From 1c33ddb5e5598c5385c4c965992c6e031fd00dd6 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Tue, 31 Aug 2021 19:13:49 +0200 Subject: [PATCH 0001/1346] Prepare for PHP 8.2 --- CONTRIBUTING.md | 3 +- NEWS | 276 +------------------- UPGRADING | 571 +---------------------------------------- UPGRADING.INTERNALS | 118 +-------- Zend/zend.h | 2 +- Zend/zend_extensions.h | 2 +- Zend/zend_modules.h | 2 +- configure.ac | 2 +- main/php.h | 2 +- main/php_version.h | 6 +- 10 files changed, 14 insertions(+), 970 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f8a1abca4ec13..a70511ad64ad7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -329,7 +329,8 @@ Currently we have the following branches in use: | Branch | | | --------- | --------- | -| master | Active development branch for PHP 8.1, which is open for backwards incompatible changes and major internal API changes. | +| master | Active development branch for PHP 8.2, which is open for backwards incompatible changes and major internal API changes. | +| PHP-8.1 | Is used to release the PHP 8.1.x series. This is a current stable version and is open for bugfixes only. | | PHP-8.0 | Is used to release the PHP 8.0.x series. This is a current stable version and is open for bugfixes only. | | PHP-7.4 | Is used to release the PHP 7.4.x series. This is a current stable version and is open for bugfixes only. | | PHP-7.3 | Is used to release the PHP 7.3.x series. This is a current stable version and is open for bugfixes only. | diff --git a/NEWS b/NEWS index 86a5f34c51907..366cb53746276 100644 --- a/NEWS +++ b/NEWS @@ -1,279 +1,5 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.1.0RC1 - -- Core: - . Fixed bug #81377 (unset() of $GLOBALS sub-key yields warning). (Nikita) - -- COM: - . Dispatch using LANG_NEUTRAL instead of LOCALE_SYSTEM_DEFAULT. (Dmitry - Maksimov) - -- Date: - . Fixed bug #80998 (Missing second with inverted interval). (Derick) - . Speed up finding timezone offset information. (Derick) - -19 Aug 2021, PHP 8.1.0beta3 - -- Core: - . Fixed bug #81342 (New ampersand token parsing depends on new line after it). - (Nikita) - . Fixed bug #81280 (Unicode characters in cli.prompt causes segfault). - (krakjoe) - . Fixed bug #81192 ("Declaration should be compatible with" gives incorrect - line number with traits). (Nikita) - . Fixed bug #78919 (CLI server: insufficient cleanup if request startup - fails). (cataphract, cmb) - -- Date: - . Fixed bug #79580 (date_create_from_format misses leap year). (Derick) - . Fixed bug #80963 (DateTimeZone::getTransitions() truncated). (Derick) - . Fixed bug #80974 (Wrong diff between 2 dates in different timezones). - (Derick) - . Fixed bug #80998 (Missing second with inverted interval). (Derick) - . Fixed bug #81097 (DateTimeZone silently falls back to UTC when providing an - offset with seconds). (Derick) - . Fixed bug #81106 (Regression in 8.1: add() now truncate ->f). (Derick) - . Fixed bug #81273 (Date interval calculation not correct). (Derick) - -- Mbstring: - . Fixed bug #81349 (mb_detect_encoding misdetcts ASCII in some cases). - (Nikita) - -- PDO PgSQL: - . Fixed bug #81343 (pdo_pgsql: Inconsitent boolean conversion after calling - closeCursor()). (Philip Hofstetter) - -- Phar: - . Use SHA256 by default for signature. (remi) - . Add support for OpenSSL_SHA256 and OpenSSL_SHA512 signature. (remi) - -- SNMP: - . Implement SHA256 and SHA512 for security protocol. (remi) - -- Standard: - . Fixed bug #81142 (PHP 7.3+ memory leak when unserialize() is used on an - associative array). (Nikita) - -05 Aug 2021, PHP 8.1.0beta2 - -- Core: - . Fixed bug #81303 (match error message improvements). (krakjoe) - -- Mbstring: - . Fixed bug #81298 (mb_detect_encoding() segfaults when 7bit encoding is - specified). (Nikita) - -- MySQLnd: - . Fixed bug #63327 (Crash (Bus Error) in mysqlnd due to wrong alignment). - (Nikita) - -- Opcache: - . Fixed Bug #81255 (Memory leak in PHPUnit with functional JIT) - . Fixed Bug #80959 (infinite loop in building cfg during JIT compilation) - (Nikita, Dmitry) - -- Reflection: - . Fixed bug #80821 (ReflectionProperty::getDefaultValue() returns current - value for statics). (Nikita) - . Fixed bug #80564 (ReflectionProperty::__toString() renders current value, - not default value). (Nikita) - -- SimpleXML: - . Fixed bug #81325 (Segfault in zif_simplexml_import_dom). (remi) - -22 Jul 2021, PHP 8.1.0beta1 - -- Core: - . Fixed bug #81238 (Fiber support missing for Solaris Sparc). (trowski) - . Fixed bug #81237 (Comparison of fake closures doesn't work). (krakjoe) - -- Opcache: - . Fixed bug #81225 (Wrong result with pow operator with JIT enabled). - (Dmitry) - . Fixed bug #81249 (Intermittent property assignment failure with JIT - enabled). (Dmitry) - . Fixed bug #81256 (Assertion `zv != ((void *)0)' failed for "preload" with - JIT). (Dmitry) - -- Reflection: - . Fixed bug #80097 (ReflectionAttribute is not a Reflector). (beberlei) - -- Standard: - . Fixed bug #81111 (Serialization is unexpectedly allowed on anonymous classes - with __serialize()). (Nikita) - -08 Jul 2021, PHP 8.1.0alpha3 - -- Core: - . Fixed bug #81202 (powerpc64 build fails on fibers). (krakjoe) - . Fixed bug #80072 (Cyclic unserialize in TMPVAR operand may leak). (Nikita) - -- Curl: - . Fixed bug #81085 (Support CURLOPT_SSLCERT_BLOB for cert strings). - (camporter) - -- Reflection: - . Fixed bug #81200 (no way to determine if Closure is static). (krakjoe) - -24 Jun 2021, PHP 8.1.0alpha2 - -- Core: - . Fixed bug #81163 (__sleep allowed to return non-array). (krakjoe) - -- Opcache: - . Fixed bug #81133 (building opcache with phpize fails). (krakjoe) - . Fixed bug #81136 (opcache header not installed). (krakjoe) - -- PDO OCI: - . Fixed bug #77120 (Support 'success with info' at connection). - (Sergei Morozov) - -- phpdbg: - . Fixed bug #81135 (unknown help topic causes assertion failure). (krakjoe) - -- SPL: - . Fixed bug #81112 (Special json_encode behavior for SplFixedArray). (Nikita) - . Fixed bug #80945 ("Notice: Undefined index" on unset() ArrayObject - non-existing key). (Nikita) - -- Standard: - . Fixed bug #81137 (hrtime breaks build on OSX before Sierra). (krakjoe) - -10 Jun 2021, PHP 8.1.0alpha1 - -- Core: - . Fixed inclusion order for phpize builds on Windows. (cmb) - . Added missing hashtable insertion APIs for arr/obj/ref. (Sara) - . Fixed bug #75474 (function scope static variables are not bound to a unique - function). (Nikita) - . Fixed bug #53826 (__callStatic fired in base class through a parent call if - the method is private). (Nikita) - . Implemented FR #77372 (Relative file path is removed from uploaded file). - (Björn Tantau) - . Fixed bug #81076 (incorrect debug info on Closures with implicit binds). - (krakjoe) - - - Standard: - . Fixed bug #77627 (method_exists on Closure::__invoke inconsistency). - (krakjoe) - -- Date: - . Fixed bug #52480 (Incorrect difference using DateInterval) (Derick) - . Fixed bug #62326 (date_diff() function returns false result) (Derick) - . Fixed bug #64992 (dst not handled past 2038) (Derick) - . Fixed bug #65003 (Wrong date diff) (Derick) - . Fixed bug #66545 (DateTime. diff returns negative values) (Derick) - . Fixed bug #68503 (date_diff on two dates with timezone set localised - returns wrong results) (Derick) - . Fixed bug #69806 (Incorrect date from timestamp) (Derick) - . Fixed bug #71700 (Extra day on diff between begin and end of march 2016) - (Derick) - . Fixed bug #71826 (DateTime::diff confuse on timezone 'Asia/Tokyo') (Derick) - . Fixed bug #73460 (Datetime add not realising it already applied DST - change) (Derick) - . Fixed bug #74173 (DateTimeImmutable::getTimestamp() triggers DST switch in - incorrect time) (Derick) - . Fixed bug #74274 (Handling DST transitions correctly) (Derick) - . Fixed bug #74524 (Date diff is bad calculated, in same time zone) (Derick) - . Fixed bug #75167 (DateTime::add does only care about backward DST - transition, not forward) (Derick) - . Fixed bug #76032 (DateTime->diff having issues with leap days for - timezones ahead of UTC) (Derick) - . Fixed bug #76374 (Date difference varies according day time) (Derick) - . Fixed bug #77571 (DateTime's diff DateInterval incorrect in timezones from - UTC+01:00 to UTC+12:00 (Derick) - . Fixed bug #78452 (diff makes wrong in hour for Asia/Tehran) (Derick) - . Fixed bug #79452 (DateTime::diff() generates months differently between - time zones) (Derick) - . Fixed bug #79698 (timelib mishandles future timestamps (triggered by 'zic - -b slim')) (Derick) - . Fixed bug #79716 (Invalid date time created (with day "00")) (Derick) - . Fixed bug #80610 (DateTime calculate wrong with DateInterval) (Derick) - . Fixed bug #80664 (DateTime objects behave incorrectly around DST - transition) (Derick) - . Fixed bug #80913 (DateTime(Immutable)::sub around DST yield incorrect - time) (Derick) - -- FPM: - . Added openmetrics status format. (Cees-Jan Kiewiet) - . Enable process renaming on macOS. (devnexen) - . Added pm.max_spawn_rate option to configure max spawn child processes rate. - (Paulius Sapragonas) - . Fixed bug #65800 (Events port mechanism). (psumbera) - -- FTP: - . Convert resource to object \FTP\Connection. (Sara) - -- GD: - . Convert resource to object \GdFont. (Sara) - -- hash: - . Implemented FR #68109 (Add MurmurHash V3). (Anatol, Michael) - . Implemented FR #73385 (Add xxHash support). (Anatol) - -- LDAP: - . Convert resource to object \LDAP\Connection. (Máté) - . Convert resource to object \LDAP\Result. (Máté) - . Convert resource to object \LDAP\ResultEntry. (Máté) - -- MySQLi: - . Fixed bug #70372 (Emulate mysqli_fetch_all() for libmysqlclient). (Nikita) - . Fixed bug #80330 (Replace language in APIs and source code/docs). - (Darek Ślusarczyk) - . Fixed bug #80329 (Add option to specify LOAD DATA LOCAL white list folder - (including libmysql)). (Darek Ślusarczyk) - -- MySQLnd: - . Fixed bug #80761 (PDO uses too much memory). (Nikita) - -- OPcache: - . Added inheritance cache. (Dmitry) - -- OpenSSL: - . Bump minimal OpenSSL version to 1.0.2. (Jakub Zelenka) - -- PCRE: - . Bundled PCRE2 is 10.37. - -- PDO: - . Fixed bug #40913 (PDO_MYSQL: PDO::PARAM_LOB does not bind to a stream for - fetching a BLOB). (Nikita) - -. PDO MySQL: - . Fixed bug #80908 (PDO::lastInsertId() return wrong). (matt) - . Fixed bug #81037 (PDO discards error message text from prepared - statement). (Kamil Tekiela) - -. PDO ODBC: - . Implement PDO_ATTR_SERVER_VERSION and PDO_ATTR_SERVER_INFO for - PDO::getAttribute(). (Calvin Buckley) - -. PDO SQLite: - . Fixed bug #38334 (Proper data-type support for PDO_SQLITE). (Nikita) - -- PgSQL: - . Convert resource to object \PgSql\Connection. (Máté) - . Convert resource to object \PgSql\Result. (Máté) - . Convert resource to object \PgSql\Lob. (Máté) - -- PSpell: - . Convert resource to object \PSpell\Dictionary. (Sara) - . Convert resource to object \PSpell\Config. (Sara) - -- readline: - . Fixed bug #72998 (invalid read in readline completion). (krakjoe) - -- Reflection: - . Implement ReflectionFunctionAbstract::getClosureUsedVariables (krakjoe) - -- Sodium: - . Added the XChaCha20 stream cipher functions. (P.I.E. Security Team) - . Added the Ristretto255 functions, which are available in libsodium 1.0.18. - (P.I.E. Security Team) - -- SPL: - . Fixed bug #80724 (FilesystemIterator::FOLLOW_SYMLINKS remove KEY_AS_FILE - from bitmask). (Cameron Porter) +?? ??? ????, PHP 8.2.0alpha1 <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index f19b273d7c525..850bc2e13b13d 100644 --- a/UPGRADING +++ b/UPGRADING @@ -1,4 +1,4 @@ -PHP 8.1 UPGRADE NOTES +PHP 8.2 UPGRADE NOTES 1. Backward Incompatible Changes 2. New Features @@ -19,544 +19,30 @@ PHP 8.1 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== -- Core: - . Access to the $GLOBALS array is now subject to a number of restrictions. - Read and write access to individual array elements like $GLOBALS['var'] - continues to work as-is. Read-only access to the entire $GLOBALS array also - continues to be supported. However, write access to the entire $GLOBALS - array is no longer supported. For example, array_pop($GLOBALS) will result - in an error. - RFC: https://wiki.php.net/rfc/restrict_globals_usage - . Passing null to a non-nullable argument of a built-in function is - deprecated. This matches the behavior of user-defined functions, where null - is never accepted by non-nullable arguments. - user-defined functions. - - var_dump(str_contains("foobar", null)); - // Deprecated: Passing null to parameter #2 ($needle) of type string - // is deprecated - - RFC: https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg - . When a method using static variables is inherited (but not overridden), the - inherited method will now share static variables with the parent method. - - class A { - public static function counter() { - static $counter = 0; - $counter++; - return $counter; - } - } - class B extends A {} - - var_dump(A::counter()); // int(1) - var_dump(A::counter()); // int(2) - var_dump(B::counter()); // int(3), previously int(1) - var_dump(B::counter()); // int(4), previously int(2) - - This means that static variables in methods now behave the same way as - static properties. - RFC: https://wiki.php.net/rfc/static_variable_inheritance - . Most non-final internal methods now require overriding methods to declare a - compatible return type, otherwise a deprecated notice is emitted during - inheritance validation. - In case the return type cannot be declared for an overriding method due to - PHP cross-version compatibility concerns, a `#[ReturnTypeWillChange]` - attribute can be added to silence the deprecation notice. - RFC: https://wiki.php.net/rfc/internal_method_return_types - -- Fileinfo: - . The fileinfo functions now accept and return, respectively, finfo objects - instead of resources. Return value checks using is_resource() - should be replaced with checks for `false`. - -- FTP: - . The FTP functions now accept and return, respectively, FTP\Connection objects - instead of resources. Return value checks using is_resource() - should be replaced with checks for `false`. - -- IMAP: - . The IMAP functions now accept and return, respectively, IMAP\Connection objects - instead of resources. Return value checks using is_resource() - should be replaced with checks for `false`. - -- LDAP: - . The LDAP functions now accept and return, respectively, LDAP\Connection objects - instead of "ldap link" resources. Return value checks using is_resource() - should be replaced with checks for `false`. - . The LDAP functions now accept and return, respectively, LDAP\Result objects - instead of "ldap result" resources. Return value checks using is_resource() - should be replaced with checks for `false`. - . The LDAP functions now accept and return, respectively, LDAP\ResultEntry - objects instead of "ldap result entry" resources. Return value checks using - is_resource() should be replaced with checks for `false`. - -- MySQLi: - . mysqli_fetch_fields() and mysqli_fetch_field_direct() will now always return - zero for max_length. You can compute this information by iterating over the - result set and taking the maximum length. This is what PHP was doing - internally previously. - . The MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH option no longer has an effect. - . The MYSQLI_STORE_RESULT_COPY_DATA option no longer has an effect. - . The default error handling mode has been changed from "silent" to - "exceptions". See https://www.php.net/manual/en/mysqli-driver.report-mode.php - for details of behavior changes and how to explicitly set this attribute. To - keep the old behavior, use mysqli_report(MYSQLI_REPORT_OFF); - RFC: https://wiki.php.net/rfc/mysqli_default_errmode - . Classes extending mysqli_stmt::execute() will be required to specify the - additional parameter now. - RFC: https://wiki.php.net/rfc/mysqli_bind_in_execute - . mysqli::connect() will now return true instead of null on success. - -- MySQLnd: - . The mysqlnd.fetch_copy_data ini setting has been removed. However, this - should not result in user-visible behavior changes. - -- OpenSSL: - . EC private keys will now be exported in PKCS#8 format rather than - traditional format, just like all other keys. - . openssl_pkcs7_encrypt() and openssl_cms_encrypt() will now default to - using AES-128-CBC rather than RC2-40. The RC2-40 cipher is considered - insecure and not enabled by default in OpenSSL 3. - -- PDO: - . PDO::ATTR_STRINGIFY_FETCHES now also stringifies values of type bool to - "0" or "1". Previously booleans were not stringified. - . Calling bindColumn() with PDO::PARAM_LOB (and assuming stringification is - not enabled) will now consistently bind a stream result, as documented. - Previously the result would be either a stream or a string depending on the - used database driver and the time the binding is performed. - -- PDO MySQL: - . Integers and floats in result sets will now be returned using native PHP - types instead of strings when using emulated prepared statements. This - matches the behavior of native prepared statements. You can restore the - previous behavior by enabling the PDO::ATTR_STRINGIFY_FETCHES option. - -- PDO SQLite: - . Integers and floats in results sets will now be returned using native PHP - types. You can restore the previous behavior by enabling the - PDO::ATTR_STRINGIFY_FETCHES option. - -- PgSQL: - . The PgSQL functions now accept and return, respectively, \PgSql\Connection - objects instead of "pgsql link" resources. Return value checks using - is_resource() should be replaced with checks for `false`. - . The PgSQL functions now accept and return, respectively, \PgSql\Result - objects instead of "pgsql result" resources. Return value checks using - is_resource() should be replaced with checks for `false`. - . The PgSQL functions now accept and return, respectively, \PgSql\Lob - objects instead of "pgsql large object" resources. Return value checks - using is_resource() should be replaced with checks for `false`. - -- Phar: - . To comply with the ArrayAccess interface, Phar::offsetUnset() and - PharData::offsetUnset() no longer return a boolean. - -- PSpell: - . The PSpell functions now accept and return, respectively, PSpell\Dictionary objects - instead of "pspell" resources. Return value checks using is_resource() - should be replaced with checks for `false`. - . The PSpell functions now accept and return, respectively, PSpell\Config objects - instead of "pspell config" resources. Return value checks using is_resource() - should be replaced with checks for `false`. - -- Standard: - . version_compare() no longer accepts undocumented operator abbreviations. - . htmlspecialchars(), htmlentities(), htmlspecialchars_decode(), - html_entity_decode() and get_html_translation_table() now use - ENT_QUOTES | ENT_SUBSTITUTE rather than ENT_COMPAT by default. This means - that ' is escaped to ' while previously it was left alone. - Additionally, malformed UTF-8 will be replaced by a Unicode substitution - character, instead of resulting in an empty string. - . debug_zval_dump() will now print reference wrappers with their refcount, - instead of only prepending a "&" to the value. This more accurately models - reference representation since PHP 7.0. - . debug_zval_dump() will not print "interned" instead of a dummy refcount of - one for interned strings and immutable arrays. - -- SPL: - . SplFixedArray will now be JSON encoded like an array. - ======================================== 2. New Features ======================================== -- Core: - . It is now possible to specify octal integer by using the explicit "0o"/"0O" - prefix similar to hexadecimal ("0x"/"0X) and binary ("0b"/"0B") integer - literals. - RFC: https://wiki.php.net/rfc/explicit_octal_notation - . Added support for array unpacking with strings keys. - RFC: https://wiki.php.net/rfc/array_unpacking_string_keys - . Added support for enumerations. - RFC: https://wiki.php.net/rfc/enumerations - . Added support for never return type - RFC: https://wiki.php.net/rfc/noreturn_type - . Added support for fibers. - RFC: https://wiki.php.net/rfc/fibers - . It is now possible to use "new ClassName()" expressions as parameter - default values, static variable and global constant initializers, as well - as attribute arguments. Objects can also be passed to `define()` now. - RFC: https://wiki.php.net/rfc/new_in_initializers - . Closures for callables can now be created using the syntax `myFunc(...)`, - which is the same as `Closure::fromCallable('myFunc')`. Yes, the `...` is - part of the syntax, not an omission. - RFC: https://wiki.php.net/rfc/first_class_callable_syntax - . File uploads now provide an additional full_path key, which contains the - full path (rather than just the basename) of the uploaded file. This is - intended for use in conjunction with "upload webkitdirectory". - . It is now allowed to specify named arguments after an argument unpack, e.g. - foo(...$args, named: $arg). - . Added support for intersection types. - They cannot be combined with union types. - RFC: https://wiki.php.net/rfc/pure-intersection-types - . Added support for the final modifier for class constants. - RFC: https://wiki.php.net/rfc/final_class_const - . Added support for readonly properties. - RFC: https://wiki.php.net/rfc/readonly_properties_v2 - -- Curl: - . Added CURLOPT_DOH_URL option. - . Added certificate blob options when for libcurl >= 7.71.0: - - CURLOPT_ISSUERCERT_BLOB - CURLOPT_PROXY_ISSUERCERT - CURLOPT_PROXY_ISSUERCERT_BLOB - CURLOPT_PROXY_SSLCERT_BLOB - CURLOPT_PROXY_SSLKEY_BLOB - CURLOPT_SSLCERT_BLOB - CURLOPT_SSLKEY_BLOB - - . Added CURLStringFile, which can be used to post a file from a string rather - than a file: - - $file = new CURLStringFile($data, 'filename.txt', 'text/plain'); - curl_setopt($curl, CURLOPT_POSTFIELDS, ['file' => $file]); - -- FPM: - . Added openmetrics status format. It can be used by Prometheus to fetch FPM - metrics. - . Added new pool option for the dynamic process manager called - pm.max_spawn_rate. It allows to start number of children in a faster rate - when dynamic pm is selected. The default value is 32 which was the previous - hard coded value. - -- GD: - . Avif support is now available through the imagecreatefromavif() and - imageavif() functions, if libgd has been built with avif support. - -- hash: - . The following functions have changed signatures, to support an optional `$options` argument: - - - function hash(string $algo, string $data, bool $binary = false, array $options = []): string|false {} - - function hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false {} - - function hash_init(string $algo, int $flags = 0, string $key = "", array $options = []): HashContext {} - - The additional `$options` argument can be used to pass algorithm specific data. - - . Added MurmurHash3 with streaming support. The following variants are implemented: - - - murmur3a, 32-bit hash - - murmur3c, 128-bit hash for x86 - - murmur3f, 128-bit hash for x64 - - The initial hash state can be passed through the `seed` key in the `$options` array, for example: - - ```php - $h = hash("murmur3f", $data, options: ["seed" => 42]); - echo $h, "\n"; - ``` - - A valid seed value is within the range from 0 to the platform defined UINT_MAX, usually 4294967295. - - . Added xxHash. The implementation brings in the following arguments - - - xxh32, 32-bit hash - - xxh64, 64-bit hash - - xxh3, 64-bit hash - - xxh128, 128-bit hash - - The initial hash state can be passed through the `seed` key in the `$options` array, for example: - - ```php - $h = hash("xxh3", $data, options: ["seed" => 42]); - echo $h, "\n"; - ``` - - Secret usage is supported through passing the `secret` key in the `$options` array, too: - - ```php - $h = hash("xxh3", $data, options: ["secret" => "at least 136 bytes long secret here"]); - echo $h, "\n"; - ``` - - Note, that the quality of the custom secret is crucial for the quality of the resulting hash. It is - highly recommended for the secret to use the best possible entropy. - -- MySQLi: - . The mysqli.local_infile_directory ini setting has been added, which can be - used to specify a directory from which files are allowed to be loaded. It - is only meaningful if mysqli.allow_local_infile is not enabled, as all - directories are allowed in that case. - . Binding in execute has been added to mysqli prepared statements. - Parameters can now be passed to mysqli_stmt::execute as an array. - RFC: https://wiki.php.net/rfc/mysqli_bind_in_execute - . A new method has been added to mysqli_result called mysqli_fetch_column(). - It allows for fetching single scalar values from the result set. - RFC: https://wiki.php.net/rfc/mysqli_fetch_column - -- PDO MySQL: - . The PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY attribute has been added, which - can be used to specify a directory from which files are allowed to be - loaded. It is only meaningful if PDO::MYSQL_ATTR_LOCAL_INFILE is not - enabled, as all directories are allowed in that case. - -- PDO SQLite: - . SQLite's "file:" DSN syntax is now supported, which allows specifying - additional flags. This feature is not available if open_basedir is set. - Example: - - new PDO('sqlite:file:path/to/sqlite.db?mode=ro') - -- Posix: - . Added POSIX_RLIMIT_KQUEUES and POSIX_RLIMIT_NPTS. These rlimits are only - available on FreeBSD. - -- Standard: - . fputcsv() now accepts a new "eol" argument which allow to define a custom - eol sequence, the default remains the same and is "\n". - -- SPL: - . SplFileObject::fputcsv() now accepts a new "eol" argument which allow to - define a custom eol sequence, the default remains the same and is "\n". - ======================================== 3. Changes in SAPI modules ======================================== -- CLI: - . Using -a without the readline extension will now result in an error. - Previously, -a without readline had the same behavior as calling php without - any arguments, apart from printing an additional "Interactive mode enabled" - message. This mode was not, in fact, interactive. - -- phpdbg: - . Remote functionality from phpdbg has been removed. - ======================================== 4. Deprecated Functionality ======================================== -- Core: - . Implementing the Serializable interface without also implementing - __serialize() and __unserialize() has been deprecated. You should either - implement the new methods (if you only support PHP 7.4 and higher) or - implement both (if you support older PHP versions as well). - RFC: https://wiki.php.net/rfc/phase_out_serializable - . Implicit conversion of floats to integers that result in loss of precision, - e.g. a truncation from 1.9 to 1, is deprecated. This affects array keys, - int parameter and return types, and operators working on integers. - RFC: https://wiki.php.net/rfc/implicit-float-int-deprecate - . Calling a static method or accessing a static property directly on a trait - is deprecated. Static methods and properties should only be accessed on a - class using the trait. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . Returning a non-array from __sleep will raise a warning - . Returning by reference from a void function is deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . Automatic conversion of "false" into an empty array on write operands is - deprecated. - RFC: https://wiki.php.net/rfc/autovivification_false - -- Ctype: - . Passing a non-string value to ctype_*() functions is deprecated. A future - version of PHP will make ctype_*() accept a string argument, which means - that either only strings will be accepted (strict_types=1) or inputs may be - converted to string (strict_types=0). In particular, using ctype_*($cp) to - check whether an ASCII codepoint given as integer satisfies a given ctype - predicate will no longer be supported. Instead ctype_*(chr($cp)) should be - used. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- Date: - . The date_sunrise() and date_sunset() functions have been deprecated in - favor of date_sun_info(). - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . The strftime() and gmstrftime() functions have been deprecated in favor of - date()/DateTime::format() (for locale-independent formatting) or - IntlDateFormatter::format() (for locale-dependent formatting). - -- Filter: - . The FILTER_SANITIZE_STRING and FILTER_SANITIZE_STRIPPED filters have been - deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . The filter.default ini setting is deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- GD: - . The $num_points parameter of image(open|filled)polygon has been deprecated. - -- Hash: - . The mhash(), mhash_keygen_s2k(), mhash_count(), mhash_get_block_size() and - mhash_get_hash_name() functions are deprecated. Use the hash_*() APIs - instead. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- IMAP: - . The NIL constant has been deprecated. Use 0 instead. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- Intl: - . Calling IntlCalendar::roll() with bool argument is deprecated. Pass 1 and -1 - instead of true and false respectively. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- Mbstring: - . Calling mb_check_encoding() without an argument is deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- MySQLi: - . The mysqli_driver::$driver_version property has been deprecated. The driver - version is meaningless as it hasn't been updated in more than a decade. Use - PHP_VERSION_ID instead. - . Calling mysqli::get_client_info in OO style or passing $mysqli argument to - mysqli_get_client_info() function has been deprecated. Use - mysqli_get_client_info() without any arguments to obtain the client - library version information. - . The mysqli::init() method has been deprecated. Replace calls to - parent::init() with parent::__construct(). - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- OCI8: - . The INI directive oci8.old_oci_close_semantics has been deprecated. - -- ODBC: - . odbc_result_all() has been deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- PDO: - . The PDO::FETCH_SERIALIZE mode has been deprecated. - RFC: https://wiki.php.net/rfc/phase_out_serializable - -- PgSQL: - . Not passing the connection argument to PgSQL functions and using the - default connection is deprecated. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- SOAP: - . The ssl_method option for the SoapClient constructor has been deprecated in - favor of ssl stream context options. The direct equivalent would be - crypto_method, but min_proto_version/max_proto_version are recommended - instead. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - -- Standard: - . Calling key(), current(), next(), prev(), reset(), or end() on objects - is deprecated. Instead cast the object to array first, or make use of - ArrayIterator. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . The strptime() function has been deprecated. Use date_parse_from_format() - instead (for locale-independent parsing) or IntlDateFormatter::parse() (for - locale-dependent parsing). - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . The auto_detect_line_endings ini setting has been deprecated. If necessary, - handle "\r" line breaks manually instead. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - . The FILE_BINARY and FILE_TEXT constants are deprecated. They already had - no effect previously. - RFC: https://wiki.php.net/rfc/deprecations_php_8_1 - ======================================== 5. Changed Functions ======================================== -- Core: - . Properties order used in foreach, var_dump(), serialize(), object comparison - etc. was changed. Now properties are naturally ordered according to their - declaration and inheritance. Properties declared in a base class are going - to be before the child properties. This order is consistent with internal - layout of properties in zend_object structure and repeats the order in - default_properties_table[] and properties_info_table[]. The old order was - not documented and was caused by class inheritance implementation details. - -- Filter: - . The FILTER_FLAG_ALLOW_OCTAL flag of the FILTER_VALIDATE_INT filter now accept - octal string with the leading octal prefix ("0o"/"0O") - RFC: https://wiki.php.net/rfc/explicit_octal_notation - -- GMP: - . All GMP function now accept octal string with the leading octal prefix ("0o"/"0O") - RFC: https://wiki.php.net/rfc/explicit_octal_notation - -- PDO ODBC: - . PDO::getAttributes() with PDO::ATTR_SERVER_INFO and PDO::ATTR_SERVER_VERSION - now return values instead of throwing PDOException. - -- Reflection: - . ReflectionProperty::setAccessible() and ReflectionMethod::setAccessible() - no longer have an effect. Properties and methods are always considered - accessible through reflection. - RFC: https://wiki.php.net/rfc/make-reflection-setaccessible-no-op - -- Standard: - . syslog() is now binary safe. - ======================================== 6. New Functions ======================================== -- Core: - . Added array_is_list(array $array), which will return true if the array keys are 0 .. count($array)-1 in that order. - RFC: https://wiki.php.net/rfc/is_list - -- pcntl: - . Added pcntl_rfork for FreeBSD variants - -- Reflection: - . Added ReflectionFunctionAbstract::getClosureUsedVariables - -- Standard: - . Added fsync() and fdatasync(), which instruct the operating system to - flush its buffers to physical storage. - RFC: https://wiki.php.net/rfc/fsync_function - -- Sodium: - . Added the XChaCha20 stream cipher interface functions: - - - sodium_crypto_stream_xchacha20() - - sodium_crypto_stream_xchacha20_keygen() - - sodium_crypto_stream_xchacha20_xor() - - . Added the Ristretto255 functions, which are available in libsodium 1.0.18. - - Ristretto is a technique for constructing prime order elliptic curve groups with non-malleable encodings. - Ristretto255 implements Ristretto atop Curve25519. - - - sodium_crypto_core_ristretto255_add() - - sodium_crypto_core_ristretto255_from_hash() - - sodium_crypto_core_ristretto255_is_valid_point() - - sodium_crypto_core_ristretto255_random() - - sodium_crypto_core_ristretto255_scalar_add() - - sodium_crypto_core_ristretto255_scalar_complement() - - sodium_crypto_core_ristretto255_scalar_invert() - - sodium_crypto_core_ristretto255_scalar_mul() - - sodium_crypto_core_ristretto255_scalar_negate() - - sodium_crypto_core_ristretto255_scalar_random() - - sodium_crypto_core_ristretto255_scalar_reduce() - - sodium_crypto_core_ristretto255_scalar_sub() - - sodium_crypto_core_ristretto255_sub() - - sodium_crypto_scalarmult_ristretto255() - - sodium_crypto_scalarmult_ristretto255_base() - ======================================== 7. New Classes and Interfaces ======================================== -- Intl: - . Added IntlDatePatternGenerator to dynamically generate patterns to use with IntlDateFormatter. - RFC: https://wiki.php.net/rfc/intldatetimepatterngenerator - ======================================== 8. Removed Extensions and SAPIs ======================================== @@ -565,69 +51,14 @@ PHP 8.1 UPGRADE NOTES 9. Other Changes to Extensions ======================================== -- GD: - imagewebp() can do lossless WebP encoding by passing IMG_WEBP_LOSSLESS as - quality. This constant is only defined, if a libgd is used which supports - lossless WebP encoding. - -- MySQLi: - . The mysqli_stmt::next_result() and mysqli::fetch_all() methods are now - available when linking against libmysqlclient. - -- OpenSSL: - . The OpenSSL extension now requires at least OpenSSL version 1.0.2. - . OpenSSL 3.0 is now supported. Be aware that many ciphers are no longer - enabled by default (part of the legacy provider), and that parameter - validation (e.g. minimum key sizes) is stricter now. - -- Phar: - . Use SHA256 by default for signature. - . Add support for OpenSSL_SHA256 and OpenSSL_SHA512 signature. - -- SNMP: - . add SHA256 and SHA512 for security protocol. - -- Standard: - . --with-password-argon2 now uses pkg-config to detect libargon2. As such, - an alternative libargon2 location should now be specified using - PKG_CONFIG_PATH. - ======================================== 10. New Global Constants ======================================== -- MySQLi: - . MYSQLI_REFRESH_REPLICA has been added as a replacement for - MYSQLI_REFRESH_SLAVE, in line with an upstream change in MySQL. The old - constant is still available for backwards-compatibility reasons, but may - be deprecated/removed in the future. - -- Sockets: - . The following socket options are now defined if they are supported: - * SO_ACCEPTFILTER - * SO_DONTTRUNC - * SO_WANTMORE - * SO_MARK - * TCP_DEFER_ACCEPT - ======================================== 11. Changes to INI File Handling ======================================== -- The log_errors_max_len ini setting has been removed. It no longer had an - effect since PHP 8.0. - -- A leading dollar in a quoted string can now be escaped: "\${" will now be - interpreted as a string with contents `${`. - -- Backslashes in double quoted strings are now more consistently treated as - escape characters. Previously, "foo\\" followed by something other than a - newline was not considered as a teminated string. It is now interpreted as a - string with contents `foo\`. However, as an exception, the string "foo\" - followed by a newline will continue to be treated as a valid string with - contents `foo\` rather than an unterminated string. This exception exists to - support naive uses of Windows file pahts as "C:\foo\". - ======================================== 12. Windows Support ======================================== diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index ec4d17f20ac67..18a6239410e0f 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -1,134 +1,20 @@ -PHP 8.1 INTERNALS UPGRADE NOTES +PHP 8.2 INTERNALS UPGRADE NOTES 1. Internal API changes - a. Removed Zend APIs - b. Zend Stream API - c. zend_get_opcode_id() - d. Removed support for "p" printf format specifier - e. ZEND_ATOL() changes - f. Non-serializable classes should use ZEND_ACC_NOT_SERIALIZABLE - g. _zend_hash_find_known_hash renamed to zend_hash_find_known_hash - h. Renaming of ZEND_TYPE_HAS_CLASS() into ZEND_TYPE_IS_COMPLEX() - i. zend_resource handle is now zend_long 2. Build system changes - a. New compiler flags 3. Module changes - a. ext/hash - b. ext/pdo - c. ext/standard - d. ext/pgsql - e. ext/pcre ======================== 1. Internal API changes ======================== - a. The following APIs have been removed from the Zend Engine: - - The spl_ce_Aggregate, spl_ce_ArrayAccess, spl_ce_Countable, spl_ce_Iterator, spl_ce_Serializable, - spl_ce_Stringable, spl_ce_Traversable alias class entries have been removed in favor of zend_ce_aggregate, - zend_ce_arrayaccess, zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_stringable, - zend_ce_traversable. - - The ZVAL_NEW_ARR() macro has been removed. Use array_init() or ZVAL_ARR - with zend_new_array() instead. - - The IGNORE_URL_WIN macro has been removed; it had no effect as of PHP 5.0.0. - - TsHashTable has been removed, it was not used in php-src and was not useful outside of php-src. - b. Zend Stream API has been changed to use "zend_string*" instead of "char*" - - zend_file_handle.filename now is zend_string* - - zend_file_handle.free_filename is removed. Now zend_file_handle.filename is always released. - - added zend_file_handle.primary_script flag. SAPIs should set it for main executed script. - - added zend_file_handle.in_list flag, which is set when a file_handle is added into CG(open_files) - - added zend_stream_init_filename_ex() function, that takes filename as zend_string* - - the "filename" parameter of functons zend_stream_open(), php_stream_open_for_zend_ex() and - callback zend_stream_open_function() has been removed (it's now passed as a "filename" field of the - file_handle parameter) - - in zend_fopen() and zend_resolve_path() callbacks filename now passed as zend_string* - - file_handles should be destroyed by zend_destroy_file_handle() function (usually in the same function - the same function where they were created by zend_stream_init_*()). Previously there were two different - destructors zend_destroy_file_handle() and zend_file_handle_dtor(). - - zend_ini_scanner_globals.filename now is zend_string* - c. Added the zend_get_opcode_id() function, which is intended to get opcode id from name. - d. Removed support for "p" modifier (%pd, %pu, etc) in PHP's printf - implementations. Use ZEND_LONG_FMT and ZEND_ULONG_FMT instead. - e. ZEND_ATOL() now returns the integer instead of assigning it as part of the - macro. Replace ZEND_ATOL(i, s) with i = ZEND_ATOL(s). - f. Non-serializable classes should be indicated using the - ZEND_ACC_NOT_SERIALIZABLE (@not-serializable in stubs) rather than the - zend_class_(un)serialize_deny handlers which are removed. - g. _zend_hash_find_known_hash has been renamed to zend_hash_find_known_hash. - h. ZEND_TYPE_HAS_CLASS() has been renamed to ZEND_TYPE_IS_COMPLEX() for clarity. - A zend_type element can contain a zend_type_list which might be either a union or an intersection, - or a single class stored as either a zend_string* or a zend_class_entry*. - i. The handle member of zend_resource (the resource ID) now has type zend_long - rather than int. This should be transparent to most code, but uses in - printf may need to switch from "%d" to ZEND_LONG_FMT. ======================== 2. Build system changes ======================== - a. New compiler flags - - [-Wimplicit-fallthrough=1] is now enabled by default. - It is possible to use the new ZEND_FALLTHROUGH macro keyword to suppress the warning. + ======================== 3. Module changes ======================== - a. ext/hash - - The init signatures are extended with an additional `HashTable*` - argument. The passed HT is to contain the algorithm specific - configuration. If an algorithm doesn't make use of any additional - configuration, the argument is to be marked with ZEND_ATTRIBUTE_UNUSED. - - b. ext/pdo - - The "preparer" callback now accepts a zend_string* instead of - char* + size_t pair the query string. Similarly, the query_string and - active_query_string members of pdo_stmt_t are now zend_string*. - - The way in which drivers provide results has changed: Previously, - the "describer" callback populated the "pdo_type" member in the - pdo_column_data structure, and the "get_col" callback then had to return - pointers to data of appropriate type. - - In PHP 8.1, the "describer" callback no longer determines the pdo_type - (and this member has been removed from pdo_column_data). Instead, the - "get_col" callback accepts a zval pointer that may be populated with a - value of arbitrary type. This gives drivers more flexibility in - determining result types (e.g. based on whether a specific integer fits - the PHP integer type) and avoid awkward juggling of temporary buffers. - - As the "describer" no longer determines pdo_type, the "get_column_meta" - function is now responsible for providing this information for use by - getColumnMeta(). The type provided here does not need to match the type - returned by get_col (in fact no corresponding type might exist, e.g. for - floats). It should be the closest logical equivalent for the column type. - - The transaction, set_attribute, and preparer handler's return type - has been formalized to bool instead of int. - - The check_liveness handler's return type has been formalized to zend_return - instead of int. - - The closer, and fetch_error handlers have been voidified. - - The quoter handler now returns the quoted string as zend_string* instead - of returning a boolean, and the quoted string as a pair of out params. - Similarly the unquoted string is now a zend_string* instead of a pair of - char* and size_t length. - - The doer handler now accepts a zend_string* instead of char* + size_t - pair for the SQL statement. - - The last_id handler now returns a zend_string* instead of returning a - char* and the length as an out param, and accepts a zend_string* instead - of char* for the optional sequence/table name. - - The php_pdo_str_tolower_dup() PDO_API has been removed use zend_str_tolower_dup() - or zend_string_tolower_ex(). - - c. ext/standard - - The PHP API php_fputcsv() now takes an extra zend_string* argument at the end - for a custom EOL sequence, passing NULL provides the old default of "\n". - - d. ext/pgsql - - The functions php_pgsql_meta_data(), php_pgsql_convert(), php_pgsql_insert(), - php_pgsql_update(), php_pgsql_delete(), and php_pgsql_select() have had - their return type formalized to zend_result. - - The functions php_pgsql_meta_data(), php_pgsql_convert(), php_pgsql_insert(), - php_pgsql_update(), php_pgsql_delete(), and php_pgsql_select() now accept a - zend_string* instead of a char* for the table name. - - e. ext/pcre - - Bundled PCRE2 is at version 10.37. The most important diff to the previous - version is the JIT support on the S390 platform. diff --git a/Zend/zend.h b/Zend/zend.h index eeacc91eb0a9f..ff247e95540cd 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -20,7 +20,7 @@ #ifndef ZEND_H #define ZEND_H -#define ZEND_VERSION "4.1.0-dev" +#define ZEND_VERSION "4.2.0-dev" #define ZEND_ENGINE_3 diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index 57c8775092f78..3b8e2b3453ade 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 420201009 +#define ZEND_EXTENSION_API_NO 420210903 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index 98957def7626a..fda01eedc5230 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 20201009 +#define ZEND_MODULE_API_NO 20210903 #ifdef ZTS #define USING_ZTS 1 #else diff --git a/configure.ac b/configure.ac index c9a29f0e82f4e..ba25175eb7845 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.1.0-dev],[https://bugs.php.net],[php],[https://www.php.net]) +AC_INIT([PHP],[8.2.0-dev],[https://bugs.php.net],[php],[https://www.php.net]) AC_CONFIG_SRCDIR([main/php_version.h]) AC_CONFIG_AUX_DIR([build]) AC_PRESERVE_HELP_ORDER diff --git a/main/php.h b/main/php.h index 3b80a589c29d4..91ecbb21dc726 100644 --- a/main/php.h +++ b/main/php.h @@ -22,7 +22,7 @@ #include #endif -#define PHP_API_VERSION 20201009 +#define PHP_API_VERSION 20210903 #define PHP_HAVE_STREAMS #define YYDEBUG 0 #define PHP_DEFAULT_CHARSET "UTF-8" diff --git a/main/php_version.h b/main/php_version.h index 66d4367856e5a..e7993749fd9e5 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 1 +#define PHP_MINOR_VERSION 2 #define PHP_RELEASE_VERSION 0 #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "8.1.0-dev" -#define PHP_VERSION_ID 80100 +#define PHP_VERSION "8.2.0-dev" +#define PHP_VERSION_ID 80200 From a13730c5e465b3c349a7970d15a49e4e132d4e07 Mon Sep 17 00:00:00 2001 From: twosee Date: Wed, 1 Sep 2021 16:32:05 +0800 Subject: [PATCH 0002/1346] Simplify zend_forbid_dynamic_call() (#7443) The special cases (parse_str/mb_parse_str with a single argument) have been removed completely, we can simplify it now. --- Zend/zend_API.h | 4 ++-- Zend/zend_builtin_functions.c | 8 ++++---- ext/standard/array.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index a51d3f3ad1e94..124c6c4da04aa 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -689,13 +689,13 @@ ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data); ZEND_API zend_result zend_set_local_var(zend_string *name, zval *value, bool force); ZEND_API zend_result zend_set_local_var_str(const char *name, size_t len, zval *value, bool force); -static zend_always_inline zend_result zend_forbid_dynamic_call(const char *func_name) +static zend_always_inline zend_result zend_forbid_dynamic_call(void) { zend_execute_data *ex = EG(current_execute_data); ZEND_ASSERT(ex != NULL && ex->func != NULL); if (ZEND_CALL_INFO(ex) & ZEND_CALL_DYNAMIC) { - zend_throw_error(NULL, "Cannot call %s dynamically", func_name); + zend_throw_error(NULL, "Cannot call %s() dynamically", get_active_function_name()); return FAILURE; } diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index ea1d0845394d6..d4fc843f84b3c 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -157,7 +157,7 @@ ZEND_FUNCTION(func_num_args) RETURN_THROWS(); } - if (zend_forbid_dynamic_call("func_num_args()") == FAILURE) { + if (zend_forbid_dynamic_call() == FAILURE) { RETURN_LONG(-1); } @@ -188,7 +188,7 @@ ZEND_FUNCTION(func_get_arg) RETURN_THROWS(); } - if (zend_forbid_dynamic_call("func_get_arg()") == FAILURE) { + if (zend_forbid_dynamic_call() == FAILURE) { RETURN_THROWS(); } @@ -226,7 +226,7 @@ ZEND_FUNCTION(func_get_args) RETURN_THROWS(); } - if (zend_forbid_dynamic_call("func_get_args()") == FAILURE) { + if (zend_forbid_dynamic_call() == FAILURE) { RETURN_THROWS(); } @@ -1331,7 +1331,7 @@ ZEND_FUNCTION(get_defined_vars) ZEND_PARSE_PARAMETERS_NONE(); - if (zend_forbid_dynamic_call("get_defined_vars()") == FAILURE) { + if (zend_forbid_dynamic_call() == FAILURE) { return; } diff --git a/ext/standard/array.c b/ext/standard/array.c index 4f70fcd1fd2bd..6345dd4ebbadf 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2407,7 +2407,7 @@ PHP_FUNCTION(extract) } } - if (zend_forbid_dynamic_call("extract()") == FAILURE) { + if (zend_forbid_dynamic_call() == FAILURE) { return; } @@ -2523,7 +2523,7 @@ PHP_FUNCTION(compact) Z_PARAM_VARIADIC('+', args, num_args) ZEND_PARSE_PARAMETERS_END(); - if (zend_forbid_dynamic_call("compact()") == FAILURE) { + if (zend_forbid_dynamic_call() == FAILURE) { return; } From aa893c4a71f6dad4ba87adce55fe4b30bd10fd7c Mon Sep 17 00:00:00 2001 From: twosee Date: Wed, 1 Sep 2021 16:33:19 +0800 Subject: [PATCH 0003/1346] Simplify SSL_set_mode() calls (#7444) SSL_set_mode() adds the mode set via bitmask in mode to ssl. --- ext/openssl/xp_ssl.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 918b3ca5b21df..15d11e3b9b63a 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -1758,7 +1758,7 @@ int php_openssl_setup_crypto(php_stream *stream, } #ifdef SSL_MODE_RELEASE_BUFFERS - SSL_set_mode(sslsock->ssl_handle, SSL_get_mode(sslsock->ssl_handle) | SSL_MODE_RELEASE_BUFFERS); + SSL_set_mode(sslsock->ssl_handle, SSL_MODE_RELEASE_BUFFERS); #endif if (cparam->inputs.session) { @@ -1861,14 +1861,7 @@ static int php_openssl_enable_crypto(php_stream *stream, sslsock->s.is_blocked = 0; /* The following mode are added only if we are able to change socket * to non blocking mode which is also used for read and write */ - SSL_set_mode( - sslsock->ssl_handle, - ( - SSL_get_mode(sslsock->ssl_handle) | - SSL_MODE_ENABLE_PARTIAL_WRITE | - SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER - ) - ); + SSL_set_mode(sslsock->ssl_handle, SSL_MODE_ENABLE_PARTIAL_WRITE | SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); } timeout = sslsock->is_client ? &sslsock->connect_timeout : &sslsock->s.timeout; From a93e12f8a6dfc23e334339317c97aa35356db821 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Wed, 1 Sep 2021 11:09:30 +0200 Subject: [PATCH 0004/1346] Prepare for PHP 8.2 (bis) --- win32/build/confutils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 01c76b0e1e886..a53d19d4f5660 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -95,10 +95,10 @@ if (typeof(CWD) == "undefined") { if (!MODE_PHPIZE) { /* defaults; we pick up the precise versions from configure.ac */ var PHP_VERSION = 8; - var PHP_MINOR_VERSION = 1; + var PHP_MINOR_VERSION = 2; var PHP_RELEASE_VERSION = 0; var PHP_EXTRA_VERSION = ""; - var PHP_VERSION_STRING = "8.1.0"; + var PHP_VERSION_STRING = "8.2.0"; } /* Get version numbers and DEFINE as a string */ From 3ec14000c6c93b3b0abee52321eb1bf88fad19b7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 12:20:52 +0200 Subject: [PATCH 0005/1346] Remove UNDEF checks in userstream implementation I don't see how object can be UNDEF here -- and just passing NULL in that case is not going to do anything reasonable either. It would fall back to global functions with the same name. --- Zend/zend_execute_API.c | 7 ++- main/streams/userspace.c | 108 +++++++-------------------------------- 2 files changed, 25 insertions(+), 90 deletions(-) diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 2511e40c19dac..d47d5d9974b4e 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -686,7 +686,12 @@ zend_result _call_user_function_impl(zval *object, zval *function_name, zval *re zend_fcall_info fci; fci.size = sizeof(fci); - fci.object = object ? Z_OBJ_P(object) : NULL; + if (object) { + ZEND_ASSERT(Z_TYPE_P(object) == IS_OBJECT); + fci.object = Z_OBJ_P(object); + } else { + fci.object = NULL; + } ZVAL_COPY_VALUE(&fci.function_name, function_name); fci.retval = retval_ptr; fci.param_count = param_count; diff --git a/main/streams/userspace.c b/main/streams/userspace.c index d134188c0e960..f706852282793 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -350,11 +350,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char * ZVAL_STRING(&zfuncname, USERSTREAM_OPEN); zend_try { - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &zfuncname, - &zretval, - 4, args); + call_result = call_user_function(NULL, &us->object, &zfuncname, &zretval, 4, args); } zend_catch { FG(user_stream_current_filename) = NULL; zend_bailout(); @@ -428,11 +424,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char ZVAL_STRING(&zfuncname, USERSTREAM_DIR_OPEN); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &zfuncname, - &zretval, - 2, args); + call_result = call_user_function(NULL, &us->object, &zfuncname, &zretval, 2, args); if (call_result == SUCCESS && Z_TYPE(zretval) != IS_UNDEF && zval_is_true(&zretval)) { /* the stream is now open! */ @@ -571,11 +563,7 @@ static ssize_t php_userstreamop_write(php_stream *stream, const char *buf, size_ ZVAL_STRINGL(&args[0], (char*)buf, count); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 1, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); zval_ptr_dtor(&args[0]); zval_ptr_dtor(&func_name); @@ -624,11 +612,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count ZVAL_LONG(&args[0], count); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 1, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); zval_ptr_dtor(&args[0]); zval_ptr_dtor(&func_name); @@ -667,11 +651,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count /* since the user stream has no way of setting the eof flag directly, we need to ask it if we hit eof */ ZVAL_STRINGL(&func_name, USERSTREAM_EOF, sizeof(USERSTREAM_EOF)-1); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&func_name); if (EG(exception)) { @@ -704,11 +684,7 @@ static int php_userstreamop_close(php_stream *stream, int close_handle) ZVAL_STRINGL(&func_name, USERSTREAM_CLOSE, sizeof(USERSTREAM_CLOSE)-1); - call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&retval); zval_ptr_dtor(&func_name); @@ -732,11 +708,7 @@ static int php_userstreamop_flush(php_stream *stream) ZVAL_STRINGL(&func_name, USERSTREAM_FLUSH, sizeof(USERSTREAM_FLUSH)-1); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF && zval_is_true(&retval)) call_result = 0; @@ -764,11 +736,7 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when ZVAL_LONG(&args[0], offset); ZVAL_LONG(&args[1], whence); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 2, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 2, args); zval_ptr_dtor(&args[0]); zval_ptr_dtor(&args[1]); @@ -798,11 +766,7 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when /* now determine where we are */ ZVAL_STRINGL(&func_name, USERSTREAM_TELL, sizeof(USERSTREAM_TELL)-1); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) == IS_LONG) { *newoffs = Z_LVAL(retval); @@ -868,11 +832,7 @@ static int php_userstreamop_stat(php_stream *stream, php_stream_statbuf *ssb) ZVAL_STRINGL(&func_name, USERSTREAM_STAT, sizeof(USERSTREAM_STAT)-1); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) == IS_ARRAY) { if (SUCCESS == statbuf_from_array(&retval, ssb)) @@ -902,7 +862,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value switch (option) { case PHP_STREAM_OPTION_CHECK_LIVENESS: ZVAL_STRINGL(&func_name, USERSTREAM_EOF, sizeof(USERSTREAM_EOF)-1); - call_result = call_user_function(NULL, Z_ISUNDEF(us->object)? NULL : &us->object, &func_name, &retval, 0, NULL); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { ret = zval_is_true(&retval) ? PHP_STREAM_OPTION_RETURN_ERR : PHP_STREAM_OPTION_RETURN_OK; } else { @@ -936,11 +896,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value /* TODO wouldblock */ ZVAL_STRINGL(&func_name, USERSTREAM_LOCK, sizeof(USERSTREAM_LOCK)-1); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 1, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); if (call_result == SUCCESS && (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { ret = (Z_TYPE(retval) == IS_FALSE); @@ -965,9 +921,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value switch (value) { case PHP_STREAM_TRUNCATE_SUPPORTED: - if (zend_is_callable_ex(&func_name, - Z_ISUNDEF(us->object)? NULL : Z_OBJ(us->object), - 0, NULL, NULL, NULL)) + if (zend_is_callable_ex(&func_name, Z_OBJ(us->object), 0, NULL, NULL, NULL)) ret = PHP_STREAM_OPTION_RETURN_OK; else ret = PHP_STREAM_OPTION_RETURN_ERR; @@ -977,11 +931,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value ptrdiff_t new_size = *(ptrdiff_t*) ptrparam; if (new_size >= 0 && new_size <= (ptrdiff_t)LONG_MAX) { ZVAL_LONG(&args[0], (zend_long)new_size); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 1, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) { if (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE) { ret = (Z_TYPE(retval) == IS_TRUE) ? PHP_STREAM_OPTION_RETURN_OK : @@ -1041,11 +991,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value break; } - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 3, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 3, args); if (call_result == FAILURE) { php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_SET_OPTION " is not implemented!", @@ -1388,11 +1334,7 @@ static ssize_t php_userstreamop_readdir(php_stream *stream, char *buf, size_t co ZVAL_STRINGL(&func_name, USERSTREAM_DIR_READ, sizeof(USERSTREAM_DIR_READ)-1); - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) != IS_FALSE && Z_TYPE(retval) != IS_TRUE) { convert_to_string(&retval); @@ -1420,11 +1362,7 @@ static int php_userstreamop_closedir(php_stream *stream, int close_handle) ZVAL_STRINGL(&func_name, USERSTREAM_DIR_CLOSE, sizeof(USERSTREAM_DIR_CLOSE)-1); - call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&retval); zval_ptr_dtor(&func_name); @@ -1444,11 +1382,7 @@ static int php_userstreamop_rewinddir(php_stream *stream, zend_off_t offset, int ZVAL_STRINGL(&func_name, USERSTREAM_DIR_REWIND, sizeof(USERSTREAM_DIR_REWIND)-1); - call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 0, NULL); + call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&retval); zval_ptr_dtor(&func_name); @@ -1478,11 +1412,7 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr) break; } - call_result = call_user_function(NULL, - Z_ISUNDEF(us->object)? NULL : &us->object, - &func_name, - &retval, - 1, args); + call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); do { if (call_result == FAILURE) { From 99d377165341653986496ae1550ffb60bb29b2c3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 12:50:01 +0200 Subject: [PATCH 0006/1346] Fix check in user filter dtor obj is always non-null, we need to check for UNDEF here. This was caught by the new assertion introduced in 3ec14000c6c93b3b0abee52321eb1bf88fad19b7. --- ext/standard/user_filters.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index 2cffcbd9685b5..1fcf6e7d1a037 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -114,7 +114,7 @@ static void userfilter_dtor(php_stream_filter *thisfilter) zval func_name; zval retval; - if (obj == NULL) { + if (Z_ISUNDEF_P(obj)) { /* If there's no object associated then there's nothing to dispose of */ return; } From 485d3acfe6a40e126783b105fde689728fca262a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 12:16:03 +0200 Subject: [PATCH 0007/1346] Make zend_call_function() failure handling consistent This API had rather peculiar behavior in case the provided function is not callable. For some types of failures, it would silently return FAILURE (e.g. a function does not exist), while for others (e.g. a class does not exist) it would generate a warning. Depending on what the calling code does, this can either result in silent failure or duplicate errors. This commit switches the contract such that zend_call_function() always (*) succeeds, though that success might be in the form of throwing an exception. Calling a non-callable will now consistently throw an exception. There are some rare callers that do want to ignore missing methods, for legacy APIs that are specific with optional methods. For these use cases a new zend_call_method_if_exists() API is provided. Calling code generally does not need to explicitly check for and report zend_call_function() failures -- it can rely on zend_call_function() having already done so. However, existing code that does check for failure should continue to work fine. (*) The only exception to this is if EG(active) being false during late engine shutdown. This is not relevant to most code, but code running in destructors and similar may need to be aware of the possibility. --- Zend/zend_API.h | 10 +++ Zend/zend_execute_API.c | 45 ++++++++--- .../tests/assert/assert_variation.phpt | 18 +++-- .../serialize/serialization_objects_008.phpt | 17 ++-- ext/standard/user_filters.c | 25 ++---- ext/xml/tests/bug72085.phpt | 48 ++--------- main/streams/userspace.c | 79 ++++++++----------- 7 files changed, 105 insertions(+), 137 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 124c6c4da04aa..e56468ca7e3b8 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -646,6 +646,9 @@ ZEND_API void zend_fcall_info_argn(zend_fcall_info *fci, uint32_t argc, ...); */ ZEND_API zend_result zend_fcall_info_call(zend_fcall_info *fci, zend_fcall_info_cache *fcc, zval *retval, zval *args); +/* Can only return FAILURE if EG(active) is false during late engine shutdown. + * If the call or call setup throws, EG(exception) will be set and the retval + * will be UNDEF. Otherwise, the retval will be a non-UNDEF value. */ ZEND_API zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache); /* Call the provided zend_function with the given params. @@ -679,6 +682,13 @@ static zend_always_inline void zend_call_known_instance_method_with_1_params( ZEND_API void zend_call_known_instance_method_with_2_params( zend_function *fn, zend_object *object, zval *retval_ptr, zval *param1, zval *param2); +/* Call method if it exists. Return FAILURE if method does not exist or call failed. + * If FAILURE is returned, retval will be UNDEF. As such, destroying retval unconditionally + * is legal. */ +ZEND_API zend_result zend_call_method_if_exists( + zend_object *object, zend_string *method_name, zval *retval, + uint32_t param_count, zval *params); + ZEND_API zend_result zend_set_hash_symbol(zval *symbol, const char *name, size_t name_length, bool is_ref, int num_symbol_tables, ...); ZEND_API zend_result zend_delete_global_variable(zend_string *name); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 448004c8cb141..481105d14c3f2 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -719,7 +719,7 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ } if (EG(exception)) { - return FAILURE; /* we would result in an instable executor otherwise */ + return SUCCESS; /* we would result in an instable executor otherwise */ } ZEND_ASSERT(fci->size == sizeof(zend_fcall_info)); @@ -731,15 +731,14 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ fci_cache = &fci_cache_local; } - if (!zend_is_callable_ex(&fci->function_name, fci->object, IS_CALLABLE_CHECK_SILENT, NULL, fci_cache, &error)) { - if (error) { - zend_string *callable_name - = zend_get_callable_name_ex(&fci->function_name, fci->object); - zend_error(E_WARNING, "Invalid callback %s, %s", ZSTR_VAL(callable_name), error); - efree(error); - zend_string_release_ex(callable_name, 0); - } - return FAILURE; + if (!zend_is_callable_ex(&fci->function_name, fci->object, 0, NULL, fci_cache, &error)) { + ZEND_ASSERT(error && "Should have error if not callable"); + zend_string *callable_name + = zend_get_callable_name_ex(&fci->function_name, fci->object); + zend_throw_error(NULL, "Invalid callback %s, %s", ZSTR_VAL(callable_name), error); + efree(error); + zend_string_release_ex(callable_name, 0); + return SUCCESS; } ZEND_ASSERT(!error); @@ -762,7 +761,7 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ if (UNEXPECTED(EG(exception))) { zend_vm_stack_free_call_frame(call); - return FAILURE; + return SUCCESS; } } @@ -789,7 +788,7 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ cleanup_args: zend_vm_stack_free_args(call); zend_vm_stack_free_call_frame(call); - return FAILURE; + return SUCCESS; } } } @@ -1010,6 +1009,28 @@ ZEND_API void zend_call_known_instance_method_with_2_params( zend_call_known_instance_method(fn, object, retval_ptr, 2, params); } +ZEND_API zend_result zend_call_method_if_exists( + zend_object *object, zend_string *method_name, zval *retval, + uint32_t param_count, zval *params) +{ + zend_fcall_info fci; + fci.size = sizeof(zend_fcall_info); + fci.object = object; + ZVAL_STR(&fci.function_name, method_name); + fci.retval = retval; + fci.param_count = param_count; + fci.params = params; + fci.named_params = NULL; + + zend_fcall_info_cache fcc; + if (!zend_is_callable_ex(&fci.function_name, fci.object, 0, NULL, &fcc, NULL)) { + ZVAL_UNDEF(retval); + return FAILURE; + } + + return zend_call_function(&fci, &fcc); +} + /* 0-9 a-z A-Z _ \ 0x80-0xff */ static const uint32_t valid_chars[8] = { 0x00000000, diff --git a/ext/standard/tests/assert/assert_variation.phpt b/ext/standard/tests/assert/assert_variation.phpt index 1ed3dad230f96..4a81b1ec2be35 100644 --- a/ext/standard/tests/assert/assert_variation.phpt +++ b/ext/standard/tests/assert/assert_variation.phpt @@ -47,11 +47,15 @@ var_dump($r2=assert(0 != 0)); echo"\n"; -echo "Reset the name of the callback routine to a class method and check that it works\n"; +echo "Reset the name of the callback routine to a class method\n"; var_dump($rc=assert_options(ASSERT_CALLBACK, "c1")); echo "assert_options(ASSERT_CALLBACK) => [".assert_options(ASSERT_CALLBACK)."]\n"; echo "ini.get(\"assert.callback\") => [".ini_get("assert.callback")."]\n"; -var_dump($r2=assert(0 != 0)); +try { + var_dump($r2=assert(0 != 0)); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} echo"\n"; echo "Reset callback options to use a class method \n"; @@ -94,11 +98,11 @@ ini.get("assert.callback") => [f2] f3 called bool(false) -Reset the name of the callback routine to a class method and check that it works +Reset the name of the callback routine to a class method string(2) "f3" assert_options(ASSERT_CALLBACK) => [c1] ini.get("assert.callback") => [f2] -bool(false) +Invalid callback c1, function "c1" not found or invalid function name Reset callback options to use a class method string(2) "c1" @@ -110,7 +114,7 @@ array(2) { } ini.get("assert.callback") => [f2] -Class assertion failed 52, "assert(0 != 0)" +Class assertion failed 56, "assert(0 != 0)" bool(false) Reset callback options to use an object method @@ -122,14 +126,14 @@ array(2) { } array(2) { [0]=> - &object(c1)#1 (0) { + &object(c1)#2 (0) { } [1]=> string(6) "assert" } ini.get("assert.callback") => [f2] -Class assertion failed 60, "assert(0 != 0)" +Class assertion failed 64, "assert(0 != 0)" bool(false) Set callback to something silly diff --git a/ext/standard/tests/serialize/serialization_objects_008.phpt b/ext/standard/tests/serialize/serialization_objects_008.phpt index 3670ddde5bbc2..650ba56330d4a 100644 --- a/ext/standard/tests/serialize/serialization_objects_008.phpt +++ b/ext/standard/tests/serialize/serialization_objects_008.phpt @@ -3,14 +3,11 @@ Bad unserialize_callback_func --FILE-- ---EXPECTF-- -Warning: unserialize(): defined (Nonexistent) but not found in %s on line %d -object(__PHP_Incomplete_Class)#%d (1) { - ["__PHP_Incomplete_Class_Name"]=> - string(3) "FOO" +try { + unserialize('O:3:"FOO":0:{}'); +} catch (Error $e) { + echo $e->getMessage(), "\n"; } -Done +?> +--EXPECT-- +Invalid callback Nonexistent, function "Nonexistent" not found or invalid function name diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index 1fcf6e7d1a037..aee9123610f27 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -111,7 +111,6 @@ PHP_RSHUTDOWN_FUNCTION(user_filters) static void userfilter_dtor(php_stream_filter *thisfilter) { zval *obj = &thisfilter->abstract; - zval func_name; zval retval; if (Z_ISUNDEF_P(obj)) { @@ -119,16 +118,11 @@ static void userfilter_dtor(php_stream_filter *thisfilter) return; } - ZVAL_STRINGL(&func_name, "onclose", sizeof("onclose")-1); - - call_user_function(NULL, - obj, - &func_name, - &retval, - 0, NULL); + zend_string *func_name = zend_string_init("onclose", sizeof("onclose")-1, 0); + zend_call_method_if_exists(Z_OBJ_P(obj), func_name, &retval, 0, NULL); + zend_string_release(func_name); zval_ptr_dtor(&retval); - zval_ptr_dtor(&func_name); /* kill the object */ zval_ptr_dtor(obj); @@ -243,7 +237,6 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, struct php_user_filter_data *fdat = NULL; php_stream_filter *filter; zval obj; - zval func_name; zval retval; size_t len; @@ -319,15 +312,9 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, } /* invoke the constructor */ - ZVAL_STRINGL(&func_name, "oncreate", sizeof("oncreate")-1); - - call_user_function(NULL, - &obj, - &func_name, - &retval, - 0, NULL); - - zval_ptr_dtor(&func_name); + zend_string *func_name = zend_string_init("oncreate", sizeof("oncreate")-1, 0); + zend_call_method_if_exists(Z_OBJ(obj), func_name, &retval, 0, NULL); + zend_string_release(func_name); if (Z_TYPE(retval) != IS_UNDEF) { if (Z_TYPE(retval) == IS_FALSE) { diff --git a/ext/xml/tests/bug72085.phpt b/ext/xml/tests/bug72085.phpt index e2a623ec37859..cfdaf47386bf8 100644 --- a/ext/xml/tests/bug72085.phpt +++ b/ext/xml/tests/bug72085.phpt @@ -6,45 +6,11 @@ xml ", 10)); +try { + xml_parse($var1, str_repeat("", 10)); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} ?> ---EXPECTF-- -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d - -Warning: Invalid callback Exception::__invoke, no array or string given in %s on line %d - -Warning: xml_parse(): Unable to call handler in %s on line %d +--EXPECT-- +Invalid callback Exception::__invoke, no array or string given diff --git a/main/streams/userspace.c b/main/streams/userspace.c index f706852282793..67d88227c77d7 100644 --- a/main/streams/userspace.c +++ b/main/streams/userspace.c @@ -275,6 +275,13 @@ typedef struct _php_userstream_data php_userstream_data_t; }}} **/ +static zend_result call_method_if_exists( + zval *object, zval *method_name, zval *retval, uint32_t param_count, zval *params) +{ + return zend_call_method_if_exists( + Z_OBJ_P(object), Z_STR_P(method_name), retval, param_count, params); +} + static void user_stream_create_object(struct php_user_stream_wrapper *uwrap, php_stream_context *context, zval *object) { if (uwrap->ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { @@ -350,7 +357,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char * ZVAL_STRING(&zfuncname, USERSTREAM_OPEN); zend_try { - call_result = call_user_function(NULL, &us->object, &zfuncname, &zretval, 4, args); + call_result = call_method_if_exists(&us->object, &zfuncname, &zretval, 4, args); } zend_catch { FG(user_stream_current_filename) = NULL; zend_bailout(); @@ -424,7 +431,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char ZVAL_STRING(&zfuncname, USERSTREAM_DIR_OPEN); - call_result = call_user_function(NULL, &us->object, &zfuncname, &zretval, 2, args); + call_result = call_method_if_exists(&us->object, &zfuncname, &zretval, 2, args); if (call_result == SUCCESS && Z_TYPE(zretval) != IS_UNDEF && zval_is_true(&zretval)) { /* the stream is now open! */ @@ -563,7 +570,7 @@ static ssize_t php_userstreamop_write(php_stream *stream, const char *buf, size_ ZVAL_STRINGL(&args[0], (char*)buf, count); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 1, args); zval_ptr_dtor(&args[0]); zval_ptr_dtor(&func_name); @@ -612,7 +619,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count ZVAL_LONG(&args[0], count); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 1, args); zval_ptr_dtor(&args[0]); zval_ptr_dtor(&func_name); @@ -651,7 +658,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count /* since the user stream has no way of setting the eof flag directly, we need to ask it if we hit eof */ ZVAL_STRINGL(&func_name, USERSTREAM_EOF, sizeof(USERSTREAM_EOF)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&func_name); if (EG(exception)) { @@ -684,7 +691,7 @@ static int php_userstreamop_close(php_stream *stream, int close_handle) ZVAL_STRINGL(&func_name, USERSTREAM_CLOSE, sizeof(USERSTREAM_CLOSE)-1); - call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&retval); zval_ptr_dtor(&func_name); @@ -708,7 +715,7 @@ static int php_userstreamop_flush(php_stream *stream) ZVAL_STRINGL(&func_name, USERSTREAM_FLUSH, sizeof(USERSTREAM_FLUSH)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF && zval_is_true(&retval)) call_result = 0; @@ -736,7 +743,7 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when ZVAL_LONG(&args[0], offset); ZVAL_LONG(&args[1], whence); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 2, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 2, args); zval_ptr_dtor(&args[0]); zval_ptr_dtor(&args[1]); @@ -766,7 +773,7 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when /* now determine where we are */ ZVAL_STRINGL(&func_name, USERSTREAM_TELL, sizeof(USERSTREAM_TELL)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) == IS_LONG) { *newoffs = Z_LVAL(retval); @@ -832,7 +839,7 @@ static int php_userstreamop_stat(php_stream *stream, php_stream_statbuf *ssb) ZVAL_STRINGL(&func_name, USERSTREAM_STAT, sizeof(USERSTREAM_STAT)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) == IS_ARRAY) { if (SUCCESS == statbuf_from_array(&retval, ssb)) @@ -862,7 +869,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value switch (option) { case PHP_STREAM_OPTION_CHECK_LIVENESS: ZVAL_STRINGL(&func_name, USERSTREAM_EOF, sizeof(USERSTREAM_EOF)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { ret = zval_is_true(&retval) ? PHP_STREAM_OPTION_RETURN_ERR : PHP_STREAM_OPTION_RETURN_OK; } else { @@ -896,7 +903,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value /* TODO wouldblock */ ZVAL_STRINGL(&func_name, USERSTREAM_LOCK, sizeof(USERSTREAM_LOCK)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 1, args); if (call_result == SUCCESS && (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { ret = (Z_TYPE(retval) == IS_FALSE); @@ -931,7 +938,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value ptrdiff_t new_size = *(ptrdiff_t*) ptrparam; if (new_size >= 0 && new_size <= (ptrdiff_t)LONG_MAX) { ZVAL_LONG(&args[0], (zend_long)new_size); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 1, args); if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) { if (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE) { ret = (Z_TYPE(retval) == IS_TRUE) ? PHP_STREAM_OPTION_RETURN_OK : @@ -991,7 +998,7 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value break; } - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 3, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 3, args); if (call_result == FAILURE) { php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_SET_OPTION " is not implemented!", @@ -1037,11 +1044,7 @@ static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int ZVAL_STRING(&zfuncname, USERSTREAM_UNLINK); - call_result = call_user_function(NULL, - &object, - &zfuncname, - &zretval, - 1, args); + call_result = call_method_if_exists(&object, &zfuncname, &zretval, 1, args); if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { ret = (Z_TYPE(zretval) == IS_TRUE); @@ -1081,11 +1084,7 @@ static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from ZVAL_STRING(&zfuncname, USERSTREAM_RENAME); - call_result = call_user_function(NULL, - &object, - &zfuncname, - &zretval, - 2, args); + call_result = call_method_if_exists(&object, &zfuncname, &zretval, 2, args); if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { ret = (Z_TYPE(zretval) == IS_TRUE); @@ -1127,11 +1126,7 @@ static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int ZVAL_STRING(&zfuncname, USERSTREAM_MKDIR); - call_result = call_user_function(NULL, - &object, - &zfuncname, - &zretval, - 3, args); + call_result = call_method_if_exists(&object, &zfuncname, &zretval, 3, args); if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { ret = (Z_TYPE(zretval) == IS_TRUE); @@ -1173,11 +1168,7 @@ static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, ZVAL_STRING(&zfuncname, USERSTREAM_RMDIR); - call_result = call_user_function(NULL, - &object, - &zfuncname, - &zretval, - 2, args); + call_result = call_method_if_exists(&object, &zfuncname, &zretval, 2, args); if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { ret = (Z_TYPE(zretval) == IS_TRUE); @@ -1243,11 +1234,7 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i ZVAL_STRING(&zfuncname, USERSTREAM_METADATA); - call_result = call_user_function(NULL, - &object, - &zfuncname, - &zretval, - 3, args); + call_result = call_method_if_exists(&object, &zfuncname, &zretval, 3, args); if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { ret = Z_TYPE(zretval) == IS_TRUE; @@ -1290,11 +1277,7 @@ static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, i ZVAL_STRING(&zfuncname, USERSTREAM_STATURL); - call_result = call_user_function(NULL, - &object, - &zfuncname, - &zretval, - 2, args); + call_result = call_method_if_exists(&object, &zfuncname, &zretval, 2, args); if (call_result == SUCCESS && Z_TYPE(zretval) == IS_ARRAY) { /* We got the info we needed */ @@ -1334,7 +1317,7 @@ static ssize_t php_userstreamop_readdir(php_stream *stream, char *buf, size_t co ZVAL_STRINGL(&func_name, USERSTREAM_DIR_READ, sizeof(USERSTREAM_DIR_READ)-1); - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); if (call_result == SUCCESS && Z_TYPE(retval) != IS_FALSE && Z_TYPE(retval) != IS_TRUE) { convert_to_string(&retval); @@ -1362,7 +1345,7 @@ static int php_userstreamop_closedir(php_stream *stream, int close_handle) ZVAL_STRINGL(&func_name, USERSTREAM_DIR_CLOSE, sizeof(USERSTREAM_DIR_CLOSE)-1); - call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&retval); zval_ptr_dtor(&func_name); @@ -1382,7 +1365,7 @@ static int php_userstreamop_rewinddir(php_stream *stream, zend_off_t offset, int ZVAL_STRINGL(&func_name, USERSTREAM_DIR_REWIND, sizeof(USERSTREAM_DIR_REWIND)-1); - call_user_function(NULL, &us->object, &func_name, &retval, 0, NULL); + call_method_if_exists(&us->object, &func_name, &retval, 0, NULL); zval_ptr_dtor(&retval); zval_ptr_dtor(&func_name); @@ -1412,7 +1395,7 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr) break; } - call_result = call_user_function(NULL, &us->object, &func_name, &retval, 1, args); + call_result = call_method_if_exists(&us->object, &func_name, &retval, 1, args); do { if (call_result == FAILURE) { From 449bb0577ca17ffe1ca2031dfee842af3cdb955b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 16:12:48 +0200 Subject: [PATCH 0008/1346] Drop IS_CALLABLE_CHECK_SILENT flag This flag was suppressing *some* but not all errors in zend_is_callable(), and is no longer used. You can avoid errors by omitting the error argument. --- Zend/zend_API.c | 4 ++-- Zend/zend_API.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 5f003c9e25d8d..c8acc13c54611 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3492,7 +3492,7 @@ static zend_always_inline bool zend_is_callable_check_func(int check_flags, zval fcc->calling_scope = ce_org; } else { /* We already checked for plain function before. */ - if (error && !(check_flags & IS_CALLABLE_CHECK_SILENT)) { + if (error) { zend_spprintf(error, 0, "function \"%s\" not found or invalid function name", Z_STRVAL_P(callable)); } return 0; @@ -3610,7 +3610,7 @@ static zend_always_inline bool zend_is_callable_check_func(int check_flags, zval } } } - } else if (error && !(check_flags & IS_CALLABLE_CHECK_SILENT)) { + } else if (error) { if (fcc->calling_scope) { if (error) zend_spprintf(error, 0, "class %s does not have a method \"%s\"", ZSTR_VAL(fcc->calling_scope->name), ZSTR_VAL(mname)); } else { diff --git a/Zend/zend_API.h b/Zend/zend_API.h index e56468ca7e3b8..1931c3a75c46b 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -378,7 +378,6 @@ ZEND_API zend_result zend_disable_class(const char *class_name, size_t class_nam ZEND_API ZEND_COLD void zend_wrong_param_count(void); #define IS_CALLABLE_CHECK_SYNTAX_ONLY (1<<0) -#define IS_CALLABLE_CHECK_SILENT (1<<3) ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc); ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object); From a8254ed57685c134073f41251365dc901c1b0ab8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 16:33:22 +0200 Subject: [PATCH 0009/1346] Simplify unserialize_callback_func handling --- ext/standard/var_unserializer.re | 35 ++++++++------------------------ 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 77f83f34475f1..b7e10429e9b73 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -1201,22 +1201,17 @@ object ":" uiv ":" ["] { /* Try to find class directly */ BG(serialize_lock)++; ce = zend_lookup_class_ex(class_name, lc_name, 0); - zend_string_release_ex(lc_name, 0); - if (ce) { - BG(serialize_lock)--; - if (EG(exception)) { - zend_string_release_ex(class_name, 0); - return 0; - } - break; - } BG(serialize_lock)--; - + zend_string_release_ex(lc_name, 0); if (EG(exception)) { zend_string_release_ex(class_name, 0); return 0; } + if (ce) { + break; + } + /* Check for unserialize callback */ if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) { incomplete_class = 1; @@ -1227,29 +1222,15 @@ object ":" uiv ":" ["] { /* Call unserialize callback */ ZVAL_STRING(&user_func, PG(unserialize_callback_func)); - ZVAL_STR_COPY(&args[0], class_name); + ZVAL_STR(&args[0], class_name); BG(serialize_lock)++; - if (call_user_function(NULL, NULL, &user_func, &retval, 1, args) != SUCCESS) { - BG(serialize_lock)--; - if (EG(exception)) { - zend_string_release_ex(class_name, 0); - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - return 0; - } - php_error_docref(NULL, E_WARNING, "defined (%s) but not found", Z_STRVAL(user_func)); - incomplete_class = 1; - ce = PHP_IC_ENTRY; - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - break; - } + call_user_function(NULL, NULL, &user_func, &retval, 1, args); BG(serialize_lock)--; zval_ptr_dtor(&retval); + if (EG(exception)) { zend_string_release_ex(class_name, 0); zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); return 0; } From e41f7e59891335681be77f4404b519192ab39e7b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 16:40:50 +0200 Subject: [PATCH 0010/1346] Simplify handler invocation in xsltprocessor --- ext/xsl/xsltprocessor.c | 51 ++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index 1bb2c46264178..bb52f75ac2c2d 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -96,7 +96,7 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t xsltTransformContextPtr tctxt; zval *args = NULL; zval retval; - int result, i; + int i; int error = 0; zend_fcall_info fci; zval handler; @@ -251,37 +251,30 @@ static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int t /* Push an empty string, so that we at least have an xslt result... */ valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); } else { - result = zend_call_function(&fci, NULL); - if (result == FAILURE) { - if (Z_TYPE(handler) == IS_STRING) { - php_error_docref(NULL, E_WARNING, "Unable to call handler %s()", Z_STRVAL(handler)); - valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); + zend_call_function(&fci, NULL); + if (Z_ISUNDEF(retval)) { + /* Exception thrown, don't do anything further. */ + } else if (Z_TYPE(retval) == IS_OBJECT && instanceof_function(Z_OBJCE(retval), dom_node_class_entry)) { + xmlNode *nodep; + dom_object *obj; + if (intern->node_list == NULL) { + intern->node_list = zend_new_array(0); } - /* retval is == NULL, when an exception occurred, don't report anything, because PHP itself will handle that */ - } else if (Z_ISUNDEF(retval)) { + Z_ADDREF(retval); + zend_hash_next_index_insert(intern->node_list, &retval); + obj = Z_DOMOBJ_P(&retval); + nodep = dom_object_get_node(obj); + valuePush(ctxt, xmlXPathNewNodeSet(nodep)); + } else if (Z_TYPE(retval) == IS_TRUE || Z_TYPE(retval) == IS_FALSE) { + valuePush(ctxt, xmlXPathNewBoolean(Z_TYPE(retval) == IS_TRUE)); + } else if (Z_TYPE(retval) == IS_OBJECT) { + php_error_docref(NULL, E_WARNING, "A PHP Object cannot be converted to a XPath-string"); + valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); } else { - if (Z_TYPE(retval) == IS_OBJECT && instanceof_function(Z_OBJCE(retval), dom_node_class_entry)) { - xmlNode *nodep; - dom_object *obj; - if (intern->node_list == NULL) { - intern->node_list = zend_new_array(0); - } - Z_ADDREF(retval); - zend_hash_next_index_insert(intern->node_list, &retval); - obj = Z_DOMOBJ_P(&retval); - nodep = dom_object_get_node(obj); - valuePush(ctxt, xmlXPathNewNodeSet(nodep)); - } else if (Z_TYPE(retval) == IS_TRUE || Z_TYPE(retval) == IS_FALSE) { - valuePush(ctxt, xmlXPathNewBoolean(Z_TYPE(retval) == IS_TRUE)); - } else if (Z_TYPE(retval) == IS_OBJECT) { - php_error_docref(NULL, E_WARNING, "A PHP Object cannot be converted to a XPath-string"); - valuePush(ctxt, xmlXPathNewString((const xmlChar *) "")); - } else { - convert_to_string(&retval); - valuePush(ctxt, xmlXPathNewString((xmlChar *) Z_STRVAL(retval))); - } - zval_ptr_dtor(&retval); + convert_to_string(&retval); + valuePush(ctxt, xmlXPathNewString((xmlChar *) Z_STRVAL(retval))); } + zval_ptr_dtor(&retval); } zend_string_release_ex(callable, 0); zval_ptr_dtor(&handler); From 00f7b0d6e71197f73726e7e77ca4971b281637ea Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 16:58:46 +0200 Subject: [PATCH 0011/1346] Don't unnecessary fetch error in is_callable() As we just end up freeing it afterwards, avoid populating it in the first place. --- ext/standard/type.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ext/standard/type.c b/ext/standard/type.c index 93df434fe310e..a564446bd8ba6 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -402,7 +402,6 @@ PHP_FUNCTION(is_callable) { zval *var, *callable_name = NULL; zend_string *name; - char *error; bool retval; bool syntax_only = 0; int check_flags = 0; @@ -418,14 +417,10 @@ PHP_FUNCTION(is_callable) check_flags |= IS_CALLABLE_CHECK_SYNTAX_ONLY; } if (ZEND_NUM_ARGS() > 2) { - retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error); + retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, NULL); ZEND_TRY_ASSIGN_REF_STR(callable_name, name); } else { - retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); - } - if (error) { - /* ignore errors */ - efree(error); + retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, NULL); } RETURN_BOOL(retval); From 6b8d4151cf8d417fa640f50ba31bde042b5e5195 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 16:59:35 +0200 Subject: [PATCH 0012/1346] Remove leftover zval_ptr_dtor This should have been dropped as part of a8254ed57685c134073f41251365dc901c1b0ab8. --- ext/standard/var_unserializer.re | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index b7e10429e9b73..0556d5522ce5d 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -1244,7 +1244,6 @@ object ":" uiv ":" ["] { BG(serialize_lock)--; zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); } while (0); *p = YYCURSOR; From 2ffa70b97c73b31ab9e2a88300380a3498cab102 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 2 Sep 2021 10:29:15 +0200 Subject: [PATCH 0013/1346] Slightly clean up is_callable implementation And adjust an error message to line up with the error message used for $callable() in zend_execute.c. --- Zend/zend_API.c | 82 ++++++++----------- .../tests/CallbackFilterIteratorTest-002.phpt | 2 +- .../tests/array/array_diff_uassoc_error.phpt | 6 +- .../tests/array/array_map_object1.phpt | 2 +- .../tests/array/array_map_variation14.phpt | 2 +- .../tests/array/array_map_variation17.phpt | 2 +- tests/output/ob_start_basic_006.phpt | 10 +-- tests/output/ob_start_error_003.phpt | 2 +- 8 files changed, 48 insertions(+), 60 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index c8acc13c54611..294a527434767 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3727,63 +3727,51 @@ ZEND_API bool zend_is_callable_at_frame( case IS_ARRAY: { - zval *method = NULL; - zval *obj = NULL; - - if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) { - obj = zend_hash_index_find(Z_ARRVAL_P(callable), 0); - method = zend_hash_index_find(Z_ARRVAL_P(callable), 1); + if (zend_hash_num_elements(Z_ARRVAL_P(callable)) != 2) { + if (error) *error = estrdup("array callback must have exactly two members"); + return 0; } - do { - if (obj == NULL || method == NULL) { - break; - } - - ZVAL_DEREF(method); - if (Z_TYPE_P(method) != IS_STRING) { - break; - } - - ZVAL_DEREF(obj); - if (Z_TYPE_P(obj) == IS_STRING) { - if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) { - return 1; - } - - if (!zend_is_callable_check_class(Z_STR_P(obj), get_scope(frame), frame, fcc, &strict_class, error)) { - return 0; - } - - } else if (Z_TYPE_P(obj) == IS_OBJECT) { + zval *obj = zend_hash_index_find(Z_ARRVAL_P(callable), 0); + zval *method = zend_hash_index_find(Z_ARRVAL_P(callable), 1); + if (!obj || !method) { + if (error) *error = estrdup("array callback has to contain indices 0 and 1"); + return 0; + } - fcc->calling_scope = Z_OBJCE_P(obj); /* TBFixed: what if it's overloaded? */ + ZVAL_DEREF(obj); + if (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT) { + if (error) *error = estrdup("first array member is not a valid class name or object"); + return 0; + } - fcc->object = Z_OBJ_P(obj); + ZVAL_DEREF(method); + if (Z_TYPE_P(method) != IS_STRING) { + if (error) *error = estrdup("second array member is not a valid method"); + return 0; + } - if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) { - fcc->called_scope = fcc->calling_scope; - return 1; - } - } else { - break; + if (Z_TYPE_P(obj) == IS_STRING) { + if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) { + return 1; } - callable = method; - goto check_func; - - } while (0); - if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) { - if (!obj || (!Z_ISREF_P(obj)? - (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT) : - (Z_TYPE_P(Z_REFVAL_P(obj)) != IS_STRING && Z_TYPE_P(Z_REFVAL_P(obj)) != IS_OBJECT))) { - if (error) *error = estrdup("first array member is not a valid class name or object"); - } else { - if (error) *error = estrdup("second array member is not a valid method"); + if (!zend_is_callable_check_class(Z_STR_P(obj), get_scope(frame), frame, fcc, &strict_class, error)) { + return 0; } } else { - if (error) *error = estrdup("array must have exactly two members"); + ZEND_ASSERT(Z_TYPE_P(obj) == IS_OBJECT); + fcc->calling_scope = Z_OBJCE_P(obj); /* TBFixed: what if it's overloaded? */ + fcc->object = Z_OBJ_P(obj); + + if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) { + fcc->called_scope = fcc->calling_scope; + return 1; + } } + + callable = method; + goto check_func; } return 0; case IS_OBJECT: diff --git a/ext/spl/tests/CallbackFilterIteratorTest-002.phpt b/ext/spl/tests/CallbackFilterIteratorTest-002.phpt index b8a612f303c77..bba7e0f8a9ada 100644 --- a/ext/spl/tests/CallbackFilterIteratorTest-002.phpt +++ b/ext/spl/tests/CallbackFilterIteratorTest-002.phpt @@ -45,5 +45,5 @@ try { CallbackFilterIterator::__construct() expects exactly 2 arguments, 0 given CallbackFilterIterator::__construct() expects exactly 2 arguments, 1 given CallbackFilterIterator::__construct(): Argument #2 ($callback) must be a valid callback, no array or string given -CallbackFilterIterator::__construct(): Argument #2 ($callback) must be a valid callback, array must have exactly two members +CallbackFilterIterator::__construct(): Argument #2 ($callback) must be a valid callback, array callback must have exactly two members some message diff --git a/ext/standard/tests/array/array_diff_uassoc_error.phpt b/ext/standard/tests/array/array_diff_uassoc_error.phpt index e22e0ad24da18..1d158dc2d49c0 100644 --- a/ext/standard/tests/array/array_diff_uassoc_error.phpt +++ b/ext/standard/tests/array/array_diff_uassoc_error.phpt @@ -45,8 +45,8 @@ try { *** Testing array_diff_uassoc() : error conditions *** -- Testing array_diff_uassoc() function with more than expected no. of arguments -- -array_diff_uassoc(): Argument #4 must be a valid callback, array must have exactly two members -array_diff_uassoc(): Argument #6 must be a valid callback, array must have exactly two members +array_diff_uassoc(): Argument #4 must be a valid callback, array callback must have exactly two members +array_diff_uassoc(): Argument #6 must be a valid callback, array callback must have exactly two members -- Testing array_diff_uassoc() function with less than expected no. of arguments -- -array_diff_uassoc(): Argument #2 must be a valid callback, array must have exactly two members +array_diff_uassoc(): Argument #2 must be a valid callback, array callback must have exactly two members diff --git a/ext/standard/tests/array/array_map_object1.phpt b/ext/standard/tests/array/array_map_object1.phpt index 88ebe2414b3f2..d86919bf9c4e8 100644 --- a/ext/standard/tests/array/array_map_object1.phpt +++ b/ext/standard/tests/array/array_map_object1.phpt @@ -140,7 +140,7 @@ array_map(): Argument #1 ($callback) must be a valid callback or null, cannot ac -- class without members -- EmptyClass -array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members +array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members -- abstract class -- ChildClass::emptyFunction diff --git a/ext/standard/tests/array/array_map_variation14.phpt b/ext/standard/tests/array/array_map_variation14.phpt index d1f0b517ea4f7..d8977e73acd41 100644 --- a/ext/standard/tests/array/array_map_variation14.phpt +++ b/ext/standard/tests/array/array_map_variation14.phpt @@ -120,5 +120,5 @@ array(2) { -- with empty string -- array_map(): Argument #1 ($callback) must be a valid callback or null, function "" not found or invalid function name -- with empty array -- -array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members +array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members Done diff --git a/ext/standard/tests/array/array_map_variation17.phpt b/ext/standard/tests/array/array_map_variation17.phpt index 78b8d8c5c838f..751167baa04ad 100644 --- a/ext/standard/tests/array/array_map_variation17.phpt +++ b/ext/standard/tests/array/array_map_variation17.phpt @@ -121,7 +121,7 @@ array_map(): Argument #1 ($callback) must be a valid callback or null, function array_map(): Argument #1 ($callback) must be a valid callback or null, function "" not found or invalid function name -- Iteration 16 -- -array_map(): Argument #1 ($callback) must be a valid callback or null, array must have exactly two members +array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members -- Iteration 17 -- array_map(): Argument #1 ($callback) must be a valid callback or null, first array member is not a valid class name or object diff --git a/tests/output/ob_start_basic_006.phpt b/tests/output/ob_start_basic_006.phpt index 30b086c63d342..af63aabab7124 100644 --- a/tests/output/ob_start_basic_006.phpt +++ b/tests/output/ob_start_basic_006.phpt @@ -73,7 +73,7 @@ checkAndClean(); --EXPECTF-- ---> Test arrays: -Warning: ob_start(): array must have exactly two members in %s on line %d +Warning: ob_start(): array callback must have exactly two members in %s on line %d Notice: ob_start(): Failed to create buffer in %s on line %d bool(false) @@ -89,7 +89,7 @@ Array ( ) -Warning: ob_start(): array must have exactly two members in %s on line %d +Warning: ob_start(): array callback must have exactly two members in %s on line %d Notice: ob_start(): Failed to create buffer in %s on line %d bool(false) @@ -97,7 +97,7 @@ Array ( ) -Warning: ob_start(): array must have exactly two members in %s on line %d +Warning: ob_start(): array callback must have exactly two members in %s on line %d Notice: ob_start(): Failed to create buffer in %s on line %d bool(false) @@ -105,7 +105,7 @@ Array ( ) -Warning: ob_start(): array must have exactly two members in %s on line %d +Warning: ob_start(): array callback must have exactly two members in %s on line %d Notice: ob_start(): Failed to create buffer in %s on line %d bool(false) @@ -125,7 +125,7 @@ Array ) -Warning: ob_start(): array must have exactly two members in %s on line %d +Warning: ob_start(): array callback must have exactly two members in %s on line %d Notice: ob_start(): Failed to create buffer in %s on line %d bool(false) diff --git a/tests/output/ob_start_error_003.phpt b/tests/output/ob_start_error_003.phpt index 70e86e3728d5f..d5e1be106c99f 100644 --- a/tests/output/ob_start_error_003.phpt +++ b/tests/output/ob_start_error_003.phpt @@ -14,7 +14,7 @@ var_dump(ob_start(array($c))); echo "done" ?> --EXPECTF-- -Warning: ob_start(): array must have exactly two members in %s on line %d +Warning: ob_start(): array callback must have exactly two members in %s on line %d Notice: ob_start(): Failed to create buffer in %s on line %d bool(false) From 0ac60d605567f3274c0db93afb5fb9c04ebf3743 Mon Sep 17 00:00:00 2001 From: twosee Date: Fri, 3 Sep 2021 09:37:42 +0800 Subject: [PATCH 0014/1346] Micro optimizations for xp_ssl.c (#7447) If certfile/private_key points to a file that doesn't exist, it throw a warning and return failure now. Also fixed sni_server tests. Co-authored-by: Nikita Popov --- ext/openssl/tests/sni_server.phpt | 1 - ext/openssl/tests/sni_server_key_cert.phpt | 1 - ext/openssl/xp_ssl.c | 67 ++++++++++------------ 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/ext/openssl/tests/sni_server.phpt b/ext/openssl/tests/sni_server.phpt index cb3b3d771684f..ecfcf7a8172ea 100644 --- a/ext/openssl/tests/sni_server.phpt +++ b/ext/openssl/tests/sni_server.phpt @@ -11,7 +11,6 @@ if (!function_exists("proc_open")) die("skip no proc_open"); $serverCode = <<<'CODE' $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ - 'local_cert' => __DIR__ . '/domain1.pem', 'SNI_server_certs' => [ "cs.php.net" => __DIR__ . "/sni_server_cs.pem", "uk.php.net" => __DIR__ . "/sni_server_uk.pem", diff --git a/ext/openssl/tests/sni_server_key_cert.phpt b/ext/openssl/tests/sni_server_key_cert.phpt index 2d0ef8c194480..a4e1f5e42a312 100644 --- a/ext/openssl/tests/sni_server_key_cert.phpt +++ b/ext/openssl/tests/sni_server_key_cert.phpt @@ -11,7 +11,6 @@ if (!function_exists("proc_open")) die("skip no proc_open"); $serverCode = <<<'CODE' $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; $ctx = stream_context_create(['ssl' => [ - 'local_cert' => __DIR__ . '/domain1.pem', 'SNI_server_certs' => [ "cs.php.net" => [ 'local_cert' => __DIR__ . "/sni_server_cs_cert.pem", diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 15d11e3b9b63a..5564bf6f08681 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -897,35 +897,30 @@ static int php_openssl_set_local_cert(SSL_CTX *ctx, php_stream *stream) /* {{{ * char resolved_path_buff[MAXPATHLEN]; const char *private_key = NULL; - if (VCWD_REALPATH(certfile, resolved_path_buff)) { - /* a certificate to use for authentication */ - if (SSL_CTX_use_certificate_chain_file(ctx, resolved_path_buff) != 1) { - php_error_docref(NULL, E_WARNING, - "Unable to set local cert chain file `%s'; Check that your cafile/capath " - "settings include details of your certificate and its issuer", - certfile); - return FAILURE; - } - GET_VER_OPT_STRING("local_pk", private_key); - - if (private_key) { - char resolved_path_buff_pk[MAXPATHLEN]; - if (VCWD_REALPATH(private_key, resolved_path_buff_pk)) { - if (SSL_CTX_use_PrivateKey_file(ctx, resolved_path_buff_pk, SSL_FILETYPE_PEM) != 1) { - php_error_docref(NULL, E_WARNING, "Unable to set private key file `%s'", resolved_path_buff_pk); - return FAILURE; - } - } - } else { - if (SSL_CTX_use_PrivateKey_file(ctx, resolved_path_buff, SSL_FILETYPE_PEM) != 1) { - php_error_docref(NULL, E_WARNING, "Unable to set private key file `%s'", resolved_path_buff); - return FAILURE; - } - } + if (!VCWD_REALPATH(certfile, resolved_path_buff)) { + php_error_docref(NULL, E_WARNING, "Unable to get real path of certificate file `%s'", certfile); + return FAILURE; + } + /* a certificate to use for authentication */ + if (SSL_CTX_use_certificate_chain_file(ctx, resolved_path_buff) != 1) { + php_error_docref(NULL, E_WARNING, + "Unable to set local cert chain file `%s'; Check that your cafile/capath " + "settings include details of your certificate and its issuer", + certfile); + return FAILURE; + } - if (!SSL_CTX_check_private_key(ctx)) { - php_error_docref(NULL, E_WARNING, "Private key does not match certificate!"); - } + GET_VER_OPT_STRING("local_pk", private_key); + if (private_key && !VCWD_REALPATH(private_key, resolved_path_buff)) { + php_error_docref(NULL, E_WARNING, "Unable to get real path of private key file `%s'", private_key); + return FAILURE; + } + if (SSL_CTX_use_PrivateKey_file(ctx, resolved_path_buff, SSL_FILETYPE_PEM) != 1) { + php_error_docref(NULL, E_WARNING, "Unable to set private key file `%s'", resolved_path_buff); + return FAILURE; + } + if (!SSL_CTX_check_private_key(ctx)) { + php_error_docref(NULL, E_WARNING, "Private key does not match certificate!"); } } @@ -1614,11 +1609,16 @@ int php_openssl_setup_crypto(php_stream *stream, /* We need to do slightly different things based on client/server method * so lets remember which method was selected */ sslsock->is_client = cparam->inputs.method & STREAM_CRYPTO_IS_CLIENT; - method_flags = ((cparam->inputs.method >> 1) << 1); + method_flags = cparam->inputs.method & ~STREAM_CRYPTO_IS_CLIENT; method = sslsock->is_client ? SSLv23_client_method() : SSLv23_server_method(); sslsock->ctx = SSL_CTX_new(method); + if (sslsock->ctx == NULL) { + php_error_docref(NULL, E_WARNING, "SSL context creation failure"); + return FAILURE; + } + GET_VER_OPT_LONG("min_proto_version", min_version); GET_VER_OPT_LONG("max_proto_version", max_version); method_flags = php_openssl_get_proto_version_flags(method_flags, min_version, max_version); @@ -1628,11 +1628,6 @@ int php_openssl_setup_crypto(php_stream *stream, ssl_ctx_options = SSL_OP_ALL; #endif - if (sslsock->ctx == NULL) { - php_error_docref(NULL, E_WARNING, "SSL context creation failure"); - return FAILURE; - } - if (GET_VER_OPT("no_ticket") && zend_is_true(val)) { ssl_ctx_options |= SSL_OP_NO_TICKET; } @@ -2293,9 +2288,7 @@ static inline int php_openssl_tcp_sockop_accept(php_stream *stream, php_openssl_ if (xparam->outputs.client && sock->enable_on_connect) { /* remove the client bit */ - if (sock->method & STREAM_CRYPTO_IS_CLIENT) { - sock->method = ((sock->method >> 1) << 1); - } + sock->method &= ~STREAM_CRYPTO_IS_CLIENT; clisockdata->method = sock->method; From e16af8e84d33051cbf1605e2710f32f0ade18f52 Mon Sep 17 00:00:00 2001 From: twosee Date: Fri, 3 Sep 2021 09:38:07 +0800 Subject: [PATCH 0015/1346] Support generate lldb command in run-tests.php (#7451) --- run-tests.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/run-tests.php b/run-tests.php index 1be42ecd9fcee..e7df5d694624e 100755 --- a/run-tests.php +++ b/run-tests.php @@ -2789,6 +2789,9 @@ function run_test(string $php, $file, array $env): string "gdb") gdb --args {$orig_cmd} ;; +"lldb") + lldb -- {$orig_cmd} + ;; "valgrind") USE_ZEND_ALLOC=0 valgrind $2 ${orig_cmd} ;; From 400c6055b19bdc2d3586233a90d0b20ff8e4ec95 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 2 Sep 2021 21:28:49 +0100 Subject: [PATCH 0016/1346] Remove mysqli_close that prevented CLEAN from running properly --- ext/mysqli/tests/clean_table.inc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ext/mysqli/tests/clean_table.inc b/ext/mysqli/tests/clean_table.inc index a3dc8b66debf1..229b42f5eddcc 100644 --- a/ext/mysqli/tests/clean_table.inc +++ b/ext/mysqli/tests/clean_table.inc @@ -8,7 +8,4 @@ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { if (!mysqli_query($link, 'DROP TABLE IF EXISTS test')) { printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link)); -} - -mysqli_close($link); -?> +} \ No newline at end of file From 2ab4482d342b52c414bc41c0cfc0af9a17874630 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 3 Sep 2021 10:52:30 +0200 Subject: [PATCH 0017/1346] Fix some broken or unnecessary CLEAN sections --- ext/session/tests/session_save_path_variation5.phpt | 2 -- ext/soap/tests/bug73037.phpt | 4 ---- ext/sockets/tests/socket_getopt.phpt | 8 -------- ext/standard/tests/file/006_error.phpt | 4 ---- ext/standard/tests/file/fileinode_variation2.phpt | 5 ----- ext/standard/tests/file/fileowner_variation2.phpt | 5 ----- ext/standard/tests/file/fileperms_variation2.phpt | 5 ----- ext/standard/tests/file/ftruncate_bug76422.phpt | 2 +- ext/standard/tests/file/readlink_variation1.phpt | 5 ----- ext/standard/tests/file/windows_links/bug78862.phpt | 1 - ext/standard/tests/streams/set_file_buffer.phpt | 5 ----- 11 files changed, 1 insertion(+), 45 deletions(-) diff --git a/ext/session/tests/session_save_path_variation5.phpt b/ext/session/tests/session_save_path_variation5.phpt index 5863441f57db9..f4cbfa637b602 100644 --- a/ext/session/tests/session_save_path_variation5.phpt +++ b/ext/session/tests/session_save_path_variation5.phpt @@ -30,7 +30,6 @@ var_dump(mkdir($sessions)); var_dump(chdir($sessions)); ini_set("session.save_path", $directory); var_dump(session_save_path()); -var_dump(rmdir($sessions)); echo "Done"; ob_end_flush(); @@ -48,5 +47,4 @@ bool(true) Warning: ini_set(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (.) in %s on line %d string(0) "" -bool(true) Done diff --git a/ext/soap/tests/bug73037.phpt b/ext/soap/tests/bug73037.phpt index 4cf46eb373aa4..023551176fc3a 100644 --- a/ext/soap/tests/bug73037.phpt +++ b/ext/soap/tests/bug73037.phpt @@ -127,10 +127,6 @@ cleanup: } } -?> ---CLEAN-- - --EXPECT-- Iteration 0 diff --git a/ext/sockets/tests/socket_getopt.phpt b/ext/sockets/tests/socket_getopt.phpt index dd6e405e1b16c..3d3e62ac23351 100644 --- a/ext/sockets/tests/socket_getopt.phpt +++ b/ext/sockets/tests/socket_getopt.phpt @@ -41,14 +41,6 @@ $r = socket_getopt($s, $level, IP_MULTICAST_IF); var_dump($r); echo "\n"; ?> ---CLEAN-- - --EXPECT-- Setting IP_MULTICAST_TTL bool(true) diff --git a/ext/standard/tests/file/006_error.phpt b/ext/standard/tests/file/006_error.phpt index ce3fdf2854e73..98caa4d1e11e2 100644 --- a/ext/standard/tests/file/006_error.phpt +++ b/ext/standard/tests/file/006_error.phpt @@ -29,10 +29,6 @@ echo "\n"; echo "\n*** Done ***\n"; ?> ---CLEAN-- - --EXPECTF-- *** Testing error conditions for fileperms(), chmod() *** diff --git a/ext/standard/tests/file/fileinode_variation2.phpt b/ext/standard/tests/file/fileinode_variation2.phpt index 2dace6413c3e6..c6c26eab8b28a 100644 --- a/ext/standard/tests/file/fileinode_variation2.phpt +++ b/ext/standard/tests/file/fileinode_variation2.phpt @@ -30,11 +30,6 @@ foreach( $filenames as $filename ) { clearstatcache(); } ?> ---CLEAN-- - --EXPECTF-- *** Testing Invalid file types *** diff --git a/ext/standard/tests/file/fileowner_variation2.phpt b/ext/standard/tests/file/fileowner_variation2.phpt index 05cc8495b1345..c5ab2042cda42 100644 --- a/ext/standard/tests/file/fileowner_variation2.phpt +++ b/ext/standard/tests/file/fileowner_variation2.phpt @@ -31,11 +31,6 @@ foreach( $filenames as $filename ) { clearstatcache(); } ?> ---CLEAN-- - --EXPECTF-- *** Testing Invalid file types *** diff --git a/ext/standard/tests/file/fileperms_variation2.phpt b/ext/standard/tests/file/fileperms_variation2.phpt index c46ce617ae72d..b1c9695d47ea0 100644 --- a/ext/standard/tests/file/fileperms_variation2.phpt +++ b/ext/standard/tests/file/fileperms_variation2.phpt @@ -30,11 +30,6 @@ foreach( $filenames as $filename ) { clearstatcache(); } ?> ---CLEAN-- - --EXPECTF-- *** Testing Invalid file types *** diff --git a/ext/standard/tests/file/ftruncate_bug76422.phpt b/ext/standard/tests/file/ftruncate_bug76422.phpt index 978a8c7a71feb..aa3068e824e7c 100644 --- a/ext/standard/tests/file/ftruncate_bug76422.phpt +++ b/ext/standard/tests/file/ftruncate_bug76422.phpt @@ -51,7 +51,7 @@ unlink($fn); --CLEAN-- --EXPECT-- bool(true) diff --git a/ext/standard/tests/file/readlink_variation1.phpt b/ext/standard/tests/file/readlink_variation1.phpt index 6697286de2b9b..b3d6fc9a44ef1 100644 --- a/ext/standard/tests/file/readlink_variation1.phpt +++ b/ext/standard/tests/file/readlink_variation1.phpt @@ -29,11 +29,6 @@ foreach( $filenames as $filename ) { clearstatcache(); } ?> ---CLEAN-- - --EXPECTF-- *** Testing Invalid file types *** diff --git a/ext/standard/tests/file/windows_links/bug78862.phpt b/ext/standard/tests/file/windows_links/bug78862.phpt index c696773be4260..24a547fe46042 100644 --- a/ext/standard/tests/file/windows_links/bug78862.phpt +++ b/ext/standard/tests/file/windows_links/bug78862.phpt @@ -14,6 +14,5 @@ Stack trace: thrown in %s on line %d --CLEAN-- diff --git a/ext/standard/tests/streams/set_file_buffer.phpt b/ext/standard/tests/streams/set_file_buffer.phpt index 5e5051c86ed60..9f5c4e08b1da6 100644 --- a/ext/standard/tests/streams/set_file_buffer.phpt +++ b/ext/standard/tests/streams/set_file_buffer.phpt @@ -32,11 +32,6 @@ var_dump(set_file_buffer($fd, 50)); var_dump(stream_set_chunk_size($fd, 42)); var_dump(fwrite($fd, str_repeat('0', 70))); ?> ---CLEAN-- - --EXPECTF-- bool(true) option: %d, %d, %d From 7a411564f0702f55763d37eb6e540099a406350c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 3 Sep 2021 11:07:16 +0200 Subject: [PATCH 0018/1346] Fix some more CLEAN sections --- ext/pgsql/tests/80_bug36625.phpt | 5 ----- ext/phar/tests/tar/phar_setalias.phpt | 2 -- ext/phar/tests/tar/phar_setalias2.phpt | 2 -- ext/standard/tests/file/filegroup_variation2.phpt | 5 ----- ext/standard/tests/file/rename_variation8.phpt | 1 - ext/standard/tests/file/stream_copy_to_stream_empty.phpt | 4 ++-- ext/standard/tests/file/windows_links/bug78862.phpt | 2 +- ext/zip/tests/oo_getstatusstring.phpt | 2 +- 8 files changed, 4 insertions(+), 19 deletions(-) diff --git a/ext/pgsql/tests/80_bug36625.phpt b/ext/pgsql/tests/80_bug36625.phpt index f905a999ef741..75d3637b03117 100644 --- a/ext/pgsql/tests/80_bug36625.phpt +++ b/ext/pgsql/tests/80_bug36625.phpt @@ -39,16 +39,11 @@ array_walk($trace, 'search_trace_file'); var_dump($found > 0); var_dump(file_exists($tracefile)); -@unlink($tracefile); - ?> --CLEAN-- --EXPECTF-- bool(false) diff --git a/ext/phar/tests/tar/phar_setalias.phpt b/ext/phar/tests/tar/phar_setalias.phpt index 6d1047e55a265..3408f515aa913 100644 --- a/ext/phar/tests/tar/phar_setalias.phpt +++ b/ext/phar/tests/tar/phar_setalias.phpt @@ -40,8 +40,6 @@ echo $a->getAlias() . "\n"; --CLEAN-- --EXPECT-- hio diff --git a/ext/phar/tests/tar/phar_setalias2.phpt b/ext/phar/tests/tar/phar_setalias2.phpt index 54aa99b94dd2a..31df9ae59aa1e 100644 --- a/ext/phar/tests/tar/phar_setalias2.phpt +++ b/ext/phar/tests/tar/phar_setalias2.phpt @@ -42,8 +42,6 @@ try { --CLEAN-- --EXPECTF-- hio diff --git a/ext/standard/tests/file/filegroup_variation2.phpt b/ext/standard/tests/file/filegroup_variation2.phpt index 7d0a87d247244..eeff71fa61ba2 100644 --- a/ext/standard/tests/file/filegroup_variation2.phpt +++ b/ext/standard/tests/file/filegroup_variation2.phpt @@ -30,11 +30,6 @@ foreach( $filenames as $filename ) { clearstatcache(); } ?> ---CLEAN-- - --EXPECTF-- *** Testing Invalid file types *** diff --git a/ext/standard/tests/file/rename_variation8.phpt b/ext/standard/tests/file/rename_variation8.phpt index 8b958666c2238..89d4bab7f0fe8 100644 --- a/ext/standard/tests/file/rename_variation8.phpt +++ b/ext/standard/tests/file/rename_variation8.phpt @@ -41,7 +41,6 @@ echo "Done\n"; ?> --CLEAN-- --EXPECTF-- diff --git a/ext/standard/tests/file/stream_copy_to_stream_empty.phpt b/ext/standard/tests/file/stream_copy_to_stream_empty.phpt index 43e659a5a2850..4aa6819323644 100644 --- a/ext/standard/tests/file/stream_copy_to_stream_empty.phpt +++ b/ext/standard/tests/file/stream_copy_to_stream_empty.phpt @@ -3,7 +3,7 @@ stream_copy_to_stream() from empty file --FILE-- --CLEAN-- --EXPECT-- int(0) diff --git a/ext/standard/tests/file/windows_links/bug78862.phpt b/ext/standard/tests/file/windows_links/bug78862.phpt index 24a547fe46042..97b659548e3d8 100644 --- a/ext/standard/tests/file/windows_links/bug78862.phpt +++ b/ext/standard/tests/file/windows_links/bug78862.phpt @@ -14,5 +14,5 @@ Stack trace: thrown in %s on line %d --CLEAN-- diff --git a/ext/zip/tests/oo_getstatusstring.phpt b/ext/zip/tests/oo_getstatusstring.phpt index 476bbbd502df8..f68a09d12349e 100644 --- a/ext/zip/tests/oo_getstatusstring.phpt +++ b/ext/zip/tests/oo_getstatusstring.phpt @@ -20,7 +20,7 @@ $arch->close(); ?> --CLEAN-- --EXPECT-- string(8) "No error" From 3021ce6e58fbc207771b0e17778462bab6fc9c13 Mon Sep 17 00:00:00 2001 From: codinghuang Date: Fri, 3 Sep 2021 17:49:34 +0800 Subject: [PATCH 0019/1346] Clean ext/opcache/minilua --- build/Makefile.global | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Makefile.global b/build/Makefile.global index 6941bab6ad412..ca7f2115f3e80 100644 --- a/build/Makefile.global +++ b/build/Makefile.global @@ -118,6 +118,7 @@ clean: rm -f libphp.la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/* rm -f ext/opcache/jit/zend_jit_x86.c rm -f ext/opcache/jit/zend_jit_arm64.c + rm -f ext/opcache/minilua distclean: clean rm -f Makefile config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h main/internal_functions_cli.c main/internal_functions.c Zend/zend_dtrace_gen.h Zend/zend_dtrace_gen.h.bak Zend/zend_config.h From 98d004c9bc4777011abe7a2d540b6ac29008badf Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 3 Sep 2021 11:34:48 +0200 Subject: [PATCH 0020/1346] Fix CLEAN sections --- ext/phar/tests/bug65414.phpt | 4 -- ext/phar/tests/bug66960.phpt | 5 --- ext/phar/tests/create_new_phar_b.phpt | 3 -- ext/phar/tests/invalid_alias.phpt | 4 -- ext/phar/tests/invalid_setstubalias.phpt | 5 --- ext/phar/tests/phar_buildfromdirectory1.phpt | 5 --- ext/phar/tests/phar_buildfromdirectory2.phpt | 5 --- ext/phar/tests/phar_buildfromdirectory6.phpt | 1 - ext/phar/tests/phar_buildfromiterator1.phpt | 5 --- ext/phar/tests/phar_buildfromiterator5.phpt | 5 --- ext/phar/tests/phar_buildfromiterator6.phpt | 5 --- ext/phar/tests/phar_buildfromiterator7.phpt | 5 --- ext/phar/tests/phar_convert_again.phpt | 3 -- ext/phar/tests/phar_convert_repeated.phpt | 2 - ext/phar/tests/phar_convert_repeated_b.phpt | 5 --- ext/phar/tests/phar_convert_tar2.phpt | 1 - ext/phar/tests/phar_convert_tar3.phpt | 6 +-- ext/phar/tests/phar_extract.phpt | 39 +++++++++---------- ext/phar/tests/phar_gobyebye.phpt | 6 ++- ext/phar/tests/phar_oo_compressallbz2.phpt | 1 - ext/phar/tests/phar_oo_compressallgz.phpt | 1 - ext/phar/tests/phar_oo_getmodified.phpt | 1 - ext/phar/tests/phar_oo_nosig.phpt | 3 +- ext/phar/tests/phar_oo_uncompressall.phpt | 1 - ext/phar/tests/phar_setalias.phpt | 2 - ext/phar/tests/phar_setalias2.phpt | 3 -- ext/phar/tests/stat2_5.3.phpt | 6 ++- ext/phar/tests/tar/bignames_overflow.phpt | 2 - ext/phar/tests/tar/create_new_phar_b.phpt | 3 -- .../tests/tar/phar_buildfromiterator5.phpt | 5 --- .../tests/tar/phar_buildfromiterator6.phpt | 5 --- .../tests/tar/phar_buildfromiterator7.phpt | 5 --- ext/phar/tests/tar/phar_convert_phar.phpt | 1 - ext/phar/tests/tar/phar_convert_phar2.phpt | 1 - ext/phar/tests/tar/phar_convert_phar3.phpt | 2 - ext/phar/tests/tar/phar_convert_phar4.phpt | 2 - ext/phar/tests/tar/phar_setalias.phpt | 3 +- ext/phar/tests/tar/truncated.phpt | 5 --- ext/phar/tests/test_unset.phpt | 1 - ext/phar/tests/zip/all.phpt | 6 ++- ext/phar/tests/zip/create_new_phar_b.phpt | 3 -- .../tests/zip/phar_buildfromiterator5.phpt | 5 --- .../tests/zip/phar_buildfromiterator6.phpt | 5 --- .../tests/zip/phar_buildfromiterator7.phpt | 5 --- .../tests/session_save_path_variation4.phpt | 2 +- .../tests/session_save_path_variation5.phpt | 2 +- 46 files changed, 37 insertions(+), 158 deletions(-) diff --git a/ext/phar/tests/bug65414.phpt b/ext/phar/tests/bug65414.phpt index abbdf49b11104..d3ff77947144a 100644 --- a/ext/phar/tests/bug65414.phpt +++ b/ext/phar/tests/bug65414.phpt @@ -24,10 +24,6 @@ foreach ($bads as $bad) { } echo 'done' . PHP_EOL; ?> ---CLEAN-- - --EXPECT-- .phar/injected-1.txt:Cannot create any files in magic ".phar" directory /.phar/injected-2.txt:Cannot create any files in magic ".phar" directory diff --git a/ext/phar/tests/bug66960.phpt b/ext/phar/tests/bug66960.phpt index aab765b59cde5..d17acc5f71592 100644 --- a/ext/phar/tests/bug66960.phpt +++ b/ext/phar/tests/bug66960.phpt @@ -14,11 +14,6 @@ var_dump(file_exists("phar://$file/". str_repeat('a', PHP_MAXPATHLEN))); var_dump(file_exists("phar://$file/". str_repeat('a', PHP_MAXPATHLEN+1))); echo 'done'; ?> ---CLEAN-- - --EXPECT-- bool(false) bool(false) diff --git a/ext/phar/tests/create_new_phar_b.phpt b/ext/phar/tests/create_new_phar_b.phpt index 810da1f7ce658..fb106153ca877 100644 --- a/ext/phar/tests/create_new_phar_b.phpt +++ b/ext/phar/tests/create_new_phar_b.phpt @@ -12,9 +12,6 @@ file_put_contents('phar://' . __DIR__ . '/' . basename(__FILE__, '.php') . '.pha 'brand new!'); include 'phar://' . __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.php/a.php'; ?> - ---CLEAN-- - --EXPECTF-- Warning: file_put_contents(phar://%screate_new_phar_b.phar.php/a.php): Failed to open stream: phar error: write operations disabled by the php.ini setting phar.readonly in %screate_new_phar_b.php on line %d diff --git a/ext/phar/tests/invalid_alias.phpt b/ext/phar/tests/invalid_alias.phpt index fa44af3c1485e..231dd9fdb315b 100644 --- a/ext/phar/tests/invalid_alias.phpt +++ b/ext/phar/tests/invalid_alias.phpt @@ -32,10 +32,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- Invalid alias "hi/" specified for phar "%sinvalid_alias.phar" Invalid alias "hi\l" specified for phar "%sinvalid_alias.phar" diff --git a/ext/phar/tests/invalid_setstubalias.phpt b/ext/phar/tests/invalid_setstubalias.phpt index 9b711bd2c3db0..bcbcb26669287 100644 --- a/ext/phar/tests/invalid_setstubalias.phpt +++ b/ext/phar/tests/invalid_setstubalias.phpt @@ -32,11 +32,6 @@ try { echo $e->getMessage() . "\n"; } -?> ---CLEAN-- - --EXPECTF-- Cannot set stub ".phar/stub.php" directly in phar "%sinvalid_setstubalias.phar.tar", use setStub diff --git a/ext/phar/tests/phar_buildfromdirectory1.phpt b/ext/phar/tests/phar_buildfromdirectory1.phpt index f7ee620b46297..9ab1fb92151f7 100644 --- a/ext/phar/tests/phar_buildfromdirectory1.phpt +++ b/ext/phar/tests/phar_buildfromdirectory1.phpt @@ -16,11 +16,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- %s(24) "UnexpectedValueException" Cannot write to archive - write operations restricted by INI setting diff --git a/ext/phar/tests/phar_buildfromdirectory2.phpt b/ext/phar/tests/phar_buildfromdirectory2.phpt index 9de4edd89c77c..c828587548a92 100644 --- a/ext/phar/tests/phar_buildfromdirectory2.phpt +++ b/ext/phar/tests/phar_buildfromdirectory2.phpt @@ -19,11 +19,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- %s(24) "UnexpectedValueException" RecursiveDirectoryIterator::__construct(1): Failed to open directory: No such file or directory diff --git a/ext/phar/tests/phar_buildfromdirectory6.phpt b/ext/phar/tests/phar_buildfromdirectory6.phpt index 131247a80722e..a652a89921dbe 100644 --- a/ext/phar/tests/phar_buildfromdirectory6.phpt +++ b/ext/phar/tests/phar_buildfromdirectory6.phpt @@ -26,7 +26,6 @@ var_dump(file_exists(__DIR__ . '/buildfromdirectory6.phar')); ?> --CLEAN-- getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- %s(24) "UnexpectedValueException" Cannot write out phar archive, phar is read-only diff --git a/ext/phar/tests/phar_buildfromiterator5.phpt b/ext/phar/tests/phar_buildfromiterator5.phpt index 147fb26875a1a..1e937fe4e8dd2 100644 --- a/ext/phar/tests/phar_buildfromiterator5.phpt +++ b/ext/phar/tests/phar_buildfromiterator5.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/phar_buildfromiterator6.phpt b/ext/phar/tests/phar_buildfromiterator6.phpt index 59a5b6ef1c7c4..4e4f09f74aa7a 100644 --- a/ext/phar/tests/phar_buildfromiterator6.phpt +++ b/ext/phar/tests/phar_buildfromiterator6.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/phar_buildfromiterator7.phpt b/ext/phar/tests/phar_buildfromiterator7.phpt index 94a192c3dfb1c..646bcdac2a5c9 100644 --- a/ext/phar/tests/phar_buildfromiterator7.phpt +++ b/ext/phar/tests/phar_buildfromiterator7.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/phar_convert_again.phpt b/ext/phar/tests/phar_convert_again.phpt index d65e5df2564b6..008d28ad80f6d 100644 --- a/ext/phar/tests/phar_convert_again.phpt +++ b/ext/phar/tests/phar_convert_again.phpt @@ -155,11 +155,8 @@ echo $e->getMessage() . "\n"; --CLEAN-- --EXPECTF-- =================== new Phar() ======================= diff --git a/ext/phar/tests/phar_convert_repeated_b.phpt b/ext/phar/tests/phar_convert_repeated_b.phpt index 26589d8457338..8adb581276f74 100644 --- a/ext/phar/tests/phar_convert_repeated_b.phpt +++ b/ext/phar/tests/phar_convert_repeated_b.phpt @@ -77,15 +77,10 @@ try { ?> --CLEAN-- --EXPECT-- =================== new PharData() ================== diff --git a/ext/phar/tests/phar_convert_tar2.phpt b/ext/phar/tests/phar_convert_tar2.phpt index 10e1bd2245410..8028d77418d23 100644 --- a/ext/phar/tests/phar_convert_tar2.phpt +++ b/ext/phar/tests/phar_convert_tar2.phpt @@ -44,7 +44,6 @@ var_dump($phar->getStub()); --CLEAN-- diff --git a/ext/phar/tests/phar_convert_tar3.phpt b/ext/phar/tests/phar_convert_tar3.phpt index 8a693cf62ab88..090782f3b27c2 100644 --- a/ext/phar/tests/phar_convert_tar3.phpt +++ b/ext/phar/tests/phar_convert_tar3.phpt @@ -11,7 +11,7 @@ phar.readonly=0 $fname = __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.php'; $pname = 'phar://' . $fname; -$fname2 = __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.tar'; +$fname2 = __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.tar.bz2'; $fname3 = __DIR__ . '/' . basename(__FILE__, '.php') . '.2.phar.tar'; $stub = ''; $file = $stub; @@ -33,7 +33,7 @@ var_dump($phar->isFileFormat(Phar::TAR)); var_dump($phar->isCompressed()); var_dump($phar->getStub()); -copy($fname2 . '.bz2', $fname3); +copy($fname2, $fname3); $phar = new Phar($fname3); var_dump($phar->isFileFormat(Phar::TAR)); @@ -45,9 +45,7 @@ var_dump($phar->getStub()); --EXPECT-- bool(false) diff --git a/ext/phar/tests/phar_extract.phpt b/ext/phar/tests/phar_extract.phpt index 9f5faa8d2a5fd..7d50a3bed749e 100644 --- a/ext/phar/tests/phar_extract.phpt +++ b/ext/phar/tests/phar_extract.phpt @@ -105,30 +105,27 @@ try { ?> --CLEAN-- --EXPECTF-- %sextract%cfile1.txt diff --git a/ext/phar/tests/phar_gobyebye.phpt b/ext/phar/tests/phar_gobyebye.phpt index 7ad8e18ce286a..4db6e0d91cdc3 100644 --- a/ext/phar/tests/phar_gobyebye.phpt +++ b/ext/phar/tests/phar_gobyebye.phpt @@ -27,8 +27,10 @@ opendir("foo/hi"); include $pname . '/foo/hi'; ?> --CLEAN-- - - + --EXPECTF-- Warning: readfile(foo/hi): Failed to open stream: No such file or directory in phar://%sphar_gobyebye.phar.php/foo/hi on line %d diff --git a/ext/phar/tests/phar_oo_compressallbz2.phpt b/ext/phar/tests/phar_oo_compressallbz2.phpt index 7a0fbfc7b7488..16f8f22a4ee3d 100644 --- a/ext/phar/tests/phar_oo_compressallbz2.phpt +++ b/ext/phar/tests/phar_oo_compressallbz2.phpt @@ -43,7 +43,6 @@ var_dump($phar['b']->isCompressed(Phar::BZ2)); ?> --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_compressallgz.phpt b/ext/phar/tests/phar_oo_compressallgz.phpt index d6d75da6a784c..c0b8ea9da2d14 100644 --- a/ext/phar/tests/phar_oo_compressallgz.phpt +++ b/ext/phar/tests/phar_oo_compressallgz.phpt @@ -47,7 +47,6 @@ echo $e->getMessage() . "\n"; ?> --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_getmodified.phpt b/ext/phar/tests/phar_oo_getmodified.phpt index 27d4928de77b0..64bc109f93393 100644 --- a/ext/phar/tests/phar_oo_getmodified.phpt +++ b/ext/phar/tests/phar_oo_getmodified.phpt @@ -26,7 +26,6 @@ var_dump($phar->getModified()); ?> --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_oo_nosig.phpt b/ext/phar/tests/phar_oo_nosig.phpt index ff30c0a3b9bf2..68b0ae18a76f7 100644 --- a/ext/phar/tests/phar_oo_nosig.phpt +++ b/ext/phar/tests/phar_oo_nosig.phpt @@ -14,8 +14,7 @@ var_dump($phar->getSignature()); ?> --CLEAN-- --EXPECT-- bool(false) diff --git a/ext/phar/tests/phar_oo_uncompressall.phpt b/ext/phar/tests/phar_oo_uncompressall.phpt index ec680a6e4d78f..d39f0308b8812 100644 --- a/ext/phar/tests/phar_oo_uncompressall.phpt +++ b/ext/phar/tests/phar_oo_uncompressall.phpt @@ -51,7 +51,6 @@ var_dump($phar['a']->isCompressed()); ?> --CLEAN-- --EXPECT-- diff --git a/ext/phar/tests/phar_setalias.phpt b/ext/phar/tests/phar_setalias.phpt index e140aae3b9a4b..bd52e680786ac 100644 --- a/ext/phar/tests/phar_setalias.phpt +++ b/ext/phar/tests/phar_setalias.phpt @@ -26,8 +26,6 @@ echo $phar->getAlias() . "\n"; --CLEAN-- --EXPECT-- hio diff --git a/ext/phar/tests/phar_setalias2.phpt b/ext/phar/tests/phar_setalias2.phpt index d248873f2c8b3..7944af8330bdf 100644 --- a/ext/phar/tests/phar_setalias2.phpt +++ b/ext/phar/tests/phar_setalias2.phpt @@ -38,9 +38,6 @@ try { --CLEAN-- --EXPECTF-- hio diff --git a/ext/phar/tests/stat2_5.3.phpt b/ext/phar/tests/stat2_5.3.phpt index 0dae17d88b65a..0696d351c5854 100644 --- a/ext/phar/tests/stat2_5.3.phpt +++ b/ext/phar/tests/stat2_5.3.phpt @@ -33,8 +33,10 @@ __HALT_COMPILER();'); include $fname3; ?> --CLEAN-- - - + --EXPECT-- bool(true) is_link diff --git a/ext/phar/tests/tar/bignames_overflow.phpt b/ext/phar/tests/tar/bignames_overflow.phpt index d992bbeb77a91..411c25a3f02dd 100644 --- a/ext/phar/tests/tar/bignames_overflow.phpt +++ b/ext/phar/tests/tar/bignames_overflow.phpt @@ -7,7 +7,6 @@ phar.require_hash=0 --FILE-- getContent() . "\n" --CLEAN-- --EXPECT-- a diff --git a/ext/phar/tests/tar/create_new_phar_b.phpt b/ext/phar/tests/tar/create_new_phar_b.phpt index 4b61403f27b18..7ec06f42931c5 100644 --- a/ext/phar/tests/tar/create_new_phar_b.phpt +++ b/ext/phar/tests/tar/create_new_phar_b.phpt @@ -12,9 +12,6 @@ file_put_contents('phar://' . __DIR__ . '/' . basename(__FILE__, '.php') . '.pha 'brand new!'); include 'phar://' . __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.tar/a.php'; ?> - ---CLEAN-- - --EXPECTF-- Warning: file_put_contents(phar://%screate_new_phar_b.phar.tar/a.php): Failed to open stream: phar error: write operations disabled by the php.ini setting phar.readonly in %screate_new_phar_b.php on line %d diff --git a/ext/phar/tests/tar/phar_buildfromiterator5.phpt b/ext/phar/tests/tar/phar_buildfromiterator5.phpt index bcfbc0715ea40..27d9dc323b415 100644 --- a/ext/phar/tests/tar/phar_buildfromiterator5.phpt +++ b/ext/phar/tests/tar/phar_buildfromiterator5.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/tar/phar_buildfromiterator6.phpt b/ext/phar/tests/tar/phar_buildfromiterator6.phpt index addacc26f1ab4..918203697998f 100644 --- a/ext/phar/tests/tar/phar_buildfromiterator6.phpt +++ b/ext/phar/tests/tar/phar_buildfromiterator6.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/tar/phar_buildfromiterator7.phpt b/ext/phar/tests/tar/phar_buildfromiterator7.phpt index 6eee23929d08e..297b40b5eedda 100644 --- a/ext/phar/tests/tar/phar_buildfromiterator7.phpt +++ b/ext/phar/tests/tar/phar_buildfromiterator7.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/tar/phar_convert_phar.phpt b/ext/phar/tests/tar/phar_convert_phar.phpt index 61ec4e1102d56..c25ed7c556bf7 100644 --- a/ext/phar/tests/tar/phar_convert_phar.phpt +++ b/ext/phar/tests/tar/phar_convert_phar.phpt @@ -39,7 +39,6 @@ var_dump(strlen($phar->getStub())); getStub())); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.gz'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); -unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '2.phar'); __HALT_COMPILER(); ?> diff --git a/ext/phar/tests/tar/phar_convert_phar3.phpt b/ext/phar/tests/tar/phar_convert_phar3.phpt index bca4e3d3a8914..c0acae3638a87 100644 --- a/ext/phar/tests/tar/phar_convert_phar3.phpt +++ b/ext/phar/tests/tar/phar_convert_phar3.phpt @@ -43,8 +43,6 @@ unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.bz2'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '2.phar'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); -unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.bz2'); -__HALT_COMPILER(); ?> --EXPECT-- bool(false) diff --git a/ext/phar/tests/tar/phar_convert_phar4.phpt b/ext/phar/tests/tar/phar_convert_phar4.phpt index 0b61a1819881c..6046854114f96 100644 --- a/ext/phar/tests/tar/phar_convert_phar4.phpt +++ b/ext/phar/tests/tar/phar_convert_phar4.phpt @@ -48,8 +48,6 @@ unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.gz'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '2.phar'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar'); unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.tar'); -unlink(__DIR__ . '/' . basename(__FILE__, '.clean.php') . '.phar.tar.gz'); -__HALT_COMPILER(); ?> --EXPECT-- bool(false) diff --git a/ext/phar/tests/tar/phar_setalias.phpt b/ext/phar/tests/tar/phar_setalias.phpt index 3408f515aa913..dd8be1ac0e385 100644 --- a/ext/phar/tests/tar/phar_setalias.phpt +++ b/ext/phar/tests/tar/phar_setalias.phpt @@ -9,7 +9,7 @@ phar.readonly=0 setStub(''); @@ -40,6 +40,7 @@ echo $a->getAlias() . "\n"; --CLEAN-- --EXPECT-- hio diff --git a/ext/phar/tests/tar/truncated.phpt b/ext/phar/tests/tar/truncated.phpt index 183c2148bc533..95ed3c1c75242 100644 --- a/ext/phar/tests/tar/truncated.phpt +++ b/ext/phar/tests/tar/truncated.phpt @@ -10,11 +10,6 @@ try { echo $e->getMessage() . "\n"; } -?> ---CLEAN-- - --EXPECTF-- phar error: "%strunc.tar" is a corrupted tar file (truncated) diff --git a/ext/phar/tests/test_unset.phpt b/ext/phar/tests/test_unset.phpt index 5f593dd4c505e..8aa422cb072ce 100644 --- a/ext/phar/tests/test_unset.phpt +++ b/ext/phar/tests/test_unset.phpt @@ -32,7 +32,6 @@ var_dump(file_exists($fname)); ?> --CLEAN-- - --EXPECTF-- NULL diff --git a/ext/phar/tests/zip/all.phpt b/ext/phar/tests/zip/all.phpt index 440d59b00ddb0..937bfbd0e4473 100644 --- a/ext/phar/tests/zip/all.phpt +++ b/ext/phar/tests/zip/all.phpt @@ -41,8 +41,10 @@ var_dump($phar->getMetadata()); var_dump($phar['a']->getMetadata()); ?> --CLEAN-- - - + --EXPECT-- bool(false) bool(false) diff --git a/ext/phar/tests/zip/create_new_phar_b.phpt b/ext/phar/tests/zip/create_new_phar_b.phpt index cf70abfddaae9..0f4e239f91de6 100644 --- a/ext/phar/tests/zip/create_new_phar_b.phpt +++ b/ext/phar/tests/zip/create_new_phar_b.phpt @@ -12,9 +12,6 @@ file_put_contents('phar://' . __DIR__ . '/' . basename(__FILE__, '.php') . '.pha 'brand new!'); include 'phar://' . __DIR__ . '/' . basename(__FILE__, '.php') . '.phar.zip/a.php'; ?> - ---CLEAN-- - --EXPECTF-- Warning: file_put_contents(phar://%screate_new_phar_b.phar.zip/a.php): Failed to open stream: phar error: write operations disabled by the php.ini setting phar.readonly in %screate_new_phar_b.php on line %d diff --git a/ext/phar/tests/zip/phar_buildfromiterator5.phpt b/ext/phar/tests/zip/phar_buildfromiterator5.phpt index dafd6ceda765c..fb34f09095483 100644 --- a/ext/phar/tests/zip/phar_buildfromiterator5.phpt +++ b/ext/phar/tests/zip/phar_buildfromiterator5.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/zip/phar_buildfromiterator6.phpt b/ext/phar/tests/zip/phar_buildfromiterator6.phpt index 491fada954870..9d9140bc3433a 100644 --- a/ext/phar/tests/zip/phar_buildfromiterator6.phpt +++ b/ext/phar/tests/zip/phar_buildfromiterator6.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/phar/tests/zip/phar_buildfromiterator7.phpt b/ext/phar/tests/zip/phar_buildfromiterator7.phpt index 4129c6b232505..f62be404a1e08 100644 --- a/ext/phar/tests/zip/phar_buildfromiterator7.phpt +++ b/ext/phar/tests/zip/phar_buildfromiterator7.phpt @@ -44,11 +44,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- rewind valid diff --git a/ext/session/tests/session_save_path_variation4.phpt b/ext/session/tests/session_save_path_variation4.phpt index dd68988805df3..673fe243c4eaa 100644 --- a/ext/session/tests/session_save_path_variation4.phpt +++ b/ext/session/tests/session_save_path_variation4.phpt @@ -41,7 +41,7 @@ ob_end_flush(); --EXPECTF-- *** Testing session_save_path() : variation *** diff --git a/ext/session/tests/session_save_path_variation5.phpt b/ext/session/tests/session_save_path_variation5.phpt index f4cbfa637b602..1ea8afc66e3df 100644 --- a/ext/session/tests/session_save_path_variation5.phpt +++ b/ext/session/tests/session_save_path_variation5.phpt @@ -38,7 +38,7 @@ ob_end_flush(); --EXPECTF-- *** Testing session_save_path() : variation *** From 6cc928c734f4e2b044839dbb4ecb7193792e6066 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 2 Sep 2021 18:38:52 +0200 Subject: [PATCH 0021/1346] Fully qualify ReturnTypeWillChange in deprecation message When adding the #[ReturnTypeWillChange] attribute in namespaced code, you also need to use ReturnTypeWillChange, otherwise it will be silently ignored and may result in confusion. Change the deprecation message to suggest #[\ReturnTypeWillChange], which will always work. Closes GH-7454. --- Zend/tests/deprecation_to_exception_during_inheritance.phpt | 2 +- Zend/tests/tentative_type_early_binding.phpt | 2 +- .../variance/internal_parent/incompatible_return_type.phpt | 2 +- .../variance/internal_parent/missing_return_type.phpt | 2 +- Zend/zend_inheritance.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/tests/deprecation_to_exception_during_inheritance.phpt b/Zend/tests/deprecation_to_exception_during_inheritance.phpt index 548b8e076aa87..dd0adec36a57c 100644 --- a/Zend/tests/deprecation_to_exception_during_inheritance.phpt +++ b/Zend/tests/deprecation_to_exception_during_inheritance.phpt @@ -17,7 +17,7 @@ $class = new class extends DateTime { ?> --EXPECTF-- -Fatal error: During inheritance of DateTime: Uncaught Exception: Return type of DateTime@anonymous::getTimezone() should either be compatible with DateTime::getTimezone(): DateTimeZone|false, or the #[ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s:%d +Fatal error: During inheritance of DateTime: Uncaught Exception: Return type of DateTime@anonymous::getTimezone() should either be compatible with DateTime::getTimezone(): DateTimeZone|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s:%d Stack trace: #0 %s(%d): {closure}(8192, 'Return type of ...', '%s', 8) #1 {main} in %s on line %d diff --git a/Zend/tests/tentative_type_early_binding.phpt b/Zend/tests/tentative_type_early_binding.phpt index cc26e7d93b71c..926ace5772bd4 100644 --- a/Zend/tests/tentative_type_early_binding.phpt +++ b/Zend/tests/tentative_type_early_binding.phpt @@ -8,6 +8,6 @@ class Test extends SplObjectStorage { } ?> --EXPECTF-- -Deprecated: Return type of Test::valid() should either be compatible with SplObjectStorage::valid(): bool, or the #[ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s on line %d +Deprecated: Return type of Test::valid() should either be compatible with SplObjectStorage::valid(): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s on line %d Fatal error: Could not check compatibility between Test::current(): Unknown and SplObjectStorage::current(): object, because class Unknown is not available in %s on line %d diff --git a/Zend/tests/type_declarations/variance/internal_parent/incompatible_return_type.phpt b/Zend/tests/type_declarations/variance/internal_parent/incompatible_return_type.phpt index e69e0a6b945b0..f6782db9a0130 100644 --- a/Zend/tests/type_declarations/variance/internal_parent/incompatible_return_type.phpt +++ b/Zend/tests/type_declarations/variance/internal_parent/incompatible_return_type.phpt @@ -13,5 +13,5 @@ class MyDateTimeZone extends DateTimeZone var_dump(MyDateTimeZone::listIdentifiers()); ?> --EXPECTF-- -Deprecated: Return type of MyDateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): string should either be compatible with DateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array, or the #[ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s on line %d +Deprecated: Return type of MyDateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): string should either be compatible with DateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s on line %d string(0) "" diff --git a/Zend/tests/type_declarations/variance/internal_parent/missing_return_type.phpt b/Zend/tests/type_declarations/variance/internal_parent/missing_return_type.phpt index 21e6ba6d1406d..e1166672498ee 100644 --- a/Zend/tests/type_declarations/variance/internal_parent/missing_return_type.phpt +++ b/Zend/tests/type_declarations/variance/internal_parent/missing_return_type.phpt @@ -10,4 +10,4 @@ class MyDateTimeZone extends DateTimeZone } ?> --EXPECTF-- -Deprecated: Return type of MyDateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null) should either be compatible with DateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array, or the #[ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s on line %d +Deprecated: Return type of MyDateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null) should either be compatible with DateTimeZone::listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index a65126572238f..175c8220ad534 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -997,7 +997,7 @@ static void ZEND_COLD emit_incompatible_method_error( if (!return_type_will_change_attribute) { zend_error_at(E_DEPRECATED, func_filename(child), func_lineno(child), "Return type of %s should either be compatible with %s, " - "or the #[ReturnTypeWillChange] attribute should be used to temporarily suppress the notice", + "or the #[\\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice", ZSTR_VAL(child_prototype), ZSTR_VAL(parent_prototype)); if (EG(exception)) { zend_exception_uncaught_error( From 481cdeab31dd0f91d7a336f06f404a5be5925791 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 3 Sep 2021 13:59:02 +0200 Subject: [PATCH 0022/1346] Fix file clash in gd tests --- .../tests/imageloadfont_end_of_file_while_reading_header.phpt | 4 ++-- ext/gd/tests/imageloadfont_invalid.phpt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/gd/tests/imageloadfont_end_of_file_while_reading_header.phpt b/ext/gd/tests/imageloadfont_end_of_file_while_reading_header.phpt index e033fa42451fd..ba6eeaeeac1c4 100644 --- a/ext/gd/tests/imageloadfont_end_of_file_while_reading_header.phpt +++ b/ext/gd/tests/imageloadfont_end_of_file_while_reading_header.phpt @@ -7,7 +7,7 @@ User Group: PHP-WVL & PHPGent #PHPTestFest gd --FILE-- --CLEAN-- --EXPECTF-- Warning: imageloadfont(): End of file while reading header in %s on line %d diff --git a/ext/gd/tests/imageloadfont_invalid.phpt b/ext/gd/tests/imageloadfont_invalid.phpt index 05d89a832254a..9d9ff7d601442 100644 --- a/ext/gd/tests/imageloadfont_invalid.phpt +++ b/ext/gd/tests/imageloadfont_invalid.phpt @@ -4,7 +4,7 @@ imageloadfont() function crashes gd --FILE-- Date: Fri, 3 Sep 2021 14:06:06 +0200 Subject: [PATCH 0023/1346] Fix some more CLEANUP sections --- ext/dba/tests/bug70825.phpt | 2 +- ext/ldap/tests/ldap_delete_basic.phpt | 2 +- ext/ldap/tests/ldap_delete_ext.phpt | 2 +- ext/ldap/tests/ldap_mod_del_error.phpt | 2 +- ..._allow_local_infile_overrides_local_infile_directory.phpt | 2 +- .../tests/mysqli_local_infile_directory_access_allowed.phpt | 2 +- .../tests/mysqli_local_infile_directory_access_denied.phpt | 2 +- .../tests/mysqli_local_infile_directory_vs_open_basedir.phpt | 2 +- ext/zip/tests/bug53885.phpt | 2 +- ext/zip/tests/bug70752.phpt | 5 ----- ext/zip/tests/oo_getstatusstring.phpt | 2 +- 11 files changed, 10 insertions(+), 15 deletions(-) diff --git a/ext/dba/tests/bug70825.phpt b/ext/dba/tests/bug70825.phpt index c9ac20b66d08f..d2e85420ecaf7 100644 --- a/ext/dba/tests/bug70825.phpt +++ b/ext/dba/tests/bug70825.phpt @@ -66,5 +66,5 @@ string(4) "1337" --CLEAN-- diff --git a/ext/ldap/tests/ldap_delete_basic.phpt b/ext/ldap/tests/ldap_delete_basic.phpt index dd64bfb4111da..491c12f6fdfc8 100644 --- a/ext/ldap/tests/ldap_delete_basic.phpt +++ b/ext/ldap/tests/ldap_delete_basic.phpt @@ -32,7 +32,7 @@ require "connect.inc"; $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); -ldap_delete($link, "dc=my-domain,$base"); +@ldap_delete($link, "dc=my-domain,$base"); ?> --EXPECT-- bool(true) diff --git a/ext/ldap/tests/ldap_delete_ext.phpt b/ext/ldap/tests/ldap_delete_ext.phpt index c6b3194398a87..41800cd53686e 100644 --- a/ext/ldap/tests/ldap_delete_ext.phpt +++ b/ext/ldap/tests/ldap_delete_ext.phpt @@ -41,7 +41,7 @@ require "connect.inc"; $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); -ldap_delete($link, "dc=my-domain,$base"); +@ldap_delete($link, "dc=my-domain,$base"); ?> --EXPECTF-- object(LDAP\Result)#%d (0) { diff --git a/ext/ldap/tests/ldap_mod_del_error.phpt b/ext/ldap/tests/ldap_mod_del_error.phpt index c149d283ff423..9e6af834cb2f2 100644 --- a/ext/ldap/tests/ldap_mod_del_error.phpt +++ b/ext/ldap/tests/ldap_mod_del_error.phpt @@ -28,7 +28,7 @@ require "connect.inc"; $link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version); -ldap_delete($link, "dc=my-domain,$base"); +@ldap_delete($link, "dc=my-domain,$base"); ?> --EXPECTF-- Warning: ldap_mod_del(): Modify: No such object in %s on line %d diff --git a/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt b/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt index eddf9fe8aeb0c..963603515400d 100644 --- a/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt +++ b/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt @@ -66,7 +66,7 @@ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { $host, $user, $db, $port, $socket); } -if (!$link->query($link, 'DROP TABLE IF EXISTS test')) { +if (!$link->query('DROP TABLE IF EXISTS test')) { printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } diff --git a/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt b/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt index 43eebb739767a..10c45894110c5 100644 --- a/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt +++ b/ext/mysqli/tests/mysqli_local_infile_directory_access_allowed.phpt @@ -71,7 +71,7 @@ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { $host, $user, $db, $port, $socket); } -if (!$link->query($link, 'DROP TABLE IF EXISTS test')) { +if (!$link->query('DROP TABLE IF EXISTS test')) { printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } diff --git a/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt b/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt index 957aeeb65fa31..9247fa30ea027 100644 --- a/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt +++ b/ext/mysqli/tests/mysqli_local_infile_directory_access_denied.phpt @@ -55,7 +55,7 @@ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { $host, $user, $db, $port, $socket); } -if (!$link->query($link, 'DROP TABLE IF EXISTS test')) { +if (!$link->query('DROP TABLE IF EXISTS test')) { printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } diff --git a/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt b/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt index 6349bef488b7c..46b198d7cf2a4 100644 --- a/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt +++ b/ext/mysqli/tests/mysqli_local_infile_directory_vs_open_basedir.phpt @@ -54,7 +54,7 @@ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { $host, $user, $db, $port, $socket); } -if (!$link->query($link, 'DROP TABLE IF EXISTS test')) { +if (!$link->query('DROP TABLE IF EXISTS test')) { printf("[clean] Failed to drop old test table: [%d] %s\n", mysqli_errno($link), mysqli_error($link)); } diff --git a/ext/zip/tests/bug53885.phpt b/ext/zip/tests/bug53885.phpt index 12fa7b904e607..aebc508eeea36 100644 --- a/ext/zip/tests/bug53885.phpt +++ b/ext/zip/tests/bug53885.phpt @@ -16,7 +16,7 @@ $nx->statName("a",ZIPARCHIVE::FL_UNCHANGED); --CLEAN-- --EXPECTF-- Deprecated: ZipArchive::open(): Using empty file as ZipArchive is deprecated in %s diff --git a/ext/zip/tests/bug70752.phpt b/ext/zip/tests/bug70752.phpt index fb46bf6cdd41e..9da82e982cc3b 100644 --- a/ext/zip/tests/bug70752.phpt +++ b/ext/zip/tests/bug70752.phpt @@ -20,8 +20,3 @@ var_dump(file_exists($filename)); --EXPECT-- bool(false) bool(false) ---CLEAN-- - diff --git a/ext/zip/tests/oo_getstatusstring.phpt b/ext/zip/tests/oo_getstatusstring.phpt index f68a09d12349e..489b77195632e 100644 --- a/ext/zip/tests/oo_getstatusstring.phpt +++ b/ext/zip/tests/oo_getstatusstring.phpt @@ -20,7 +20,7 @@ $arch->close(); ?> --CLEAN-- --EXPECT-- string(8) "No error" From 99510ed009e7b8a663f23c1e7f7ef1ace37c10ab Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 6 Sep 2021 11:46:20 +0200 Subject: [PATCH 0024/1346] Remove unnecessary argument from zend_throw_auto_init_* This is now always "array", so inline it. --- Zend/zend_execute.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index be25d94749344..2a33a2fba1b28 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -586,22 +586,20 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_cannot_pass_by_reference(uint32_t arg zend_string_release(func_name); } -static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop, const char *type) { +static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop) { zend_string *type_str = zend_type_to_string(prop->type); zend_type_error( - "Cannot auto-initialize an %s inside property %s::$%s of type %s", - type, + "Cannot auto-initialize an array inside property %s::$%s of type %s", ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name), ZSTR_VAL(type_str) ); zend_string_release(type_str); } -static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_property_info *prop, const char *type) { +static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_property_info *prop) { zend_string *type_str = zend_type_to_string(prop->type); zend_type_error( - "Cannot auto-initialize an %s inside a reference held by property %s::$%s of type %s", - type, + "Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s", ZSTR_VAL(prop->ce->name), zend_get_unmangled_property_name(prop->name), ZSTR_VAL(type_str) ); @@ -2799,7 +2797,7 @@ ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref) { ZEND_ASSERT(ZEND_REF_HAS_TYPE_SOURCES(ref)); ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { if (!check_type_array_assignable(prop->type)) { - zend_throw_auto_init_in_ref_error(prop, "array"); + zend_throw_auto_init_in_ref_error(prop); return 0; } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); @@ -2835,7 +2833,7 @@ static zend_never_inline bool zend_handle_fetch_obj_flags( } } if (!check_type_array_assignable(prop_info->type)) { - zend_throw_auto_init_in_prop_error(prop_info, "array"); + zend_throw_auto_init_in_prop_error(prop_info); if (result) ZVAL_ERROR(result); return 0; } From 626f0fec5498ccb2e20dc7cf2942e85b9523ba2a Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 30 Jul 2021 11:44:18 +0200 Subject: [PATCH 0025/1346] Remove some dead code from mbstring mbstring has a great deal of dead code. Some common types are: - Default switch clauses which will never be taken - If clauses intended to convert codepoints which were not present in a conversion table... but the codepoint in question *is* in the table, so the if clause is not needed. - Bounds checks in places where it is not possible for a value to ever be out of bounds. - Checks to see if an unmatched Unicode codepoint is in CP932 extension range 3... but every codepoint in range 3 is also in range 2, so no codepoint will ever be matched and converted by that code. --- ext/mbstring/libmbfl/filters/mbfilter_big5.c | 4 +- .../libmbfl/filters/mbfilter_cp5022x.c | 48 ++----------- .../libmbfl/filters/mbfilter_cp51932.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_cp932.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_cp936.c | 16 ++--- .../libmbfl/filters/mbfilter_euc_cn.c | 25 +++---- .../libmbfl/filters/mbfilter_euc_jp.c | 6 +- .../libmbfl/filters/mbfilter_euc_jp_win.c | 7 +- .../libmbfl/filters/mbfilter_euc_kr.c | 22 ++---- .../libmbfl/filters/mbfilter_euc_tw.c | 4 +- .../libmbfl/filters/mbfilter_gb18030.c | 28 ++------ ext/mbstring/libmbfl/filters/mbfilter_hz.c | 27 +++----- .../libmbfl/filters/mbfilter_iso2022_jp_ms.c | 4 -- .../libmbfl/filters/mbfilter_iso2022_kr.c | 20 ++---- .../filters/mbfilter_iso2022jp_mobile.c | 4 -- ext/mbstring/libmbfl/filters/mbfilter_jis.c | 15 +--- ext/mbstring/libmbfl/filters/mbfilter_sjis.c | 2 - .../libmbfl/filters/mbfilter_sjis_2004.c | 69 ++++++++----------- .../libmbfl/filters/mbfilter_sjis_mac.c | 13 +--- .../libmbfl/filters/mbfilter_sjis_mobile.c | 10 --- ext/mbstring/libmbfl/filters/mbfilter_uhc.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_utf7.c | 26 ++----- .../libmbfl/filters/mbfilter_utf7imap.c | 9 +-- ext/mbstring/libmbfl/filters/mbfilter_utf8.c | 5 +- .../libmbfl/filters/mbfilter_utf8_mobile.c | 5 +- ext/mbstring/libmbfl/mbfl/mbfilter.c | 2 - 26 files changed, 103 insertions(+), 280 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c index c4f77a26fc4dd..561ab8c225ae0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c @@ -239,9 +239,7 @@ int mbfl_filt_conv_big5_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index 7f1994077abfd..a69c4c5426a14 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -298,9 +298,7 @@ int mbfl_filt_conv_cp5022x_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -322,16 +320,13 @@ static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter) static int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter) { - int mode = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE, second = 0; + int mode = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE; bool consumed = false; if (filter->cache) { - int s = mbfl_convert_kana(filter->cache, c, &consumed, &second, mode); + int s = mbfl_convert_kana(filter->cache, c, &consumed, NULL, mode); filter->cache = consumed ? 0 : c; mbfl_filt_conv_wchar_cp50221(s, filter); - if (second) { - mbfl_filt_conv_wchar_cp50221(second, filter); - } } else if (c == 0) { /* This case has to be handled separately, since `filter->cache == 0` means * no codepoint is cached */ @@ -345,14 +340,11 @@ static int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter) static int mbfl_filt_conv_wchar_cp50220_flush(mbfl_convert_filter *filter) { - int mode = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE, second = 0; + int mode = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE; if (filter->cache) { - int s = mbfl_convert_kana(filter->cache, 0, NULL, &second, mode); + int s = mbfl_convert_kana(filter->cache, 0, NULL, NULL, mode); mbfl_filt_conv_wchar_cp50221(s, filter); - if (second) { - mbfl_filt_conv_wchar_cp50221(s, filter); - } filter->cache = 0; } @@ -432,21 +424,6 @@ int mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter) } } - if (s < 0) { - const int cp932ext3_ucs_table_size = - cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; - const int limit = cp932ext3_ucs_table_size > - cp932ext3_eucjp_table_size ? - cp932ext3_eucjp_table_size: - cp932ext3_ucs_table_size; - for (i = 0; i < limit; i++) { - if (c == cp932ext3_ucs_table[i]) { - s = cp932ext3_eucjp_table[i]; - break; - } - } - } - if (c == 0) { s = 0; } else if (s <= 0) { @@ -564,21 +541,6 @@ int mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter) } } - if (s <= 0) { - const int cp932ext3_ucs_table_size = - cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; - const int limit = cp932ext3_ucs_table_size > - cp932ext3_eucjp_table_size ? - cp932ext3_eucjp_table_size: - cp932ext3_ucs_table_size; - for (i = 0; i < limit; i++) { - if (c == cp932ext3_ucs_table[i]) { - s = cp932ext3_eucjp_table[i]; - break; - } - } - } - if (c == 0) { s = 0; } else if (s <= 0) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c index 9bfb75fee8cb0..c0069a93fb98b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c @@ -163,9 +163,7 @@ mbfl_filt_conv_cp51932_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c index 10559b593be60..9c24fa64494f2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c @@ -203,9 +203,7 @@ mbfl_filt_conv_cp932_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c index c53bfe42a7b12..22a759ee79ff4 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c @@ -142,24 +142,16 @@ int mbfl_filt_conv_cp936_wchar(int c, mbfl_convert_filter *filter) if (w <= 0) { if (c1 < 0xff && c1 > 0x80 && c >= 0x40 && c < 0xff && c != 0x7f) { - w = (c1 - 0x81)*192 + (c - 0x40); - if (w >= 0 && w < cp936_ucs_table_size) { - w = cp936_ucs_table[w]; - if (!w) - w = MBFL_BAD_INPUT; - } else { - w = MBFL_BAD_INPUT; - } - CK((*filter->output_function)(w, filter->data)); + w = (c1 - 0x81)*192 + c - 0x40; + ZEND_ASSERT(w < cp936_ucs_table_size); + CK((*filter->output_function)(cp936_ucs_table[w], filter->data)); } else { CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); } } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c index ecde251b119be..01c48e433eedd 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c @@ -108,19 +108,16 @@ int mbfl_filt_conv_euccn_wchar(int c, mbfl_convert_filter *filter) filter->status = 0; c1 = filter->cache; if (c > 0xA0 && c < 0xFF) { - w = (c1 - 0x81)*192 + (c - 0x40); - if (w >= 0 && w < cp936_ucs_table_size) { - if (w == 0x1864) { - w = 0x30FB; - } else if (w == 0x186A) { - w = 0x2015; - } else if ((w >= 0x1921 && w <= 0x192A) || w == 0x1963 || (w >= 0x1C59 && w <= 0x1C7E) || (w >= 0x1DBB && w <= 0x1DC4)) { - w = 0; - } else { - w = cp936_ucs_table[w]; - } - } else { + w = (c1 - 0x81)*192 + c - 0x40; + ZEND_ASSERT(w < cp936_ucs_table_size); + if (w == 0x1864) { + w = 0x30FB; + } else if (w == 0x186A) { + w = 0x2015; + } else if ((w >= 0x1921 && w <= 0x192A) || w == 0x1963 || (w >= 0x1C59 && w <= 0x1C7E) || (w >= 0x1DBB && w <= 0x1DC4)) { w = 0; + } else { + w = cp936_ucs_table[w]; } if (w <= 0) { @@ -133,9 +130,7 @@ int mbfl_filt_conv_euccn_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c index c963716d43244..7dd095862ec87 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c @@ -166,9 +166,7 @@ mbfl_filt_conv_eucjp_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -209,8 +207,6 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter) if (s <= 0) { if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c index 02ee1b1c59a19..1209e63148f75 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c @@ -167,6 +167,7 @@ int mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter) filter->status++; filter->cache = c; break; + case 4: /* got 0x8f, X 0212 second char */ filter->status = 0; c1 = filter->cache; @@ -211,9 +212,7 @@ int mbfl_filt_conv_eucjpwin_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -271,8 +270,6 @@ int mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter) s1 = 0x213D; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xff0d) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c index a824909f05c33..8362138d15a13 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c @@ -114,19 +114,13 @@ int mbfl_filt_conv_euckr_wchar(int c, mbfl_convert_filter *filter) } if (flag > 0 && c >= 0xa1 && c <= 0xfe) { if (flag == 1) { /* 1st: 0xa1..0xc6, 2nd: 0x41..0x7a, 0x81..0xfe */ - w = (c1 - 0xa1)*190 + (c - 0x41); - if (w >= 0 && w < uhc2_ucs_table_size) { - w = uhc2_ucs_table[w]; - } else { - w = 0; - } + w = (c1 - 0xa1)*190 + c - 0x41; + ZEND_ASSERT(w < uhc2_ucs_table_size); + w = uhc2_ucs_table[w]; } else { /* 1st: 0xc7..0xc8,0xca..0xfe, 2nd: 0xa1..0xfe */ - w = (c1 - 0xc7)*94 + (c - 0xa1); - if (w >= 0 && w < uhc3_ucs_table_size) { - w = uhc3_ucs_table[w]; - } else { - w = 0; - } + w = (c1 - 0xc7)*94 + c - 0xa1; + ZEND_ASSERT(w < uhc3_ucs_table_size); + w = uhc3_ucs_table[w]; } if (w <= 0) { @@ -138,9 +132,7 @@ int mbfl_filt_conv_euckr_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c index 187ac8ad9d558..e2c3bceaa509a 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c @@ -184,9 +184,7 @@ int mbfl_filt_conv_euctw_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c index 5ab2bc15af6f2..4a8939523a5bf 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c @@ -168,15 +168,9 @@ int mbfl_filt_conv_gb18030_wchar(int c, mbfl_convert_filter *filter) (c1 >= 0x81 && c1 <= 0xa0 && c >= 0x40 && c <= 0xfe && c != 0x7f) || (c1 >= 0xaa && c1 <= 0xfe && c >= 0x40 && c <= 0xa0 && c != 0x7f) || (c1 >= 0xa8 && c1 <= 0xa9 && c >= 0x40 && c <= 0xa0 && c != 0x7f)) { - w = (c1 - 0x81)*192 + (c - 0x40); - if (w >= 0 && w < cp936_ucs_table_size) { - w = cp936_ucs_table[w]; - if (!w) - w = MBFL_BAD_INPUT; - } else { - w = MBFL_BAD_INPUT; - } - CK((*filter->output_function)(w, filter->data)); + w = (c1 - 0x81)*192 + c - 0x40; + ZEND_ASSERT(w < cp936_ucs_table_size); + CK((*filter->output_function)(cp936_ucs_table[w], filter->data)); } else { CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); } @@ -211,10 +205,6 @@ int mbfl_filt_conv_gb18030_wchar(int c, mbfl_convert_filter *filter) w = (((c1 - 0x81)*10 + (c2 - 0x30))*126 + (c3 - 0x81))*10 + (c - 0x30); if (w >= 0 && w <= 39419) { k = mbfl_bisec_srch(w, mbfl_gb2uni_tbl, mbfl_gb_uni_max); - if (k < 0) { - CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); - return 0; - } w += mbfl_gb_uni_ofst[k]; } else { CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); @@ -227,9 +217,7 @@ int mbfl_filt_conv_gb18030_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -370,12 +358,8 @@ int mbfl_filt_conv_wchar_gb18030(int c, mbfl_convert_filter *filter) s1 = c1 + 0x90; } - if (s <= 0) { - if (c == 0) { - s = 0; - } else { - s = -1; - } + if (c == 0) { + s = 0; } if (s >= 0) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.c b/ext/mbstring/libmbfl/filters/mbfilter_hz.c index 14edf64a7bbac..722d73dd40c64 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_hz.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.c @@ -95,20 +95,17 @@ int mbfl_filt_conv_hz_wchar(int c, mbfl_convert_filter *filter) c1 = filter->cache; if (c1 > 0x20 && c1 < 0x7F && c > 0x20 && c < 0x7F) { s = (c1 - 1)*192 + c + 0x40; /* GB2312 */ - if (s >= 0 && s < cp936_ucs_table_size) { - if (s == 0x1864) { - w = 0x30FB; - } else if (s == 0x186A) { - w = 0x2015; - } else if (s == 0x186C) { - w = 0x2225; - } else if ((s >= 0x1920 && s <= 0x192A) || s == 0x1963 || (s >= 0x1C60 && s <= 0x1C7F) || (s >= 0x1DBB && s <= 0x1DC4)) { - w = 0; - } else { - w = cp936_ucs_table[s]; - } - } else { + ZEND_ASSERT(s < cp936_ucs_table_size); + if (s == 0x1864) { + w = 0x30FB; + } else if (s == 0x186A) { + w = 0x2015; + } else if (s == 0x186C) { + w = 0x2225; + } else if ((s >= 0x1920 && s <= 0x192A) || s == 0x1963 || (s >= 0x1C60 && s <= 0x1C7F) || (s >= 0x1DBB && s <= 0x1DC4)) { w = 0; + } else { + w = cp936_ucs_table[s]; } if (w <= 0) { @@ -139,9 +136,7 @@ int mbfl_filt_conv_hz_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c index cc7cd90a1d51a..41d4088c475e8 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c @@ -258,12 +258,8 @@ int mbfl_filt_conv_wchar_2022jpms(int c, mbfl_convert_filter *filter) if (s1 <= 0) { if (c == 0xA5) { /* YEN SIGN */ s1 = 0x216F; /* FULLWIDTH YEN SIGN */ - } else if (c == 0x203E) { /* OVER LINE */ - s1 = 0x2131; /* FULLWIDTH MACRON */ } else if (c == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xFF5E) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c index ba1177a2ea985..f012656b1974b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c @@ -113,19 +113,13 @@ int mbfl_filt_conv_2022kr_wchar(int c, mbfl_convert_filter *filter) if (flag == 1) { if (c1 != 0x22 || c <= 0x65) { w = (c1 - 0x21)*190 + (c - 0x41) + 0x80; - if (w >= 0 && w < uhc2_ucs_table_size) { - w = uhc2_ucs_table[w]; - } else { - w = 0; - } + ZEND_ASSERT(w < uhc2_ucs_table_size); + w = uhc2_ucs_table[w]; } } else { - w = (c1 - 0x47)*94 + (c - 0x21); - if (w >= 0 && w < uhc3_ucs_table_size) { - w = uhc3_ucs_table[w]; - } else { - w = 0; - } + w = (c1 - 0x47)*94 + c - 0x21; + ZEND_ASSERT(w < uhc3_ucs_table_size); + w = uhc3_ucs_table[w]; } if (w <= 0) { @@ -162,9 +156,7 @@ int mbfl_filt_conv_2022kr_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index febfd84ddc5ba..3d289f1191595 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -268,12 +268,8 @@ int mbfl_filt_conv_wchar_2022jp_mobile(int c, mbfl_convert_filter *filter) if (s1 <= 0) { if (c == 0xA5) { /* YEN SIGN */ s1 = 0x216F; /* FULLWIDTH YEN SIGN */ - } else if (c == 0x203E) { /* OVER LINE */ - s1 = 0x2131; /* FULLWIDTH MACRON */ } else if (c == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xFF5E) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.c b/ext/mbstring/libmbfl/filters/mbfilter_jis.c index 6d876bbdfad92..9de18964ccef2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_jis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.c @@ -251,9 +251,7 @@ mbfl_filt_conv_jis_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -318,14 +316,6 @@ mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter) } filter->status = 0; CK((*filter->output_function)(s, filter->data)); - } else if (s < 0x100) { /* kana */ - if ((filter->status & 0xff00) != 0x100) { - CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ - CK((*filter->output_function)(0x28, filter->data)); /* '(' */ - CK((*filter->output_function)(0x49, filter->data)); /* 'I' */ - } - filter->status = 0x100; - CK((*filter->output_function)(s & 0x7f, filter->data)); } else if (s < 0x8080) { /* X 0208 */ if ((filter->status & 0xff00) != 0x200) { CK((*filter->output_function)(0x1b, filter->data)); /* ESC */ @@ -380,11 +370,10 @@ mbfl_filt_conv_wchar_2022jp(int c, mbfl_convert_filter *filter) } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) { s = ucs_r_jis_table[c - ucs_r_jis_table_min]; } + if (s <= 0) { if (c == 0xa5) { /* YEN SIGN */ s = 0x1005c; - } else if (c == 0x203e) { /* OVER LINE */ - s = 0x1007e; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ s = 0x2140; } else if (c == 0x2225) { /* PARALLEL TO */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c index 188f162bf8785..ef59026a9eea1 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c @@ -221,8 +221,6 @@ int mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter) s1 = 0x5C; } else if (c == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ s1 = 0x2140; - } else if (c == 0xFF5E) { /* FULLWIDTH TILDE */ - s1 = 0x2141; } else if (c == 0x2225) { /* PARALLEL TO */ s1 = 0x2142; } else if (c == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c index a1d94693e8f83..19602dd9da4da 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c @@ -209,43 +209,39 @@ int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter) } w1 = (s1 << 8) | s2; - if (w1 >= 0x2121) { - /* conversion for combining characters */ - if ((w1 >= 0x2477 && w1 <= 0x2479) || (w1 >= 0x2479 && w1 <= 0x247B) || - (w1 >= 0x2577 && w1 <= 0x257E) || w1 == 0x2678 || w1 == 0x2B44 || - (w1 >= 0x2B48 && w1 <= 0x2B4F) || (w1 >= 0x2B65 && w1 <= 0x2B66)) { - k = mbfl_bisec_srch2(w1, jisx0213_u2_key, jisx0213_u2_tbl_len); - if (k >= 0) { - w = jisx0213_u2_tbl[2*k]; - CK((*filter->output_function)(w, filter->data)); - w = jisx0213_u2_tbl[2*k+1]; - } + /* conversion for combining characters */ + if ((w1 >= 0x2477 && w1 <= 0x2479) || (w1 >= 0x2479 && w1 <= 0x247B) || + (w1 >= 0x2577 && w1 <= 0x257E) || w1 == 0x2678 || w1 == 0x2B44 || + (w1 >= 0x2B48 && w1 <= 0x2B4F) || (w1 >= 0x2B65 && w1 <= 0x2B66)) { + k = mbfl_bisec_srch2(w1, jisx0213_u2_key, jisx0213_u2_tbl_len); + if (k >= 0) { + w = jisx0213_u2_tbl[2*k]; + CK((*filter->output_function)(w, filter->data)); + w = jisx0213_u2_tbl[2*k+1]; } + } - /* conversion for BMP */ - if (w <= 0) { - w1 = (s1 - 0x21)*94 + s2 - 0x21; - if (w1 >= 0 && w1 < jisx0213_ucs_table_size) { - w = jisx0213_ucs_table[w1]; - } + /* conversion for BMP */ + if (w <= 0) { + w1 = (s1 - 0x21)*94 + s2 - 0x21; + if (w1 >= 0 && w1 < jisx0213_ucs_table_size) { + w = jisx0213_ucs_table[w1]; } + } - /* conversion for CJK Unified Ideographs ext.B (U+2XXXX) */ - if (w <= 0) { - w1 = (s1 << 8) | s2; - k = mbfl_bisec_srch2(w1, jisx0213_jis_u5_key, jisx0213_u5_tbl_len); - if (k >= 0) { - w = jisx0213_jis_u5_tbl[k] + 0x20000; - } + /* conversion for CJK Unified Ideographs ext.B (U+2XXXX) */ + if (w <= 0) { + w1 = (s1 << 8) | s2; + k = mbfl_bisec_srch2(w1, jisx0213_jis_u5_key, jisx0213_u5_tbl_len); + if (k >= 0) { + w = jisx0213_jis_u5_tbl[k] + 0x20000; } + } - if (w <= 0) { - w = MBFL_BAD_INPUT; - } - CK((*filter->output_function)(w, filter->data)); - } else { - CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); + if (w <= 0) { + w = MBFL_BAD_INPUT; } + CK((*filter->output_function)(w, filter->data)); break; case 2: /* got 0x8e: EUC-JP-2004 kana */ @@ -297,11 +293,8 @@ int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter) /* check for japanese chars in BMP */ s = (s1 + 94 + k)*94 + s2; - if (s >= 0 && s < jisx0213_ucs_table_size) { - w = jisx0213_ucs_table[s]; - } else { - w = 0; - } + ZEND_ASSERT(s < jisx0213_ucs_table_size); + w = jisx0213_ucs_table[s]; /* check for japanese chars in CJK Unified Ideographs ext.B (U+2XXXX) */ if (w <= 0) { @@ -408,9 +401,7 @@ int mbfl_filt_conv_jis2004_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -543,8 +534,6 @@ int mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter) } else { s1 = -1; } - } else if (s1 >= 0x9980) { - s1 = -1; } if (s1 >= 0) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c index 35d5bee59a8db..e8116b6b8bd31 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c @@ -253,9 +253,7 @@ mbfl_filt_conv_sjis_mac_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -287,7 +285,6 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) // r: U+FF00 -> U+FFFF switch (filter->status) { - case 1: c1 = filter->cache; filter->cache = 0; @@ -368,7 +365,6 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) ZEND_FALLTHROUGH; case 0: - if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) { s1 = ucs_a1_jis_table[c - ucs_a1_jis_table_min]; if (c == 0x5c) { @@ -480,7 +476,6 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } break; - case 2: c1 = filter->cache; filter->cache = 0; @@ -516,7 +511,6 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) CK(mbfl_filt_conv_illegal_output(c1, filter)); return mbfl_filt_conv_wchar_sjis_mac(c, filter); } - break; case 3: @@ -653,10 +647,9 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } + return 0; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c index 41097df304ac7..4eaa1c2557512 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c @@ -785,16 +785,6 @@ int mbfl_filt_conv_wchar_sjis_mobile(int c, mbfl_convert_filter *filter) } } - if (s1 <= 0) { - /* CP932 vendor ext3 (115ku - 119ku) */ - for (c1 = 0; c1 < cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; c1++) { - if (c == cp932ext3_ucs_table[c1]) { - s1 = (((c1 / 94) + 0x93) << 8) + (c1 % 94) + 0x21; - break; - } - } - } - if (c == 0) { s1 = 0; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c index 96be552729bfd..06300404b6e27 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c @@ -133,9 +133,7 @@ int mbfl_filt_conv_uhc_wchar(int c, mbfl_convert_filter *filter) CK((*filter->output_function)(w, filter->data)); break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c index a5446afd8ae25..c3144b4779584 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c @@ -163,11 +163,7 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter) s &= 0x3ff; s |= (filter->cache & 0xfff0000) >> 6; filter->cache = n; - if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX) { - CK((*filter->output_function)(s, filter->data)); - } else { /* illegal character */ - CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); - } + CK((*filter->output_function)(s, filter->data)); } else { CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); filter->cache = n; @@ -207,11 +203,7 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter) s &= 0x3ff; s |= (filter->cache & 0xfff0000) >> 6; filter->cache = n; - if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX) { - CK((*filter->output_function)(s, filter->data)); - } else { /* illegal character */ - CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); - } + CK((*filter->output_function)(s, filter->data)); } else { CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); filter->cache = n; @@ -245,11 +237,7 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter) s &= 0x3ff; s |= (filter->cache & 0xfff0000) >> 6; filter->cache = 0; - if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX) { - CK((*filter->output_function)(s, filter->data)); - } else { /* illegal character */ - CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); - } + CK((*filter->output_function)(s, filter->data)); } else { CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); filter->cache = 0; @@ -264,9 +252,7 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -373,9 +359,7 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c index eb768f9ab2b73..473a1f56c1396 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c @@ -269,9 +269,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -397,9 +395,7 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter) } break; - default: - filter->status = 0; - break; + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; @@ -434,5 +430,6 @@ static int mbfl_filt_conv_wchar_utf7imap_flush(mbfl_convert_filter *filter) CK((*filter->output_function)('-', filter->data)); break; } + return 0; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c index 524c9c079a137..7c371d2e4d138 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c @@ -172,9 +172,8 @@ int mbfl_filt_conv_utf8_wchar(int c, mbfl_convert_filter *filter) } } break; - default: - filter->status = 0; - break; + + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c index c52459dc3abb6..14b0094592489 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c @@ -261,9 +261,8 @@ int mbfl_filt_conv_utf8_mobile_wchar(int c, mbfl_convert_filter *filter) goto retry; } break; - default: - filter->status = 0; - break; + + EMPTY_SWITCH_DEFAULT_CASE(); } return 0; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 9db80c8895bb7..a6dfded40a641 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -2480,8 +2480,6 @@ int mbfl_filt_decode_htmlnumericentity_flush(mbfl_convert_filter *filter) (*pc->decoder->filter_function)(mbfl_hexchar_table[d], pc->decoder); } break; - default: - break; } } From a31262060720bdc71f93264f80d65dcadaf85c22 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 30 Jul 2021 16:19:53 +0200 Subject: [PATCH 0026/1346] Remove redundant NULL checks in mbstring Whoever originally wrote mbstring seems to have a deathly fear of NULL pointers lurking behind every corner. A common pattern is that one function will check if a pointer is NULL, then pass it to another function, which will again check if it is NULL, then pass to yet another function, which will yet again check if it is NULL... it's NULL checks all the way down. Remove all the NULL checks in places where pointers could not possibly be NULL. --- ext/mbstring/libmbfl/mbfl/mbfilter.c | 111 ++++++--------------------- ext/mbstring/libmbfl/mbfl/mbfilter.h | 6 +- ext/mbstring/php_unicode.c | 8 +- 3 files changed, 30 insertions(+), 95 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index a6dfded40a641..00b77403f1d39 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -149,52 +149,32 @@ mbfl_buffer_converter_new( return convd; } - -void -mbfl_buffer_converter_delete(mbfl_buffer_converter *convd) +void mbfl_buffer_converter_delete(mbfl_buffer_converter *convd) { - if (convd != NULL) { - if (convd->filter1) { - mbfl_convert_filter_delete(convd->filter1); - } - if (convd->filter2) { - mbfl_convert_filter_delete(convd->filter2); - } - mbfl_memory_device_clear(&convd->device); - efree((void*)convd); + mbfl_convert_filter_delete(convd->filter1); + if (convd->filter2) { + mbfl_convert_filter_delete(convd->filter2); } + mbfl_memory_device_clear(&convd->device); + efree((void*)convd); } -int -mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode) +void mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode) { - if (convd != NULL) { - if (convd->filter2 != NULL) { - convd->filter2->illegal_mode = mode; - } else if (convd->filter1 != NULL) { - convd->filter1->illegal_mode = mode; - } else { - return 0; - } + if (convd->filter2) { + convd->filter2->illegal_mode = mode; + } else { + convd->filter1->illegal_mode = mode; } - - return 1; } -int -mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, int substchar) +void mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, int substchar) { - if (convd != NULL) { - if (convd->filter2 != NULL) { - convd->filter2->illegal_substchar = substchar; - } else if (convd->filter1 != NULL) { - convd->filter1->illegal_substchar = substchar; - } else { - return 0; - } + if (convd->filter2) { + convd->filter2->illegal_substchar = substchar; + } else { + convd->filter1->illegal_substchar = substchar; } - - return 1; } size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *string) @@ -223,59 +203,30 @@ size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *str return p - string->val; } - -int -mbfl_buffer_converter_flush(mbfl_buffer_converter *convd) +void mbfl_buffer_converter_flush(mbfl_buffer_converter *convd) { - if (convd == NULL) { - return -1; - } - - if (convd->filter1 != NULL) { - mbfl_convert_filter_flush(convd->filter1); - } - - return 0; + mbfl_convert_filter_flush(convd->filter1); } -mbfl_string * -mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result) +mbfl_string* mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result) { - if (convd == NULL || result == NULL) { - return NULL; - } result->encoding = convd->to; return mbfl_memory_device_result(&convd->device, result); } -mbfl_string * -mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, - mbfl_string *result) +mbfl_string* mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result) { - if (convd == NULL || string == NULL || result == NULL) { - return NULL; - } mbfl_buffer_converter_feed(convd, string); - if (convd->filter1 != NULL) { - mbfl_convert_filter_flush(convd->filter1); - } + mbfl_convert_filter_flush(convd->filter1); result->encoding = convd->to; return mbfl_memory_device_result(&convd->device, result); } size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd) { - size_t num_illegalchars = 0; - - if (convd == NULL) { - return 0; - } - - if (convd->filter1 != NULL) { - num_illegalchars += convd->filter1->num_illegalchar; - } + size_t num_illegalchars = convd->filter1->num_illegalchar; - if (convd->filter2 != NULL) { + if (convd->filter2) { num_illegalchars += convd->filter2->num_illegalchar; } @@ -399,16 +350,10 @@ mbfl_convert_encoding( size_t n; unsigned char *p; mbfl_memory_device device; - mbfl_convert_filter *filter1; - mbfl_convert_filter *filter2; + mbfl_convert_filter *filter1 = NULL; + mbfl_convert_filter *filter2 = NULL; /* initialize */ - if (toenc == NULL || string == NULL || result == NULL) { - return NULL; - } - - filter1 = NULL; - filter2 = NULL; if (mbfl_convert_filter_get_vtbl(string->encoding, toenc) != NULL) { filter1 = mbfl_convert_filter_new(string->encoding, toenc, mbfl_memory_device_output, 0, &device); } else { @@ -1385,9 +1330,6 @@ mbfl_strimwidth( size_t n, mkwidth; unsigned char *p; - if (string == NULL || result == NULL) { - return NULL; - } mbfl_string_init(result); result->encoding = string->encoding; mbfl_memory_device_init(&pc.device, MIN(string->len, width), 0); @@ -2505,9 +2447,6 @@ mbfl_html_numeric_entity( size_t n; unsigned char *p; - if (string == NULL || result == NULL) { - return NULL; - } mbfl_string_init(result); result->encoding = string->encoding; mbfl_memory_device_init(&device, string->len, 0); diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.h b/ext/mbstring/libmbfl/mbfl/mbfilter.h index 6db8801c62a39..b73746fbb321f 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.h +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.h @@ -141,10 +141,10 @@ struct _mbfl_buffer_converter { MBFLAPI extern mbfl_buffer_converter * mbfl_buffer_converter_new(const mbfl_encoding *from, const mbfl_encoding *to, size_t buf_initsz); MBFLAPI extern void mbfl_buffer_converter_delete(mbfl_buffer_converter *convd); -MBFLAPI extern int mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode); -MBFLAPI extern int mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, int substchar); +MBFLAPI extern void mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode); +MBFLAPI extern void mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, int substchar); MBFLAPI extern size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *string); -MBFLAPI extern int mbfl_buffer_converter_flush(mbfl_buffer_converter *convd); +MBFLAPI extern void mbfl_buffer_converter_flush(mbfl_buffer_converter *convd); MBFLAPI extern mbfl_string * mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result); MBFLAPI extern mbfl_string * mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result); MBFLAPI extern size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd); diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c index 51e7a8e94c1eb..3ed6b4297a90a 100644 --- a/ext/mbstring/php_unicode.c +++ b/ext/mbstring/php_unicode.c @@ -363,7 +363,7 @@ MBSTRING_API char *php_unicode_convert_case( { struct convert_case_data data; mbfl_convert_filter *from_wchar, *to_wchar; - mbfl_string result, *result_ptr; + mbfl_string result; mbfl_memory_device device; mbfl_memory_device_init(&device, srclen + 1, 0); @@ -410,14 +410,10 @@ MBSTRING_API char *php_unicode_convert_case( mbfl_convert_filter_flush(to_wchar); mbfl_convert_filter_flush(from_wchar); - result_ptr = mbfl_memory_device_result(&device, &result); + mbfl_memory_device_result(&device, &result); mbfl_convert_filter_delete(to_wchar); mbfl_convert_filter_delete(from_wchar); - if (!result_ptr) { - return NULL; - } - *ret_len = result.len; return (char *) result.val; } From 64e379d81e22fd42f59ebb6c27bc805675fe9208 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 31 Aug 2021 22:32:43 +0200 Subject: [PATCH 0027/1346] Declare CP50222 flush function as 'static' --- ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c | 4 ++-- ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index a69c4c5426a14..ad88899f82a28 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -33,6 +33,7 @@ static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter); static int mbfl_filt_conv_wchar_cp50220_flush(mbfl_convert_filter *filter); +static int mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter); static int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter); /* Previously, a dubious 'encoding' called 'cp50220raw' was supported @@ -601,8 +602,7 @@ int mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter) return 0; } -int -mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter) +static int mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter) { /* back to latin */ if ((filter->status & 0xff00) == 0x500) { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h index fc0fa2f097021..0cc90f4b45889 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.h @@ -46,6 +46,5 @@ extern const struct mbfl_convert_vtbl vtbl_wchar_cp50222; int mbfl_filt_conv_cp5022x_wchar(int c, mbfl_convert_filter *filter); int mbfl_filt_conv_wchar_cp50221(int c, mbfl_convert_filter *filter); int mbfl_filt_conv_wchar_cp50222(int c, mbfl_convert_filter *filter); -int mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter); #endif /* MBFL_MBFILTER_CP50221_h */ From 0957f54eb1442489370ee5c11c538168ec5db8cf Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 31 Aug 2021 22:33:11 +0200 Subject: [PATCH 0028/1346] Treat truncated escape sequences for CP5022{0,1,2} as error --- ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c | 5 +++-- ext/mbstring/tests/cp5022x_encoding.phpt | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index ad88899f82a28..2cf5600895bfa 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -307,8 +307,9 @@ int mbfl_filt_conv_cp5022x_wchar(int c, mbfl_convert_filter *filter) static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter) { - if ((filter->status & 0xF) == 1) { - /* 2-byte (JIS X 0208 or 0212) character was truncated */ + if (filter->status & 0xF) { + /* 2-byte (JIS X 0208 or 0212) character was truncated, or else + * escape sequence was truncated */ CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); } diff --git a/ext/mbstring/tests/cp5022x_encoding.phpt b/ext/mbstring/tests/cp5022x_encoding.phpt index eecb6fb8c2229..11a4855462a84 100644 --- a/ext/mbstring/tests/cp5022x_encoding.phpt +++ b/ext/mbstring/tests/cp5022x_encoding.phpt @@ -352,6 +352,19 @@ convertInvalidString("\x1B\$B1", "%", "CP50221", "UTF-8"); convertInvalidString("\x1B\$B1", "%", "CP50222", "UTF-8"); echo "Long error markers OK\n"; + +foreach (['CP50220', 'CP50221', 'CP50222'] as $encoding) { + testInvalidString("\x1B", "%", $encoding, "UTF-8"); + testInvalidString("\x1BX", "%X", $encoding, "UTF-8"); + testInvalidString("\x1B(", "%", $encoding, "UTF-8"); + testInvalidString("\x1B(X", "%(X", $encoding, "UTF-8"); + testInvalidString("\x1B\$", "%", $encoding, "UTF-8"); + testInvalidString("\x1B\$(", "%", $encoding, "UTF-8"); + testInvalidString("\x1B\$X", "%\$X", $encoding, "UTF-8"); + testInvalidString("\x1B\$(X", "%\$(X", $encoding, "UTF-8"); +} + +echo "Invalid escape sequences OK\n"; ?> --EXPECT-- ASCII support OK @@ -361,3 +374,4 @@ JIS X 0212 support OK Folding of fullwidth katakana for CP50220 OK Invalid Unicode is flagged when converting to CP5022x Long error markers OK +Invalid escape sequences OK From d2f5a8b32816448ea6e07d60195bc357432c05e4 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 31 Aug 2021 22:53:35 +0200 Subject: [PATCH 0029/1346] Add more tests for SJIS-mac text conversion --- .../libmbfl/filters/mbfilter_sjis_mac.c | 77 +++++++------------ ext/mbstring/libmbfl/filters/sjis_mac2uni.h | 2 +- ext/mbstring/tests/sjismac_encoding.phpt | 11 +++ 3 files changed, 41 insertions(+), 49 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c index e8116b6b8bd31..e24e0b1a3f7cb 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c @@ -267,17 +267,9 @@ static int mbfl_filt_conv_sjis_mac_wchar_flush(mbfl_convert_filter *filter) return 0; } -/* - * wchar => SJIS-mac - */ -int -mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) +int mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) { - int i; - int c1, c2, s1, s2, mode; - - s1 = 0; - s2 = 0; + int i, c1, c2, s1 = 0, s2 = 0, mode; // a1: U+0000 -> U+046F // a2: U+2000 -> U+30FF @@ -287,14 +279,10 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) switch (filter->status) { case 1: c1 = filter->cache; - filter->cache = 0; - filter->status = 0; - - s1 = 0; - s2 = 0; + filter->cache = filter->status = 0; if (c == 0xf87a) { - for (i=0;i<4;i++) { + for (i = 0; i < 4; i++) { if (c1 == s_form_tbl[i+34+3+3]) { s1 = s_form_sjis_tbl[i+34+3+3]; break; @@ -304,7 +292,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) s2 = c1; } } else if (c == 0x20dd) { - for (i=0;i<3;i++) { + for (i = 0; i < 3; i++) { if (c1 == s_form_tbl[i+34+3]) { s1 = s_form_sjis_tbl[i+34+3]; break; @@ -314,24 +302,26 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) s2 = c1; } } else if (c == 0xf87f) { - for (i=0;i<3;i++) { + for (i = 0; i < 3; i++) { if (c1 == s_form_tbl[i+34]) { s1 = s_form_sjis_tbl[i+34]; break; } } if (s1 <= 0) { - s2 = c1; s1 = -1; + s2 = c1; + s1 = -1; } } else if (c == 0xf87e) { - for (i=0;i<34;i++) { + for (i = 0; i < 34; i++) { if (c1 == s_form_tbl[i]) { s1 = s_form_sjis_tbl[i]; break; } } if (s1 <= 0) { - s2 = c1; s1 = -1; + s2 = c1; + s1 = -1; } } else { s2 = c1; @@ -339,7 +329,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } if (s2 > 0) { - for (i=0;i= 0x2000) { - for (i=0;istatus = 1; filter->cache = c; @@ -481,7 +471,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) filter->cache = 0; filter->status = 0; if (c1 == 0xf860) { - for (i=0; i<5; i++) { + for (i = 0; i < 5; i++) { if (c == code_tbl_m[i][2]) { filter->cache = c | 0x10000; filter->status = 3; @@ -489,7 +479,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } } } else if (c1 == 0xf861) { - for (i=0; i<3; i++) { + for (i = 0; i < 3; i++) { if (c == code_tbl_m[i+5][2]) { filter->cache = c | 0x20000; filter->status = 3; @@ -497,7 +487,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } } } else if (c1 == 0xf862) { - for (i=0; i<4; i++) { + for (i = 0; i < 4; i++) { if (c == code_tbl_m[i+5+3][2]) { filter->cache = c | 0x40000; filter->status = 3; @@ -518,11 +508,10 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) c1 = filter->cache & 0xffff; mode = (filter->cache & 0xf0000) >> 16; - filter->cache = 0; - filter->status = 0; + filter->cache = filter->status = 0; if (mode == 0x1) { - for (i=0; i<5; i++) { + for (i = 0; i < 5; i++) { if (c1 == code_tbl_m[i][2] && c == code_tbl_m[i][3]) { s1 = code_tbl_m[i][0]; break; @@ -535,16 +524,13 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) SJIS_ENCODE(c1, c2, s1, s2); CK((*filter->output_function)(s1, filter->data)); CK((*filter->output_function)(s2, filter->data)); - } - - if (s1 <= 0) { + } else { CK(mbfl_filt_conv_illegal_output(0xf860, filter)); CK(mbfl_filt_conv_illegal_output(c1, filter)); CK(mbfl_filt_conv_illegal_output(c, filter)); } - } else if (mode == 0x2) { - for (i=0; i<3; i++) { + for (i = 0; i < 3; i++) { if (c1 == code_tbl_m[i+5][2] && c == code_tbl_m[i+5][3]) { filter->cache = c | 0x20000; filter->status = 4; @@ -552,7 +538,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) } } } else if (mode == 0x4) { - for (i=0; i<4; i++) { + for (i = 0; i < 4; i++) { if (c1 == code_tbl_m[i+8][2] && c == code_tbl_m[i+8][3]) { filter->cache = c | 0x40000; filter->status = 4; @@ -571,7 +557,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) filter->status = 0; if (mode == 0x2) { - for (i=0; i<3; i++) { + for (i = 0; i < 3; i++) { if (c1 == code_tbl_m[i+5][3] && c == code_tbl_m[i+5][4]) { s1 = code_tbl_m[i+5][0]; break; @@ -584,11 +570,9 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) SJIS_ENCODE(c1, c2, s1, s2); CK((*filter->output_function)(s1, filter->data)); CK((*filter->output_function)(s2, filter->data)); - } - - if (s1 <= 0) { + } else { CK(mbfl_filt_conv_illegal_output(0xf861, filter)); - for (i=0; i<3; i++) { + for (i = 0; i < 3; i++) { if (c1 == code_tbl_m[i+5][3]) { CK(mbfl_filt_conv_illegal_output(code_tbl_m[i+5][2], filter)); break; @@ -598,7 +582,7 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) CK(mbfl_filt_conv_illegal_output(c, filter)); } } else if (mode == 0x4) { - for (i=0; i<4; i++) { + for (i = 0; i < 4; i++) { if (c1 == code_tbl_m[i+8][3] && c == code_tbl_m[i+8][4]) { filter->cache = c | 0x40000; filter->status = 5; @@ -613,11 +597,10 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) c1 = filter->cache & 0xffff; mode = (filter->cache & 0xf0000) >> 16; - filter->cache = 0; - filter->status = 0; + filter->cache = filter->status = 0; if (mode == 0x4) { - for (i=0; i<4; i++) { + for (i = 0; i < 4; i++) { if (c1 == code_tbl_m[i+8][4] && c == code_tbl_m[i+8][5]) { s1 = code_tbl_m[i+8][0]; break; @@ -630,11 +613,9 @@ mbfl_filt_conv_wchar_sjis_mac(int c, mbfl_convert_filter *filter) SJIS_ENCODE(c1, c2, s1, s2); CK((*filter->output_function)(s1, filter->data)); CK((*filter->output_function)(s2, filter->data)); - } - - if (s1 <= 0) { + } else { CK(mbfl_filt_conv_illegal_output(0xf862, filter)); - for (i=0; i<4; i++) { + for (i = 0; i < 4; i++) { if (c1 == code_tbl_m[i+8][4]) { CK(mbfl_filt_conv_illegal_output( code_tbl_m[i+8][2], filter)); CK(mbfl_filt_conv_illegal_output( code_tbl_m[i+8][3], filter)); diff --git a/ext/mbstring/libmbfl/filters/sjis_mac2uni.h b/ext/mbstring/libmbfl/filters/sjis_mac2uni.h index c50caba29dda5..0b953132d9799 100644 --- a/ext/mbstring/libmbfl/filters/sjis_mac2uni.h +++ b/ext/mbstring/libmbfl/filters/sjis_mac2uni.h @@ -253,7 +253,7 @@ static const unsigned short code_tbl_m[][6] = { {0x0523, 0xf862, 0x8ca1, 0x56e3, 0x6cd5, 0x4eba}, }; -static int code_tbl_m_len = sizeof(code_tbl_m)/(sizeof(unsigned short)*6); +static int code_tbl_m_len = sizeof(code_tbl_m)/(sizeof(unsigned short)*6); static const unsigned short s_form_tbl[] = { 0x2010,0x2016,0x2026, diff --git a/ext/mbstring/tests/sjismac_encoding.phpt b/ext/mbstring/tests/sjismac_encoding.phpt index 1e80800928aed..5d1c2de869e32 100644 --- a/ext/mbstring/tests/sjismac_encoding.phpt +++ b/ext/mbstring/tests/sjismac_encoding.phpt @@ -87,6 +87,17 @@ findInvalidChars($fromUnicode, $invalidChars, $unused, array_fill_keys(range(0, convertAllInvalidChars($invalidChars, $fromUnicode, 'UTF-16BE', 'SJIS-mac', '%'); echo "Unicode -> SJIS-mac conversion works on all invalid characters\n"; +// Test special combining characters for MacJapanese when *not* appearing in +// an expected combination +convertInvalidString("\x20\x10\xF8\x7A", "\x81\x5D%", "UTF-16BE", "SJIS-mac"); +convertInvalidString("\x20\x10\x20\xDD", "\x81\x5D%", "UTF-16BE", "SJIS-mac"); +convertInvalidString("\x20\x10\xF8\x7F", "\x81\x5D%", "UTF-16BE", "SJIS-mac"); +convertInvalidString("\x21\xE6\xF8\x7E", "\x86\xD0%", "UTF-16BE", "SJIS-mac"); + +convertInvalidString("\xF8\x60\x00\x30\x12\x34", "%%%", "UTF-16BE", "SJIS-mac"); +convertInvalidString("\xF8\x61\x00\x46\x00\x41\x12\x34", "%%%%", "UTF-16BE", "SJIS-mac"); +convertInvalidString("\xF8\x62\x00\x58\x00\x49\x00\x49\x12\x34", "%%%%%", "UTF-16BE", "SJIS-mac"); + // Test "long" illegal character markers mb_substitute_character("long"); convertInvalidString("\x81", "%", "SJIS-mac", "UTF-8"); From 6a2dca3420209c325c0e1927a4d3abb983b224ed Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 1 Sep 2021 21:50:12 +0200 Subject: [PATCH 0030/1346] Add more tests for ISO-2022-JP-KDDI text conversion --- ext/mbstring/tests/iso2022jp_kddi_encoding.phpt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ext/mbstring/tests/iso2022jp_kddi_encoding.phpt b/ext/mbstring/tests/iso2022jp_kddi_encoding.phpt index 6a0246b7bf03b..87ebdb1cc86d9 100644 --- a/ext/mbstring/tests/iso2022jp_kddi_encoding.phpt +++ b/ext/mbstring/tests/iso2022jp_kddi_encoding.phpt @@ -193,10 +193,22 @@ foreach (array_keys($invalidChars) as $invalid) { testInvalidString("\x1B\$B" . $invalid, "\x00\x00\x00%", 'ISO-2022-JP-KDDI', 'UTF-32BE'); } } +// Try Kanji which starts with a good byte, but the 2nd byte is junk +testInvalidString("\x1B\$B\x21\xFF", "%", 'ISO-2022-JP-KDDI', 'UTF-8'); foreach (array_keys($truncatedChars) as $truncated) testInvalidString("\x1B\$B" . $truncated, "\x00\x00\x00%", 'ISO-2022-JP-KDDI', 'UTF-32BE'); +testValidString("\x1B\$B\x76\x27", "\x00\x01\xF1\xEF\x00\x01\xF1\xF5", 'ISO-2022-JP-KDDI', 'UTF-32BE', false); // Japan flag emoji +testValidString("\x00#\x20\xE3", "\x1B\$B\x71\x69\x1B(B", 'UTF-16BE', 'ISO-2022-JP-KDDI', false); // Phone key emoji + +testValidString("\x1B\$(B\x21\x21", "\x30\x00", 'ISO-2022-JP-KDDI', 'UTF-16BE', false); // Try ESC $ ( B escape sequence + +// Switch from JISX 0208 Kanji to ASCII +testValidString("\x30\x00\x00A", "\x1B\$B\x21\x21\x1B(BA", "UTF-16BE", "ISO-2022-JP-KDDI", false); +// Switch from JISX 0208 Kanji to JISX 0201 Kana +testValidString("\x30\x00\xFF\x67", "\x1B\$B\x21\x21\x1B(I'\x1B(B", "UTF-16BE", "ISO-2022-JP-KDDI", false); + echo "JIS X 0208 (with MS extensions) and KDDI emoji support OK\n"; testValidString("\x00\xA5", "\x1B\$B!o\x1B(B", "UTF-16BE", "ISO-2022-JP-KDDI", false); @@ -205,6 +217,8 @@ testValidString("\xFF\x5E", "\x1B\$B!A\x1B(B", "UTF-16BE", "ISO-2022-JP-KDDI", f echo "Other mappings from Unicode -> ISO-2022-JP-KDDI OK\n"; +testInvalidString("\x1B\$B\x7F\x7E", "%", 'ISO-2022-JP-KDDI', 'UTF-8'); + // Test "long" illegal character markers mb_substitute_character("long"); convertInvalidString("\xE0", "%", "ISO-2022-JP-KDDI", "UTF-8"); @@ -213,6 +227,8 @@ convertInvalidString("\x1B", "%", "ISO-2022-JP-KDDI", "UTF-8"); convertInvalidString("\x1B.", "%", "ISO-2022-JP-KDDI", "UTF-8"); convertInvalidString("\x1B\$", "%", "ISO-2022-JP-KDDI", "UTF-8"); convertInvalidString("\x1B\$.", "%", "ISO-2022-JP-KDDI", "UTF-8"); +convertInvalidString("\x1B(", "%", "ISO-2022-JP-KDDI", "UTF-8"); +convertInvalidString("\x1B(.", "%", "ISO-2022-JP-KDDI", "UTF-8"); convertInvalidString("\x1B\$(X", "%", "ISO-2022-JP-KDDI", "UTF-8"); convertInvalidString("\x1B\$B\x9F", "%", "ISO-2022-JP-KDDI", "UTF-8"); // 0x9F does not start any 2-byte character convertInvalidString("\xE0\x00", "U+E000", "UTF-16BE", "ISO-2022-JP-KDDI"); From edf2bd95d9587c6e2611a8fec5cae036edef333f Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 1 Sep 2021 22:13:24 +0200 Subject: [PATCH 0031/1346] Add more tests for ISO-2022-JP and JIS7/8 text conversion --- ext/mbstring/tests/iso2022jp_encoding.phpt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ext/mbstring/tests/iso2022jp_encoding.phpt b/ext/mbstring/tests/iso2022jp_encoding.phpt index 54653d1bbf789..4858f45e41e5b 100644 --- a/ext/mbstring/tests/iso2022jp_encoding.phpt +++ b/ext/mbstring/tests/iso2022jp_encoding.phpt @@ -132,6 +132,10 @@ for ($i = 0x21; $i <= 0x7E; $i++) { testInvalid("\x1B\$B" . chr($i), "\x00%", 'ISO-2022-JP'); } +/* Switch from Kanji to ASCII */ +testValidString("\x30\x00\x00A", "\x1B\$B\x21\x21\x1B(BA", "UTF-16BE", "JIS", false); +testValidString("\x30\x00\x00A", "\x1B\$B\x21\x21\x1B(BA", "UTF-16BE", "ISO-2022-JP", false); + echo "JIS X 0208 support OK\n"; /* JIS7 supports escape to switch to JIS X 0212 charset, but ISO-2022-JP does not */ @@ -156,6 +160,10 @@ for ($i = 0x21; $i <= 0x7E; $i++) { testInvalid("\x1B\$(D" . chr($i), "\x00%", 'JIS'); } +testValidString("\x00\xA1", "\x1B\$(D\x22\x42\x1B(B", "UTF-16BE", "JIS", false); +// Check that ISO-2022-JP treats JISX 0212 chars as error +convertInvalidString("\x00\xA1", "%", "UTF-16BE", "ISO-2022-JP", false); + echo "JIS X 0212 support OK\n"; /* All possible escape sequences */ @@ -199,6 +207,9 @@ foreach (['JIS', 'ISO-2022-JP'] as $encoding) { echo "Other mappings from Unicode -> ISO-2022-JP are OK\n"; +convertInvalidString("\xFF\xFE", "%", "UTF-16BE", "JIS", false); +convertInvalidString("\xFF\xFE", "%", "UTF-16BE", "ISO-2022-JP", false); + // Test "long" illegal character markers mb_substitute_character("long"); convertInvalidString("\xE0", "%", "JIS", "UTF-8"); From fd0e0c73907287dbf86f69bb3d76c1b936125d9c Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Thu, 2 Sep 2021 17:13:54 +0200 Subject: [PATCH 0032/1346] Add another test for UCS-2 text conversion --- ext/mbstring/tests/other_encodings.phpt | 10 ---------- ext/mbstring/tests/ucs2_encoding.phpt | 5 +++++ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/ext/mbstring/tests/other_encodings.phpt b/ext/mbstring/tests/other_encodings.phpt index 4a62966be5021..ac0dc496c991d 100644 --- a/ext/mbstring/tests/other_encodings.phpt +++ b/ext/mbstring/tests/other_encodings.phpt @@ -20,12 +20,6 @@ echo "7bit done\n"; var_dump(mb_convert_encoding("\x01\x00", "8bit", "UTF-16BE")); // codepoints over 0xFF are illegal for '8-bit' echo "8bit done\n"; -// UCS-2 -echo bin2hex(mb_convert_encoding("\xFF\xFE\x00\x30", "UTF-16BE", "UCS-2")), "\n"; -echo bin2hex(mb_convert_encoding("\xFE\xFF\x30\x00", "UTF-16BE", "UCS-2")), "\n"; -echo bin2hex(mb_convert_encoding("\x00\x30", "UTF-16BE", "UCS-2LE")), "\n"; -echo "UCS-2 done\n"; - // UCS-4 echo bin2hex(mb_convert_encoding("\xFF\xFE\x00\x00\x00\x30\x00\x00", "UTF-16BE", "UCS-4")), "\n"; echo bin2hex(mb_convert_encoding("\x00\x00\xFE\xFF\x00\x00\x30\x01", "UTF-16BE", "UCS-4")), "\n"; @@ -45,10 +39,6 @@ string(3) "ABC" string(1) "%" 8bit done 3000 -3000 -3000 -UCS-2 done -3000 3001 3002 3003 diff --git a/ext/mbstring/tests/ucs2_encoding.phpt b/ext/mbstring/tests/ucs2_encoding.phpt index 468d813ad6e64..faa43a6231f85 100644 --- a/ext/mbstring/tests/ucs2_encoding.phpt +++ b/ext/mbstring/tests/ucs2_encoding.phpt @@ -7,6 +7,11 @@ mbstring include('encoding_tests.inc'); mb_substitute_character(0x25); +testValidString("\xFF\xFE\x00\x30", "\x30\x00", "UCS-2", "UTF-16BE", false); +testValidString("\xFE\xFF\x30\x00", "\x30\x00", "UCS-2", "UTF-16BE", false); +testValidString("\x30\x00", "\x30\x00", "UCS-2", "UTF-16BE"); +testValidString("\x00\x30", "\x30\x00", "UCS-2LE", "UTF-16BE"); + // Test "long" illegal character markers mb_substitute_character("long"); From ae71bfdee7db4019fd23d4028a2b01e3858529d0 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Thu, 2 Sep 2021 22:27:01 +0200 Subject: [PATCH 0033/1346] Add more tests for UCS-4 text conversion --- ext/mbstring/tests/other_encodings.phpt | 16 ---------------- ext/mbstring/tests/ucs4_encoding.phpt | 7 +++++++ 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/ext/mbstring/tests/other_encodings.phpt b/ext/mbstring/tests/other_encodings.phpt index ac0dc496c991d..f071989fee698 100644 --- a/ext/mbstring/tests/other_encodings.phpt +++ b/ext/mbstring/tests/other_encodings.phpt @@ -20,16 +20,6 @@ echo "7bit done\n"; var_dump(mb_convert_encoding("\x01\x00", "8bit", "UTF-16BE")); // codepoints over 0xFF are illegal for '8-bit' echo "8bit done\n"; -// UCS-4 -echo bin2hex(mb_convert_encoding("\xFF\xFE\x00\x00\x00\x30\x00\x00", "UTF-16BE", "UCS-4")), "\n"; -echo bin2hex(mb_convert_encoding("\x00\x00\xFE\xFF\x00\x00\x30\x01", "UTF-16BE", "UCS-4")), "\n"; -echo bin2hex(mb_convert_encoding("\x02\x30\x00\x00", "UTF-16BE", "UCS-4LE")), "\n"; -echo bin2hex(mb_convert_encoding("\x00\x00\x30\x03", "UTF-16BE", "UCS-4BE")), "\n"; - -mb_substitute_character("long"); -echo mb_convert_encoding("\x01\x02\x03", "UTF-8", "UCS-4"), "\n"; -echo "UCS-4 done\n"; - ?> --EXPECT-- string(3) "ABC" @@ -38,9 +28,3 @@ string(3) "ABC" 7bit done string(1) "%" 8bit done -3000 -3001 -3002 -3003 -% -UCS-4 done diff --git a/ext/mbstring/tests/ucs4_encoding.phpt b/ext/mbstring/tests/ucs4_encoding.phpt index 953a3cd3fb9ee..973e81b99a6b0 100644 --- a/ext/mbstring/tests/ucs4_encoding.phpt +++ b/ext/mbstring/tests/ucs4_encoding.phpt @@ -7,6 +7,13 @@ mbstring include('encoding_tests.inc'); mb_substitute_character(0x25); +testValidString("\xFF\xFE\x00\x00\x00\x30\x00\x00", "\x30\x00", "UCS-4", "UTF-16BE", false); +testValidString("\x00\x00\xFE\xFF\x00\x00\x30\x01", "\x30\x01", "UCS-4", "UTF-16BE", false); +testValidString("\x02\x30\x00\x00", "\x30\x02", "UCS-4LE", "UTF-16BE"); +testValidString("\x00\x00\x30\x03", "\x30\x03", "UCS-4BE", "UTF-16BE"); + +convertInvalidString("\x01\x02\x03", "%", "UCS-4", "UTF-8"); + // Test "long" illegal character markers mb_substitute_character("long"); convertInvalidString("\x6F\x00\x00\x00", "U+6F000000", "UCS-4BE", "UTF-8"); From 32df61c55833c9a72b853ca0244dfff55aba9f6f Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 3 Sep 2021 20:53:25 +0200 Subject: [PATCH 0034/1346] Add more tests for UTF-7 text conversion --- ext/mbstring/tests/utf_encodings.phpt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/tests/utf_encodings.phpt b/ext/mbstring/tests/utf_encodings.phpt index 9e47fe36ce480..ee0acc891bbec 100644 --- a/ext/mbstring/tests/utf_encodings.phpt +++ b/ext/mbstring/tests/utf_encodings.phpt @@ -962,6 +962,7 @@ for ($i = 0; $i < 256; $i++) { testValidString('+' . encode("\x12\x34", 'UTF-16BE') . '-', "\x00\x00\x12\x34", 'UTF-7', 'UTF-32BE'); testValidString('+' . encode("\x12\x34\x56\x78", 'UTF-16BE') . '-', "\x00\x00\x12\x34\x00\x00\x56\x78", 'UTF-7', 'UTF-32BE'); testValidString('+' . encode("\x12\x34\x56\x78\x00\x40", 'UTF-16BE') . '-', "\x00\x00\x12\x34\x00\x00\x56\x78\x00\x00\x00\x40", 'UTF-7', 'UTF-32BE'); +testValidString('+' . encode("\xFF\xEE\xEE\xFF", 'UTF-16BE') . '-', "\x00\x00\xFF\xEE\x00\x00\xEE\xFF", 'UTF-7', 'UTF-32BE'); // Surrogate pair testValidString('+' . encode("\x00\x01\x04\x00", 'UTF-32BE') . '-', "\x00\x01\x04\x00", 'UTF-7', 'UTF-32BE'); @@ -981,7 +982,7 @@ testValidString('+' . encode('AB', 'ASCII') . '-+' . encode('CD', 'ASCII') . '-' testValidString('+' . encode('AB', 'ASCII') . '-!+' . encode('CD', 'ASCII') . '-', "\x00A\x00B\x00!\x00C\x00D", 'UTF-7', 'UTF-16BE', false); // + section terminated by a non-Base64 ASCII character which is NOT - -for ($i = 0; $i < 128; $i++) { +for ($i = 0; $i < 128; $i++) { if ($i >= ord('A') && $i <= ord('Z')) continue; if ($i >= ord('a') && $i <= ord('z')) @@ -994,22 +995,39 @@ for ($i = 0; $i < 128; $i++) { testValidString('+' . encode("\x12\x34", 'UTF-16BE') . $char, "\x00\x00\x12\x34\x00\x00\x00" . $char, 'UTF-7', 'UTF-32BE', false); } +// Non-direct character followed by direct character +testValidString('%A', '+ACU-A', 'ASCII', 'UTF-7'); +testValidString('%%A', '+ACUAJQ-A', 'ASCII', 'UTF-7'); +testValidString('%%%A', '+ACUAJQAl-A', 'ASCII', 'UTF-7'); + // Now let's see how UTF-7 can go BAD... function rawEncode($str) { return str_replace('=', '', base64_encode($str)); } +// Totally bogus byte +testInvalidString("\xFF", "%", 'UTF-7', 'UTF-8'); +// Totally bogus codepoint... '+ACU-' is '%' in UTF-7' +testInvalidString("\x12\x34\x56\x78", "+ACU-", 'UTF-32BE', 'UTF-7'); + // First, messed up UTF16 in + section // Second half of surrogate pair coming first testInvalidString('+' . rawEncode("\xDC\x01\xD8\x02") . '-', "\x00\x00\x00%\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\x00.\xDC\x01\xD8\x02") . '-', "\x00\x00\x00.\x00\x00\x00%\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\x00.\x00.\xDC\x01\xD8\x02") . '-', "\x00\x00\x00.\x00\x00\x00.\x00\x00\x00%\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); // First half of surrogate pair not followed by second half testInvalidString('+' . rawEncode("\xD8\x01\x00A") . '-', "\x00\x00\x00%\x00\x00\x00A", 'UTF-7', 'UTF-32BE'); testInvalidString('+' . rawEncode("\xD8\x01\xD9\x02") . '-', "\x00\x00\x00%\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\x00.\xD8\x01\x00A") . '-', "\x00\x00\x00.\x00\x00\x00%\x00\x00\x00A", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\x00.\xD8\x01\xD9\x02") . '-', "\x00\x00\x00.\x00\x00\x00%\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\x00.\x00.\xD8\x01\x00A") . '-', "\x00\x00\x00.\x00\x00\x00.\x00\x00\x00%\x00\x00\x00A", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\x00.\x00.\xD8\x01\xD9\x02") . '-', "\x00\x00\x00.\x00\x00\x00.\x00\x00\x00%\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); // First half of surrogate pair appearing at end of string testInvalidString('+' . rawEncode("\xD8\x01") . '-', "\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +testInvalidString('+' . rawEncode("\xD8\x01"), "\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); // Truncated string testInvalidString('+' . rawEncode("\x01") . '-', "\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); From bf940a13ffc8d9227e18606fec78fa277de05073 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 3 Sep 2021 22:52:38 +0200 Subject: [PATCH 0035/1346] Add another test for SJIS-Mobile text conversion --- ext/mbstring/tests/sjis_mobile_encodings.phpt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/tests/sjis_mobile_encodings.phpt b/ext/mbstring/tests/sjis_mobile_encodings.phpt index 2e6af579ee255..e692b9fbfde3b 100644 --- a/ext/mbstring/tests/sjis_mobile_encodings.phpt +++ b/ext/mbstring/tests/sjis_mobile_encodings.phpt @@ -290,7 +290,10 @@ function testSJISVariant($validChars, $nonInvertible, $encoding) { // flags, but in Unicode these are represented by a sequence of _two_ codepoints // So if only one of those two codepoints appears at the end of a string, it can't // be converted to SJIS and should be treated as an error - convertInvalidString("\x00\x01\xF1\xE6", "%", "UTF-32BE", $encoding); // Regional Indicator A + convertInvalidString("\x00\x01\xF1\xE9", "%", "UTF-32BE", $encoding); // Regional Indicator C + + // Test Regional Indicator codepoint followed by some other codepoint + convertInvalidString("\x00\x01\xF1\xE9\x00\x00\x00A", "%A", "UTF-32BE", $encoding); } testSJISVariant($docomo, $nonInvertibleDocomo, 'SJIS-Mobile#DOCOMO'); From 907d0c32484f39bc32f404c53c3ea3f9a4c770c2 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 3 Sep 2021 23:17:52 +0200 Subject: [PATCH 0036/1346] Add more tests for UTF7-IMAP text conversion --- ext/mbstring/tests/utf7imap_encoding.phpt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ext/mbstring/tests/utf7imap_encoding.phpt b/ext/mbstring/tests/utf7imap_encoding.phpt index 3899c2c1afea0..e48ccc167c3bb 100644 --- a/ext/mbstring/tests/utf7imap_encoding.phpt +++ b/ext/mbstring/tests/utf7imap_encoding.phpt @@ -110,24 +110,30 @@ if (strlen($testString) != 4) $testString = substr($testString, 2, 2) . substr($testString, 0, 2); identifyInvalidString("&" . mBase64($testString) . "-", 'UTF7-IMAP'); /* (Or could appear by itself) */ -$testString = substr($testString, 0, 2); -identifyInvalidString("&" . mBase64($testString) . "-", 'UTF7-IMAP'); +$testString2 = substr($testString, 0, 2); +identifyInvalidString("&" . mBase64($testString2) . "-", 'UTF7-IMAP'); /* ...and we should detect this wherever it occurs */ -$singleChar = mb_convert_encoding("1", 'UTF-16BE', 'ASCII'); +$singleChar = "\x00\x01"; $doubleChar = mb_convert_encoding("\x00\x01\x04\x01", 'UTF-16BE', 'UTF-32BE'); if (strlen($doubleChar) != 4) die("That was supposed to be a surrogate pair"); identifyInvalidString("&" . mBase64($singleChar . $testString) . "-", 'UTF7-IMAP'); identifyInvalidString("&" . mBase64($singleChar . $singleChar . $testString) . "-", 'UTF7-IMAP'); identifyInvalidString("&" . mBase64($singleChar . $singleChar . $singleChar . $testString) . "-", 'UTF7-IMAP'); +identifyInvalidString("&" . mBase64($singleChar . $testString2) . "-", 'UTF7-IMAP'); +identifyInvalidString("&" . mBase64($singleChar . $singleChar . $testString2) . "-", 'UTF7-IMAP'); +identifyInvalidString("&" . mBase64($singleChar . $singleChar . $singleChar . $testString2) . "-", 'UTF7-IMAP'); identifyInvalidString("&" . mBase64($doubleChar . $testString) . "-", 'UTF7-IMAP'); identifyInvalidString("&" . mBase64($singleChar . $doubleChar . $testString) . "-", 'UTF7-IMAP'); identifyInvalidString("&" . mBase64($singleChar . $singleChar . $doubleChar . $testString) . "-", 'UTF7-IMAP'); +identifyInvalidString("&" . mBase64($doubleChar . $testString2) . "-", 'UTF7-IMAP'); +identifyInvalidString("&" . mBase64($singleChar . $doubleChar . $testString2) . "-", 'UTF7-IMAP'); +identifyInvalidString("&" . mBase64($singleChar . $singleChar . $doubleChar . $testString2) . "-", 'UTF7-IMAP'); /* 2. The first half of a surrogate pair might be followed by an invalid 2nd part, */ $testString = mb_convert_encoding("\x00\x01\x04\x00", 'UTF-16BE', 'UTF-32BE'); -$testString = substr($testString, 0, 2) . mb_convert_encoding("a", 'UTF-16BE', 'ASCII'); +$testString = substr($testString, 0, 2) . "\x00a"; identifyInvalidString("&" . mBase64($testString) . "-", 'UTF7-IMAP'); /* ...and we should also detect that wherever it occurs... */ From d7eb44299322a63f78634aa26241c5c5bf6a02a5 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sat, 4 Sep 2021 22:07:32 +0200 Subject: [PATCH 0037/1346] Add more tests for ISO-2022-JP-2004 text conversion --- ext/mbstring/tests/iso2022jp_2004_encoding.phpt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ext/mbstring/tests/iso2022jp_2004_encoding.phpt b/ext/mbstring/tests/iso2022jp_2004_encoding.phpt index 078881db5a972..f678aeae2c738 100644 --- a/ext/mbstring/tests/iso2022jp_2004_encoding.phpt +++ b/ext/mbstring/tests/iso2022jp_2004_encoding.phpt @@ -320,6 +320,11 @@ convertInvalidString("\xE0", "%", "ISO-2022-JP-2004", "UTF-8"); convertInvalidString("\x1B\$(X", "%", "ISO-2022-JP-2004", "UTF-8"); // Invalid escape convertInvalidString("\x1B\$B!", "%", "ISO-2022-JP-2004", "UTF-8"); // Truncated character +// Test sequences of 2 Unicode codepoints which convert to a single character in ISO-2022-JP-2004 +testValidString("\x02\x54\x03\x00", "\x1B\$(Q+H\x1B(B", "UTF-16BE", "ISO-2022-JP-2004"); +// Including the case where such a codepoint is followed by one which it can't combine with +testValidString("\x02\x54\x00A", "\x1B\$(Q+8\x1B(BA", "UTF-16BE", "ISO-2022-JP-2004"); + echo "All done!\n"; ?> From c8e65c9d74cf51b1ade4c8333111821746da6906 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 5 Sep 2021 15:00:21 +0200 Subject: [PATCH 0038/1346] Remove COMPAT2 conversion modes for mb_convert_kana mb_convert_kana has conversion modes selected using 'M'/'m', which convert a few various punctuation and symbol characters between 'ordinary' and full-width forms. The constants which refer to these modes have names ending with COMPAT1. Internally, there are similar conversion modes with names ending in COMPAT2. They are like COMPAT1 modes, but they operate on a smaller set of characters. But... that is all just dead code, because there is no way for user code to select the COMPAT2 modes. I have no idea what the original author intended those COMPAT2 modes to actually be used for. Guess it doesn't really matter, anyways. At this point, it's just more food for the flames. --- .../filters/mbfilter_tl_jisx0201_jisx0208.c | 22 ------------------- .../filters/mbfilter_tl_jisx0201_jisx0208.h | 8 ++----- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c index f377a00006031..65065a0bf60e3 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c @@ -114,16 +114,6 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) } else if (c == 0x22) { return 0x201d; /* RIGHT DOUBLE QUOTATION MARK */ } - } else if (mode & MBFL_FILT_TL_HAN2ZEN_COMPAT2) { /* special ascii to symbol */ - if (c == 0x5c) { - return 0xff3c; /* FULLWIDTH REVERSE SOLIDUS */ - } else if (c == 0x7e) { - return 0xff5e; /* FULLWIDTH TILDE */ - } else if (c == 0x27) { - return 0xff07; /* FULLWIDTH APOSTROPHE */ - } else if (c == 0x22) { - return 0xff02; /* FULLWIDTH QUOTATION MARK */ - } } if (mode & (MBFL_FILT_TL_ZEN2HAN_ALL | MBFL_FILT_TL_ZEN2HAN_ALPHA | MBFL_FILT_TL_ZEN2HAN_NUMERIC | MBFL_FILT_TL_ZEN2HAN_SPACE)) { @@ -205,18 +195,6 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) } } - if (mode & MBFL_FILT_TL_ZEN2HAN_COMPAT2) { /* special symbol to ascii */ - if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ - return 0x5c; - } else if (c == 0xff5e) { /* FULLWIDTH TILDE */ - return 0x7e; - } else if (c == 0xff07) { /* FULLWIDTH APOSTROPHE */ - return 0x27; - } else if (c == 0xff02) { /* FULLWIDTH QUOTATION MARK */ - return 0x22; - } - } - return c; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h index f474735187c8d..c44e4fae0ffe5 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h @@ -46,8 +46,6 @@ #define MBFL_FILT_TL_ZEN2HAN_KANA2HIRA 0x00020000 #define MBFL_FILT_TL_HAN2ZEN_COMPAT1 0x00100000 #define MBFL_FILT_TL_ZEN2HAN_COMPAT1 0x00200000 -#define MBFL_FILT_TL_HAN2ZEN_COMPAT2 0x00400000 -#define MBFL_FILT_TL_ZEN2HAN_COMPAT2 0x00800000 #define MBFL_FILT_TL_HAN2ZEN_MASK ( \ MBFL_FILT_TL_HAN2ZEN_ALL |\ MBFL_FILT_TL_HAN2ZEN_ALPHA |\ @@ -56,8 +54,7 @@ MBFL_FILT_TL_HAN2ZEN_KATAKANA |\ MBFL_FILT_TL_HAN2ZEN_HIRAGANA |\ MBFL_FILT_TL_HAN2ZEN_GLUE |\ - MBFL_FILT_TL_HAN2ZEN_COMPAT1 |\ - MBFL_FILT_TL_HAN2ZEN_COMPAT2) + MBFL_FILT_TL_HAN2ZEN_COMPAT1) #define MBFL_FILT_TL_ZEN2HAN_MASK ( \ MBFL_FILT_TL_ZEN2HAN_ALL | \ MBFL_FILT_TL_ZEN2HAN_ALPHA | \ @@ -67,8 +64,7 @@ MBFL_FILT_TL_ZEN2HAN_HIRAGANA | \ MBFL_FILT_TL_ZEN2HAN_HIRA2KANA | \ MBFL_FILT_TL_ZEN2HAN_KANA2HIRA | \ - MBFL_FILT_TL_ZEN2HAN_COMPAT1 | \ - MBFL_FILT_TL_ZEN2HAN_COMPAT2) + MBFL_FILT_TL_ZEN2HAN_COMPAT1) extern const struct mbfl_convert_vtbl vtbl_tl_jisx0201_jisx0208; From 9e1447dbf367ffeecfae2b048a6c58d8e4aac0a9 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 5 Sep 2021 15:18:45 +0200 Subject: [PATCH 0039/1346] Rename KANA2HIRA and HIRA2KANA constants (for mb_convert_kana) mb_convert_kana is able to convert fullwidth katakana to fullwidth hiragana (and vice versa). The constants referring to these modes had names like MBFL_FILT_TL_ZEN2HAN_KANA2HIRA. The "ZEN2HAN" part of the name is misleading, since these modes do not convert fullwidth (zenkaku) kana to halfwidth (hankaku). The converted characters are fullwidth both before and after the conversion. So... let's name the constants accordingly. --- .../libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c | 6 +++--- .../libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h | 8 ++++---- ext/mbstring/mbstring.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c index 65065a0bf60e3..f49cadbca7422 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c @@ -165,11 +165,11 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) } else if (c == 0x30fb) { return 0xff65; /* HALFWIDTH KATAKANA MIDDLE DOT */ } - } else if (mode & (MBFL_FILT_TL_ZEN2HAN_HIRA2KANA | MBFL_FILT_TL_ZEN2HAN_KANA2HIRA)) { - if ((mode & MBFL_FILT_TL_ZEN2HAN_HIRA2KANA) && ((c >= 0x3041 && c <= 0x3093) || c == 0x309d || c == 0x309e)) { + } else if (mode & (MBFL_FILT_TL_ZENKAKU_HIRA2KANA | MBFL_FILT_TL_ZENKAKU_KANA2HIRA)) { + if ((mode & MBFL_FILT_TL_ZENKAKU_HIRA2KANA) && ((c >= 0x3041 && c <= 0x3093) || c == 0x309d || c == 0x309e)) { /* Zenkaku hiragana to Zenkaku katakana */ return c + 0x60; - } else if ((mode & MBFL_FILT_TL_ZEN2HAN_KANA2HIRA) && ((c >= 0x30a1 && c <= 0x30f3) || c == 0x30fd || c == 0x30fe)) { + } else if ((mode & MBFL_FILT_TL_ZENKAKU_KANA2HIRA) && ((c >= 0x30a1 && c <= 0x30f3) || c == 0x30fd || c == 0x30fe)) { /* Zenkaku katakana to Zenkaku hiragana */ return c - 0x60; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h index c44e4fae0ffe5..23a0add241ef0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h @@ -42,8 +42,8 @@ #define MBFL_FILT_TL_HAN2ZEN_GLUE 0x00000800 #define MBFL_FILT_TL_ZEN2HAN_KATAKANA 0x00001000 #define MBFL_FILT_TL_ZEN2HAN_HIRAGANA 0x00002000 -#define MBFL_FILT_TL_ZEN2HAN_HIRA2KANA 0x00010000 -#define MBFL_FILT_TL_ZEN2HAN_KANA2HIRA 0x00020000 +#define MBFL_FILT_TL_ZENKAKU_HIRA2KANA 0x00010000 +#define MBFL_FILT_TL_ZENKAKU_KANA2HIRA 0x00020000 #define MBFL_FILT_TL_HAN2ZEN_COMPAT1 0x00100000 #define MBFL_FILT_TL_ZEN2HAN_COMPAT1 0x00200000 #define MBFL_FILT_TL_HAN2ZEN_MASK ( \ @@ -62,8 +62,8 @@ MBFL_FILT_TL_ZEN2HAN_SPACE | \ MBFL_FILT_TL_ZEN2HAN_KATAKANA | \ MBFL_FILT_TL_ZEN2HAN_HIRAGANA | \ - MBFL_FILT_TL_ZEN2HAN_HIRA2KANA | \ - MBFL_FILT_TL_ZEN2HAN_KANA2HIRA | \ + MBFL_FILT_TL_ZENKAKU_HIRA2KANA | \ + MBFL_FILT_TL_ZENKAKU_KANA2HIRA | \ MBFL_FILT_TL_ZEN2HAN_COMPAT1) extern const struct mbfl_convert_vtbl vtbl_tl_jisx0201_jisx0208; diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 75c35e80ef494..bcb4d5b06930f 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2910,10 +2910,10 @@ PHP_FUNCTION(mb_convert_kana) opt |= MBFL_FILT_TL_HAN2ZEN_GLUE; break; case 'C': - opt |= MBFL_FILT_TL_ZEN2HAN_HIRA2KANA; + opt |= MBFL_FILT_TL_ZENKAKU_HIRA2KANA; break; case 'c': - opt |= MBFL_FILT_TL_ZEN2HAN_KANA2HIRA; + opt |= MBFL_FILT_TL_ZENKAKU_KANA2HIRA; break; case 'M': /* TODO: figure out what 'M' and 'm' are for, and rename the constant From 92fb3de9d7666038732d65179b6b48e31af52ad0 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 5 Sep 2021 15:19:17 +0200 Subject: [PATCH 0040/1346] Remove unused MBFL_FILT_TL_*_MASK constants Sending more unused, unneeded, unwanted, unrequired, unloved and uncalled-for code where it belongs. --- .../filters/mbfilter_tl_jisx0201_jisx0208.h | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h index 23a0add241ef0..832225ab1429e 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h @@ -46,25 +46,6 @@ #define MBFL_FILT_TL_ZENKAKU_KANA2HIRA 0x00020000 #define MBFL_FILT_TL_HAN2ZEN_COMPAT1 0x00100000 #define MBFL_FILT_TL_ZEN2HAN_COMPAT1 0x00200000 -#define MBFL_FILT_TL_HAN2ZEN_MASK ( \ - MBFL_FILT_TL_HAN2ZEN_ALL |\ - MBFL_FILT_TL_HAN2ZEN_ALPHA |\ - MBFL_FILT_TL_HAN2ZEN_NUMERIC |\ - MBFL_FILT_TL_HAN2ZEN_SPACE |\ - MBFL_FILT_TL_HAN2ZEN_KATAKANA |\ - MBFL_FILT_TL_HAN2ZEN_HIRAGANA |\ - MBFL_FILT_TL_HAN2ZEN_GLUE |\ - MBFL_FILT_TL_HAN2ZEN_COMPAT1) -#define MBFL_FILT_TL_ZEN2HAN_MASK ( \ - MBFL_FILT_TL_ZEN2HAN_ALL | \ - MBFL_FILT_TL_ZEN2HAN_ALPHA | \ - MBFL_FILT_TL_ZEN2HAN_NUMERIC | \ - MBFL_FILT_TL_ZEN2HAN_SPACE | \ - MBFL_FILT_TL_ZEN2HAN_KATAKANA | \ - MBFL_FILT_TL_ZEN2HAN_HIRAGANA | \ - MBFL_FILT_TL_ZENKAKU_HIRA2KANA | \ - MBFL_FILT_TL_ZENKAKU_KANA2HIRA | \ - MBFL_FILT_TL_ZEN2HAN_COMPAT1) extern const struct mbfl_convert_vtbl vtbl_tl_jisx0201_jisx0208; From 86a0d4b22d471c38b4ce1a80b92611b5e0950dd8 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 5 Sep 2021 14:58:10 +0200 Subject: [PATCH 0041/1346] Add more tests for mb_convert_kana --- ext/mbstring/tests/mb_convert_kana.phpt | 154 +++++++++++++++++++++--- 1 file changed, 134 insertions(+), 20 deletions(-) diff --git a/ext/mbstring/tests/mb_convert_kana.phpt b/ext/mbstring/tests/mb_convert_kana.phpt index a9f9ef333d4f1..b430ca8f1a615 100644 --- a/ext/mbstring/tests/mb_convert_kana.phpt +++ b/ext/mbstring/tests/mb_convert_kana.phpt @@ -16,27 +16,79 @@ $hanKakuB = 'ーアイウエオカキクケコサシスセソ'; $hanKakuC = 'タチツテトナニヌネノハヒフヘホマ'; $hanKakuD = 'ミムメモヤユヨラリルレロワン゙゚'; +echo $zenKakuA . ' => ' . mb_convert_kana($zenKakuA, 'AZKH', 'utf-8'), "\n"; +echo $zenKakuB . ' => ' . mb_convert_kana($zenKakuB, 'azkh', 'utf-8'), "\n"; +echo $zenKakuC . ' => ' . mb_convert_kana($zenKakuC, 'azkh', 'utf-8'), "\n"; +echo $zenKakuD . ' => ' . mb_convert_kana($zenKakuD, 'azkh', 'utf-8'), "\n"; +echo $zenKakuE . ' => ' . mb_convert_kana($zenKakuE, 'azkh', 'utf-8'), "\n"; +echo $zenKakuF . ' => ' . mb_convert_kana($zenKakuF, 'azkh', 'utf-8'), "\n\n"; -echo $zenKakuA . ' => ' . mb_convert_kana($zenKakuA, 'AZKH', 'utf-8'); -echo "\n"; -echo $zenKakuB . ' => ' . mb_convert_kana($zenKakuB, 'azkh', 'utf-8'); -echo "\n"; -echo $zenKakuC . ' => ' . mb_convert_kana($zenKakuC, 'azkh', 'utf-8'); -echo "\n"; -echo $zenKakuD . ' => ' . mb_convert_kana($zenKakuD, 'azkh', 'utf-8'); -echo "\n"; -echo $zenKakuE . ' => ' . mb_convert_kana($zenKakuE, 'azkh', 'utf-8'); -echo "\n"; -echo $zenKakuF . ' => ' . mb_convert_kana($zenKakuF, 'azkh', 'utf-8'); -echo "\n"; -echo "\n"; -echo $hanKakuA . ' => ' . mb_convert_kana($hanKakuA, 'AZKH', 'utf-8'); -echo "\n"; -echo $hanKakuB . ' => ' . mb_convert_kana($hanKakuB, 'AZKH', 'utf-8'); -echo "\n"; -echo $hanKakuC . ' => ' . mb_convert_kana($hanKakuC, 'AZKH', 'utf-8'); -echo "\n"; -echo $hanKakuD . ' => ' . mb_convert_kana($hanKakuD, 'AZKH', 'utf-8'); +echo $hanKakuA . ' => ' . mb_convert_kana($hanKakuA, 'AZKH', 'utf-8'), "\n"; +echo $hanKakuB . ' => ' . mb_convert_kana($hanKakuB, 'AZKH', 'utf-8'), "\n"; +echo $hanKakuC . ' => ' . mb_convert_kana($hanKakuC, 'AZKH', 'utf-8'), "\n"; +echo $hanKakuD . ' => ' . mb_convert_kana($hanKakuD, 'AZKH', 'utf-8'), "\n\n"; + +echo "Convert ASCII letter to full-width: A -> ", bin2hex(mb_convert_kana("\x00A", 'A', 'UTF-16BE')), "\n"; +echo "Convert ASCII letter to full-width: A -> ", bin2hex(mb_convert_kana("\x00A", 'R', 'UTF-16BE')), "\n"; +echo "Convert ASCII numeral to full-width: 1 -> ", bin2hex(mb_convert_kana("\x001", 'N', 'UTF-16BE')), "\n"; +echo "Convert ASCII space to full-width: ", bin2hex(mb_convert_kana("\x00 ", 'S', 'UTF-16BE')), "\n\n"; + +echo "Convert hankaku kana to zenkaku kana:\n"; +echo "Using 'glue' mode:\n"; +echo bin2hex(mb_convert_kana("\xFF\x76\xFF\x9E", 'KV', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x73\xFF\x9E", 'KV', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x8A\xFF\x9F", 'KV', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x8A\x00A", 'KV', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x76\xFF\x9E", 'HV', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x8A\xFF\x9F", 'HV', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x8A\x00A", 'HV', 'UTF-16BE')), "\n"; +echo "Not using 'glue' mode:\n"; +echo bin2hex(mb_convert_kana("\xFF\x70", 'K', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x70", 'H', 'UTF-16BE')), "\n\n"; + +echo "Convert selected punctuation/symbols to full-width and back:\n"; +echo bin2hex(mb_convert_kana("\x00\x5C\x00\xA5\x00\x7E\x20\x3E\x00\x27\x00\x22", 'M', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\xE5\xFF\x3C\xFF\xE3\x20\x3E\x20\x18\x20\x19\x20\x1C\x20\x1D", 'm', 'UTF-16BE')), "\n\n"; + +echo "Convert various full-width characters to half-width:\n"; +echo bin2hex(mb_convert_kana("\xFF\x01", 'a', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x21", 'r', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\xFF\x10", 'n', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x00", 's', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x22\x12", 'a', 'UTF-16BE')), "\n\n"; + +echo "Convert full-width kana to half-width:\n"; +echo bin2hex(mb_convert_kana("\x30\x41", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x01", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x02", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x0C", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x0D", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x9B", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x9C", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\xFC", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\xFB", 'h', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x01", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x02", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x0C", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x0D", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x9B", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x9C", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\xFC", 'k', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\xFB", 'k', 'UTF-16BE')), "\n"; +echo "Including one which will expand to two codepoints:\n"; +echo bin2hex(mb_convert_kana("\x30\x52", 'h', 'UTF-16BE')), "\n\n"; + +echo "Convert full-width hiragana to full-width katakana:\n"; +echo bin2hex(mb_convert_kana("\x30\x41", 'C', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x9D", 'C', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\x9E", 'C', 'UTF-16BE')), "\n\n"; + +echo "Convert full-width katakana to full-width hiragana:\n"; +echo bin2hex(mb_convert_kana("\x30\xA1", 'c', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\xFD", 'c', 'UTF-16BE')), "\n"; +echo bin2hex(mb_convert_kana("\x30\xFE", 'c', 'UTF-16BE')), "\n\n"; + +echo bin2hex(mb_convert_kana("\x00\x00", 'A', 'UTF-16BE')), "\n"; ?> --EXPECT-- ァアィイゥウェエォオカガキギク => ァアィイゥウェエォオカガキギク @@ -50,6 +102,68 @@ echo $hanKakuD . ' => ' . mb_convert_kana($hanKakuD, 'AZKH', 'utf-8'); ーアイウエオカキクケコサシスセソ => ーアイウエオカキクケコサシスセソ タチツテトナニヌネノハヒフヘホマ => タチツテトナニヌネノハヒフヘホマ ミムメモヤユヨラリルレロワン゙゚ => ミムメモヤユヨラリルレロワン゛゜ + +Convert ASCII letter to full-width: A -> ff21 +Convert ASCII letter to full-width: A -> ff21 +Convert ASCII numeral to full-width: 1 -> ff11 +Convert ASCII space to full-width: 3000 + +Convert hankaku kana to zenkaku kana: +Using 'glue' mode: +30ac +30f4 +30d1 +30cf0041 +304c +3071 +306f0041 +Not using 'glue' mode: +30fc +30fc + +Convert selected punctuation/symbols to full-width and back: +ffe5ffe5ffe3ffe32019201d +005c005c007e007e0027002700220022 + +Convert various full-width characters to half-width: +0021 +0041 +0030 +0020 +002d + +Convert full-width kana to half-width: +ff67 +ff64 +ff61 +ff62 +ff63 +ff9e +ff9f +ff70 +ff65 +ff64 +ff61 +ff62 +ff63 +ff9e +ff9f +ff70 +ff65 +Including one which will expand to two codepoints: +ff79ff9e + +Convert full-width hiragana to full-width katakana: +30a1 +30fd +30fe + +Convert full-width katakana to full-width hiragana: +3041 +309d +309e + +0000 --CREDITS-- Jason Easter PHPUG Würzburg From 768265cd227d6cdffe4b817ba465dcc618f2f77d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 6 Sep 2021 11:20:53 +0200 Subject: [PATCH 0042/1346] Fix some more CLEAN sections --- ext/com_dotnet/tests/bug78650.phpt | 4 ++-- .../tests/phar_buildfromdirectory2-win.phpt | 5 ----- ext/phar/tests/phar_gobyebye-win32.phpt | 6 ++++-- .../tests/tar/phar_buildfromiterator4.phpt | 17 ++++++---------- .../tests/tar/phar_buildfromiterator8.phpt | 20 +++++++------------ .../tests/tar/phar_buildfromiterator9.phpt | 17 ++++++---------- .../tests/socket_clear_error-win32.phpt | 6 ------ ...ecursiveDirectoryIterator_hasChildren.phpt | 6 +++++- .../tests/SplFileInfo_getExtension_basic.phpt | 2 +- .../tests/file/005_variation-win32.phpt | 2 +- ext/standard/tests/file/bug65701.phpt | 2 +- .../tests/file/copy_variation12-win32.phpt | 1 - ext/standard/tests/file/realpath_basic4.phpt | 9 +++++++-- .../tests/file/rename_variation-win32.phpt | 6 +----- .../tests/file/rename_variation1-win32.phpt | 2 -- .../tests/file/rename_variation2-win32.phpt | 6 +----- .../tests/file/rename_variation3-win32.phpt | 3 --- 17 files changed, 42 insertions(+), 72 deletions(-) diff --git a/ext/com_dotnet/tests/bug78650.phpt b/ext/com_dotnet/tests/bug78650.phpt index ca2a235af24c9..3474a599e1109 100644 --- a/ext/com_dotnet/tests/bug78650.phpt +++ b/ext/com_dotnet/tests/bug78650.phpt @@ -17,9 +17,9 @@ print('OK'); OK --CLEAN-- diff --git a/ext/phar/tests/phar_buildfromdirectory2-win.phpt b/ext/phar/tests/phar_buildfromdirectory2-win.phpt index eaaf5b533b770..19a5ae8bfa2ef 100644 --- a/ext/phar/tests/phar_buildfromdirectory2-win.phpt +++ b/ext/phar/tests/phar_buildfromdirectory2-win.phpt @@ -19,11 +19,6 @@ try { echo $e->getMessage() . "\n"; } ?> ---CLEAN-- - --EXPECTF-- %s(24) "UnexpectedValueException" RecursiveDirectoryIterator::__construct(1): %s (code: 2) diff --git a/ext/phar/tests/phar_gobyebye-win32.phpt b/ext/phar/tests/phar_gobyebye-win32.phpt index 39dcdbe961209..7baa0c618fe64 100644 --- a/ext/phar/tests/phar_gobyebye-win32.phpt +++ b/ext/phar/tests/phar_gobyebye-win32.phpt @@ -26,8 +26,10 @@ opendir("foo/hi"); include $pname . '/foo/hi'; ?> --CLEAN-- - - + --EXPECTF-- Warning: readfile(foo/hi): Failed to open stream: No such file or directory in phar://%sphar_gobyebye-win32.phar.php/foo/hi on line %d diff --git a/ext/phar/tests/tar/phar_buildfromiterator4.phpt b/ext/phar/tests/tar/phar_buildfromiterator4.phpt index 36ea9cac60827..8fa55768b082f 100644 --- a/ext/phar/tests/tar/phar_buildfromiterator4.phpt +++ b/ext/phar/tests/tar/phar_buildfromiterator4.phpt @@ -35,20 +35,15 @@ class myIterator implements Iterator reset($this->a); } } -try { - chdir(__DIR__); - $phar = new Phar(__DIR__ . '/buildfromiterator.phar.tar'); - var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . 'phpt')))); - var_dump($phar->isFileFormat(Phar::TAR)); -} catch (Exception $e) { - var_dump(get_class($e)); - echo $e->getMessage() . "\n"; -} + +chdir(__DIR__); +$phar = new Phar(__DIR__ . '/buildfromiterator4.phar.tar'); +var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . 'phpt')))); +var_dump($phar->isFileFormat(Phar::TAR)); ?> --CLEAN-- --EXPECTF-- rewind diff --git a/ext/phar/tests/tar/phar_buildfromiterator8.phpt b/ext/phar/tests/tar/phar_buildfromiterator8.phpt index 0a857e424b2a5..146eceb529811 100644 --- a/ext/phar/tests/tar/phar_buildfromiterator8.phpt +++ b/ext/phar/tests/tar/phar_buildfromiterator8.phpt @@ -6,22 +6,16 @@ phar phar.readonly=0 --FILE-- buildFromIterator(new RegexIterator(new DirectoryIterator('.'), '/^frontcontroller\d{0,2}\.phar\.phpt\\z|^\.\\z|^\.\.\\z/'), __DIR__ . DIRECTORY_SEPARATOR); - asort($a); - var_dump($a); - var_dump($phar->isFileFormat(Phar::TAR)); -} catch (Exception $e) { - var_dump(get_class($e)); - echo $e->getMessage() . "\n"; -} +chdir(__DIR__); +$phar = new Phar(__DIR__ . '/buildfromiterator8.phar.tar'); +$a = $phar->buildFromIterator(new RegexIterator(new DirectoryIterator('.'), '/^frontcontroller\d{0,2}\.phar\.phpt\\z|^\.\\z|^\.\.\\z/'), __DIR__ . DIRECTORY_SEPARATOR); +asort($a); +var_dump($a); +var_dump($phar->isFileFormat(Phar::TAR)); ?> --CLEAN-- --EXPECTF-- array(21) { diff --git a/ext/phar/tests/tar/phar_buildfromiterator9.phpt b/ext/phar/tests/tar/phar_buildfromiterator9.phpt index d67997afa91b9..483762dbad784 100644 --- a/ext/phar/tests/tar/phar_buildfromiterator9.phpt +++ b/ext/phar/tests/tar/phar_buildfromiterator9.phpt @@ -35,20 +35,15 @@ class myIterator implements Iterator reset($this->a); } } -try { - chdir(__DIR__); - $phar = new Phar(__DIR__ . '/buildfromiterator.phar.tar'); - var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r'))))); - fclose($a); -} catch (Exception $e) { - var_dump(get_class($e)); - echo $e->getMessage() . "\n"; -} + +chdir(__DIR__); +$phar = new Phar(__DIR__ . '/buildfromiterator9.phar.tar'); +var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r'))))); +fclose($a); ?> --CLEAN-- --EXPECTF-- rewind diff --git a/ext/sockets/tests/socket_clear_error-win32.phpt b/ext/sockets/tests/socket_clear_error-win32.phpt index 158b6474f4aba..3c8020e6f9862 100644 --- a/ext/sockets/tests/socket_clear_error-win32.phpt +++ b/ext/sockets/tests/socket_clear_error-win32.phpt @@ -19,12 +19,6 @@ var_dump(socket_last_error($socket)); socket_clear_error($socket); var_dump(socket_last_error($socket)); ?> ---CLEAN-- - --EXPECTF-- Warning: socket_connect(): unable to connect [%d]: No connection could be made because the target machine actively refused it in %s on line %d int(%d) diff --git a/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt b/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt index a4bad9b52d9ed..ff18c2b50732c 100644 --- a/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt +++ b/ext/spl/tests/RecursiveDirectoryIterator_hasChildren.phpt @@ -30,6 +30,10 @@ bool(false) --CLEAN-- diff --git a/ext/spl/tests/SplFileInfo_getExtension_basic.phpt b/ext/spl/tests/SplFileInfo_getExtension_basic.phpt index 72597ef12d1e9..370257495b872 100644 --- a/ext/spl/tests/SplFileInfo_getExtension_basic.phpt +++ b/ext/spl/tests/SplFileInfo_getExtension_basic.phpt @@ -15,7 +15,7 @@ foreach ($exts as $ext) { $file = md5('SplFileInfo::getExtension'); $exts = array('.txt', '.extension', '..', '.', ''); foreach ($exts as $ext) { - unlink($file . $ext); + @unlink($file . $ext); } ?> --EXPECT-- diff --git a/ext/standard/tests/file/005_variation-win32.phpt b/ext/standard/tests/file/005_variation-win32.phpt index 328e46dfd1598..dbe108ba42cae 100644 --- a/ext/standard/tests/file/005_variation-win32.phpt +++ b/ext/standard/tests/file/005_variation-win32.phpt @@ -139,7 +139,7 @@ unlink($file_path."/005_variation_softlink.tmp"); unlink($file_path."/005_variation_hardlink.tmp"); unlink($file_path."/005_variation1.tmp"); unlink($file_path."/005_variation_copy.tmp"); -unlink($file_path."/005_variation_touch.tmp"); +@unlink($file_path."/005_variation_touch.tmp"); unlink($file_path."/005_variation_touch_fly.tmp"); unlink($file_path."/005_variation_touch_new.tmp"); ?> diff --git a/ext/standard/tests/file/bug65701.phpt b/ext/standard/tests/file/bug65701.phpt index f70446a17e41f..041ff2f8283cf 100644 --- a/ext/standard/tests/file/bug65701.phpt +++ b/ext/standard/tests/file/bug65701.phpt @@ -22,7 +22,7 @@ var_dump(filesize($dst)); --CLEAN-- --EXPECTF-- diff --git a/ext/standard/tests/file/realpath_basic4.phpt b/ext/standard/tests/file/realpath_basic4.phpt index 524dde3056f74..7989704065355 100644 --- a/ext/standard/tests/file/realpath_basic4.phpt +++ b/ext/standard/tests/file/realpath_basic4.phpt @@ -12,8 +12,13 @@ echo "2. " . realpath("$file_path/realpath_basic4/link2/test") . "\n"; --CLEAN-- --CLEAN-- --EXPECTF-- *** Testing rename() : rename files across directories *** diff --git a/ext/standard/tests/file/rename_variation1-win32.phpt b/ext/standard/tests/file/rename_variation1-win32.phpt index 1888838635d79..194dde0086d06 100644 --- a/ext/standard/tests/file/rename_variation1-win32.phpt +++ b/ext/standard/tests/file/rename_variation1-win32.phpt @@ -55,8 +55,6 @@ echo "Done\n"; --CLEAN-- --EXPECT-- diff --git a/ext/standard/tests/file/rename_variation2-win32.phpt b/ext/standard/tests/file/rename_variation2-win32.phpt index 9a5d56e48b2f2..b486fcc543d63 100644 --- a/ext/standard/tests/file/rename_variation2-win32.phpt +++ b/ext/standard/tests/file/rename_variation2-win32.phpt @@ -34,16 +34,12 @@ var_dump( rename($file_path."/rename_variation2_dir/", $file_path."/12345") ); var_dump( file_exists($file_path."/rename_variation2_dir" ) ); // expecting false var_dump( file_exists($file_path."/12345" ) ); // expecting true -rmdir($file_path."/12345"); - echo "Done\n"; ?> --CLEAN-- --EXPECT-- *** Testing rename() by renaming a file and directory to numeric name *** diff --git a/ext/standard/tests/file/rename_variation3-win32.phpt b/ext/standard/tests/file/rename_variation3-win32.phpt index b8ed7fc0d1193..8f347e5506f9e 100644 --- a/ext/standard/tests/file/rename_variation3-win32.phpt +++ b/ext/standard/tests/file/rename_variation3-win32.phpt @@ -51,9 +51,6 @@ echo "Done\n"; --CLEAN-- --EXPECTF-- From e435613bc272321f5ee95fec0291ebcc90f387c4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 6 Sep 2021 18:57:24 +0200 Subject: [PATCH 0043/1346] Fix file clash in file_put_contents() tests --- .../file_get_contents_file_put_contents_basic.phpt | 8 ++++---- .../file_get_contents_file_put_contents_error.phpt | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/standard/tests/file/file_get_contents_file_put_contents_basic.phpt b/ext/standard/tests/file/file_get_contents_file_put_contents_basic.phpt index 97482e9a59231..19ce657d27c19 100644 --- a/ext/standard/tests/file/file_get_contents_file_put_contents_basic.phpt +++ b/ext/standard/tests/file/file_get_contents_file_put_contents_basic.phpt @@ -10,7 +10,7 @@ echo "*** Testing the basic functionality of file_put_contents() and file_get_co echo "-- Testing with simple valid data file --\n"; -$file_name = "/file_put_contents.tmp"; +$file_name = "/file_put_contents_basic.tmp"; fill_buffer($text_buffer, "text", 100); file_put_contents( $file_path.$file_name, $text_buffer ); @@ -18,7 +18,7 @@ var_dump( file_get_contents($file_path.$file_name) ); echo "\n-- Testing with empty file --\n"; -$file_name = "/file_put_contents1.tmp"; +$file_name = "/file_put_contents_basic1.tmp"; file_put_contents( $file_path.$file_name, ""); var_dump( file_get_contents( $file_path.$file_name ) ); @@ -27,8 +27,8 @@ echo "\n*** Done ***"; --CLEAN-- --EXPECT-- *** Testing the basic functionality of file_put_contents() and file_get_contents() functions *** diff --git a/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt b/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt index 9a576bd26c8e0..dbd20f7f5c35d 100644 --- a/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt +++ b/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt @@ -10,12 +10,12 @@ $file_path = __DIR__; echo "\n-- Testing with Non-existing file --\n"; print( file_get_contents("/no/such/file/or/dir") ); -$file_handle = fopen($file_path."/file_put_contents.tmp", "w"); +$file_handle = fopen($file_path."/file_put_contents_error.tmp", "w"); echo "\n-- Testing for invalid negative maxlen values --\n"; -file_put_contents($file_path."/file_put_contents1.tmp", "Garbage data in the file"); +file_put_contents($file_path."/file_put_contents_error1.tmp", "Garbage data in the file"); try { - file_get_contents($file_path."/file_put_contents1.tmp", FALSE, NULL, 0, -5); + file_get_contents($file_path."/file_put_contents_error1.tmp", FALSE, NULL, 0, -5); } catch (ValueError $exception) { echo $exception->getMessage() . "\n"; } @@ -27,8 +27,8 @@ echo "\n*** Done ***\n"; --CLEAN-- --EXPECTF-- From 4f42a0affbc239a4af06fe7b69a8ba19f97934ca Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Mon, 6 Sep 2021 17:58:50 +0100 Subject: [PATCH 0044/1346] Report output from CLEAN (#7456) Mark test as borked if the test passed and CLEAN produces output. Co-authored-by: Nikita Popov --- run-tests.php | 76 +++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/run-tests.php b/run-tests.php index e7df5d694624e..200ba5cd26cfb 100755 --- a/run-tests.php +++ b/run-tests.php @@ -2495,6 +2495,8 @@ function run_test(string $php, $file, array $env): string ]; } + // Remember CLEAN output to report borked test if it otherwise passes. + $clean_output = null; if ($test->sectionNotEmpty('CLEAN') && (!$no_clean || $cfg['keep']['clean'])) { show_file_block('clean', $test->getSection('CLEAN')); save_text($test_clean, trim($test->getSection('CLEAN')), $temp_clean); @@ -2502,7 +2504,7 @@ function run_test(string $php, $file, array $env): string if (!$no_clean) { $extra = !IS_WINDOWS ? "unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;" : ""; - system_with_timeout("$extra $php $pass_options $extra_options -q $orig_ini_settings $no_file_cache \"$test_clean\"", $env); + $clean_output = system_with_timeout("$extra $orig_php $pass_options -q $orig_ini_settings $no_file_cache \"$test_clean\"", $env); } if (!$cfg['keep']['clean']) { @@ -2654,25 +2656,6 @@ function run_test(string $php, $file, array $env): string if (preg_match("/^$wanted_re\$/s", $output)) { $passed = true; - if (!$cfg['keep']['php'] && !$leaked) { - @unlink($test_file); - @unlink($preload_filename); - } - @unlink($tmp_post); - - if (!$leaked && !$failed_headers) { - if ($test->hasSection('XFAIL')) { - $warn = true; - $info = " (warn: XFAIL section but test passes)"; - } elseif ($test->hasSection('XLEAK')) { - $warn = true; - $info = " (warn: XLEAK section but test passes)"; - } else { - show_result("PASS", $tested, $tested_file, '', $temp_filenames); - $junit->markTestAs('PASS', $shortname, $tested); - return 'PASSED'; - } - } } } else { $wanted = trim($test->getSection('EXPECT')); @@ -2682,29 +2665,46 @@ function run_test(string $php, $file, array $env): string // compare and leave on success if (!strcmp($output, $wanted)) { $passed = true; + } - if (!$cfg['keep']['php'] && !$leaked) { - @unlink($test_file); - @unlink($preload_filename); + $wanted_re = null; + } + + if ($passed) { + if (!$cfg['keep']['php'] && !$leaked) { + @unlink($test_file); + @unlink($preload_filename); + } + @unlink($tmp_post); + + if (!$leaked && !$failed_headers) { + // If the test passed and CLEAN produced output, report test as borked. + if ($clean_output) { + show_result("BORK", $output, $tested_file, 'reason: invalid output from CLEAN', $temp_filenames); + $PHP_FAILED_TESTS['BORKED'][] = [ + 'name' => $file, + 'test_name' => '', + 'output' => '', + 'diff' => '', + 'info' => "$clean_output [$file]", + ]; + + $junit->markTestAs('BORK', $shortname, $tested, null, $clean_output); + return 'BORKED'; } - @unlink($tmp_post); - if (!$leaked && !$failed_headers) { - if ($test->hasSection('XFAIL')) { - $warn = true; - $info = " (warn: XFAIL section but test passes)"; - } elseif ($test->hasSection('XLEAK')) { - $warn = true; - $info = " (warn: XLEAK section but test passes)"; - } else { - show_result("PASS", $tested, $tested_file, '', $temp_filenames); - $junit->markTestAs('PASS', $shortname, $tested); - return 'PASSED'; - } + if ($test->hasSection('XFAIL')) { + $warn = true; + $info = " (warn: XFAIL section but test passes)"; + } elseif ($test->hasSection('XLEAK')) { + $warn = true; + $info = " (warn: XLEAK section but test passes)"; + } else { + show_result("PASS", $tested, $tested_file, '', $temp_filenames); + $junit->markTestAs('PASS', $shortname, $tested); + return 'PASSED'; } } - - $wanted_re = null; } // Test failed so we need to report details. From a1a8e9032c496c060767d1bba6eebdcf6c935d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 7 Sep 2021 10:04:00 +0200 Subject: [PATCH 0045/1346] Remove unnecessary PHP_FUNCTION() declarations (#7472) --- ext/iconv/php_iconv.h | 12 ---- ext/odbc/php_odbc_includes.h | 1 - ext/sockets/sendrecvmsg.h | 3 - ext/sodium/php_libsodium.h | 104 ---------------------------------- ext/spl/spl_iterators.h | 4 -- ext/standard/php_dir.h | 3 - ext/tokenizer/php_tokenizer.h | 3 - main/php_output.h | 18 ------ sapi/litespeed/lsapi_main.c | 6 -- 9 files changed, 154 deletions(-) diff --git a/ext/iconv/php_iconv.h b/ext/iconv/php_iconv.h index 726c36d036d2b..7bc1cce0df9f5 100644 --- a/ext/iconv/php_iconv.h +++ b/ext/iconv/php_iconv.h @@ -41,18 +41,6 @@ PHP_MINIT_FUNCTION(miconv); PHP_MSHUTDOWN_FUNCTION(miconv); PHP_MINFO_FUNCTION(miconv); -PHP_NAMED_FUNCTION(php_if_iconv); -PHP_FUNCTION(ob_iconv_handler); -PHP_FUNCTION(iconv_get_encoding); -PHP_FUNCTION(iconv_set_encoding); -PHP_FUNCTION(iconv_strlen); -PHP_FUNCTION(iconv_substr); -PHP_FUNCTION(iconv_strpos); -PHP_FUNCTION(iconv_strrpos); -PHP_FUNCTION(iconv_mime_encode); -PHP_FUNCTION(iconv_mime_decode); -PHP_FUNCTION(iconv_mime_decode_headers); - ZEND_BEGIN_MODULE_GLOBALS(iconv) char *input_encoding; char *internal_encoding; diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h index f3e93a1c4b3da..d1cbda0fba6b4 100644 --- a/ext/odbc/php_odbc_includes.h +++ b/ext/odbc/php_odbc_includes.h @@ -42,7 +42,6 @@ # include #endif /* end: #if defined(HAVE_SOLID) */ #undef HAVE_SQL_EXTENDED_FETCH -PHP_FUNCTION(solid_fetch_prev); #define SQLSMALLINT SWORD #define SQLUSMALLINT UWORD #ifndef SQL_SUCCEEDED diff --git a/ext/sockets/sendrecvmsg.h b/ext/sockets/sendrecvmsg.h index b12974e4bd2a5..1d651458adb6e 100644 --- a/ext/sockets/sendrecvmsg.h +++ b/ext/sockets/sendrecvmsg.h @@ -5,9 +5,6 @@ #include "conversions.h" /* for sockets.c */ -PHP_FUNCTION(socket_sendmsg); -PHP_FUNCTION(socket_recvmsg); -PHP_FUNCTION(socket_cmsg_space); void php_socket_sendrecvmsg_init(INIT_FUNC_ARGS); void php_socket_sendrecvmsg_shutdown(SHUTDOWN_FUNC_ARGS); diff --git a/ext/sodium/php_libsodium.h b/ext/sodium/php_libsodium.h index 543a5cb37cda5..eee51630e29ab 100644 --- a/ext/sodium/php_libsodium.h +++ b/ext/sodium/php_libsodium.h @@ -33,108 +33,4 @@ PHP_RINIT_FUNCTION(sodium); PHP_RSHUTDOWN_FUNCTION(sodium); PHP_MINFO_FUNCTION(sodium); -PHP_FUNCTION(sodium_add); -PHP_FUNCTION(sodium_base642bin); -PHP_FUNCTION(sodium_bin2base64); -PHP_FUNCTION(sodium_bin2hex); -PHP_FUNCTION(sodium_compare); -PHP_FUNCTION(sodium_crypto_aead_aes256gcm_decrypt); -PHP_FUNCTION(sodium_crypto_aead_aes256gcm_encrypt); -PHP_FUNCTION(sodium_crypto_aead_aes256gcm_is_available); -PHP_FUNCTION(sodium_crypto_aead_aes256gcm_keygen); -PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_decrypt); -PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_encrypt); -PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_decrypt); -PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_encrypt); -PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_keygen); -PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_keygen); -PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_decrypt); -PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_encrypt); -PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_keygen); -PHP_FUNCTION(sodium_crypto_auth); -PHP_FUNCTION(sodium_crypto_auth_keygen); -PHP_FUNCTION(sodium_crypto_auth_verify); -PHP_FUNCTION(sodium_crypto_box); -PHP_FUNCTION(sodium_crypto_box_keypair); -PHP_FUNCTION(sodium_crypto_box_keypair_from_secretkey_and_publickey); -PHP_FUNCTION(sodium_crypto_box_open); -PHP_FUNCTION(sodium_crypto_box_publickey); -PHP_FUNCTION(sodium_crypto_box_publickey_from_secretkey); -PHP_FUNCTION(sodium_crypto_box_seal); -PHP_FUNCTION(sodium_crypto_box_seal_open); -PHP_FUNCTION(sodium_crypto_box_secretkey); -PHP_FUNCTION(sodium_crypto_box_seed_keypair); -PHP_FUNCTION(sodium_crypto_core_ristretto255_add); -PHP_FUNCTION(sodium_crypto_core_ristretto255_from_hash); -PHP_FUNCTION(sodium_crypto_core_ristretto255_is_valid_point); -PHP_FUNCTION(sodium_crypto_core_ristretto255_random); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_add); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_complement); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_invert); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_mul); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_negate); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_random); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_reduce); -PHP_FUNCTION(sodium_crypto_core_ristretto255_scalar_sub); -PHP_FUNCTION(sodium_crypto_core_ristretto255_sub); -PHP_FUNCTION(sodium_crypto_generichash); -PHP_FUNCTION(sodium_crypto_generichash_final); -PHP_FUNCTION(sodium_crypto_generichash_init); -PHP_FUNCTION(sodium_crypto_generichash_keygen); -PHP_FUNCTION(sodium_crypto_generichash_update); -PHP_FUNCTION(sodium_crypto_kdf_derive_from_key); -PHP_FUNCTION(sodium_crypto_kdf_keygen); -PHP_FUNCTION(sodium_crypto_kx_client_session_keys); -PHP_FUNCTION(sodium_crypto_kx_keypair); -PHP_FUNCTION(sodium_crypto_kx_publickey); -PHP_FUNCTION(sodium_crypto_kx_secretkey); -PHP_FUNCTION(sodium_crypto_kx_seed_keypair); -PHP_FUNCTION(sodium_crypto_kx_server_session_keys); -PHP_FUNCTION(sodium_crypto_pwhash); -PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256); -PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str); -PHP_FUNCTION(sodium_crypto_pwhash_scryptsalsa208sha256_str_verify); -PHP_FUNCTION(sodium_crypto_pwhash_str); -PHP_FUNCTION(sodium_crypto_pwhash_str_needs_rehash); -PHP_FUNCTION(sodium_crypto_pwhash_str_verify); -PHP_FUNCTION(sodium_crypto_scalarmult); -PHP_FUNCTION(sodium_crypto_scalarmult_base); -PHP_FUNCTION(sodium_crypto_scalarmult_ristretto255); -PHP_FUNCTION(sodium_crypto_scalarmult_ristretto255_base); -PHP_FUNCTION(sodium_crypto_secretbox); -PHP_FUNCTION(sodium_crypto_secretbox_keygen); -PHP_FUNCTION(sodium_crypto_secretbox_open); -PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_keygen); -PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_init_push); -PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_push); -PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_init_pull); -PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_pull); -PHP_FUNCTION(sodium_crypto_secretstream_xchacha20poly1305_rekey); -PHP_FUNCTION(sodium_crypto_shorthash); -PHP_FUNCTION(sodium_crypto_shorthash_keygen); -PHP_FUNCTION(sodium_crypto_sign); -PHP_FUNCTION(sodium_crypto_sign_detached); -PHP_FUNCTION(sodium_crypto_sign_ed25519_pk_to_curve25519); -PHP_FUNCTION(sodium_crypto_sign_ed25519_sk_to_curve25519); -PHP_FUNCTION(sodium_crypto_sign_keypair); -PHP_FUNCTION(sodium_crypto_sign_keypair_from_secretkey_and_publickey); -PHP_FUNCTION(sodium_crypto_sign_open); -PHP_FUNCTION(sodium_crypto_sign_publickey); -PHP_FUNCTION(sodium_crypto_sign_publickey_from_secretkey); -PHP_FUNCTION(sodium_crypto_sign_secretkey); -PHP_FUNCTION(sodium_crypto_sign_seed_keypair); -PHP_FUNCTION(sodium_crypto_sign_verify_detached); -PHP_FUNCTION(sodium_crypto_stream); -PHP_FUNCTION(sodium_crypto_stream_keygen); -PHP_FUNCTION(sodium_crypto_stream_xor); -PHP_FUNCTION(sodium_crypto_stream_xchacha20); -PHP_FUNCTION(sodium_crypto_stream_xchacha20_keygen); -PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor); -PHP_FUNCTION(sodium_hex2bin); -PHP_FUNCTION(sodium_increment); -PHP_FUNCTION(sodium_memcmp); -PHP_FUNCTION(sodium_memzero); -PHP_FUNCTION(sodium_pad); -PHP_FUNCTION(sodium_unpad); - #endif /* PHP_LIBSODIUM_H */ diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index ee6339e1f2433..1f42201b769cf 100644 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -44,10 +44,6 @@ extern PHPAPI zend_class_entry *spl_ce_SeekableIterator; PHP_MINIT_FUNCTION(spl_iterators); -PHP_FUNCTION(iterator_apply); -PHP_FUNCTION(iterator_count); -PHP_FUNCTION(iterator_to_array); - typedef enum { DIT_Default = 0, DIT_FilterIterator = DIT_Default, diff --git a/ext/standard/php_dir.h b/ext/standard/php_dir.h index dd9c039e49e7a..1307d1ecafdbd 100644 --- a/ext/standard/php_dir.h +++ b/ext/standard/php_dir.h @@ -20,9 +20,6 @@ /* directory functions */ PHP_MINIT_FUNCTION(dir); PHP_RINIT_FUNCTION(dir); -PHP_FUNCTION(closedir); -PHP_FUNCTION(rewinddir); -PHP_FUNCTION(readdir); #define PHP_SCANDIR_SORT_ASCENDING 0 #define PHP_SCANDIR_SORT_DESCENDING 1 diff --git a/ext/tokenizer/php_tokenizer.h b/ext/tokenizer/php_tokenizer.h index b0e53a43bab73..2777a35fbd66b 100644 --- a/ext/tokenizer/php_tokenizer.h +++ b/ext/tokenizer/php_tokenizer.h @@ -34,7 +34,4 @@ char *get_token_type_name(int token_type); PHP_MINIT_FUNCTION(tokenizer); PHP_MINFO_FUNCTION(tokenizer); -PHP_FUNCTION(token_get_all); -PHP_FUNCTION(token_name); - #endif /* PHP_TOKENIZER_H */ diff --git a/main/php_output.h b/main/php_output.h index 4a8659e6a36a6..edd0a3e50740a 100644 --- a/main/php_output.h +++ b/main/php_output.h @@ -241,22 +241,4 @@ PHPAPI int php_output_handler_alias_register(const char *handler_name, size_t ha END_EXTERN_C() - -PHP_FUNCTION(ob_start); -PHP_FUNCTION(ob_flush); -PHP_FUNCTION(ob_clean); -PHP_FUNCTION(ob_end_flush); -PHP_FUNCTION(ob_end_clean); -PHP_FUNCTION(ob_get_flush); -PHP_FUNCTION(ob_get_clean); -PHP_FUNCTION(ob_get_contents); -PHP_FUNCTION(ob_get_length); -PHP_FUNCTION(ob_get_level); -PHP_FUNCTION(ob_get_status); -PHP_FUNCTION(ob_implicit_flush); -PHP_FUNCTION(ob_list_handlers); - -PHP_FUNCTION(output_add_rewrite_var); -PHP_FUNCTION(output_reset_rewrite_vars); - #endif diff --git a/sapi/litespeed/lsapi_main.c b/sapi/litespeed/lsapi_main.c index 2b3d83ad4bed6..e034a3fdffa92 100644 --- a/sapi/litespeed/lsapi_main.c +++ b/sapi/litespeed/lsapi_main.c @@ -1602,14 +1602,8 @@ int main( int argc, char * argv[] ) return ret; } - /* LiteSpeed PHP module starts here */ -PHP_FUNCTION(litespeed_request_headers); -PHP_FUNCTION(litespeed_response_headers); -PHP_FUNCTION(apache_get_modules); -PHP_FUNCTION(litespeed_finish_request); - PHP_MINFO_FUNCTION(litespeed); static PHP_MINIT_FUNCTION(litespeed) From 6381a16f3f1d0ce5d260f90661a7026b8f05d074 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 9 Sep 2021 15:28:06 +0200 Subject: [PATCH 0046/1346] Avoid use after free in internal prop type verification This issue only applies to debug builds: read_property can free the object, but we'd try to check the object handlers afterwards. Rewrite the check in a way that only accessed the object before the read_property call. Fixes oss-fuzz #38297. --- Zend/tests/magic_get_destroy_object.phpt | 15 +++ Zend/zend_execute.c | 9 -- Zend/zend_vm_def.h | 13 +- Zend/zend_vm_execute.h | 156 +++++++++++++++++++---- 4 files changed, 158 insertions(+), 35 deletions(-) create mode 100644 Zend/tests/magic_get_destroy_object.phpt diff --git a/Zend/tests/magic_get_destroy_object.phpt b/Zend/tests/magic_get_destroy_object.phpt new file mode 100644 index 0000000000000..9c1a7b1cb8709 --- /dev/null +++ b/Zend/tests/magic_get_destroy_object.phpt @@ -0,0 +1,15 @@ +--TEST-- +Destroy object in magic __get() +--FILE-- +prop); + +?> +--EXPECT-- +NULL diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2a33a2fba1b28..e59642292ba51 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1194,15 +1194,6 @@ ZEND_API ZEND_COLD void zend_internal_call_arginfo_violation(zend_function *fbc) ZSTR_VAL(fbc->common.function_name)); } -static void zend_verify_internal_read_property_type(zend_object *obj, zend_string *name, zval *val) -{ - zend_property_info *prop_info = - zend_get_property_info(obj->ce, name, /* silent */ true); - if (prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO && ZEND_TYPE_IS_SET(prop_info->type)) { - zend_verify_property_type(prop_info, val, /* strict */ true); - } -} - #ifndef ZEND_VERIFY_FUNC_INFO # define ZEND_VERIFY_FUNC_INFO 0 #endif diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 38619d94d8096..2e3052d88bcfd 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2104,10 +2104,19 @@ ZEND_VM_C_LABEL(fetch_obj_r_fast_copy): } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 55e86737d5a52..da4d6a94beec5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -6288,10 +6288,19 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -8608,10 +8617,19 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -10963,10 +10981,19 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -15386,10 +15413,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_ } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -16809,10 +16845,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -18124,10 +18169,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -31428,10 +31482,19 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -33286,10 +33349,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -35756,10 +35828,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -39895,10 +39976,19 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -43531,10 +43621,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif @@ -48562,10 +48661,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER } } +#if ZEND_DEBUG + /* For non-standard object handlers, verify a declared property type in debug builds. + * Fetch prop_info before calling read_property(), as it may deallocate the object. */ + zend_property_info *prop_info = NULL; + if (zobj->handlers->read_property != zend_std_read_property) { + prop_info = zend_get_property_info(zobj->ce, name, /* silent */ true); + } +#endif retval = zobj->handlers->read_property(zobj, name, BP_VAR_R, cache_slot, EX_VAR(opline->result.var)); #if ZEND_DEBUG - if (!EG(exception) && zobj->handlers->read_property != zend_std_read_property) { - zend_verify_internal_read_property_type(zobj, name, retval); + if (!EG(exception) && prop_info && prop_info != ZEND_WRONG_PROPERTY_INFO + && ZEND_TYPE_IS_SET(prop_info->type)) { + zend_verify_property_type(prop_info, retval, /* strict */ true); } #endif From 353461ae5e3eeb1d14feae006f613df1230bf484 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 13 Sep 2021 22:44:40 +0300 Subject: [PATCH 0047/1346] Separate zend_array_type_info() to avoid loop inlining --- Zend/Optimizer/zend_inference.c | 28 ++++++++++++++++++++++++++++ Zend/Optimizer/zend_inference.h | 28 +++++----------------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 534cee30c764a..b68016d34e604 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2024,6 +2024,34 @@ static void emit_type_narrowing_warning(const zend_op_array *op_array, zend_ssa zend_error(E_WARNING, "Narrowing occurred during type inference of %s. Please file a bug report on bugs.php.net", def_op_name); } +ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info(const zval *zv) +{ + HashTable *ht = Z_ARRVAL_P(zv); + uint32_t tmp = MAY_BE_ARRAY; + zend_string *str; + zval *val; + + if (Z_REFCOUNTED_P(zv)) { + tmp |= MAY_BE_RC1 | MAY_BE_RCN; + } else { + tmp |= MAY_BE_RCN; + } + + ZEND_HASH_FOREACH_STR_KEY_VAL(ht, str, val) { + if (str) { + tmp |= MAY_BE_ARRAY_KEY_STRING; + } else { + tmp |= MAY_BE_ARRAY_KEY_LONG; + } + tmp |= 1 << (Z_TYPE_P(val) + MAY_BE_ARRAY_SHIFT); + } ZEND_HASH_FOREACH_END(); + if (HT_IS_PACKED(ht)) { + tmp &= ~(MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE_ARRAY_STRING_HASH); + } + return tmp; +} + + ZEND_API uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert) { uint32_t tmp = 0; diff --git a/Zend/Optimizer/zend_inference.h b/Zend/Optimizer/zend_inference.h index 54910a957ceba..104d43858f270 100644 --- a/Zend/Optimizer/zend_inference.h +++ b/Zend/Optimizer/zend_inference.h @@ -152,33 +152,15 @@ DEFINE_SSA_OP_RANGE_OVERFLOW(op2) #define OP2_RANGE_UNDERFLOW() (_ssa_op2_range_underflow (op_array, ssa, opline, ssa_op)) #define OP2_RANGE_OVERFLOW() (_ssa_op2_range_overflow (op_array, ssa, opline, ssa_op)) +BEGIN_EXTERN_C() +ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info(const zval *zv); +END_EXTERN_C() + static zend_always_inline uint32_t _const_op_type(const zval *zv) { if (Z_TYPE_P(zv) == IS_CONSTANT_AST) { return MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY; } else if (Z_TYPE_P(zv) == IS_ARRAY) { - HashTable *ht = Z_ARRVAL_P(zv); - uint32_t tmp = MAY_BE_ARRAY; - zend_string *str; - zval *val; - - if (Z_REFCOUNTED_P(zv)) { - tmp |= MAY_BE_RC1 | MAY_BE_RCN; - } else { - tmp |= MAY_BE_RCN; - } - - ZEND_HASH_FOREACH_STR_KEY_VAL(ht, str, val) { - if (str) { - tmp |= MAY_BE_ARRAY_KEY_STRING; - } else { - tmp |= MAY_BE_ARRAY_KEY_LONG; - } - tmp |= 1 << (Z_TYPE_P(val) + MAY_BE_ARRAY_SHIFT); - } ZEND_HASH_FOREACH_END(); - if (HT_IS_PACKED(ht)) { - tmp &= ~(MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE_ARRAY_STRING_HASH); - } - return tmp; + return zend_array_type_info(zv); } else { uint32_t tmp = (1 << Z_TYPE_P(zv)); From d9e5c6b0b37afecb45bd353616c57d3deceea1d0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 14 Sep 2021 11:04:11 +0200 Subject: [PATCH 0048/1346] Free recorded warnings if script not cached --- ext/opcache/zend_accelerator_util_funcs.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index c62f5532bdbd3..45ddff04cb83d 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -59,6 +59,16 @@ void free_persistent_script(zend_persistent_script *persistent_script, int destr zend_string_release_ex(persistent_script->script.filename, 0); } + if (persistent_script->warnings) { + for (uint32_t i = 0; i < persistent_script->num_warnings; i++) { + zend_error_info *info = persistent_script->warnings[i]; + zend_string_release(info->filename); + zend_string_release(info->message); + efree(info); + } + efree(persistent_script->warnings); + } + efree(persistent_script); } From 45d81704e1882d9833f8ccfb4b2f483b95ec6e6b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 14 Sep 2021 14:27:53 +0200 Subject: [PATCH 0049/1346] Display DASM_S_UNDEF_PC argument --- ext/opcache/jit/zend_jit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index d172c01df7bb4..93c79bdce2992 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -865,7 +865,7 @@ static void handle_dasm_error(int ret) { break; #endif case DASM_S_UNDEF_PC: - fprintf(stderr, "DASM_S_UNDEF_PC\n"); + fprintf(stderr, "DASM_S_UNDEF_PC %d\n", ret & 0xffffffu); break; default: fprintf(stderr, "DASM_S_%0x\n", ret & 0xff000000u); From e6387258f09a588556d011112b57b020757ca69e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 2 Sep 2020 11:12:29 +0200 Subject: [PATCH 0050/1346] Trigger assertion failure on SSA verification failure To make sure this is automatically detectable as a PHP bug, e.g. during fuzzing. Also dump the current opcodes/SSA as we may no longer reach a following dump. --- Zend/Optimizer/ssa_integrity.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Zend/Optimizer/ssa_integrity.c b/Zend/Optimizer/ssa_integrity.c index a465bd97c5098..436633cdb1b80 100644 --- a/Zend/Optimizer/ssa_integrity.c +++ b/Zend/Optimizer/ssa_integrity.c @@ -108,7 +108,7 @@ static inline bool is_var_type(zend_uchar type) { #define INSTR(i) \ (i), (zend_get_opcode_name(op_array->opcodes[i].opcode)) -int ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *extra) { +void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *extra) { zend_cfg *cfg = &ssa->cfg; zend_ssa_phi *phi; int i, status = SUCCESS; @@ -146,7 +146,7 @@ int ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ext FOREACH_USE(var, use) { if (++c > 10000) { FAIL("cycle in uses of " VARFMT "\n", VAR(i)); - return status; + goto finish; } if (!is_used_by_op(ssa, use, i)) { fprintf(stderr, "var " VARFMT " not in uses of op %d\n", VAR(i), use); @@ -157,7 +157,7 @@ int ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ext FOREACH_PHI_USE(var, phi) { if (++c > 10000) { FAIL("cycle in phi uses of " VARFMT "\n", VAR(i)); - return status; + goto finish; } if (!is_in_phi_sources(ssa, phi, i)) { FAIL("var " VARFMT " not in phi sources of %d\n", VAR(i), phi->ssa_var); @@ -374,5 +374,9 @@ int ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ext } } - return status; +finish: + if (status == FAILURE) { + zend_dump_op_array(op_array, ZEND_DUMP_SSA, "at SSA integrity verification", ssa); + ZEND_ASSERT(0 && "SSA integrity verification failed"); + } } From 19888a69b4c692e2a18422adb8f0b59beee0e79b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 15 Sep 2021 13:11:08 +0200 Subject: [PATCH 0051/1346] Initialize UNUSED operands to sentinel value This makes it more likely that unintentional uses of UNUSED operands will result in crash rather than some hard to detect corruption of the call frame. --- Zend/zend_compile.c | 13 ++++++------- Zend/zend_compile.h | 11 +++++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7eb2bffbcaf4a..2d6fc13713eb3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -724,7 +724,7 @@ static void zend_do_free(znode *op1) /* {{{ */ case ZEND_POST_DEC: /* convert $i++ to ++$i */ opline->opcode -= 2; - opline->result_type = IS_UNUSED; + SET_UNUSED(opline->result); return; case ZEND_ASSIGN: case ZEND_ASSIGN_DIM: @@ -740,7 +740,7 @@ static void zend_do_free(znode *op1) /* {{{ */ case ZEND_PRE_DEC_OBJ: case ZEND_PRE_INC: case ZEND_PRE_DEC: - opline->result_type = IS_UNUSED; + SET_UNUSED(opline->result); return; } } @@ -757,10 +757,8 @@ static void zend_do_free(znode *op1) /* {{{ */ && opline->result.var == op1->u.op.var) { if (opline->opcode == ZEND_FETCH_THIS) { opline->opcode = ZEND_NOP; - opline->result_type = IS_UNUSED; - } else { - opline->result_type = IS_UNUSED; } + SET_UNUSED(opline->result); } else { while (opline >= CG(active_op_array)->opcodes) { if ((opline->opcode == ZEND_FETCH_LIST_R || @@ -5103,11 +5101,11 @@ void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline) /* {{{ */ } opline->opcode = ZEND_JMP; - opline->op1.opline_num = dest->opline_num; - opline->extended_value = 0; SET_UNUSED(opline->op1); SET_UNUSED(opline->op2); SET_UNUSED(opline->result); + opline->op1.opline_num = dest->opline_num; + opline->extended_value = 0; ZEND_ASSERT(remove_oplines >= 0); while (remove_oplines--) { @@ -9394,6 +9392,7 @@ static void zend_compile_const(znode *result, zend_ast *ast) /* {{{ */ opline->op2_type = IS_CONST; if (is_fully_qualified || !FC(current_namespace)) { + opline->op1.num = 0; opline->op2.constant = zend_add_const_name_literal( resolved_name, 0); } else { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f1aebddea93af..462fc3f7c0276 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -27,16 +27,19 @@ #include "zend_llist.h" -#define SET_UNUSED(op) op ## _type = IS_UNUSED +#define SET_UNUSED(op) do { \ + op ## _type = IS_UNUSED; \ + op.num = (uint32_t) -1; \ +} while (0) #define MAKE_NOP(opline) do { \ (opline)->op1.num = 0; \ (opline)->op2.num = 0; \ (opline)->result.num = 0; \ (opline)->opcode = ZEND_NOP; \ - (opline)->op1_type = IS_UNUSED; \ - (opline)->op2_type = IS_UNUSED; \ - (opline)->result_type = IS_UNUSED; \ + SET_UNUSED((opline)->op1); \ + SET_UNUSED((opline)->op2); \ + SET_UNUSED((opline)->result); \ } while (0) #define RESET_DOC_COMMENT() do { \ From fb4405d357e2876f7719d19d47c007d86a05e390 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 15 Sep 2021 14:44:54 +0200 Subject: [PATCH 0052/1346] Avoid accessing literal operand on nop This would have create a NOP with a CONST operand ... probably harmless in practice, but we should avoid it. --- Zend/Optimizer/zend_optimizer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 66a27bd9c7416..1ac1e09b2c67f 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -305,6 +305,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, opline->op1.constant = zend_optimizer_add_literal(op_array, val); if (Z_TYPE_P(val) == IS_STRING && Z_STRLEN_P(val) == 0) { MAKE_NOP(opline); + return 1; } /* TODO: In a subsequent pass, *after* this step and compacting nops, combine consecutive ZEND_ECHOs using the block information from ssa->cfg */ /* (e.g. for ext/opcache/tests/opt/sccp_010.phpt) */ From 74033b2cc6db9df6278b229e4802802449a72980 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 15 Sep 2021 16:07:26 +0200 Subject: [PATCH 0053/1346] Don't hardcode used sanitizers in fuzzer Now that we have generic --enable-address|undefined|memory-sanitizer options, let the user pick one of these instead of making the fuzzer enable one implicitly. --- configure.ac | 10 ++++++++-- sapi/fuzzer/README.md | 3 +++ sapi/fuzzer/config.m4 | 22 ---------------------- 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index ba25175eb7845..b91534733ef11 100644 --- a/configure.ac +++ b/configure.ac @@ -1512,8 +1512,14 @@ fi if test "$PHP_UNDEFINED_SANITIZER" = "yes"; then AX_CHECK_COMPILE_FLAG([-fsanitize=undefined], [ - CFLAGS="$CFLAGS -fsanitize=undefined" - CXXFLAGS="$CXXFLAGS -fsanitize=undefined" + CFLAGS="$CFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" + CXXFLAGS="$CXXFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" + AX_CHECK_COMPILE_FLAG([-fno-sanitize=object-size], [ + dnl Disable object-size sanitizer, because it is incompatible with our zend_function + dnl union, and this can't be easily fixed. + CFLAGS="$CFLAGS -fno-sanitize=object-size" + CXXFLAGS="$CFLAGS -fno-sanitize=object-size" + ]) ], [AC_MSG_ERROR([UndefinedBehaviorSanitizer is not available])]) fi diff --git a/sapi/fuzzer/README.md b/sapi/fuzzer/README.md index f79baa6c00dff..3da8534187ecc 100644 --- a/sapi/fuzzer/README.md +++ b/sapi/fuzzer/README.md @@ -10,12 +10,15 @@ CC=clang CXX=clang++ \ --enable-fuzzer \ --with-pic \ --enable-debug-assertions \ + --enable-address-sanitizer \ --enable-exif \ --enable-mbstring ``` The `--with-pic` option is required to avoid a linking failure. The `--enable-debug-assertions` option can be used to enable debug assertions despite the use of a release build. +You can combine fuzzing with `--enable-address-sanitizer`, `--enable-undefined-sanitizer` or `--enable-memory-sanitizer`. The first two options can also be used together. + You will need a recent version of clang that supports the `-fsanitize=fuzzer-no-link` option. When running `make` it creates these binaries in `sapi/fuzzer/`: diff --git a/sapi/fuzzer/config.m4 b/sapi/fuzzer/config.m4 index 92327fc1d4b71..55ad91c7a6b78 100644 --- a/sapi/fuzzer/config.m4 +++ b/sapi/fuzzer/config.m4 @@ -6,12 +6,6 @@ PHP_ARG_ENABLE([fuzzer],, [no], [no]) -PHP_ARG_ENABLE([fuzzer-msan],, - [AS_HELP_STRING([--enable-fuzzer-msan], - [Enable msan instead of asan/ubsan when fuzzing])], - [no], - [no]) - dnl For newer clang versions see https://llvm.org/docs/LibFuzzer.html#fuzzer-usage dnl for relevant flags. @@ -39,22 +33,6 @@ if test "$PHP_FUZZER" != "no"; then AX_CHECK_COMPILE_FLAG([-fsanitize=fuzzer-no-link], [ CFLAGS="$CFLAGS -fsanitize=fuzzer-no-link" CXXFLAGS="$CXXFLAGS -fsanitize=fuzzer-no-link" - - if test "$PHP_FUZZER_MSAN" = "yes"; then - CFLAGS="$CFLAGS -fsanitize=memory -fsanitize-memory-track-origins" - CXXFLAGS="$CXXFLAGS -fsanitize=memory -fsanitize-memory-track-origins" - else - CFLAGS="$CFLAGS -fsanitize=address" - CXXFLAGS="$CXXFLAGS -fsanitize=address" - - dnl Don't include -fundefined in CXXFLAGS, because that would also require linking - dnl with a C++ compiler. - dnl Disable object-size sanitizer, because it is incompatible with our zend_function - dnl union, and this can't be easily fixed. - dnl We need to specify -fno-sanitize-recover=undefined here, otherwise ubsan warnings - dnl will not be considered failures by the fuzzer. - CFLAGS="$CFLAGS -fsanitize=undefined -fno-sanitize=object-size -fno-sanitize-recover=undefined" - fi ],[ AC_MSG_ERROR(Compiler doesn't support -fsanitize=fuzzer-no-link) ]) From cd4243dde9a91e8a4baa60f9ddba67ff19911d8b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 1 Sep 2020 10:52:53 +0200 Subject: [PATCH 0054/1346] Add fuzzer for function JIT This is a basic fuzzer for the function JIT, which looks for crashes and sanitizer violations only, and does not try to detect differing behavior yet. --- ext/opcache/ZendAccelerator.c | 1 + sapi/fuzzer/Makefile.frag | 3 + sapi/fuzzer/README.md | 1 + sapi/fuzzer/config.m4 | 1 + sapi/fuzzer/fuzzer-execute-common.h | 99 ++++++++++++++++++++++++++++ sapi/fuzzer/fuzzer-execute.c | 85 ++---------------------- sapi/fuzzer/fuzzer-exif.c | 2 +- sapi/fuzzer/fuzzer-jit.c | 86 ++++++++++++++++++++++++ sapi/fuzzer/fuzzer-json.c | 2 +- sapi/fuzzer/fuzzer-mbstring.c | 2 +- sapi/fuzzer/fuzzer-parser.c | 5 +- sapi/fuzzer/fuzzer-sapi.c | 26 ++++++-- sapi/fuzzer/fuzzer-sapi.h | 5 +- sapi/fuzzer/fuzzer-unserialize.c | 2 +- sapi/fuzzer/fuzzer-unserializehash.c | 2 +- 15 files changed, 228 insertions(+), 94 deletions(-) create mode 100644 sapi/fuzzer/fuzzer-execute-common.h create mode 100644 sapi/fuzzer/fuzzer-jit.c diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index a50cf630b9ca0..b70ddcc3e401d 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2811,6 +2811,7 @@ static inline int accel_find_sapi(void) "apache2handler", "litespeed", "uwsgi", + "fuzzer", NULL }; const char **sapi_name; diff --git a/sapi/fuzzer/Makefile.frag b/sapi/fuzzer/Makefile.frag index 50feac3a9ab21..fc8fa8410cb1a 100644 --- a/sapi/fuzzer/Makefile.frag +++ b/sapi/fuzzer/Makefile.frag @@ -8,6 +8,9 @@ $(SAPI_FUZZER_PATH)/php-fuzz-parser: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_F $(SAPI_FUZZER_PATH)/php-fuzz-execute: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_EXECUTE_OBJS) $(FUZZER_BUILD) $(PHP_FUZZER_EXECUTE_OBJS) -o $@ +$(SAPI_FUZZER_PATH)/php-fuzz-jit: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_JIT_OBJS) + $(FUZZER_BUILD) $(PHP_FUZZER_JIT_OBJS) -o $@ + $(SAPI_FUZZER_PATH)/php-fuzz-unserialize: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_UNSERIALIZE_OBJS) $(FUZZER_BUILD) $(PHP_FUZZER_UNSERIALIZE_OBJS) -o $@ diff --git a/sapi/fuzzer/README.md b/sapi/fuzzer/README.md index 3da8534187ecc..e8f60ac40ad4b 100644 --- a/sapi/fuzzer/README.md +++ b/sapi/fuzzer/README.md @@ -30,6 +30,7 @@ When running `make` it creates these binaries in `sapi/fuzzer/`: * `php-fuzz-exif`: Fuzzing `exif_read_data()` function (requires --enable-exif) * `php-fuzz-mbstring`: Fuzzing `mb_ereg[i]()` (requires --enable-mbstring) * `php-fuzz-execute`: Fuzzing the executor +* `php-fuzz-jit`: Fuzzing the function JIT (requires --enable-opcache) Some fuzzers have a seed corpus in `sapi/fuzzer/corpus`. You can use it as follows: diff --git a/sapi/fuzzer/config.m4 b/sapi/fuzzer/config.m4 index 55ad91c7a6b78..f7125365d0e0a 100644 --- a/sapi/fuzzer/config.m4 +++ b/sapi/fuzzer/config.m4 @@ -54,6 +54,7 @@ if test "$PHP_FUZZER" != "no"; then PHP_FUZZER_TARGET([parser], PHP_FUZZER_PARSER_OBJS) PHP_FUZZER_TARGET([execute], PHP_FUZZER_EXECUTE_OBJS) + PHP_FUZZER_TARGET([jit], PHP_FUZZER_JIT_OBJS) PHP_FUZZER_TARGET([unserialize], PHP_FUZZER_UNSERIALIZE_OBJS) PHP_FUZZER_TARGET([unserializehash], PHP_FUZZER_UNSERIALIZEHASH_OBJS) PHP_FUZZER_TARGET([json], PHP_FUZZER_JSON_OBJS) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h new file mode 100644 index 0000000000000..092a662c42f98 --- /dev/null +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -0,0 +1,99 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | https://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Nikita Popov | + +----------------------------------------------------------------------+ + */ + +#include
+ +#include "fuzzer.h" +#include "fuzzer-sapi.h" + +#define MAX_STEPS 1000 +#define MAX_SIZE (8 * 1024) +static uint32_t steps_left; +static bool bailed_out = false; + +/* Because the fuzzer is always compiled with clang, + * we can assume that we don't use global registers / hybrid VM. */ +typedef int (ZEND_FASTCALL *opcode_handler_t)(zend_execute_data *); + +static zend_always_inline void fuzzer_step(void) { + if (--steps_left == 0) { + /* Reset steps before bailing out, so code running after bailout (e.g. in + * destructors) will get another MAX_STEPS, rather than UINT32_MAX steps. */ + steps_left = MAX_STEPS; + bailed_out = true; + zend_bailout(); + } +} + +static void fuzzer_execute_ex(zend_execute_data *execute_data) { + while (1) { + int ret; + fuzzer_step(); + if ((ret = ((opcode_handler_t) EX(opline)->handler)(execute_data)) != 0) { + if (ret > 0) { + execute_data = EG(current_execute_data); + } else { + return; + } + } + } +} + +static zend_op_array *(*orig_compile_string)(zend_string *source_string, const char *filename); + +static zend_op_array *fuzzer_compile_string(zend_string *str, const char *filename) { + if (ZSTR_LEN(str) > MAX_SIZE) { + /* Avoid compiling huge inputs via eval(). */ + zend_bailout(); + } + + return orig_compile_string(str, filename); +} + +static void (*orig_execute_internal)(zend_execute_data *execute_data, zval *return_value); + +static void fuzzer_execute_internal(zend_execute_data *execute_data, zval *return_value) { + fuzzer_step(); + + uint32_t num_args = ZEND_CALL_NUM_ARGS(execute_data); + for (uint32_t i = 0; i < num_args; i++) { + /* Some internal functions like preg_replace() may be slow on large inputs. + * Limit the maximum size of string inputs. */ + zval *arg = ZEND_CALL_VAR_NUM(execute_data, i); + if (Z_TYPE_P(arg) == IS_STRING && Z_STRLEN_P(arg) > MAX_SIZE) { + zend_bailout(); + } + } + + orig_execute_internal(execute_data, return_value); +} + +static void fuzzer_init_php_for_execute(const char *extra_ini) { + /* Compilation will often trigger fatal errors. + * Use tracked allocation mode to avoid leaks in that case. */ + putenv("USE_TRACKED_ALLOC=1"); + + /* Just like other SAPIs, ignore SIGPIPEs. */ + signal(SIGPIPE, SIG_IGN); + + fuzzer_init_php(extra_ini); + + zend_execute_ex = fuzzer_execute_ex; + orig_execute_internal = zend_execute_internal ? zend_execute_internal : execute_internal; + zend_execute_internal = fuzzer_execute_internal; + orig_compile_string = zend_compile_string; + zend_compile_string = fuzzer_compile_string; +} diff --git a/sapi/fuzzer/fuzzer-execute.c b/sapi/fuzzer/fuzzer-execute.c index abc5ebff2ece5..75bacf8e75fe1 100644 --- a/sapi/fuzzer/fuzzer-execute.c +++ b/sapi/fuzzer/fuzzer-execute.c @@ -14,70 +14,7 @@ +----------------------------------------------------------------------+ */ -#include
- -#include "fuzzer.h" -#include "fuzzer-sapi.h" - -#define MAX_STEPS 1000 -#define MAX_SIZE (8 * 1024) -static uint32_t steps_left; - -/* Because the fuzzer is always compiled with clang, - * we can assume that we don't use global registers / hybrid VM. */ -typedef int (ZEND_FASTCALL *opcode_handler_t)(zend_execute_data *); - -static zend_always_inline void fuzzer_step(void) { - if (--steps_left == 0) { - /* Reset steps before bailing out, so code running after bailout (e.g. in - * destructors) will get another MAX_STEPS, rather than UINT32_MAX steps. */ - steps_left = MAX_STEPS; - zend_bailout(); - } -} - -static void fuzzer_execute_ex(zend_execute_data *execute_data) { - while (1) { - int ret; - fuzzer_step(); - if ((ret = ((opcode_handler_t) EX(opline)->handler)(execute_data)) != 0) { - if (ret > 0) { - execute_data = EG(current_execute_data); - } else { - return; - } - } - } -} - -static zend_op_array *(*orig_compile_string)(zend_string *source_string, const char *filename); - -static zend_op_array *fuzzer_compile_string(zend_string *str, const char *filename) { - if (ZSTR_LEN(str) > MAX_SIZE) { - /* Avoid compiling huge inputs via eval(). */ - zend_bailout(); - } - - return orig_compile_string(str, filename); -} - -static void (*orig_execute_internal)(zend_execute_data *execute_data, zval *return_value); - -static void fuzzer_execute_internal(zend_execute_data *execute_data, zval *return_value) { - fuzzer_step(); - - uint32_t num_args = ZEND_CALL_NUM_ARGS(execute_data); - for (uint32_t i = 0; i < num_args; i++) { - /* Some internal functions like preg_replace() may be slow on large inputs. - * Limit the maximum size of string inputs. */ - zval *arg = ZEND_CALL_VAR_NUM(execute_data, i); - if (Z_TYPE_P(arg) == IS_STRING && Z_STRLEN_P(arg) > MAX_SIZE) { - zend_bailout(); - } - } - - orig_execute_internal(execute_data, return_value); -} +#include "fuzzer-execute-common.h" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { if (Size > MAX_SIZE) { @@ -87,27 +24,13 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { } steps_left = MAX_STEPS; - fuzzer_do_request_from_buffer("/fuzzer.php", (const char *) Data, Size, /* execute */ 1); + fuzzer_do_request_from_buffer( + "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, /* before_shutdown */ NULL); return 0; } int LLVMFuzzerInitialize(int *argc, char ***argv) { - /* Compilation will often trigger fatal errors. - * Use tracked allocation mode to avoid leaks in that case. */ - putenv("USE_TRACKED_ALLOC=1"); - - /* Just like other SAPIs, ignore SIGPIPEs. */ - signal(SIGPIPE, SIG_IGN); - - fuzzer_init_php(); - - zend_execute_ex = fuzzer_execute_ex; - orig_execute_internal = zend_execute_internal ? zend_execute_internal : execute_internal; - zend_execute_internal = fuzzer_execute_internal; - orig_compile_string = zend_compile_string; - zend_compile_string = fuzzer_compile_string; - - /* fuzzer_shutdown_php(); */ + fuzzer_init_php_for_execute(NULL); return 0; } diff --git a/sapi/fuzzer/fuzzer-exif.c b/sapi/fuzzer/fuzzer-exif.c index 8cf1ce06752f2..cb16bb90233a0 100644 --- a/sapi/fuzzer/fuzzer-exif.c +++ b/sapi/fuzzer/fuzzer-exif.c @@ -64,7 +64,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { } int LLVMFuzzerInitialize(int *argc, char ***argv) { - fuzzer_init_php(); + fuzzer_init_php(NULL); /* fuzzer_shutdown_php(); */ return 0; diff --git a/sapi/fuzzer/fuzzer-jit.c b/sapi/fuzzer/fuzzer-jit.c new file mode 100644 index 0000000000000..04313bf9b74d1 --- /dev/null +++ b/sapi/fuzzer/fuzzer-jit.c @@ -0,0 +1,86 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | https://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Nikita Popov | + +----------------------------------------------------------------------+ + */ + +#include "fuzzer-execute-common.h" +#include "zend_exceptions.h" + +static void opcache_invalidate(void) { + steps_left = MAX_STEPS; + zend_exception_save(); + zval retval, func, args[2]; + ZVAL_STRING(&func, "opcache_invalidate"); + ZVAL_STRING(&args[0], "/fuzzer.php"); + ZVAL_TRUE(&args[1]); + call_user_function(CG(function_table), NULL, &func, &retval, 2, args); + ZEND_ASSERT(Z_TYPE(retval) == IS_TRUE); + zval_ptr_dtor(&args[0]); + zval_ptr_dtor(&retval); + zval_ptr_dtor(&func); + zend_exception_restore(); +} + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + if (Size > MAX_SIZE) { + /* Large inputs have a large impact on fuzzer performance, + * but are unlikely to be necessary to reach new codepaths. */ + return 0; + } + + zend_string *jit_option = zend_string_init("opcache.jit", sizeof("opcache.jit") - 1, 1); + + /* First run without JIT to determine whether we bail out. We should not run JITed code if + * we bail out here, as the JIT code may loop infinitely. */ + steps_left = MAX_STEPS; + bailed_out = false; + zend_alter_ini_entry_chars( + jit_option, "off", sizeof("off")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); + fuzzer_do_request_from_buffer( + "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + + if (!bailed_out) { + steps_left = MAX_STEPS; + zend_alter_ini_entry_chars(jit_option, + "function", sizeof("function")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); + fuzzer_do_request_from_buffer( + "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + } + + zend_string_release(jit_option); + + return 0; +} + +char *get_opcache_path(void) { + // TODO: Make this more general. + char *opcache_path = "modules/opcache.so"; + return realpath(opcache_path, NULL); +} + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + char *opcache_path = get_opcache_path(); + assert(opcache_path && "Failed to determine opcache path"); + + char ini_buf[256]; + snprintf(ini_buf, sizeof(ini_buf), + "zend_extension=%s\n" + "opcache.validate_timestamps=0\n" + "opcache.file_update_protection=0\n" + "opcache.jit_buffer_size=512M", + opcache_path); + free(opcache_path); + fuzzer_init_php_for_execute(ini_buf); + return 0; +} diff --git a/sapi/fuzzer/fuzzer-json.c b/sapi/fuzzer/fuzzer-json.c index a154bc3b8a517..4335598bc3caa 100644 --- a/sapi/fuzzer/fuzzer-json.c +++ b/sapi/fuzzer/fuzzer-json.c @@ -55,7 +55,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { } int LLVMFuzzerInitialize(int *argc, char ***argv) { - fuzzer_init_php(); + fuzzer_init_php(NULL); /* fuzzer_shutdown_php(); */ return 0; diff --git a/sapi/fuzzer/fuzzer-mbstring.c b/sapi/fuzzer/fuzzer-mbstring.c index 142552a3337ac..970a7b5baeedb 100644 --- a/sapi/fuzzer/fuzzer-mbstring.c +++ b/sapi/fuzzer/fuzzer-mbstring.c @@ -68,7 +68,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { } int LLVMFuzzerInitialize(int *argc, char ***argv) { - fuzzer_init_php(); + fuzzer_init_php(NULL); /* The default parse depth limit allows stack overflows under asan. */ onig_set_parse_depth_limit(512); diff --git a/sapi/fuzzer/fuzzer-parser.c b/sapi/fuzzer/fuzzer-parser.c index 61cedcfc1cdde..55669c70c02d3 100644 --- a/sapi/fuzzer/fuzzer-parser.c +++ b/sapi/fuzzer/fuzzer-parser.c @@ -32,7 +32,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } - fuzzer_do_request_from_buffer("fuzzer.php", (const char *) Data, Size, /* execute */ 0); + fuzzer_do_request_from_buffer( + "fuzzer.php", (const char *) Data, Size, /* execute */ 0, /* before_shutdown */ NULL); return 0; } @@ -42,7 +43,7 @@ int LLVMFuzzerInitialize(int *argc, char ***argv) { * Use tracked allocation mode to avoid leaks in that case. */ putenv("USE_TRACKED_ALLOC=1"); - fuzzer_init_php(); + fuzzer_init_php(NULL); /* fuzzer_shutdown_php(); */ return 0; diff --git a/sapi/fuzzer/fuzzer-sapi.c b/sapi/fuzzer/fuzzer-sapi.c index 95c2b1ce95604..7f019b4452cbf 100644 --- a/sapi/fuzzer/fuzzer-sapi.c +++ b/sapi/fuzzer/fuzzer-sapi.c @@ -131,7 +131,7 @@ static sapi_module_struct fuzzer_module = { STANDARD_SAPI_MODULE_PROPERTIES }; -int fuzzer_init_php() +int fuzzer_init_php(const char *extra_ini) { #ifdef __SANITIZE_ADDRESS__ /* We're going to leak all the memory allocated during startup, @@ -142,8 +142,20 @@ int fuzzer_init_php() sapi_startup(&fuzzer_module); fuzzer_module.phpinfo_as_text = 1; - fuzzer_module.ini_entries = malloc(sizeof(HARDCODED_INI)); - memcpy(fuzzer_module.ini_entries, HARDCODED_INI, sizeof(HARDCODED_INI)); + size_t ini_len = sizeof(HARDCODED_INI); + size_t extra_ini_len = extra_ini ? strlen(extra_ini) : 0; + if (extra_ini) { + ini_len += extra_ini_len + 1; + } + char *p = fuzzer_module.ini_entries = malloc(ini_len + 1); + memcpy(p, HARDCODED_INI, sizeof(HARDCODED_INI) - 1); + p += sizeof(HARDCODED_INI) - 1; + if (extra_ini) { + *p++ = '\n'; + memcpy(p, extra_ini, extra_ini_len); + p += extra_ini_len; + } + *p = '\0'; /* * TODO: we might want to test both Zend and malloc MM, but testing with malloc @@ -230,7 +242,8 @@ int fuzzer_shutdown_php(void) } int fuzzer_do_request_from_buffer( - char *filename, const char *data, size_t data_len, bool execute) + char *filename, const char *data, size_t data_len, bool execute, + void (*before_shutdown)(void)) { int retval = FAILURE; /* failure by default */ @@ -253,6 +266,8 @@ int fuzzer_do_request_from_buffer( file_handle.primary_script = 1; file_handle.buf = estrndup(data, data_len); file_handle.len = data_len; + /* Avoid ZEND_HANDLE_FILENAME for opcache. */ + file_handle.type = ZEND_HANDLE_STREAM; zend_op_array *op_array = zend_compile_file(&file_handle, ZEND_REQUIRE); zend_destroy_file_handle(&file_handle); @@ -267,6 +282,9 @@ int fuzzer_do_request_from_buffer( } zend_end_try(); CG(compiled_filename) = NULL; /* ??? */ + if (before_shutdown) { + before_shutdown(); + } fuzzer_request_shutdown(); return (retval == SUCCESS) ? SUCCESS : FAILURE; diff --git a/sapi/fuzzer/fuzzer-sapi.h b/sapi/fuzzer/fuzzer-sapi.h index 076a5714569ee..4ee2cb3fbc175 100644 --- a/sapi/fuzzer/fuzzer-sapi.h +++ b/sapi/fuzzer/fuzzer-sapi.h @@ -15,11 +15,12 @@ +----------------------------------------------------------------------+ */ -int fuzzer_init_php(void); +int fuzzer_init_php(const char *extra_ini); int fuzzer_request_startup(void); void fuzzer_request_shutdown(void); void fuzzer_setup_dummy_frame(void); void fuzzer_call_php_func(const char *func_name, int nargs, char **params); void fuzzer_call_php_func_zval(const char *func_name, int nargs, zval *args); int fuzzer_do_request_from_buffer( - char *filename, const char *data, size_t data_len, bool execute); + char *filename, const char *data, size_t data_len, bool execute, + void (*before_shutdown)(void)); diff --git a/sapi/fuzzer/fuzzer-unserialize.c b/sapi/fuzzer/fuzzer-unserialize.c index efae256a49938..ff26e5b1e8da3 100644 --- a/sapi/fuzzer/fuzzer-unserialize.c +++ b/sapi/fuzzer/fuzzer-unserialize.c @@ -60,7 +60,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { } int LLVMFuzzerInitialize(int *argc, char ***argv) { - fuzzer_init_php(); + fuzzer_init_php(NULL); /* fuzzer_shutdown_php(); */ return 0; diff --git a/sapi/fuzzer/fuzzer-unserializehash.c b/sapi/fuzzer/fuzzer-unserializehash.c index 0f7d81a3d5b7a..5d29eb5fb8c61 100644 --- a/sapi/fuzzer/fuzzer-unserializehash.c +++ b/sapi/fuzzer/fuzzer-unserializehash.c @@ -75,7 +75,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t FullSize) { } int LLVMFuzzerInitialize(int *argc, char ***argv) { - fuzzer_init_php(); + fuzzer_init_php(NULL); /* fuzzer_shutdown_php(); */ return 0; From 3c864f135a9051651e59a6927147cf4a0f7e8a94 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 15 Sep 2021 17:22:51 +0200 Subject: [PATCH 0055/1346] Fix file clash in file_put_contents test This was creating a file that is not related to the test in any way, so just drop it entirely. --- .../file/file_get_contents_file_put_contents_error.phpt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt b/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt index dbd20f7f5c35d..91a37cd2e1acd 100644 --- a/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt +++ b/ext/standard/tests/file/file_get_contents_file_put_contents_error.phpt @@ -10,8 +10,6 @@ $file_path = __DIR__; echo "\n-- Testing with Non-existing file --\n"; print( file_get_contents("/no/such/file/or/dir") ); -$file_handle = fopen($file_path."/file_put_contents_error.tmp", "w"); - echo "\n-- Testing for invalid negative maxlen values --\n"; file_put_contents($file_path."/file_put_contents_error1.tmp", "Garbage data in the file"); try { @@ -20,14 +18,11 @@ try { echo $exception->getMessage() . "\n"; } -fclose($file_handle); - echo "\n*** Done ***\n"; ?> --CLEAN-- From 13fa90fb55cae9c386c3e69c3972b5c45ddbbd92 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 16 Sep 2021 16:52:38 +0200 Subject: [PATCH 0056/1346] Fix initializer warning in apache2handler --- sapi/apache2handler/mod_php.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sapi/apache2handler/mod_php.c b/sapi/apache2handler/mod_php.c index d22ca28751765..c7308fe2df607 100644 --- a/sapi/apache2handler/mod_php.c +++ b/sapi/apache2handler/mod_php.c @@ -34,5 +34,6 @@ AP_MODULE_DECLARE_DATA module php_module = { NULL, /* create per-server config structure */ NULL, /* merge per-server config structures */ php_dir_cmds, /* command apr_table_t */ - php_ap2_register_hook /* register hooks */ + php_ap2_register_hook, /* register hooks */ + 0 /* flags */ }; From e2d05bfcb2b788932bacf53bcd4cab8ec27a8dd4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 16 Sep 2021 16:54:07 +0200 Subject: [PATCH 0057/1346] Allow get_request_time() hook to fail In particular, this allows using the hook without server_context. The apache2handler implementation now checks that server_context is available itself, as that's the implementation that cares about it. --- main/SAPI.c | 5 ++--- main/SAPI.h | 2 +- sapi/apache2handler/sapi_apache2.c | 9 +++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/main/SAPI.c b/main/SAPI.c index 039ba06827089..d1bd3134b6dee 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -1073,9 +1073,8 @@ SAPI_API double sapi_get_request_time(void) { if(SG(global_request_time)) return SG(global_request_time); - if (sapi_module.get_request_time && SG(server_context)) { - SG(global_request_time) = sapi_module.get_request_time(); - } else { + if (!sapi_module.get_request_time + || sapi_module.get_request_time(&SG(global_request_time)) == FAILURE) { struct timeval tp = {0}; if (!gettimeofday(&tp, NULL)) { SG(global_request_time) = (double)(tp.tv_sec + tp.tv_usec / 1000000.00); diff --git a/main/SAPI.h b/main/SAPI.h index 97c52c41eccce..77ab84806fe97 100644 --- a/main/SAPI.h +++ b/main/SAPI.h @@ -236,7 +236,7 @@ struct _sapi_module_struct { void (*register_server_variables)(zval *track_vars_array); void (*log_message)(const char *message, int syslog_type_int); - double (*get_request_time)(void); + zend_result (*get_request_time)(double *request_time); void (*terminate_process)(void); char *php_ini_path_override; diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index 2eeeaf174d82b..178b6f3de479a 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -363,10 +363,15 @@ static void php_apache_sapi_log_message_ex(const char *msg, request_rec *r) } } -static double php_apache_sapi_get_request_time(void) +static zend_result php_apache_sapi_get_request_time(double *request_time) { php_struct *ctx = SG(server_context); - return ((double) ctx->r->request_time) / 1000000.0; + if (!ctx) { + return FAILURE; + } + + *request_time = ((double) ctx->r->request_time) / 1000000.0; + return SUCCESS; } extern zend_module_entry php_apache_module; From 4087aba60d438569db417675ec2df0a1bf66ed50 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 17 Sep 2021 10:11:06 +0200 Subject: [PATCH 0058/1346] Fix file name clashes in phar buildfromiterator tests --- .../tests/zip/phar_buildfromiterator4.phpt | 16 +++++---------- .../tests/zip/phar_buildfromiterator8.phpt | 20 +++++++------------ .../tests/zip/phar_buildfromiterator9.phpt | 16 +++++---------- 3 files changed, 17 insertions(+), 35 deletions(-) diff --git a/ext/phar/tests/zip/phar_buildfromiterator4.phpt b/ext/phar/tests/zip/phar_buildfromiterator4.phpt index 6d44e2f8d7e04..8c1096754bf25 100644 --- a/ext/phar/tests/zip/phar_buildfromiterator4.phpt +++ b/ext/phar/tests/zip/phar_buildfromiterator4.phpt @@ -35,20 +35,14 @@ class myIterator implements Iterator reset($this->a); } } -try { - chdir(__DIR__); - $phar = new Phar(__DIR__ . '/buildfromiterator.phar.zip'); - var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . 'phpt')))); - var_dump($phar->isFileFormat(Phar::ZIP)); -} catch (Exception $e) { - var_dump(get_class($e)); - echo $e->getMessage() . "\n"; -} +chdir(__DIR__); +$phar = new Phar(__DIR__ . '/buildfromiterator4.phar.zip'); +var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . 'phpt')))); +var_dump($phar->isFileFormat(Phar::ZIP)); ?> --CLEAN-- --EXPECTF-- rewind diff --git a/ext/phar/tests/zip/phar_buildfromiterator8.phpt b/ext/phar/tests/zip/phar_buildfromiterator8.phpt index d0e2150dcb72f..99e8f63172293 100644 --- a/ext/phar/tests/zip/phar_buildfromiterator8.phpt +++ b/ext/phar/tests/zip/phar_buildfromiterator8.phpt @@ -6,22 +6,16 @@ phar phar.readonly=0 --FILE-- buildFromIterator(new RegexIterator(new DirectoryIterator('.'), '/^frontcontroller\d{0,2}\.phar\.phpt\\z|^\.\\z|^\.\.\\z/'), __DIR__ . DIRECTORY_SEPARATOR); - asort($a); - var_dump($a); - var_dump($phar->isFileFormat(Phar::ZIP)); -} catch (Exception $e) { - var_dump(get_class($e)); - echo $e->getMessage() . "\n"; -} +chdir(__DIR__); +$phar = new Phar(__DIR__ . '/buildfromiterator8.phar.zip'); +$a = $phar->buildFromIterator(new RegexIterator(new DirectoryIterator('.'), '/^frontcontroller\d{0,2}\.phar\.phpt\\z|^\.\\z|^\.\.\\z/'), __DIR__ . DIRECTORY_SEPARATOR); +asort($a); +var_dump($a); +var_dump($phar->isFileFormat(Phar::ZIP)); ?> --CLEAN-- --EXPECTF-- array(21) { diff --git a/ext/phar/tests/zip/phar_buildfromiterator9.phpt b/ext/phar/tests/zip/phar_buildfromiterator9.phpt index 9d290a73a2388..9f527d21ad494 100644 --- a/ext/phar/tests/zip/phar_buildfromiterator9.phpt +++ b/ext/phar/tests/zip/phar_buildfromiterator9.phpt @@ -35,20 +35,14 @@ class myIterator implements Iterator reset($this->a); } } -try { - chdir(__DIR__); - $phar = new Phar(__DIR__ . '/buildfromiterator.phar'); - var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r'))))); - fclose($a); -} catch (Exception $e) { - var_dump(get_class($e)); - echo $e->getMessage() . "\n"; -} +chdir(__DIR__); +$phar = new Phar(__DIR__ . '/buildfromiterator9.phar'); +var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r'))))); +fclose($a); ?> --CLEAN-- --EXPECTF-- rewind From 62503236d51e8d500a0ed3ab3361ba9b747a5d2d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 17 Sep 2021 10:15:35 +0200 Subject: [PATCH 0059/1346] Make it easier to run CLI server tests standalone --- sapi/cli/tests/php_cli_server.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/cli/tests/php_cli_server.inc b/sapi/cli/tests/php_cli_server.inc index 26bdd4c18f9f2..a7d68b16cf259 100644 --- a/sapi/cli/tests/php_cli_server.inc +++ b/sapi/cli/tests/php_cli_server.inc @@ -12,7 +12,7 @@ function php_cli_server_start( ?string $router = 'index.php', array $cmd_args = [] ): CliServerInfo { - $php_executable = getenv('TEST_PHP_EXECUTABLE'); + $php_executable = getenv('TEST_PHP_EXECUTABLE') ?: PHP_BINARY; $error = null; // Create dedicated doc root to avoid index.php clashes between tests. From 28e882a162b89f8d0d7857e243e6b1f3a1ab2b31 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 17 Sep 2021 10:25:52 +0200 Subject: [PATCH 0060/1346] Fix null pointer ubsan warning Don't pass null pointer to memmove, even with zero length. --- sapi/cli/php_cli_server.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 4ebe8fe654c9e..230ad62ee0da7 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1384,26 +1384,28 @@ static void php_cli_server_request_translate_vpath(php_cli_server_request *reque memmove(p, document_root, document_root_len); p += document_root_len; vpath = p; - if (request->vpath_len > 0 && request->vpath[0] != '/') { - *p++ = DEFAULT_SLASH; - } - q = request->vpath + request->vpath_len; - while (q > request->vpath) { - if (*q-- == '.') { - is_static_file = 1; - break; + if (request->vpath_len != 0) { + if (request->vpath[0] != '/') { + *p++ = DEFAULT_SLASH; + } + q = request->vpath + request->vpath_len; + while (q > request->vpath) { + if (*q-- == '.') { + is_static_file = 1; + break; + } } - } - memmove(p, request->vpath, request->vpath_len); + memmove(p, request->vpath, request->vpath_len); #ifdef PHP_WIN32 - q = p + request->vpath_len; - do { - if (*q == '/') { - *q = '\\'; - } - } while (q-- > p); + q = p + request->vpath_len; + do { + if (*q == '/') { + *q = '\\'; + } + } while (q-- > p); #endif - p += request->vpath_len; + p += request->vpath_len; + } *p = '\0'; q = p; while (q > buf) { From a51869a20207da1a357c8d9fb39180a882ff9c32 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 17 Sep 2021 23:05:35 +0100 Subject: [PATCH 0061/1346] Fix test by using a format specifier for resource to int conversion Surprised this worked for so long --- ext/spl/tests/bug62978.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/spl/tests/bug62978.phpt b/ext/spl/tests/bug62978.phpt index ed47d4e44f2fc..073530926a6f1 100644 --- a/ext/spl/tests/bug62978.phpt +++ b/ext/spl/tests/bug62978.phpt @@ -49,5 +49,5 @@ bool(false) Warning: Resource ID#%d used as offset, casting to integer (%d) in %sbug62978.php on line %d -Warning: Undefined array key 5 in %s on line %d +Warning: Undefined array key %d in %s on line %d NULL From e47af326da6112f52d91dbede3f25fc0301ce667 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 20 Sep 2021 10:26:33 +0200 Subject: [PATCH 0062/1346] Don't disable unrelated ext during configure This is apparently a long-standing copy & paste issue. --- ext/xml/config.w32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/xml/config.w32 b/ext/xml/config.w32 index 564f6a43a899e..c0bb3168e88e4 100644 --- a/ext/xml/config.w32 +++ b/ext/xml/config.w32 @@ -16,6 +16,6 @@ if (PHP_XML == "yes") { PHP_INSTALL_HEADERS("", "ext/xml"); } else { WARNING("xml support can't be enabled, libraries or headers are missing") - PHP_ZLIB = "no" + PHP_XML = "no" } } From 1c905434b9bc5d478102148c4412dc3bf54abdec Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 14 Sep 2021 11:50:36 +0200 Subject: [PATCH 0063/1346] Add more tests for mb_substr --- ext/mbstring/tests/mb_substr.phpt | 129 +++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 11 deletions(-) diff --git a/ext/mbstring/tests/mb_substr.phpt b/ext/mbstring/tests/mb_substr.phpt index 366173eab8661..6d5e9d42ac0da 100644 --- a/ext/mbstring/tests/mb_substr.phpt +++ b/ext/mbstring/tests/mb_substr.phpt @@ -2,30 +2,137 @@ mb_substr() --EXTENSIONS-- mbstring ---INI-- -output_handler= --FILE-- --EXPECT-- +EUC-JP: 1: c6fccbdcb8eca4c7a4b9a1a34555432d 2: 30313233a4b3a4cecab8bbfacef3a4cfc6fccbdcb8eca4c7a4b9a1a34555432d4a50a4f2bbc8a4c3a4c6a4a4a4dea4b9a1a3c6fccbdcb8eca4cfccccc5ddbdada4a4a1a3 3 OK 4 OK: 30313233a4b3a4cecab8bbfacef3a4cf +SJIS: +1: 93fa967b8cea +2: 8142 +3: 825582568257 +4: 967b8cea8365834c8358836782c582b781423031323334825482558256825782588142 +5: +ISO-2022-JP: +1: 1b2442212121721b284241 +2: 43 +3: 1b2442212121721b284241 +4: 4142 +5: 1b244221721b2842414243 +6: +7: +GB-18030: +1: c3dcc2ebd3c3 +2: b3c6 +3: c2ebc3fbb3c6 +4: c2ebd3c3bba7c3fbc3dcc2ebc3fbb3c6c3fbb3c6 +5: +HZ: +1: The +2: . +3: ~{!#~}By +4: he next sentence is in GB.~{<:Ky2;S{#,NpJ)l6HK!#~}Bye. +5: +UTF-8: +1: Gre +2: ь +3: йте +4: reek: Σὲ γνωρίζω ἀπὸ τὴν κόψη Russian: Зарегистрируйтесь +5: +UTF-32: +1: Gre +2: ь +3: йте +4: reek: Σὲ γνωρίζω ἀπὸ τὴν κόψη Russian: Зарегистрируйтесь +5: +UTF-7: +1: Gre +2: ь +3: йте +4: reek: Σὲ γνωρίζω ἀπὸ τὴν κόψη Russian: Зарегистрируйтесь +5: From 68176fdfb1f7b4ac8113aaabd20a16ebaea11fe5 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 14 Sep 2021 22:01:14 +0200 Subject: [PATCH 0064/1346] Use char literals in HTML numeric entity {en,de}coding functions --- ext/mbstring/libmbfl/mbfl/mbfilter.c | 106 +++++++++++++-------------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 8c068b2f744d0..1f2a8b867b37f 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -2112,8 +2112,8 @@ collector_encode_htmlnumericentity(int c, void *data) if (c >= mapelm[0] && c <= mapelm[1]) { s = (c + mapelm[2]) & mapelm[3]; if (s >= 0) { - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); r = 100000000; s %= r; while (r > 0) { @@ -2127,9 +2127,9 @@ collector_encode_htmlnumericentity(int c, void *data) } if (!f) { f = 1; - (*pc->decoder->filter_function)(mbfl_hexchar_table[0], pc->decoder); + (*pc->decoder->filter_function)('0', pc->decoder); } - (*pc->decoder->filter_function)(0x3b, pc->decoder); /* ';' */ + (*pc->decoder->filter_function)(';', pc->decoder); } } if (f) { @@ -2152,38 +2152,38 @@ collector_decode_htmlnumericentity(int c, void *data) switch (pc->status) { case 1: - if (c == 0x23) { /* '#' */ + if (c == '#') { pc->status = 2; } else { pc->status = 0; - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ + (*pc->decoder->filter_function)('&', pc->decoder); (*pc->decoder->filter_function)(c, pc->decoder); } break; case 2: - if (c == 0x78) { /* 'x' */ + if (c == 'x') { pc->status = 4; - } else if (c >= 0x30 && c <= 0x39) { /* '0' - '9' */ - pc->cache = c - 0x30; + } else if (c >= '0' && c <= '9') { + pc->cache = c - '0'; pc->status = 3; pc->digit = 1; } else { pc->status = 0; - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); (*pc->decoder->filter_function)(c, pc->decoder); } break; case 3: s = 0; f = 0; - if (c >= 0x30 && c <= 0x39) { /* '0' - '9' */ + if (c >= '0' && c <= '9') { s = pc->cache; if (pc->digit > 9 || s > INT_MAX/10) { pc->status = 0; f = 1; } else { - s = s*10 + (c - 0x30); + s = s*10 + (c - '0'); pc->cache = s; pc->digit++; } @@ -2199,7 +2199,7 @@ collector_decode_htmlnumericentity(int c, void *data) if (d >= mapelm[0] && d <= mapelm[1]) { f = 0; (*pc->decoder->filter_function)(d, pc->decoder); - if (c != 0x3b) { /* ';' */ + if (c != ';') { (*pc->decoder->filter_function)(c, pc->decoder); } break; @@ -2208,8 +2208,8 @@ collector_decode_htmlnumericentity(int c, void *data) } } if (f) { - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); r = 1; n = pc->digit; while (n > 1) { @@ -2226,43 +2226,41 @@ collector_decode_htmlnumericentity(int c, void *data) } break; case 4: - if (c >= 0x30 && c <= 0x39) { /* '0' - '9' */ - pc->cache = c - 0x30; + if (c >= '0' && c <= '9') { + pc->cache = c - '0'; pc->status = 5; pc->digit = 1; - } else if (c >= 0x41 && c <= 0x46) { /* 'A' - 'F' */ - pc->cache = c - 0x41 + 10; + } else if (c >= 'A' && c <= 'F') { + pc->cache = c - 'A' + 10; pc->status = 5; pc->digit = 1; - } else if (c >= 0x61 && c <= 0x66) { /* 'a' - 'f' */ - pc->cache = c - 0x61 + 10; + } else if (c >= 'a' && c <= 'f') { + pc->cache = c - 'a' + 10; pc->status = 5; pc->digit = 1; } else { pc->status = 0; - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ - (*pc->decoder->filter_function)(0x78, pc->decoder); /* 'x' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); + (*pc->decoder->filter_function)('x', pc->decoder); (*pc->decoder->filter_function)(c, pc->decoder); } break; case 5: s = 0; f = 0; - if ((c >= 0x30 && c <= 0x39) || - (c >= 0x41 && c <= 0x46) || - (c >= 0x61 && c <= 0x66)) { /* '0' - '9' or 'a' - 'f' */ + if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) { if (pc->digit > 9) { pc->status = 0; s = pc->cache; f = 1; } else { - if (c >= 0x30 && c <= 0x39) { - s = pc->cache*16 + (c - 0x30); - } else if (c >= 0x41 && c <= 0x46) { - s = pc->cache*16 + (c - 0x41 + 10); + if (c >= '0' && c <= '9') { + s = pc->cache*16 + (c - '0'); + } else if (c >= 'A' && c <= 'F') { + s = pc->cache*16 + (c - 'A' + 10); } else { - s = pc->cache*16 + (c - 0x61 + 10); + s = pc->cache*16 + (c - 'a' + 10); } pc->cache = s; pc->digit++; @@ -2279,7 +2277,7 @@ collector_decode_htmlnumericentity(int c, void *data) if (d >= mapelm[0] && d <= mapelm[1]) { f = 0; (*pc->decoder->filter_function)(d, pc->decoder); - if (c != 0x3b) { /* ';' */ + if (c != ';') { (*pc->decoder->filter_function)(c, pc->decoder); } break; @@ -2288,9 +2286,9 @@ collector_decode_htmlnumericentity(int c, void *data) } } if (f) { - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ - (*pc->decoder->filter_function)(0x78, pc->decoder); /* 'x' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); + (*pc->decoder->filter_function)('x', pc->decoder); r = 1; n = pc->digit; while (n > 0) { @@ -2309,7 +2307,7 @@ collector_decode_htmlnumericentity(int c, void *data) } break; default: - if (c == 0x26) { /* '&' */ + if (c == '&') { pc->status = 1; } else { (*pc->decoder->filter_function)(c, pc->decoder); @@ -2334,9 +2332,9 @@ collector_encode_hex_htmlnumericentity(int c, void *data) if (c >= mapelm[0] && c <= mapelm[1]) { s = (c + mapelm[2]) & mapelm[3]; if (s >= 0) { - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ - (*pc->decoder->filter_function)(0x78, pc->decoder); /* 'x' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); + (*pc->decoder->filter_function)('x', pc->decoder); r = 0x1000000; s %= r; while (r > 0) { @@ -2350,9 +2348,9 @@ collector_encode_hex_htmlnumericentity(int c, void *data) } if (!f) { f = 1; - (*pc->decoder->filter_function)(mbfl_hexchar_table[0], pc->decoder); + (*pc->decoder->filter_function)('0', pc->decoder); } - (*pc->decoder->filter_function)(0x3b, pc->decoder); /* ';' */ + (*pc->decoder->filter_function)(';', pc->decoder); } } if (f) { @@ -2375,15 +2373,15 @@ int mbfl_filt_decode_htmlnumericentity_flush(mbfl_convert_filter *filter) if (pc->status) { switch (pc->status) { case 1: /* '&' */ - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ + (*pc->decoder->filter_function)('&', pc->decoder); break; case 2: /* '#' */ - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); break; case 3: /* '0'-'9' */ - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); s = pc->cache; r = 1; @@ -2401,14 +2399,14 @@ int mbfl_filt_decode_htmlnumericentity_flush(mbfl_convert_filter *filter) break; case 4: /* 'x' */ - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ - (*pc->decoder->filter_function)(0x78, pc->decoder); /* 'x' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); + (*pc->decoder->filter_function)('x', pc->decoder); break; case 5: /* '0'-'9','a'-'f' */ - (*pc->decoder->filter_function)(0x26, pc->decoder); /* '&' */ - (*pc->decoder->filter_function)(0x23, pc->decoder); /* '#' */ - (*pc->decoder->filter_function)(0x78, pc->decoder); /* 'x' */ + (*pc->decoder->filter_function)('&', pc->decoder); + (*pc->decoder->filter_function)('#', pc->decoder); + (*pc->decoder->filter_function)('x', pc->decoder); s = pc->cache; r = 1; From be11d95170e1c08856b432e5df1aaf44e51d9ab9 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 14 Sep 2021 22:09:13 +0200 Subject: [PATCH 0065/1346] Add more tests for mb_encode_numericentity --- .../tests/mb_encode_numericentity.phpt | 75 +++++++++++++++---- 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/ext/mbstring/tests/mb_encode_numericentity.phpt b/ext/mbstring/tests/mb_encode_numericentity.phpt index 78788fc900d83..da760a3577cb9 100644 --- a/ext/mbstring/tests/mb_encode_numericentity.phpt +++ b/ext/mbstring/tests/mb_encode_numericentity.phpt @@ -1,5 +1,5 @@ --TEST-- -Test mb_encode_numericentity() function : Convert UTF-8 to HTML-Entities +Test mb_encode_numericentity() function: Convert text to HTML entities --EXTENSIONS-- mbstring --FILE-- @@ -7,25 +7,74 @@ mbstring $str1 = '¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'; $str2 = 'ƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦'; $convmap = array(0x0, 0x2FFFF, 0, 0xFFFF); -echo mb_encode_numericentity($str1, $convmap, "UTF-8")."\n"; -echo mb_encode_numericentity($str2, $convmap, "UTF-8")."\n"; +echo "1: " . mb_encode_numericentity($str1, $convmap, "UTF-8") . "\n"; +echo "1 (hex): " . mb_encode_numericentity($str1, $convmap, "UTF-8", true) . "\n"; +echo "2: " . mb_encode_numericentity($str2, $convmap, "UTF-8") . "\n"; $convmap = array(0xFF, 0x2FFFF, 0, 0xFFFF); -echo mb_encode_numericentity('aŒbœcŠdše€fg', $convmap, "UTF-8")."\n"; +echo "3: " . mb_encode_numericentity('aŒbœcŠdše€fg', $convmap, "UTF-8") . "\n"; $convmap = []; -echo mb_encode_numericentity('föo', $convmap, "UTF-8")."\n"; +echo "4: " . mb_encode_numericentity('föo', $convmap, "UTF-8") . "\n"; -$convmap = array(0xFF, 0x2FFFF, 0); // 3 elements try { - echo mb_encode_numericentity('aŒbœcŠdše€fg', $convmap, "UTF-8")."\n"; + $convmap = array(0xFF, 0x2FFFF, 0); // 3 elements + echo "5: " . mb_encode_numericentity('aŒbœcŠdše€fg', $convmap, "UTF-8") . "\n"; } catch (ValueError $ex) { - echo $ex->getMessage()."\n"; + echo "5: " . $ex->getMessage() . "\n"; } + +// HTML-encode a null byte +echo "6: " . mb_encode_numericentity("\x00", array(0, 1, 0, 0xFFFF), "UTF-8", false) . "\n"; +echo "6 (hex): " . mb_encode_numericentity("\x00", array(0, 1, 0, 0xFFFF), "UTF-8", true) . "\n"; + +// Try doing weird things with convmap +$convmap = [ + 0, 0, 0, 0, // Only one codepoint, empty mask + 100, 50, 0, 0xFFFF // 'End' codepoint is before 'start' codepoint +]; +echo "7: " . mb_encode_numericentity('föo', $convmap, "UTF-8") . "\n"; +echo "7 (hex): " . mb_encode_numericentity('föo', $convmap, "UTF-8", true) . "\n"; + +// Try using positive offset +$convmap = [0, 10, 1000, 0xFFFF]; +echo "8: " . mb_encode_numericentity("\x01\x02\x03", $convmap, "UTF-8") . "\n"; +echo "8 (hex): " . mb_encode_numericentity("\x01\x02\x03", $convmap, "UTF-8", true) . "\n"; + +// Try using negative offset +$convmap = [0, 10, -100000, 0xFFFFFF]; +echo "9: " . mb_encode_numericentity("\x01\x02\x03", $convmap, "UTF-8") . "\n"; +echo "9 (hex): " . mb_encode_numericentity("\x01\x02\x03", $convmap, "UTF-8", true) . "\n"; + +// Try using mask to remove some bits +$convmap = [0, 1000, 0, 0x123]; +echo "10: " . mb_encode_numericentity('föo', $convmap, "UTF-8") . "\n"; +echo "10 (hex): " . mb_encode_numericentity('föo', $convmap, "UTF-8", true) . "\n"; + +// Try different text encoding +$convmap = [0, 0xFFFF, 0, 0xFFFF]; +$iso2022jp = "\x1B\$B\x21\x21!r\x1B(BABC"; +echo "11: " . mb_encode_numericentity($iso2022jp, $convmap, "ISO-2022-JP") . "\n"; +echo "11 (hex): " . mb_encode_numericentity($iso2022jp, $convmap, "ISO-2022-JP", true) . "\n"; + + ?> --EXPECT-- -¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ -ƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦ -aŒbœcŠdše€fg -föo -mb_encode_numericentity(): Argument #2 ($map) must have a multiple of 4 elements +1: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +1 (hex): ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +2: ƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦ +3: aŒbœcŠdše€fg +4: föo +5: mb_encode_numericentity(): Argument #2 ($map) must have a multiple of 4 elements +6: � +6 (hex): � +7: föo +7 (hex): föo +8: ϩϪϫ +8 (hex): ϩϪϫ +9: ��� +9 (hex): ��� +10: ""# +10 (hex): ""# +11:  £ABC +11 (hex):  £ABC From 57eafd44c66af835d95da6909563447411632449 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 15 Sep 2021 18:04:45 +0200 Subject: [PATCH 0066/1346] Add more tests for mb_decode_numericentity --- .../tests/mb_decode_numericentity.phpt | 82 ++++++++++++------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/ext/mbstring/tests/mb_decode_numericentity.phpt b/ext/mbstring/tests/mb_decode_numericentity.phpt index 82220db316869..f9e63234ae0ed 100644 --- a/ext/mbstring/tests/mb_decode_numericentity.phpt +++ b/ext/mbstring/tests/mb_decode_numericentity.phpt @@ -1,5 +1,5 @@ --TEST-- -Test mb_decode_numericentity() function : Convert HTML-Entities to UTF-8 +Test mb_decode_numericentity() function : Convert HTML entities to text --EXTENSIONS-- mbstring --FILE-- @@ -7,43 +7,69 @@ mbstring $str1 = '¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'; $str2 = 'ƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦'; $str3 = 'aŒbœcŠdše€fg'; + $convmap = array(0x0, 0x2FFFF, 0, 0xFFFF); -echo mb_decode_numericentity($str1, $convmap, "UTF-8")."\n"; -echo mb_decode_numericentity($str2, $convmap, "UTF-8")."\n"; -echo mb_decode_numericentity($str3, $convmap, "UTF-8")."\n"; +echo "1: " . mb_decode_numericentity($str1, $convmap, "UTF-8") . "\n"; +echo "2: " . mb_decode_numericentity($str2, $convmap, "UTF-8") . "\n"; +echo "3: " . mb_decode_numericentity($str3, $convmap, "UTF-8") . "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; +echo "4: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "5: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "6: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "7: " . mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; -echo mb_decode_numericentity('�', $convmap), "\n"; +echo "8: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "9: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "10: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "11: " . mb_decode_numericentity('�', $convmap), "\n"; +echo "12: " . bin2hex(mb_decode_numericentity(mb_convert_encoding('�', 'UCS-4', 'ASCII'), [0, 0x7FFFFFFF, 0, 0x7FFFFFFF], 'UCS-4')), "\n"; $convmap = []; -echo mb_decode_numericentity('föo', $convmap, "UTF-8")."\n"; +echo "13: " . mb_decode_numericentity('föo', $convmap, "UTF-8") . "\n"; $convmap = array(0x0, 0x2FFFF, 0); // 3 elements try { - echo mb_decode_numericentity($str3, $convmap, "UTF-8")."\n"; + echo "14: " . mb_decode_numericentity($str3, $convmap, "UTF-8") . "\n"; } catch (ValueError $ex) { - echo $ex->getMessage()."\n"; + echo "14: " . $ex->getMessage()."\n"; } +echo "15: " . bin2hex(mb_decode_numericentity('�', [0, 1, 0, 0xFFFF], 'UTF-8')) . "\n"; +echo "16: " . bin2hex(mb_decode_numericentity('�', [0, 1, 0, 0xFFFF], 'UTF-8')) . "\n"; + +// Weird convmap +$convmap = [ + 0, 0, 0, 0, // Only one codepoint, empty mask + 100, 50, 0, 0xFFFF // 'End' codepoint is before 'start' codepoint +]; +echo "17: " . mb_decode_numericentity('föo', $convmap, "UTF-8") . "\n"; + +// Convmap with positive offset +$convmap = [0, 10, 1000, 0xFFFF]; +echo "18: " . bin2hex(mb_decode_numericentity("ϩϪϫ", $convmap, "UTF-8")) . "\n"; +echo "19: " . bin2hex(mb_decode_numericentity("ϩϪϫ", $convmap, "UTF-8")) . "\n"; + +echo "20: " . mb_decode_numericentity("{a;", [0, 0xFFFF, 0, 0xFFFF]) . "\n"; + ?> --EXPECT-- -¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ -ƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦ -aŒbœcŠdše€fg -� -� -� -� -� -� -� -� -föo -mb_decode_numericentity(): Argument #2 ($map) must have a multiple of 4 elements +1: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ +2: ƒΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψωϑϒϖ•…′″‾⁄℘ℑℜ™ℵ←↑→↓↔↵⇐⇑⇒⇓⇔∀∂∃∅∇∈∉∋∏∑−∗√∝∞∠∧∨∩∪∫∴∼≅≈≠≡≤≥⊂⊃⊄⊆⊇⊕⊗⊥⋅⌈⌉⌊⌋〈〉◊♠♣♥♦ +3: aŒbœcŠdše€fg +4: � +5: � +6: � +7: � +8: � +9: � +10: � +11: � +12: 00bc614e +13: föo +14: mb_decode_numericentity(): Argument #2 ($map) must have a multiple of 4 elements +15: 00 +16: 00 +17: föo +18: 010203 +19: 010203 +20: {a; From 1170981b33123d0e6c2eb5f8d80b98ff12f5d328 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sat, 18 Sep 2021 20:20:45 +0200 Subject: [PATCH 0067/1346] Fix mb_str_split on empty strings in variable-length text encodings Previously, when passed an empty string, and given an encoding which uses a variable number of bytes per character (and which doesn't have a 'character length table'), mb_str_split would return an array containing a single empty string, rather than an empty array. The ISO-2022 encodings are among those which were affected by this bug. --- ext/mbstring/mbstring.c | 4 ++++ ext/mbstring/tests/mb_str_split_jp.phpt | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 3ae28e7736789..6973160c29541 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -1699,6 +1699,10 @@ PHP_FUNCTION(mb_str_split) RETURN_THROWS(); } + if (ZSTR_LEN(str) == 0) { + RETURN_EMPTY_ARRAY(); + } + p = ZSTR_VAL(str); /* string cursor pointer */ last = ZSTR_VAL(str) + ZSTR_LEN(str); /* last string char pointer */ diff --git a/ext/mbstring/tests/mb_str_split_jp.phpt b/ext/mbstring/tests/mb_str_split_jp.phpt index f57531eeb25dd..22f39539608c3 100644 --- a/ext/mbstring/tests/mb_str_split_jp.phpt +++ b/ext/mbstring/tests/mb_str_split_jp.phpt @@ -23,8 +23,15 @@ $charset = [ "UTF-8" ]; +/* Try empty strings first */ +foreach ($charset as $cs) { + if (count(mb_str_split("", 1, $cs)) !== 0) + echo "Empty $cs string should convert to empty array!\n"; + if (count(mb_str_split("", 2, $cs)) !== 0) + echo "Empty $cs string should convert to empty array!\n"; +} -foreach($charset as $cs){ +foreach ($charset as $cs) { $enc = mb_convert_encoding($string, $cs, "UTF-8"); $split = mb_str_split($enc, 1, $cs); @@ -32,7 +39,7 @@ foreach($charset as $cs){ for($i = 1; $i <= $len; ++$i){ $ceil = ceil($len / $i); $cnt = count(mb_str_split($enc,$i,$cs)); - if($ceil != $cnt){ + if ($ceil != $cnt){ echo "$cs WRONG CHUNKS NUMBER: expected/actual: $ceil/$cnt\n"; } } From 2f096c403967b139c1a6ee40fe84b4e768854a77 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sat, 18 Sep 2021 20:47:56 +0200 Subject: [PATCH 0068/1346] Remove useless constant MBFL_ENCTYPE_MWC2 --- ext/mbstring/libmbfl/filters/mbfilter_utf16.c | 6 +++--- ext/mbstring/libmbfl/mbfl/mbfl_consts.h | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c index 71f6e1a0933e9..8477367f79d87 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c @@ -40,7 +40,7 @@ const mbfl_encoding mbfl_encoding_utf16 = { "UTF-16", mbfl_encoding_utf16_aliases, NULL, - MBFL_ENCTYPE_MWC2, + 0, &vtbl_utf16_wchar, &vtbl_wchar_utf16 }; @@ -51,7 +51,7 @@ const mbfl_encoding mbfl_encoding_utf16be = { "UTF-16BE", NULL, NULL, - MBFL_ENCTYPE_MWC2, + 0, &vtbl_utf16be_wchar, &vtbl_wchar_utf16be }; @@ -62,7 +62,7 @@ const mbfl_encoding mbfl_encoding_utf16le = { "UTF-16LE", NULL, NULL, - MBFL_ENCTYPE_MWC2, + 0, &vtbl_utf16le_wchar, &vtbl_wchar_utf16le }; diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h index 1e4add39113ec..5e519af5656f0 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_consts.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_consts.h @@ -33,7 +33,6 @@ #define MBFL_ENCTYPE_SBCS 0x00000001 /* single-byte encoding */ #define MBFL_ENCTYPE_WCS2 0x00000010 /* 2 bytes/char */ -#define MBFL_ENCTYPE_MWC2 0x00000040 /* 2+ bytes/char */ #define MBFL_ENCTYPE_WCS4 0x00000100 /* 4 bytes/char */ #define MBFL_ENCTYPE_GL_UNSAFE 0x00004000 From 07c4b3b8c02d15a0167762d3e32c383bd0659618 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 30 Aug 2020 18:06:52 +0200 Subject: [PATCH 0069/1346] Simplify code for handling mbstring language aliases Rather than using pointers to pointers to pointers (3 levels of indirection), what makes sense is two levels. This reduces unnecessary pointer dereference operations. --- ext/mbstring/libmbfl/mbfl/mbfl_language.c | 6 +++--- ext/mbstring/libmbfl/mbfl/mbfl_language.h | 2 +- ext/mbstring/libmbfl/nls/nls_de.c | 2 +- ext/mbstring/libmbfl/nls/nls_uni.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_language.c b/ext/mbstring/libmbfl/mbfl/mbfl_language.c index 8e4d8f776d876..ba1855aed109e 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_language.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_language.c @@ -99,13 +99,13 @@ mbfl_name2language(const char *name) } } - /* serch aliases */ + /* search aliases */ i = 0; while ((language = mbfl_language_ptr_table[i++]) != NULL) { if (language->aliases != NULL) { j = 0; - while ((*language->aliases)[j] != NULL) { - if (strcasecmp((*language->aliases)[j], name) == 0) { + while (language->aliases[j]) { + if (strcasecmp(language->aliases[j], name) == 0) { return language; } j++; diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_language.h b/ext/mbstring/libmbfl/mbfl/mbfl_language.h index a0a73899ee3bf..c5e68df745e4f 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_language.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_language.h @@ -72,7 +72,7 @@ typedef struct _mbfl_language { enum mbfl_no_language no_language; const char *name; const char *short_name; - const char *(*aliases)[]; + const char **aliases; enum mbfl_no_encoding mail_charset; enum mbfl_no_encoding mail_header_encoding; enum mbfl_no_encoding mail_body_encoding; diff --git a/ext/mbstring/libmbfl/nls/nls_de.c b/ext/mbstring/libmbfl/nls/nls_de.c index 9e9dae7cab6f9..54f4679b45048 100644 --- a/ext/mbstring/libmbfl/nls/nls_de.c +++ b/ext/mbstring/libmbfl/nls/nls_de.c @@ -6,7 +6,7 @@ const mbfl_language mbfl_language_german = { mbfl_no_language_german, "German", "de", - (const char *(*)[])&mbfl_language_german_aliases, + mbfl_language_german_aliases, mbfl_no_encoding_8859_15, mbfl_no_encoding_qprint, mbfl_no_encoding_8bit diff --git a/ext/mbstring/libmbfl/nls/nls_uni.c b/ext/mbstring/libmbfl/nls/nls_uni.c index e8ec5c795afd5..994b1c450e485 100644 --- a/ext/mbstring/libmbfl/nls/nls_uni.c +++ b/ext/mbstring/libmbfl/nls/nls_uni.c @@ -6,7 +6,7 @@ const mbfl_language mbfl_language_uni = { mbfl_no_language_uni, "uni", "uni", - (const char *(*)[])&mbfl_language_uni_aliases, + mbfl_language_uni_aliases, mbfl_no_encoding_utf8, mbfl_no_encoding_base64, mbfl_no_encoding_base64 From 36c979e2b6af1ddf003cca3d7b31a116759fc010 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 18 Oct 2020 20:00:20 +0200 Subject: [PATCH 0070/1346] Use stack-allocated buffer in php_mb_chr --- ext/mbstring/mbstring.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 6973160c29541..6b6fa3e7ef620 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -4055,8 +4055,7 @@ static inline zend_string *php_mb_chr(zend_long cp, zend_string *enc_name, uint3 const mbfl_encoding *enc; enum mbfl_no_encoding no_enc; zend_string *ret; - char* buf; - size_t buf_len; + char buf[5]; enc = php_mb_get_encoding(enc_name, enc_name_arg_num); if (!enc) { @@ -4103,21 +4102,17 @@ static inline zend_string *php_mb_chr(zend_long cp, zend_string *enc_name, uint3 return ret; } - buf_len = 4; - buf = (char *) emalloc(buf_len + 1); buf[0] = (cp >> 24) & 0xff; buf[1] = (cp >> 16) & 0xff; buf[2] = (cp >> 8) & 0xff; buf[3] = cp & 0xff; buf[4] = 0; - char *ret_str; size_t ret_len; long orig_illegalchars = MBSTRG(illegalchars); MBSTRG(illegalchars) = 0; - ret_str = php_mb_convert_encoding_ex(buf, buf_len, enc, &mbfl_encoding_ucs4be, &ret_len); + char *ret_str = php_mb_convert_encoding_ex(buf, 4, enc, &mbfl_encoding_ucs4be, &ret_len); if (MBSTRG(illegalchars) != 0) { - efree(buf); efree(ret_str); MBSTRG(illegalchars) = orig_illegalchars; return NULL; @@ -4127,7 +4122,6 @@ static inline zend_string *php_mb_chr(zend_long cp, zend_string *enc_name, uint3 efree(ret_str); MBSTRG(illegalchars) = orig_illegalchars; - efree(buf); return ret; } From 4e51810f9bfeb7f153eb9e7cdffbef23ee415748 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 26 Jul 2020 21:17:27 +0200 Subject: [PATCH 0071/1346] Optimize mbstring upper/lowercasing: use fast path in more cases The 'fast path' in the uppercase/lowercase functions for Unicode text can be used for a slightly greater range of characters. This is not expected to have a big impact on performance, since the number of characters which will use the 'fast path' is only increased by about 50-60, and these are not very commonly used characters... but still, it doesn't cost anything. --- ext/mbstring/php_unicode.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c index 3ed6b4297a90a..0da63fe1e6a86 100644 --- a/ext/mbstring/php_unicode.c +++ b/ext/mbstring/php_unicode.c @@ -121,7 +121,9 @@ static inline unsigned mph_lookup( static unsigned php_unicode_toupper_raw(unsigned code, enum mbfl_no_encoding enc) { - if (code < 0x80) { + /* After the ASCII characters, the first codepoint with an uppercase version + * is 0xB5 (MICRO SIGN) */ + if (code < 0xB5) { /* Fast path for ASCII */ if (code >= 0x61 && code <= 0x7A) { if (UNEXPECTED(enc == mbfl_no_encoding_8859_9 && code == 0x69)) { @@ -141,7 +143,9 @@ static unsigned php_unicode_toupper_raw(unsigned code, enum mbfl_no_encoding enc static unsigned php_unicode_tolower_raw(unsigned code, enum mbfl_no_encoding enc) { - if (code < 0x80) { + /* After the ASCII characters, the first codepoint with a lowercase version + * is 0xC0 (LATIN CAPITAL LETTER A WITH GRAVE) */ + if (code < 0xC0) { /* Fast path for ASCII */ if (code >= 0x41 && code <= 0x5A) { if (UNEXPECTED(enc == mbfl_no_encoding_8859_9 && code == 0x0049L)) { From 3240a7476210fb524ba85f4572294d018eb73f71 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 17 Sep 2021 13:40:01 +0100 Subject: [PATCH 0072/1346] Use more specific return type for stream functions Some void, some zend_result, some bool --- ext/standard/streamsfuncs.c | 4 +-- main/php_streams.h | 20 +++++++------- main/streams/php_stream_context.h | 2 +- main/streams/php_streams_int.h | 3 --- main/streams/streams.c | 44 +++++++++++++++---------------- 5 files changed, 34 insertions(+), 39 deletions(-) diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 282a1c9c92461..b68daace373c9 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -1033,8 +1033,8 @@ PHP_FUNCTION(stream_context_set_option) zend_argument_value_error(4, "must be provided when argument #2 ($wrapper_or_options) is a string"); RETURN_THROWS(); } - - RETURN_BOOL(php_stream_context_set_option(context, ZSTR_VAL(wrappername), optionname, zvalue) == SUCCESS); + php_stream_context_set_option(context, ZSTR_VAL(wrappername), optionname, zvalue); + RETURN_TRUE; } } /* }}} */ diff --git a/main/php_streams.h b/main/php_streams.h index ca8d9c034740f..3742290218e95 100644 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -314,7 +314,7 @@ PHPAPI ssize_t _php_stream_write(php_stream *stream, const char *buf, size_t cou #define php_stream_write_string(stream, str) _php_stream_write(stream, str, strlen(str)) #define php_stream_write(stream, buf, count) _php_stream_write(stream, (buf), (count)) -PHPAPI int _php_stream_fill_read_buffer(php_stream *stream, size_t size); +PHPAPI zend_result _php_stream_fill_read_buffer(php_stream *stream, size_t size); #define php_stream_fill_read_buffer(stream, size) _php_stream_fill_read_buffer((stream), (size)) PHPAPI ssize_t _php_stream_printf(php_stream *stream, const char *fmt, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3); @@ -322,7 +322,7 @@ PHPAPI ssize_t _php_stream_printf(php_stream *stream, const char *fmt, ...) PHP_ /* php_stream_printf macro & function require */ #define php_stream_printf _php_stream_printf -PHPAPI int _php_stream_eof(php_stream *stream); +PHPAPI bool _php_stream_eof(php_stream *stream); #define php_stream_eof(stream) _php_stream_eof((stream)) PHPAPI int _php_stream_getc(php_stream *stream); @@ -343,8 +343,8 @@ PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen, #define php_stream_get_line(stream, buf, maxlen, retlen) _php_stream_get_line((stream), (buf), (maxlen), (retlen)) PHPAPI zend_string *php_stream_get_record(php_stream *stream, size_t maxlen, const char *delim, size_t delim_len); -/* CAREFUL! this is equivalent to puts NOT fputs! */ -PHPAPI int _php_stream_puts(php_stream *stream, const char *buf); +/* Returns true if buffer has been appended, false on error */ +PHPAPI bool _php_stream_puts(php_stream *stream, const char *buf); #define php_stream_puts(stream, buf) _php_stream_puts((stream), (buf)) PHPAPI int _php_stream_stat(php_stream *stream, php_stream_statbuf *ssb); @@ -466,7 +466,7 @@ BEGIN_EXTERN_C() ZEND_ATTRIBUTE_DEPRECATED PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC); #define php_stream_copy_to_stream(src, dest, maxlen) _php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC) -PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC); +PHPAPI zend_result _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC); #define php_stream_copy_to_stream_ex(src, dest, maxlen, len) _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC) @@ -568,15 +568,15 @@ END_EXTERN_C() #define STREAM_OPEN_FOR_ZEND_STREAM 0x00010000 int php_init_stream_wrappers(int module_number); -int php_shutdown_stream_wrappers(int module_number); +void php_shutdown_stream_wrappers(int module_number); void php_shutdown_stream_hashes(void); PHP_RSHUTDOWN_FUNCTION(streams); BEGIN_EXTERN_C() -PHPAPI int php_register_url_stream_wrapper(const char *protocol, const php_stream_wrapper *wrapper); -PHPAPI int php_unregister_url_stream_wrapper(const char *protocol); -PHPAPI int php_register_url_stream_wrapper_volatile(zend_string *protocol, php_stream_wrapper *wrapper); -PHPAPI int php_unregister_url_stream_wrapper_volatile(zend_string *protocol); +PHPAPI zend_result php_register_url_stream_wrapper(const char *protocol, const php_stream_wrapper *wrapper); +PHPAPI zend_result php_unregister_url_stream_wrapper(const char *protocol); +PHPAPI zend_result php_register_url_stream_wrapper_volatile(zend_string *protocol, php_stream_wrapper *wrapper); +PHPAPI zend_result php_unregister_url_stream_wrapper_volatile(zend_string *protocol); PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC); PHPAPI php_stream_wrapper *php_stream_locate_url_wrapper(const char *path, const char **path_for_open, int options); PHPAPI const char *php_stream_locate_eol(php_stream *stream, zend_string *buf); diff --git a/main/streams/php_stream_context.h b/main/streams/php_stream_context.h index 5905b6909101f..c98f5420ac3e6 100644 --- a/main/streams/php_stream_context.h +++ b/main/streams/php_stream_context.h @@ -57,7 +57,7 @@ PHPAPI void php_stream_context_free(php_stream_context *context); PHPAPI php_stream_context *php_stream_context_alloc(void); PHPAPI zval *php_stream_context_get_option(php_stream_context *context, const char *wrappername, const char *optionname); -PHPAPI int php_stream_context_set_option(php_stream_context *context, +PHPAPI void php_stream_context_set_option(php_stream_context *context, const char *wrappername, const char *optionname, zval *optionvalue); PHPAPI php_stream_notifier *php_stream_notification_alloc(void); diff --git a/main/streams/php_streams_int.h b/main/streams/php_streams_int.h index bde413a882675..a3c55bdd4f066 100644 --- a/main/streams/php_streams_int.h +++ b/main/streams/php_streams_int.h @@ -60,6 +60,3 @@ * any other function that expects standard modes and you allow non-standard * ones. result should be a char[5]. */ void php_stream_mode_sanitize_fdopen_fopencookie(php_stream *stream, char *result); - -void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper); -void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *path, const char *caption); diff --git a/main/streams/streams.c b/main/streams/streams.c index 2882d6a179d58..ce0eeb462231c 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -148,7 +148,7 @@ static zend_llist *php_get_wrapper_errors_list(php_stream_wrapper *wrapper) } /* {{{ wrapper error reporting */ -void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *path, const char *caption) +static void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char *path, const char *caption) { char *tmp; char *msg; @@ -218,7 +218,7 @@ void php_stream_display_wrapper_errors(php_stream_wrapper *wrapper, const char * } } -void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper) +static void php_stream_tidy_wrapper_error_log(php_stream_wrapper *wrapper) { if (wrapper && FG(wrapper_errors)) { zend_hash_str_del(FG(wrapper_errors), (const char*)&wrapper, sizeof(wrapper)); @@ -535,7 +535,7 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov /* {{{ generic stream operations */ -PHPAPI int _php_stream_fill_read_buffer(php_stream *stream, size_t size) +PHPAPI zend_result _php_stream_fill_read_buffer(php_stream *stream, size_t size) { /* allocate/fill the buffer */ @@ -776,7 +776,7 @@ PHPAPI zend_string *php_stream_read_to_str(php_stream *stream, size_t len) return str; } -PHPAPI int _php_stream_eof(php_stream *stream) +PHPAPI bool _php_stream_eof(php_stream *stream) { /* if there is data in the buffer, it's not EOF */ if (stream->writepos - stream->readpos > 0) { @@ -813,7 +813,7 @@ PHPAPI int _php_stream_getc(php_stream *stream) return EOF; } -PHPAPI int _php_stream_puts(php_stream *stream, const char *buf) +PHPAPI bool _php_stream_puts(php_stream *stream, const char *buf) { size_t len; char newline[2] = "\n"; /* is this OK for Win? */ @@ -1034,7 +1034,7 @@ PHPAPI zend_string *php_stream_get_record(php_stream *stream, size_t maxlen, con const char *found_delim = NULL; size_t buffered_len, tent_ret_len; /* tentative returned length */ - int has_delim = delim_len > 0; + bool has_delim = delim_len > 0; if (maxlen == 0) { return NULL; @@ -1537,7 +1537,7 @@ PHPAPI zend_string *_php_stream_copy_to_mem(php_stream *src, size_t maxlen, int } /* Returns SUCCESS/FAILURE and sets *len to the number of bytes moved */ -PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC) +PHPAPI zend_result _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC) { char buf[CHUNK_SIZE]; size_t haveread = 0; @@ -1649,7 +1649,7 @@ ZEND_ATTRIBUTE_DEPRECATED PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC) { size_t len; - int ret = _php_stream_copy_to_stream_ex(src, dest, maxlen, &len STREAMS_REL_CC); + zend_result ret = _php_stream_copy_to_stream_ex(src, dest, maxlen, &len STREAMS_REL_CC); if (ret == SUCCESS && len == 0 && maxlen != 0) { return 1; } @@ -1717,18 +1717,17 @@ int php_init_stream_wrappers(int module_number) ) ? SUCCESS : FAILURE; } -int php_shutdown_stream_wrappers(int module_number) +void php_shutdown_stream_wrappers(int module_number) { zend_hash_destroy(&url_stream_wrappers_hash); zend_hash_destroy(php_get_stream_filters_hash_global()); zend_hash_destroy(php_stream_xport_get_hash()); - return SUCCESS; } /* Validate protocol scheme names during registration * Must conform to /^[a-zA-Z0-9+.-]+$/ */ -static inline int php_stream_wrapper_scheme_validate(const char *protocol, unsigned int protocol_len) +static inline zend_result php_stream_wrapper_scheme_validate(const char *protocol, unsigned int protocol_len) { unsigned int i; @@ -1745,10 +1744,10 @@ static inline int php_stream_wrapper_scheme_validate(const char *protocol, unsig } /* API for registering GLOBAL wrappers */ -PHPAPI int php_register_url_stream_wrapper(const char *protocol, const php_stream_wrapper *wrapper) +PHPAPI zend_result php_register_url_stream_wrapper(const char *protocol, const php_stream_wrapper *wrapper) { - unsigned int protocol_len = (unsigned int)strlen(protocol); - int ret; + size_t protocol_len = strlen(protocol); + zend_result ret; zend_string *str; if (php_stream_wrapper_scheme_validate(protocol, protocol_len) == FAILURE) { @@ -1761,7 +1760,7 @@ PHPAPI int php_register_url_stream_wrapper(const char *protocol, const php_strea return ret; } -PHPAPI int php_unregister_url_stream_wrapper(const char *protocol) +PHPAPI zend_result php_unregister_url_stream_wrapper(const char *protocol) { return zend_hash_str_del(&url_stream_wrappers_hash, protocol, strlen(protocol)); } @@ -1774,7 +1773,7 @@ static void clone_wrapper_hash(void) } /* API for registering VOLATILE wrappers */ -PHPAPI int php_register_url_stream_wrapper_volatile(zend_string *protocol, php_stream_wrapper *wrapper) +PHPAPI zend_result php_register_url_stream_wrapper_volatile(zend_string *protocol, php_stream_wrapper *wrapper) { if (php_stream_wrapper_scheme_validate(ZSTR_VAL(protocol), ZSTR_LEN(protocol)) == FAILURE) { return FAILURE; @@ -1787,7 +1786,7 @@ PHPAPI int php_register_url_stream_wrapper_volatile(zend_string *protocol, php_s return zend_hash_add_ptr(FG(stream_wrappers), protocol, wrapper) ? SUCCESS : FAILURE; } -PHPAPI int php_unregister_url_stream_wrapper_volatile(zend_string *protocol) +PHPAPI zend_result php_unregister_url_stream_wrapper_volatile(zend_string *protocol) { if (!FG(stream_wrappers)) { clone_wrapper_hash(); @@ -2250,7 +2249,7 @@ PHPAPI zval *php_stream_context_get_option(php_stream_context *context, return zend_hash_str_find(Z_ARRVAL_P(wrapperhash), optionname, strlen(optionname)); } -PHPAPI int php_stream_context_set_option(php_stream_context *context, +PHPAPI void php_stream_context_set_option(php_stream_context *context, const char *wrappername, const char *optionname, zval *optionvalue) { zval *wrapperhash; @@ -2266,7 +2265,6 @@ PHPAPI int php_stream_context_set_option(php_stream_context *context, Z_TRY_ADDREF_P(optionvalue); SEPARATE_ARRAY(wrapperhash); zend_hash_str_update(Z_ARRVAL_P(wrapperhash), optionname, strlen(optionname), optionvalue); - return SUCCESS; } /* }}} */ @@ -2295,12 +2293,12 @@ PHPAPI int _php_stream_scandir(const char *dirname, zend_string **namelist[], in unsigned int nfiles = 0; if (!namelist) { - return FAILURE; + return -1; } stream = php_stream_opendir(dirname, REPORT_ERRORS, context); if (!stream) { - return FAILURE; + return -1; } while (php_stream_readdir(stream, &sdp)) { @@ -2312,7 +2310,7 @@ PHPAPI int _php_stream_scandir(const char *dirname, zend_string **namelist[], in /* overflow */ php_stream_closedir(stream); efree(vector); - return FAILURE; + return -1; } vector_size *= 2; } @@ -2326,7 +2324,7 @@ PHPAPI int _php_stream_scandir(const char *dirname, zend_string **namelist[], in /* overflow */ php_stream_closedir(stream); efree(vector); - return FAILURE; + return -1; } } php_stream_closedir(stream); From 53d5420d493ce8b9ef0e68de8b86c5ad0571f802 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 15:54:27 +0100 Subject: [PATCH 0073/1346] Use more appropriate types in Optimizer Mainly using zend_result and bool instead of int --- Zend/Optimizer/block_pass.c | 17 ++++----- Zend/Optimizer/compact_literals.c | 5 ++- Zend/Optimizer/dfa_pass.c | 6 +-- Zend/Optimizer/escape_analysis.c | 10 ++--- Zend/Optimizer/optimize_temp_vars_5.c | 2 +- Zend/Optimizer/pass3.c | 2 +- Zend/Optimizer/sccp.c | 48 ++++++++++++------------ Zend/Optimizer/scdf.c | 4 +- Zend/Optimizer/scdf.h | 2 +- Zend/Optimizer/ssa_integrity.c | 3 +- Zend/Optimizer/zend_call_graph.c | 4 +- Zend/Optimizer/zend_cfg.c | 2 +- Zend/Optimizer/zend_dump.c | 12 +++--- Zend/Optimizer/zend_func_info.c | 6 +-- Zend/Optimizer/zend_func_info.h | 4 +- Zend/Optimizer/zend_inference.c | 36 +++++++++--------- Zend/Optimizer/zend_inference.h | 8 ++-- Zend/Optimizer/zend_optimizer.c | 20 +++++----- Zend/Optimizer/zend_optimizer.h | 4 +- Zend/Optimizer/zend_optimizer_internal.h | 22 +++++------ Zend/Optimizer/zend_ssa.c | 4 +- Zend/Optimizer/zend_ssa.h | 2 +- Zend/Optimizer/zend_worklist.h | 2 +- 23 files changed, 113 insertions(+), 112 deletions(-) diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 61c8f420aa43f..c2b159bf7dd55 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -30,7 +30,7 @@ #include "zend_dump.h" /* Checks if a constant (like "true") may be replaced by its value */ -int zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy) +bool zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy) { zend_constant *c = zend_hash_find_ptr(EG(zend_constants), name); if (c) { @@ -220,7 +220,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array * Float to string conversion may be affected by current * locale setting. */ - int l, old_len; + size_t l, old_len; if (Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) { convert_to_string(&ZEND_OP1_LITERAL(opline)); @@ -327,7 +327,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array ) { zval *arg = &OPLINE_OP1_LITERAL(sv); char *fname = FUNCTION_CACHE->funcs[Z_LVAL(ZEND_OP1_LITERAL(fcall))].function_name; - int flen = FUNCTION_CACHE->funcs[Z_LVAL(ZEND_OP1_LITERAL(fcall))].name_len; + size_t flen = FUNCTION_CACHE->funcs[Z_LVAL(ZEND_OP1_LITERAL(fcall))].name_len; if((flen == sizeof("function_exists")-1 && zend_binary_strcasecmp(fname, flen, "function_exists", sizeof("function_exists")-1) == 0) || (flen == sizeof("is_callable")-1 && zend_binary_strcasecmp(fname, flen, "is_callable", sizeof("is_callable")-1) == 0) ) { @@ -341,7 +341,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array } } else if(flen == sizeof("constant")-1 && zend_binary_strcasecmp(fname, flen, "constant", sizeof("constant")-1) == 0) { zval c; - if(zend_optimizer_get_persistent_constant(Z_STR_P(arg), &c, 1 ELS_CC) != 0) { + if (zend_optimizer_get_persistent_constant(Z_STR_P(arg), &c, 1 ELS_CC)) { literal_dtor(arg); MAKE_NOP(sv); MAKE_NOP(fcall); @@ -712,7 +712,7 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array src->opcode == ZEND_FAST_CONCAT) && src->op2_type == IS_CONST) { /* compress consecutive CONCATs */ - int l, old_len; + size_t l, old_len; if (Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) { convert_to_string(&ZEND_OP2_LITERAL(opline)); @@ -960,7 +960,6 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array, zend_op zend_op *new_opcodes; zend_op *opline; uint32_t len = 0; - int n; for (b = blocks; b < end; b++) { if (b->len == 0) { @@ -1129,7 +1128,7 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array, zend_op /* rebuild map (just for printing) */ memset(cfg->map, -1, sizeof(int) * op_array->last); - for (n = 0; n < cfg->blocks_count; n++) { + for (int n = 0; n < cfg->blocks_count; n++) { if (cfg->blocks[n].flags & (ZEND_BB_REACHABLE|ZEND_BB_UNREACHABLE_FREE)) { cfg->map[cfg->blocks[n].start] = n; } @@ -1189,7 +1188,7 @@ static zend_always_inline zend_basic_block *get_next_block(const zend_cfg *cfg, /* we use "jmp_hitlist" to avoid infinity loops during jmp optimization */ -static zend_always_inline int in_hitlist(int target, int *jmp_hitlist, int jmp_hitlist_count) +static zend_always_inline bool in_hitlist(int target, int *jmp_hitlist, int jmp_hitlist_count) { int i; @@ -1642,7 +1641,7 @@ static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset use } if (ctx->debug_level & ZEND_DUMP_BLOCK_PASS_VARS) { - int printed = 0; + bool printed = 0; uint32_t i; for (i = op_array->last_var; i< op_array->T; i++) { diff --git a/Zend/Optimizer/compact_literals.c b/Zend/Optimizer/compact_literals.c index 6e935bc60c8c1..b0ad30e6b90cd 100644 --- a/Zend/Optimizer/compact_literals.c +++ b/Zend/Optimizer/compact_literals.c @@ -88,7 +88,7 @@ static uint32_t add_static_slot(HashTable *hash, uint32_t op1, uint32_t op2, uint32_t kind, - int *cache_size) + uint32_t *cache_size) { uint32_t ret; zval *class_name = &op_array->literals[op1]; @@ -150,7 +150,8 @@ static zend_string *create_str_cache_key(zval *literal, uint32_t flags) void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx *ctx) { zend_op *opline, *end; - int i, j, n, *map, cache_size; + int i, j, n, *map; + uint32_t cache_size; zval zv, *pos; literal_info *info; int l_null = -1; diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 49a060844aae5..39d82a639c22e 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -38,7 +38,7 @@ # include "ssa_integrity.c" #endif -int zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa) +zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa) { uint32_t build_flags; @@ -410,7 +410,7 @@ int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) && (send_needly->opcode == ZEND_SEND_VAL || send_needly->opcode == ZEND_SEND_VAR) ) { - int ok = 1; + bool ok = 1; HashTable *src = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, send_array->op1.constant)); HashTable *dst; @@ -996,7 +996,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) return removed_ops; } -static int zend_dfa_try_to_replace_result(zend_op_array *op_array, zend_ssa *ssa, int def, int cv_var) +static bool zend_dfa_try_to_replace_result(zend_op_array *op_array, zend_ssa *ssa, int def, int cv_var) { int result_var = ssa->ops[def].result_def; int cv = EX_NUM_TO_VAR(ssa->vars[cv_var].var); diff --git a/Zend/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c index e92b927b72289..26c62b76d58db 100644 --- a/Zend/Optimizer/escape_analysis.c +++ b/Zend/Optimizer/escape_analysis.c @@ -73,7 +73,7 @@ static zend_always_inline void union_find_unite(int *parent, int *size, int i, i } /* }}} */ -static int zend_build_equi_escape_sets(int *parent, zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ +static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ { zend_ssa_var *ssa_vars = ssa->vars; int ssa_vars_count = ssa->vars_count; @@ -147,7 +147,7 @@ static int zend_build_equi_escape_sets(int *parent, zend_op_array *op_array, zen } /* }}} */ -static int is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */ +static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */ { zend_ssa_op *ssa_op = ssa->ops + def; zend_op *opline = op_array->opcodes + def; @@ -212,7 +212,7 @@ static int is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, in } /* }}} */ -static int is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */ +static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */ { zend_ssa_op *op = ssa->ops + def; zend_op *opline = op_array->opcodes + def; @@ -256,7 +256,7 @@ static int is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var } /* }}} */ -static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int var) /* {{{ */ +static bool is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int var) /* {{{ */ { zend_ssa_op *ssa_op = ssa->ops + use; zend_op *opline = op_array->opcodes + use; @@ -367,7 +367,7 @@ static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int va } /* }}} */ -int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ +zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ { zend_ssa_var *ssa_vars = ssa->vars; int ssa_vars_count = ssa->vars_count; diff --git a/Zend/Optimizer/optimize_temp_vars_5.c b/Zend/Optimizer/optimize_temp_vars_5.c index 118f9243dede9..d6f2f01de40a1 100644 --- a/Zend/Optimizer/optimize_temp_vars_5.c +++ b/Zend/Optimizer/optimize_temp_vars_5.c @@ -40,7 +40,7 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *ctx) { - int T = op_array->T; + uint32_t T = op_array->T; int offset = op_array->last_var; uint32_t bitset_len; zend_bitset taken_T; /* T index in use */ diff --git a/Zend/Optimizer/pass3.c b/Zend/Optimizer/pass3.c index 8270f38045069..107c78f19f5cc 100644 --- a/Zend/Optimizer/pass3.c +++ b/Zend/Optimizer/pass3.c @@ -31,7 +31,7 @@ #include "zend_vm.h" /* we use "jmp_hitlist" to avoid infinity loops during jmp optimization */ -static zend_always_inline int in_hitlist(zend_op *target, zend_op **jmp_hitlist, int jmp_hitlist_count) +static zend_always_inline bool in_hitlist(zend_op *target, zend_op **jmp_hitlist, int jmp_hitlist_count) { int i; diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 30fafe0079115..11a6a07db9cf5 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -370,7 +370,7 @@ static bool try_replace_op2( return 0; } -static inline int ct_eval_binary_op(zval *result, zend_uchar binop, zval *op1, zval *op2) { +static inline zend_result ct_eval_binary_op(zval *result, zend_uchar binop, zval *op1, zval *op2) { /* TODO: We could implement support for evaluation of + on partial arrays. */ if (IS_PARTIAL_ARRAY(op1) || IS_PARTIAL_ARRAY(op2)) { return FAILURE; @@ -379,7 +379,7 @@ static inline int ct_eval_binary_op(zval *result, zend_uchar binop, zval *op1, z return zend_optimizer_eval_binary_op(result, binop, op1, op2); } -static inline int ct_eval_bool_cast(zval *result, zval *op) { +static inline zend_result ct_eval_bool_cast(zval *result, zval *op) { if (IS_PARTIAL_ARRAY(op)) { if (zend_hash_num_elements(Z_ARRVAL_P(op)) == 0) { /* An empty partial array may be non-empty at runtime, we don't know whether the @@ -395,7 +395,7 @@ static inline int ct_eval_bool_cast(zval *result, zval *op) { return SUCCESS; } -static inline int zval_to_string_offset(zend_long *result, zval *op) { +static inline zend_result zval_to_string_offset(zend_long *result, zval *op) { switch (Z_TYPE_P(op)) { case IS_LONG: *result = Z_LVAL_P(op); @@ -411,7 +411,7 @@ static inline int zval_to_string_offset(zend_long *result, zval *op) { } } -static inline int fetch_array_elem(zval **result, zval *op1, zval *op2) { +static inline zend_result fetch_array_elem(zval **result, zval *op1, zval *op2) { switch (Z_TYPE_P(op2)) { case IS_NULL: *result = zend_hash_find(Z_ARR_P(op1), ZSTR_EMPTY_ALLOC()); @@ -441,7 +441,7 @@ static inline int fetch_array_elem(zval **result, zval *op1, zval *op2) { } } -static inline int ct_eval_fetch_dim(zval *result, zval *op1, zval *op2, int support_strings) { +static inline zend_result ct_eval_fetch_dim(zval *result, zval *op1, zval *op2, int support_strings) { if (Z_TYPE_P(op1) == IS_ARRAY || IS_PARTIAL_ARRAY(op1)) { zval *value; if (fetch_array_elem(&value, op1, op2) == SUCCESS && value && !IS_BOT(value)) { @@ -462,7 +462,7 @@ static inline int ct_eval_fetch_dim(zval *result, zval *op1, zval *op2, int supp } /* op1 may be NULL here to indicate an unset value */ -static inline int ct_eval_isset_isempty(zval *result, uint32_t extended_value, zval *op1) { +static inline zend_result ct_eval_isset_isempty(zval *result, uint32_t extended_value, zval *op1) { zval zv; if (!(extended_value & ZEND_ISEMPTY)) { ZVAL_BOOL(result, op1 && Z_TYPE_P(op1) != IS_NULL); @@ -478,7 +478,7 @@ static inline int ct_eval_isset_isempty(zval *result, uint32_t extended_value, z } } -static inline int ct_eval_isset_dim(zval *result, uint32_t extended_value, zval *op1, zval *op2) { +static inline zend_result ct_eval_isset_dim(zval *result, uint32_t extended_value, zval *op1, zval *op2) { if (Z_TYPE_P(op1) == IS_ARRAY || IS_PARTIAL_ARRAY(op1)) { zval *value; if (fetch_array_elem(&value, op1, op2) == FAILURE) { @@ -497,7 +497,7 @@ static inline int ct_eval_isset_dim(zval *result, uint32_t extended_value, zval } } -static inline int ct_eval_del_array_elem(zval *result, zval *key) { +static inline zend_result ct_eval_del_array_elem(zval *result, zval *key) { ZEND_ASSERT(IS_PARTIAL_ARRAY(result)); switch (Z_TYPE_P(key)) { @@ -531,7 +531,7 @@ static inline int ct_eval_del_array_elem(zval *result, zval *key) { return SUCCESS; } -static inline int ct_eval_add_array_elem(zval *result, zval *value, zval *key) { +static inline zend_result ct_eval_add_array_elem(zval *result, zval *value, zval *key) { if (!key) { SEPARATE_ARRAY(result); if ((value = zend_hash_next_index_insert(Z_ARR_P(result), value))) { @@ -580,7 +580,7 @@ static inline int ct_eval_add_array_elem(zval *result, zval *value, zval *key) { return SUCCESS; } -static inline int ct_eval_add_array_unpack(zval *result, zval *array) { +static inline zend_result ct_eval_add_array_unpack(zval *result, zval *array) { zend_string *key; zval *value; if (Z_TYPE_P(array) != IS_ARRAY) { @@ -602,7 +602,7 @@ static inline int ct_eval_add_array_unpack(zval *result, zval *array) { return SUCCESS; } -static inline int ct_eval_assign_dim(zval *result, zval *value, zval *key) { +static inline zend_result ct_eval_assign_dim(zval *result, zval *value, zval *key) { switch (Z_TYPE_P(result)) { case IS_NULL: case IS_FALSE: @@ -641,7 +641,7 @@ static inline int ct_eval_assign_dim(zval *result, zval *value, zval *key) { } } -static inline int fetch_obj_prop(zval **result, zval *op1, zval *op2) { +static inline zend_result fetch_obj_prop(zval **result, zval *op1, zval *op2) { switch (Z_TYPE_P(op2)) { case IS_STRING: *result = zend_symtable_find(Z_ARR_P(op1), Z_STR_P(op2)); @@ -651,7 +651,7 @@ static inline int fetch_obj_prop(zval **result, zval *op1, zval *op2) { } } -static inline int ct_eval_fetch_obj(zval *result, zval *op1, zval *op2) { +static inline zend_result ct_eval_fetch_obj(zval *result, zval *op1, zval *op2) { if (IS_PARTIAL_OBJECT(op1)) { zval *value; if (fetch_obj_prop(&value, op1, op2) == SUCCESS && value && !IS_BOT(value)) { @@ -662,7 +662,7 @@ static inline int ct_eval_fetch_obj(zval *result, zval *op1, zval *op2) { return FAILURE; } -static inline int ct_eval_isset_obj(zval *result, uint32_t extended_value, zval *op1, zval *op2) { +static inline zend_result ct_eval_isset_obj(zval *result, uint32_t extended_value, zval *op1, zval *op2) { if (IS_PARTIAL_OBJECT(op1)) { zval *value; if (fetch_obj_prop(&value, op1, op2) == FAILURE) { @@ -678,7 +678,7 @@ static inline int ct_eval_isset_obj(zval *result, uint32_t extended_value, zval } } -static inline int ct_eval_del_obj_prop(zval *result, zval *key) { +static inline zend_result ct_eval_del_obj_prop(zval *result, zval *key) { ZEND_ASSERT(IS_PARTIAL_OBJECT(result)); switch (Z_TYPE_P(key)) { @@ -692,7 +692,7 @@ static inline int ct_eval_del_obj_prop(zval *result, zval *key) { return SUCCESS; } -static inline int ct_eval_add_obj_prop(zval *result, zval *value, zval *key) { +static inline zend_result ct_eval_add_obj_prop(zval *result, zval *value, zval *key) { switch (Z_TYPE_P(key)) { case IS_STRING: value = zend_symtable_update(Z_ARR_P(result), Z_STR_P(key), value); @@ -705,7 +705,7 @@ static inline int ct_eval_add_obj_prop(zval *result, zval *value, zval *key) { return SUCCESS; } -static inline int ct_eval_assign_obj(zval *result, zval *value, zval *key) { +static inline zend_result ct_eval_assign_obj(zval *result, zval *value, zval *key) { switch (Z_TYPE_P(result)) { case IS_NULL: case IS_FALSE: @@ -718,7 +718,7 @@ static inline int ct_eval_assign_obj(zval *result, zval *value, zval *key) { } } -static inline int ct_eval_incdec(zval *result, zend_uchar opcode, zval *op1) { +static inline zend_result ct_eval_incdec(zval *result, zend_uchar opcode, zval *op1) { if (Z_TYPE_P(op1) == IS_ARRAY || IS_PARTIAL_ARRAY(op1)) { return FAILURE; } @@ -745,7 +745,7 @@ static inline void ct_eval_type_check(zval *result, uint32_t type_mask, zval *op ZVAL_BOOL(result, (type_mask >> type) & 1); } -static inline int ct_eval_in_array(zval *result, uint32_t extended_value, zval *op1, zval *op2) { +static inline zend_result ct_eval_in_array(zval *result, uint32_t extended_value, zval *op1, zval *op2) { HashTable *ht; bool res; @@ -780,7 +780,7 @@ static inline int ct_eval_in_array(zval *result, uint32_t extended_value, zval * return SUCCESS; } -static inline int ct_eval_array_key_exists(zval *result, zval *op1, zval *op2) { +static inline zend_result ct_eval_array_key_exists(zval *result, zval *op1, zval *op2) { zval *value; if (Z_TYPE_P(op2) != IS_ARRAY && !IS_PARTIAL_ARRAY(op2)) { @@ -872,7 +872,7 @@ static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **a /* The functions chosen here are simple to implement and either likely to affect a branch, * or just happened to be commonly used with constant operands in WP (need to test other * applications as well, of course). */ -static inline int ct_eval_func_call( +static inline zend_result ct_eval_func_call( zend_op_array *op_array, zval *result, zend_string *name, uint32_t num_args, zval **args) { uint32_t i; zend_function *func = zend_hash_find_ptr(CG(function_table), name); @@ -954,7 +954,7 @@ static inline int ct_eval_func_call( zval_ptr_dtor_nogc(EX_VAR_NUM(i)); } - int retval = SUCCESS; + zend_result retval = SUCCESS; if (EG(exception)) { zval_ptr_dtor(result); zend_clear_exception(); @@ -2001,7 +2001,7 @@ static void join_hash_tables(HashTable *ret, HashTable *ht1, HashTable *ht2) } ZEND_HASH_FOREACH_END(); } -static int join_partial_arrays(zval *a, zval *b) +static zend_result join_partial_arrays(zval *a, zval *b) { zval ret; @@ -2018,7 +2018,7 @@ static int join_partial_arrays(zval *a, zval *b) return SUCCESS; } -static int join_partial_objects(zval *a, zval *b) +static zend_result join_partial_objects(zval *a, zval *b) { zval ret; diff --git a/Zend/Optimizer/scdf.c b/Zend/Optimizer/scdf.c index a07f1857244d5..7e4bfe72cba11 100644 --- a/Zend/Optimizer/scdf.c +++ b/Zend/Optimizer/scdf.c @@ -249,10 +249,10 @@ static uint32_t cleanup_loop_var_free_block(scdf_ctx *scdf, zend_basic_block *bl /* Removes unreachable blocks. This will remove both the instructions (and phis) in the * blocks, as well as remove them from the successor / predecessor lists and mark them * unreachable. Blocks already marked unreachable are not removed. */ -int scdf_remove_unreachable_blocks(scdf_ctx *scdf) { +uint32_t scdf_remove_unreachable_blocks(scdf_ctx *scdf) { zend_ssa *ssa = scdf->ssa; int i; - int removed_ops = 0; + uint32_t removed_ops = 0; for (i = 0; i < ssa->cfg.blocks_count; i++) { zend_basic_block *block = &ssa->cfg.blocks[i]; if (!zend_bitset_in(scdf->executable_blocks, i) && (block->flags & ZEND_BB_REACHABLE)) { diff --git a/Zend/Optimizer/scdf.h b/Zend/Optimizer/scdf.h index 9cf8319d5f015..840a99065bcb0 100644 --- a/Zend/Optimizer/scdf.h +++ b/Zend/Optimizer/scdf.h @@ -49,7 +49,7 @@ typedef struct _scdf_ctx { void scdf_init(zend_optimizer_ctx *ctx, scdf_ctx *scdf, zend_op_array *op_array, zend_ssa *ssa); void scdf_solve(scdf_ctx *scdf, const char *name); -int scdf_remove_unreachable_blocks(scdf_ctx *scdf); +uint32_t scdf_remove_unreachable_blocks(scdf_ctx *scdf); /* Add uses to worklist */ static inline void scdf_add_to_worklist(scdf_ctx *scdf, int var_num) { diff --git a/Zend/Optimizer/ssa_integrity.c b/Zend/Optimizer/ssa_integrity.c index 436633cdb1b80..33b6567a9942f 100644 --- a/Zend/Optimizer/ssa_integrity.c +++ b/Zend/Optimizer/ssa_integrity.c @@ -111,7 +111,8 @@ static inline bool is_var_type(zend_uchar type) { void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *extra) { zend_cfg *cfg = &ssa->cfg; zend_ssa_phi *phi; - int i, status = SUCCESS; + int i; + zend_result status = SUCCESS; /* Vars */ for (i = 0; i < ssa->vars_count; i++) { diff --git a/Zend/Optimizer/zend_call_graph.c b/Zend/Optimizer/zend_call_graph.c index c6b95542e2a0b..685b235a69605 100644 --- a/Zend/Optimizer/zend_call_graph.c +++ b/Zend/Optimizer/zend_call_graph.c @@ -153,11 +153,11 @@ ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_ return SUCCESS; } -static int zend_is_indirectly_recursive(zend_op_array *root, zend_op_array *op_array, zend_bitset visited) +static bool zend_is_indirectly_recursive(zend_op_array *root, zend_op_array *op_array, zend_bitset visited) { zend_func_info *func_info; zend_call_info *call_info; - int ret = 0; + bool ret = 0; if (op_array == root) { return 1; diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index d3cdbbcd1e3c0..c0db2ac7637b1 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -776,7 +776,7 @@ ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zen } /* }}} */ -static int dominates(zend_basic_block *blocks, int a, int b) /* {{{ */ +static bool dominates(zend_basic_block *blocks, int a, int b) /* {{{ */ { while (blocks[b].level > blocks[a].level) { b = blocks[b].idom; diff --git a/Zend/Optimizer/zend_dump.c b/Zend/Optimizer/zend_dump.c index 3c27d2786e8a0..41146bdad97ec 100644 --- a/Zend/Optimizer/zend_dump.c +++ b/Zend/Optimizer/zend_dump.c @@ -29,7 +29,7 @@ void zend_dump_ht(HashTable *ht) zend_ulong index; zend_string *key; zval *val; - int first = 1; + bool first = 1; ZEND_HASH_FOREACH_KEY_VAL(ht, index, key, val) { if (first) { @@ -169,7 +169,7 @@ static void zend_dump_range(const zend_ssa_range *r) static void zend_dump_type_info(uint32_t info, zend_class_entry *ce, int is_instanceof, uint32_t dump_flags) { - int first = 1; + bool first = 1; fprintf(stderr, " ["); if (info & MAY_BE_GUARD) { @@ -256,7 +256,7 @@ static void zend_dump_type_info(uint32_t info, zend_class_entry *ce, int is_inst if ((info & MAY_BE_ARRAY_KEY_ANY) != 0 && ((info & MAY_BE_ARRAY_KEY_LONG) == 0 || (info & MAY_BE_ARRAY_KEY_STRING) == 0)) { - int afirst = 1; + bool afirst = 1; fprintf(stderr, " ["); if (info & MAY_BE_ARRAY_KEY_LONG) { if (afirst) afirst = 0; else fprintf(stderr, ", "); @@ -269,7 +269,7 @@ static void zend_dump_type_info(uint32_t info, zend_class_entry *ce, int is_inst fprintf(stderr, "]"); } if (info & (MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF)) { - int afirst = 1; + bool afirst = 1; fprintf(stderr, " of ["); if ((info & MAY_BE_ARRAY_OF_ANY) == MAY_BE_ARRAY_OF_ANY) { if (afirst) afirst = 0; else fprintf(stderr, ", "); @@ -738,7 +738,7 @@ ZEND_API void zend_dump_op_line(const zend_op_array *op_array, const zend_basic_ int len = 0; const zend_ssa *ssa = NULL; zend_ssa_op *ssa_op = NULL; - + if (dump_flags & ZEND_DUMP_LINE_NUMBERS) { fprintf(stderr, "L%04u ", opline->lineno); } @@ -1194,7 +1194,7 @@ void zend_dump_ssa_variables(const zend_op_array *op_array, const zend_ssa *ssa, static void zend_dump_var_set(const zend_op_array *op_array, const char *name, zend_bitset set) { - int first = 1; + bool first = 1; uint32_t i; fprintf(stderr, " ; %s = {", name); diff --git a/Zend/Optimizer/zend_func_info.c b/Zend/Optimizer/zend_func_info.c index de59118b4649a..8ea94dcfc4653 100644 --- a/Zend/Optimizer/zend_func_info.c +++ b/Zend/Optimizer/zend_func_info.c @@ -33,7 +33,7 @@ typedef uint32_t (*info_func_t)(const zend_call_info *call_info, const zend_ssa typedef struct _func_info_t { const char *name; - int name_len; + unsigned name_len; uint32_t info; info_func_t info_func; } func_info_t; @@ -197,7 +197,7 @@ static void zend_func_info_add(const func_info_t *func_infos, size_t n) } } -int zend_func_info_startup(void) +zend_result zend_func_info_startup(void) { if (zend_func_info_rid == -1) { zend_func_info_rid = zend_get_resource_handle("Zend Optimizer"); @@ -214,7 +214,7 @@ int zend_func_info_startup(void) return SUCCESS; } -int zend_func_info_shutdown(void) +zend_result zend_func_info_shutdown(void) { if (zend_func_info_rid != -1) { zend_hash_destroy(&func_info); diff --git a/Zend/Optimizer/zend_func_info.h b/Zend/Optimizer/zend_func_info.h index 0a48edeefc4ce..b53683bdf5e70 100644 --- a/Zend/Optimizer/zend_func_info.h +++ b/Zend/Optimizer/zend_func_info.h @@ -62,8 +62,8 @@ ZEND_API uint32_t zend_get_func_info( const zend_call_info *call_info, const zend_ssa *ssa, zend_class_entry **ce, bool *ce_is_instanceof); -int zend_func_info_startup(void); -int zend_func_info_shutdown(void); +zend_result zend_func_info_startup(void); +zend_result zend_func_info_shutdown(void); END_EXTERN_C() diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 7aa4d577bc1e6..b321555859ca1 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -564,7 +564,7 @@ static void float_div(zend_long a, zend_long b, zend_long *r1, zend_long *r2) { } } -static int zend_inference_calc_binary_op_range( +static bool zend_inference_calc_binary_op_range( const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op, zend_uchar opcode, zend_ssa_range *tmp) { zend_long op1_min, op2_min, op1_max, op2_max, t1, t2, t3, t4; @@ -858,7 +858,7 @@ static int zend_inference_calc_binary_op_range( return 0; } -static int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int var, int widening, int narrowing, zend_ssa_range *tmp) +static bool zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ssa, int var, int widening, int narrowing, zend_ssa_range *tmp) { uint32_t line; zend_op *opline; @@ -1048,7 +1048,7 @@ static int zend_inference_calc_range(const zend_op_array *op_array, zend_ssa *ss return zend_inference_propagate_range(op_array, ssa, opline, ssa_op, var, tmp); } -ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp) +ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp) { zend_long op1_min, op2_min, op1_max, op2_max; @@ -1565,7 +1565,7 @@ static void zend_inference_init_range(const zend_op_array *op_array, zend_ssa *s LOG_SSA_RANGE(" change range (init SCC %2d) %2d [%s%ld..%ld%s]\n", ssa->vars[var].scc, var, (underflow?"-- ":""), min, max, (overflow?" ++":"")); } -static int zend_inference_widening_meet(zend_ssa_var_info *var_info, zend_ssa_range *r) +static bool zend_inference_widening_meet(zend_ssa_var_info *var_info, zend_ssa_range *r) { if (!var_info->has_range) { var_info->has_range = 1; @@ -1593,7 +1593,7 @@ static int zend_inference_widening_meet(zend_ssa_var_info *var_info, zend_ssa_ra return 1; } -static int zend_ssa_range_widening(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) +static bool zend_ssa_range_widening(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) { zend_ssa_range tmp; @@ -1606,7 +1606,7 @@ static int zend_ssa_range_widening(const zend_op_array *op_array, zend_ssa *ssa, return 0; } -static int zend_inference_narrowing_meet(zend_ssa_var_info *var_info, zend_ssa_range *r) +static bool zend_inference_narrowing_meet(zend_ssa_var_info *var_info, zend_ssa_range *r) { if (!var_info->has_range) { var_info->has_range = 1; @@ -1638,7 +1638,7 @@ static int zend_inference_narrowing_meet(zend_ssa_var_info *var_info, zend_ssa_r return 1; } -static int zend_ssa_range_narrowing(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) +static bool zend_ssa_range_narrowing(const zend_op_array *op_array, zend_ssa *ssa, int var, int scc) { zend_ssa_range tmp; @@ -1662,7 +1662,7 @@ static int zend_ssa_range_narrowing(const zend_op_array *op_array, zend_ssa *ssa } \ } while (0) -static int zend_check_inner_cycles(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, zend_bitset visited, int var) +static bool zend_check_inner_cycles(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, zend_bitset visited, int var) { if (zend_bitset_in(worklist, var)) { return 1; @@ -2413,7 +2413,7 @@ static uint32_t zend_fetch_prop_type(const zend_script *script, zend_property_in return zend_convert_type(script, prop_info->type, pce); } -static zend_always_inline int _zend_update_type_info( +static zend_always_inline zend_result _zend_update_type_info( const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, @@ -2454,7 +2454,7 @@ static zend_always_inline int _zend_update_type_info( if (ssa_op->op2_def >= 0 && !(ssa_var_info[ssa_op->op2_def].type & MAY_BE_REF)) { UPDATE_SSA_TYPE(tmp, ssa_op->op2_def); } - return 1; + return SUCCESS; } switch (opline->opcode) { @@ -3709,7 +3709,7 @@ static zend_always_inline int _zend_update_type_info( return SUCCESS; } -ZEND_API int zend_update_type_info( +ZEND_API zend_result zend_update_type_info( const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, @@ -3767,7 +3767,7 @@ static zend_class_entry *join_class_entries( return ce1; } -static int zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_bitset worklist, zend_long optimization_level) +static zend_result zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_bitset worklist, zend_long optimization_level) { zend_basic_block *blocks = ssa->cfg.blocks; zend_ssa_var *ssa_vars = ssa->vars; @@ -4017,7 +4017,7 @@ static bool can_convert_to_double( return 1; } -static int zend_type_narrowing(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) +static zend_result zend_type_narrowing(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) { uint32_t bitset_len = zend_bitset_len(ssa->vars_count); zend_bitset visited, worklist; @@ -4070,7 +4070,7 @@ static int zend_type_narrowing(const zend_op_array *op_array, const zend_script return SUCCESS; } -static int is_recursive_tail_call(const zend_op_array *op_array, +static bool is_recursive_tail_call(const zend_op_array *op_array, zend_op *opline) { zend_func_info *info = ZEND_FUNC_INFO(op_array); @@ -4332,7 +4332,7 @@ static void zend_func_return_info(const zend_op_array *op_array, ret->has_range = tmp_has_range; } -static int zend_infer_types(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) +static zend_result zend_infer_types(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) { int ssa_vars_count = ssa->vars_count; int j; @@ -4501,7 +4501,7 @@ static int zend_mark_cv_references(const zend_op_array *op_array, const zend_scr return SUCCESS; } -ZEND_API int zend_ssa_inference(zend_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) /* {{{ */ +ZEND_API zend_result zend_ssa_inference(zend_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) /* {{{ */ { zend_ssa_var_info *ssa_var_info; int i; @@ -4546,7 +4546,7 @@ ZEND_API int zend_ssa_inference(zend_arena **arena, const zend_op_array *op_arra } /* }}} */ -ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2) +ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2) { if (opline->op1_type == IS_CV) { if (t1 & MAY_BE_UNDEF) { @@ -4946,7 +4946,7 @@ ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, } } -ZEND_API int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa) +ZEND_API bool zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa) { return zend_may_throw_ex(opline, ssa_op, op_array, ssa, OP1_INFO(), OP2_INFO()); } diff --git a/Zend/Optimizer/zend_inference.h b/Zend/Optimizer/zend_inference.h index 104d43858f270..767295ab72d1e 100644 --- a/Zend/Optimizer/zend_inference.h +++ b/Zend/Optimizer/zend_inference.h @@ -234,7 +234,7 @@ ZEND_API int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_arra ZEND_API uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert); -ZEND_API int zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp); +ZEND_API bool zend_inference_propagate_range(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, zend_ssa_op* ssa_op, int var, zend_ssa_range *tmp); ZEND_API uint32_t zend_fetch_arg_info_type( const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce); @@ -244,10 +244,10 @@ uint32_t zend_get_return_info_from_signature_only( const zend_function *func, const zend_script *script, zend_class_entry **ce, bool *ce_is_instanceof, bool use_tentative_return_info); -ZEND_API int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2); -ZEND_API int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa); +ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2); +ZEND_API bool zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa); -ZEND_API int zend_update_type_info( +ZEND_API zend_result zend_update_type_info( const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, zend_op *opline, zend_ssa_op *ssa_op, const zend_op **ssa_opcodes, zend_long optimization_level); diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 1ac1e09b2c67f..e0bda22994799 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -57,7 +57,7 @@ void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* zend_hash_add(ctx->constants, Z_STR_P(name), &val); } -int zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval *op1, zval *op2) /* {{{ */ +zend_result zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval *op1, zval *op2) /* {{{ */ { if (zend_binary_op_produces_error(opcode, op1, op2)) { return FAILURE; @@ -68,7 +68,7 @@ int zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval *op1, zv } /* }}} */ -int zend_optimizer_eval_unary_op(zval *result, zend_uchar opcode, zval *op1) /* {{{ */ +zend_result zend_optimizer_eval_unary_op(zval *result, zend_uchar opcode, zval *op1) /* {{{ */ { unary_op_type unary_op = get_unary_op(opcode); @@ -84,7 +84,7 @@ int zend_optimizer_eval_unary_op(zval *result, zend_uchar opcode, zval *op1) /* } /* }}} */ -int zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1) /* {{{ */ +zend_result zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1) /* {{{ */ { switch (type) { case IS_NULL: @@ -116,7 +116,7 @@ int zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1) /* {{{ */ } /* }}} */ -int zend_optimizer_eval_strlen(zval *result, zval *op1) /* {{{ */ +zend_result zend_optimizer_eval_strlen(zval *result, zval *op1) /* {{{ */ { if (Z_TYPE_P(op1) != IS_STRING) { return FAILURE; @@ -126,7 +126,7 @@ int zend_optimizer_eval_strlen(zval *result, zval *op1) /* {{{ */ } /* }}} */ -int zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value) +bool zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value) { zval *val; @@ -181,7 +181,7 @@ static inline uint32_t alloc_cache_slots(zend_op_array *op_array, uint32_t num) convert_to_string(val); \ } while (0) -int zend_optimizer_update_op1_const(zend_op_array *op_array, +bool zend_optimizer_update_op1_const(zend_op_array *op_array, zend_op *opline, zval *val) { @@ -336,7 +336,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, return 1; } -int zend_optimizer_update_op2_const(zend_op_array *op_array, +bool zend_optimizer_update_op2_const(zend_op_array *op_array, zend_op *opline, zval *val) { @@ -518,7 +518,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, return 1; } -int zend_optimizer_replace_by_const(zend_op_array *op_array, +bool zend_optimizer_replace_by_const(zend_op_array *op_array, zend_op *opline, zend_uchar type, uint32_t var, @@ -1599,12 +1599,12 @@ ZEND_API void zend_optimizer_unregister_pass(int idx) zend_optimizer_registered_passes.pass[idx-1] = NULL; } -int zend_optimizer_startup(void) +zend_result zend_optimizer_startup(void) { return zend_func_info_startup(); } -int zend_optimizer_shutdown(void) +zend_result zend_optimizer_shutdown(void) { return zend_func_info_shutdown(); } diff --git a/Zend/Optimizer/zend_optimizer.h b/Zend/Optimizer/zend_optimizer.h index 08b7d12a7ff93..07136cfc860ec 100644 --- a/Zend/Optimizer/zend_optimizer.h +++ b/Zend/Optimizer/zend_optimizer.h @@ -95,8 +95,8 @@ BEGIN_EXTERN_C() ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level); ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass); ZEND_API void zend_optimizer_unregister_pass(int idx); -int zend_optimizer_startup(void); -int zend_optimizer_shutdown(void); +zend_result zend_optimizer_startup(void); +zend_result zend_optimizer_shutdown(void); END_EXTERN_C() #endif diff --git a/Zend/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h index 2c12390baf4d7..bd4367eaf276b 100644 --- a/Zend/Optimizer/zend_optimizer_internal.h +++ b/Zend/Optimizer/zend_optimizer_internal.h @@ -77,20 +77,20 @@ static inline bool zend_optimizer_is_loop_var_free(const zend_op *opline) { } int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv); -int zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy); +bool zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy); void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value); -int zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value); -int zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval *op1, zval *op2); -int zend_optimizer_eval_unary_op(zval *result, zend_uchar opcode, zval *op1); -int zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1); -int zend_optimizer_eval_strlen(zval *result, zval *op1); -int zend_optimizer_update_op1_const(zend_op_array *op_array, +bool zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value); +zend_result zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval *op1, zval *op2); +zend_result zend_optimizer_eval_unary_op(zval *result, zend_uchar opcode, zval *op1); +zend_result zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1); +zend_result zend_optimizer_eval_strlen(zval *result, zval *op1); +bool zend_optimizer_update_op1_const(zend_op_array *op_array, zend_op *opline, zval *val); -int zend_optimizer_update_op2_const(zend_op_array *op_array, +bool zend_optimizer_update_op2_const(zend_op_array *op_array, zend_op *opline, zval *val); -int zend_optimizer_replace_by_const(zend_op_array *op_array, +bool zend_optimizer_replace_by_const(zend_op_array *op_array, zend_op *opline, zend_uchar type, uint32_t var, @@ -103,7 +103,7 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx); void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx); void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx); void zend_optimize_dfa(zend_op_array *op_array, zend_optimizer_ctx *ctx); -int zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa); +zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa); void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx, zend_ssa *ssa, zend_call_info **call_map); void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_ctx *ctx); void zend_optimizer_nop_removal(zend_op_array *op_array, zend_optimizer_ctx *ctx); @@ -116,7 +116,7 @@ void zend_optimizer_migrate_jump(zend_op_array *op_array, zend_op *new_opline, z void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_t *shiftlist); int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_array, zend_ssa *ssa, zend_call_info **call_map); int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, bool reorder_dtor_effects); -int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa); +zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa); typedef void (*zend_op_array_func_t)(zend_op_array *, void *context); void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context); diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 864f22fab3572..25f8b2752734d 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -778,7 +778,7 @@ ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *op } /* }}} */ -static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa, int *var, int n) /* {{{ */ +static zend_result zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa, int *var, int n) /* {{{ */ { zend_basic_block *blocks = ssa->cfg.blocks; zend_ssa_block *ssa_blocks = ssa->blocks; @@ -895,7 +895,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, } /* }}} */ -ZEND_API int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa) /* {{{ */ +ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa) /* {{{ */ { zend_basic_block *blocks = ssa->cfg.blocks; zend_ssa_block *ssa_blocks; diff --git a/Zend/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h index 1fef8ddee9625..88c4a9c671e76 100644 --- a/Zend/Optimizer/zend_ssa.h +++ b/Zend/Optimizer/zend_ssa.h @@ -145,7 +145,7 @@ typedef struct _zend_ssa { BEGIN_EXTERN_C() -ZEND_API int zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa); +ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa); ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa); ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var); int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var); diff --git a/Zend/Optimizer/zend_worklist.h b/Zend/Optimizer/zend_worklist.h index 7dfb65eb224fa..29a21269c6e96 100644 --- a/Zend/Optimizer/zend_worklist.h +++ b/Zend/Optimizer/zend_worklist.h @@ -94,7 +94,7 @@ static inline int zend_worklist_len(zend_worklist *worklist) return worklist->stack.len; } -static inline int zend_worklist_push(zend_worklist *worklist, int i) +static inline bool zend_worklist_push(zend_worklist *worklist, int i) { ZEND_ASSERT(i >= 0 && i < worklist->stack.capacity); From fea9b5cf1d2d61ad2a8043e192fa9f4d6ddea8fd Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 16:04:33 +0100 Subject: [PATCH 0074/1346] Use zend_string_equals_literal() macro --- Zend/Optimizer/pass1.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 110babf3e95d4..8f3c263833dd6 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -174,8 +174,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) case ZEND_FETCH_CONSTANT: if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING && - Z_STRLEN(ZEND_OP2_LITERAL(opline)) == sizeof("__COMPILER_HALT_OFFSET__") - 1 && - memcmp(Z_STRVAL(ZEND_OP2_LITERAL(opline)), "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) { + zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(opline)), "__COMPILER_HALT_OFFSET__")) { /* substitute __COMPILER_HALT_OFFSET__ constant */ zend_execute_data *orig_execute_data = EG(current_execute_data); zend_execute_data fake_execute_data; @@ -376,12 +375,8 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) */ if (!send2_opline && Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING) { - if ((Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("function_exists")-1 && - !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), - "function_exists", sizeof("function_exists")-1)) || - (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("is_callable")-1 && - !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), - "is_callable", sizeof("is_callable")))) { + if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "function_exists") || + zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "is_callable")) { zend_internal_function *func; zend_string *lc_name = zend_string_tolower( Z_STR(ZEND_OP1_LITERAL(send1_opline))); @@ -410,9 +405,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) } zend_string_release_ex(lc_name, 0); break; - } else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("extension_loaded")-1 && - !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), - "extension_loaded", sizeof("extension_loaded")-1)) { + } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "extension_loaded")) { zval t; zend_string *lc_name = zend_string_tolower( Z_STR(ZEND_OP1_LITERAL(send1_opline))); @@ -451,9 +444,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) zend_optimizer_update_op1_const(op_array, opline, &t); } break; - } else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("constant")-1 && - !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), - "constant", sizeof("constant")-1)) { + } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "constant")) { zval t; if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &t, 1)) { @@ -472,9 +463,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) } break; /* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */ - } else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("dirname")-1 && - !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), - "dirname", sizeof("dirname") - 1) && + } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "dirname") && IS_ABSOLUTE_PATH(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)))) { zend_string *dirname = zend_string_init(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)), 0); ZSTR_LEN(dirname) = zend_dirname(ZSTR_VAL(dirname), ZSTR_LEN(dirname)); From 278efe3b646f43e2ea83f43b87d35b2a9ee73578 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 16:31:19 +0100 Subject: [PATCH 0075/1346] Voidify zend_build_call_graph() It always returned SUCCESS --- Zend/Optimizer/zend_call_graph.c | 4 +--- Zend/Optimizer/zend_call_graph.h | 2 +- Zend/Optimizer/zend_optimizer.c | 9 +++++---- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Zend/Optimizer/zend_call_graph.c b/Zend/Optimizer/zend_call_graph.c index 685b235a69605..7f9a19695325a 100644 --- a/Zend/Optimizer/zend_call_graph.c +++ b/Zend/Optimizer/zend_call_graph.c @@ -222,7 +222,7 @@ static void zend_sort_op_arrays(zend_call_graph *call_graph) // TODO: perform topological sort of cyclic call graph } -ZEND_API int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */ +ZEND_API void zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */ { call_graph->op_arrays_count = 0; zend_foreach_op_array(script, zend_op_array_calc, call_graph); @@ -231,8 +231,6 @@ ZEND_API int zend_build_call_graph(zend_arena **arena, zend_script *script, zend call_graph->func_infos = (zend_func_info*)zend_arena_calloc(arena, call_graph->op_arrays_count, sizeof(zend_func_info)); call_graph->op_arrays_count = 0; zend_foreach_op_array(script, zend_op_array_collect, call_graph); - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_call_graph.h b/Zend/Optimizer/zend_call_graph.h index 0df674e685f54..7023faa6d4d27 100644 --- a/Zend/Optimizer/zend_call_graph.h +++ b/Zend/Optimizer/zend_call_graph.h @@ -60,7 +60,7 @@ typedef struct _zend_call_graph { BEGIN_EXTERN_C() -ZEND_API int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph); +ZEND_API void zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph); ZEND_API void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph); ZEND_API zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array); ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info); diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index e0bda22994799..db8bc56c9d973 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -1431,7 +1431,6 @@ ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_le zend_op_array *op_array; zend_string *name; zend_optimizer_ctx ctx; - zend_call_graph call_graph; ctx.arena = zend_arena_create(64 * 1024); ctx.script = script; @@ -1440,9 +1439,11 @@ ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_le ctx.debug_level = debug_level; if ((ZEND_OPTIMIZER_PASS_6 & optimization_level) && - (ZEND_OPTIMIZER_PASS_7 & optimization_level) && - zend_build_call_graph(&ctx.arena, script, &call_graph) == SUCCESS) { + (ZEND_OPTIMIZER_PASS_7 & optimization_level)) { /* Optimize using call-graph */ + zend_call_graph call_graph; + zend_build_call_graph(&ctx.arena, script, &call_graph); + int i; zend_func_info *func_info; @@ -1585,7 +1586,7 @@ ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass) } if (zend_optimizer_registered_passes.last == ZEND_OPTIMIZER_MAX_REGISTERED_PASSES) { - return -1; + return -1; } zend_optimizer_registered_passes.pass[ diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 3229a17bd30e5..0c96df377d7df 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -4492,9 +4492,7 @@ ZEND_EXT_API int zend_jit_script(zend_script *script) checkpoint = zend_arena_checkpoint(CG(arena)); call_graph.op_arrays_count = 0; - if (zend_build_call_graph(&CG(arena), script, &call_graph) != SUCCESS) { - goto jit_failure; - } + zend_build_call_graph(&CG(arena), script, &call_graph); zend_analyze_call_graph(&CG(arena), script, &call_graph); From 643b7b394a6c98c0b02685091bf11a9bcc2239f6 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 16:34:57 +0100 Subject: [PATCH 0076/1346] Voidify zend_analyze_calls() It always returned SUCCESS --- Zend/Optimizer/zend_call_graph.c | 3 +-- Zend/Optimizer/zend_call_graph.h | 2 +- ext/opcache/jit/zend_jit.c | 8 +++----- ext/opcache/jit/zend_jit_trace.c | 4 +--- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Zend/Optimizer/zend_call_graph.c b/Zend/Optimizer/zend_call_graph.c index 7f9a19695325a..c2b7b00cbee13 100644 --- a/Zend/Optimizer/zend_call_graph.c +++ b/Zend/Optimizer/zend_call_graph.c @@ -43,7 +43,7 @@ static void zend_op_array_collect(zend_op_array *op_array, void *context) call_graph->op_arrays_count++; } -ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info) +ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info) { zend_op *opline = op_array->opcodes; zend_op *end = opline + op_array->last; @@ -150,7 +150,6 @@ ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_ opline++; } free_alloca(call_stack, use_heap); - return SUCCESS; } static bool zend_is_indirectly_recursive(zend_op_array *root, zend_op_array *op_array, zend_bitset visited) diff --git a/Zend/Optimizer/zend_call_graph.h b/Zend/Optimizer/zend_call_graph.h index 7023faa6d4d27..5b1634d561dc3 100644 --- a/Zend/Optimizer/zend_call_graph.h +++ b/Zend/Optimizer/zend_call_graph.h @@ -63,7 +63,7 @@ BEGIN_EXTERN_C() ZEND_API void zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph); ZEND_API void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph); ZEND_API zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array); -ZEND_API int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info); +ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info); END_EXTERN_C() diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 0c96df377d7df..a083e4d356d69 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -4128,7 +4128,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op return FAILURE; } -static int zend_jit_collect_calls(zend_op_array *op_array, zend_script *script) +static void zend_jit_collect_calls(zend_op_array *op_array, zend_script *script) { zend_func_info *func_info; @@ -4140,7 +4140,7 @@ static int zend_jit_collect_calls(zend_op_array *op_array, zend_script *script) func_info = zend_arena_calloc(&CG(arena), 1, sizeof(zend_func_info)); ZEND_SET_FUNC_INFO(op_array, func_info); } - return zend_analyze_calls(&CG(arena), script, ZEND_CALL_TREE, op_array, func_info); + zend_analyze_calls(&CG(arena), script, ZEND_CALL_TREE, op_array, func_info); } static void zend_jit_cleanup_func_info(zend_op_array *op_array) @@ -4200,9 +4200,7 @@ static int zend_real_jit_func(zend_op_array *op_array, zend_script *script, cons } if (JIT_G(opt_level) >= ZEND_JIT_LEVEL_OPT_FUNCS) { - if (zend_jit_collect_calls(op_array, script) != SUCCESS) { - goto jit_failure; - } + zend_jit_collect_calls(op_array, script); func_info = ZEND_FUNC_INFO(op_array); func_info->call_map = zend_build_call_map(&CG(arena), func_info, op_array); if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index a8fa723264d4f..d51d3385c9e57 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -553,9 +553,7 @@ static zend_ssa *zend_jit_trace_build_ssa(const zend_op_array *op_array, zend_sc } if (JIT_G(opt_level) >= ZEND_JIT_LEVEL_OPT_FUNCS) { - if (zend_analyze_calls(&CG(arena), script, ZEND_CALL_TREE, (zend_op_array*)op_array, &jit_extension->func_info) != SUCCESS) { - break; - } + zend_analyze_calls(&CG(arena), script, ZEND_CALL_TREE, (zend_op_array*)op_array, &jit_extension->func_info); jit_extension->func_info.call_map = zend_build_call_map(&CG(arena), &jit_extension->func_info, op_array); if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { zend_init_func_return_info(op_array, script, &jit_extension->func_info.return_info); From 50378666fe0058ae8ea9bac68dfbb7bf7f42690a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 17:38:47 +0100 Subject: [PATCH 0077/1346] Voidify zend_build_cfg() It always returned SUCCESS --- Zend/Optimizer/block_pass.c | 5 +---- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_cfg.c | 4 +--- Zend/Optimizer/zend_cfg.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index c2b159bf7dd55..95cd6b1bcee52 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -1847,10 +1847,7 @@ void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx) /* Build CFG */ checkpoint = zend_arena_checkpoint(ctx->arena); - if (zend_build_cfg(&ctx->arena, op_array, 0, &cfg) != SUCCESS) { - zend_arena_release(&ctx->arena, checkpoint); - return; - } + zend_build_cfg(&ctx->arena, op_array, 0, &cfg); if (cfg.blocks_count * (op_array->last_var + op_array->T) > 64 * 1024 * 1024) { zend_arena_release(&ctx->arena, checkpoint); diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 39d82a639c22e..98dc1556d60d8 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -50,9 +50,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct /* Build SSA */ memset(ssa, 0, sizeof(zend_ssa)); - if (zend_build_cfg(&ctx->arena, op_array, ZEND_CFG_NO_ENTRY_PREDECESSORS, &ssa->cfg) != SUCCESS) { - return FAILURE; - } + zend_build_cfg(&ctx->arena, op_array, ZEND_CFG_NO_ENTRY_PREDECESSORS, &ssa->cfg); if ((ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS)) { /* TODO: we can't analyze functions with indirect variable access ??? */ diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index c0db2ac7637b1..a08ac75a15e68 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -269,7 +269,7 @@ static void initialize_block(zend_basic_block *block) { block_map[i]++; \ } while (0) -ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg) /* {{{ */ +ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg) /* {{{ */ { uint32_t flags = 0; uint32_t i; @@ -597,8 +597,6 @@ ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, u /* Build CFG, Step 4, Mark Reachable Basic Blocks */ cfg->flags |= flags; zend_mark_reachable_blocks(op_array, cfg, 0); - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h index 76c9830d3c877..0ade23017c461 100644 --- a/Zend/Optimizer/zend_cfg.h +++ b/Zend/Optimizer/zend_cfg.h @@ -116,7 +116,7 @@ typedef struct _zend_cfg { BEGIN_EXTERN_C() -ZEND_API int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg); +ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg); void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg); ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg); ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg); diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index a083e4d356d69..d7eb8e889989d 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1268,9 +1268,7 @@ static int zend_jit_build_cfg(const zend_op_array *op_array, zend_cfg *cfg) flags = ZEND_CFG_STACKLESS | ZEND_CFG_NO_ENTRY_PREDECESSORS | ZEND_SSA_RC_INFERENCE_FLAG | ZEND_SSA_USE_CV_RESULTS | ZEND_CFG_RECV_ENTRY; - if (zend_build_cfg(&CG(arena), op_array, flags, cfg) != SUCCESS) { - return FAILURE; - } + zend_build_cfg(&CG(arena), op_array, flags, cfg); /* Don't JIT huge functions. Apart from likely being detrimental due to the amount of * generated code, some of our analysis is recursive and will stack overflow with many From 6a456644844079930f9258c35cf19cb47b383636 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 17:40:21 +0100 Subject: [PATCH 0078/1346] Voidify zend_cfg_build_predecessors() It always returned SUCCESS --- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_cfg.c | 4 +--- Zend/Optimizer/zend_cfg.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 98dc1556d60d8..98c57d94563c8 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -57,9 +57,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct return FAILURE; } - if (zend_cfg_build_predecessors(&ctx->arena, &ssa->cfg) != SUCCESS) { - return FAILURE; - } + zend_cfg_build_predecessors(&ctx->arena, &ssa->cfg); if (ctx->debug_level & ZEND_DUMP_DFA_CFG) { zend_dump_op_array(op_array, ZEND_DUMP_CFG, "dfa cfg", &ssa->cfg); diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index a08ac75a15e68..d53cd33e90e2e 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -600,7 +600,7 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, } /* }}} */ -ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */ +ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* {{{ */ { int j, s, edges; zend_basic_block *b; @@ -658,8 +658,6 @@ ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg) /* { } } } - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h index 0ade23017c461..f4be76b10d65f 100644 --- a/Zend/Optimizer/zend_cfg.h +++ b/Zend/Optimizer/zend_cfg.h @@ -118,7 +118,7 @@ BEGIN_EXTERN_C() ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg); void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg); -ZEND_API int zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg); +ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg); ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg); ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg); diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index d7eb8e889989d..c56b31cd14a67 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1277,9 +1277,7 @@ static int zend_jit_build_cfg(const zend_op_array *op_array, zend_cfg *cfg) return FAILURE; } - if (zend_cfg_build_predecessors(&CG(arena), cfg) != SUCCESS) { - return FAILURE; - } + zend_cfg_build_predecessors(&CG(arena), cfg); /* Compute Dominators Tree */ if (zend_cfg_compute_dominators_tree(op_array, cfg) != SUCCESS) { From 53c72bd6e0683305d1e8b8d673b9e428562bd35e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 17:41:47 +0100 Subject: [PATCH 0079/1346] Voidify zend_cfg_compute_dominators_tree() It always returned SUCCESS --- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_cfg.c | 3 +-- Zend/Optimizer/zend_cfg.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 98c57d94563c8..e57a7f722a897 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -64,9 +64,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct } /* Compute Dominators Tree */ - if (zend_cfg_compute_dominators_tree(op_array, &ssa->cfg) != SUCCESS) { - return FAILURE; - } + zend_cfg_compute_dominators_tree(op_array, &ssa->cfg); /* Identify reducible and irreducible loops */ if (zend_cfg_identify_loops(op_array, &ssa->cfg) != SUCCESS) { diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index d53cd33e90e2e..50244d88d8dc4 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -681,7 +681,7 @@ static void compute_postnum_recursive( /* Computes dominator tree using algorithm from "A Simple, Fast Dominance Algorithm" by * Cooper, Harvey and Kennedy. */ -ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ +ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ { zend_basic_block *blocks = cfg->blocks; int blocks_count = cfg->blocks_count; @@ -768,7 +768,6 @@ ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zen } free_alloca(postnum, use_heap); - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h index f4be76b10d65f..156fc19804dce 100644 --- a/Zend/Optimizer/zend_cfg.h +++ b/Zend/Optimizer/zend_cfg.h @@ -119,7 +119,7 @@ BEGIN_EXTERN_C() ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t build_flags, zend_cfg *cfg); void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg); ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg); -ZEND_API int zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg); +ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg); ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg); END_EXTERN_C() diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index c56b31cd14a67..a19948e1f8468 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1280,9 +1280,7 @@ static int zend_jit_build_cfg(const zend_op_array *op_array, zend_cfg *cfg) zend_cfg_build_predecessors(&CG(arena), cfg); /* Compute Dominators Tree */ - if (zend_cfg_compute_dominators_tree(op_array, cfg) != SUCCESS) { - return FAILURE; - } + zend_cfg_compute_dominators_tree(op_array, cfg); /* Identify reducible and irreducible loops */ if (zend_cfg_identify_loops(op_array, cfg) != SUCCESS) { From a06d6c36d4a6f1618ba3ac7a9db03204a19ea3ed Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 17:44:15 +0100 Subject: [PATCH 0080/1346] Voidify zend_cfg_identify_loops() It always returned SUCCESS --- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_cfg.c | 4 +--- Zend/Optimizer/zend_cfg.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index e57a7f722a897..299f15526fb2a 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -67,9 +67,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct zend_cfg_compute_dominators_tree(op_array, &ssa->cfg); /* Identify reducible and irreducible loops */ - if (zend_cfg_identify_loops(op_array, &ssa->cfg) != SUCCESS) { - return FAILURE; - } + zend_cfg_identify_loops(op_array, &ssa->cfg); if (ctx->debug_level & ZEND_DUMP_DFA_DOMINATORS) { zend_dump_dominators(op_array, &ssa->cfg); diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index 50244d88d8dc4..8ac7942b61a0f 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -793,7 +793,7 @@ static void swap_blocks(block_info *a, block_info *b) { *b = tmp; } -ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ +ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ { int i, j, k, n; int time; @@ -905,7 +905,5 @@ ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cf ZEND_WORKLIST_FREE_ALLOCA(&work, list_use_heap); cfg->flags |= flag; - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h index 156fc19804dce..152502978dad4 100644 --- a/Zend/Optimizer/zend_cfg.h +++ b/Zend/Optimizer/zend_cfg.h @@ -120,7 +120,7 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, void zend_cfg_remark_reachable_blocks(const zend_op_array *op_array, zend_cfg *cfg); ZEND_API void zend_cfg_build_predecessors(zend_arena **arena, zend_cfg *cfg); ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, zend_cfg *cfg); -ZEND_API int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg); +ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg); END_EXTERN_C() diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index a19948e1f8468..22d06d4e658e9 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1283,9 +1283,7 @@ static int zend_jit_build_cfg(const zend_op_array *op_array, zend_cfg *cfg) zend_cfg_compute_dominators_tree(op_array, cfg); /* Identify reducible and irreducible loops */ - if (zend_cfg_identify_loops(op_array, cfg) != SUCCESS) { - return FAILURE; - } + zend_cfg_identify_loops(op_array, cfg); return SUCCESS; } From 57e4bd2be37b79921d13508afee50a3f48b00144 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 17:49:10 +0100 Subject: [PATCH 0081/1346] Voidify zend_build_dfg() It always returned SUCCESS --- Zend/Optimizer/zend_dfg.c | 4 +--- Zend/Optimizer/zend_dfg.h | 2 +- Zend/Optimizer/zend_ssa.c | 5 +---- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/Zend/Optimizer/zend_dfg.c b/Zend/Optimizer/zend_dfg.c index 9547b31e70733..2207b594b85a5 100644 --- a/Zend/Optimizer/zend_dfg.c +++ b/Zend/Optimizer/zend_dfg.c @@ -247,7 +247,7 @@ ZEND_API void zend_dfg_add_use_def_op(const zend_op_array *op_array, const zend_ } /* }}} */ -int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg *dfg, uint32_t build_flags) /* {{{ */ +void zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg *dfg, uint32_t build_flags) /* {{{ */ { int set_size; zend_basic_block *blocks = cfg->blocks; @@ -326,7 +326,5 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg free_alloca(worklist, use_heap); } - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_dfg.h b/Zend/Optimizer/zend_dfg.h index 1d5817e8a4dff..b59dc62790901 100644 --- a/Zend/Optimizer/zend_dfg.h +++ b/Zend/Optimizer/zend_dfg.h @@ -43,7 +43,7 @@ typedef struct _zend_dfg { BEGIN_EXTERN_C() -int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg *dfg, uint32_t build_flags); +void zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg *dfg, uint32_t build_flags); ZEND_API void zend_dfg_add_use_def_op(const zend_op_array *op_array, const zend_op *opline, uint32_t build_flags, zend_bitset use, zend_bitset def); END_EXTERN_C() diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 25f8b2752734d..faa61c31ea9c6 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -926,10 +926,7 @@ ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *scrip dfg.in = dfg.use + set_size * blocks_count; dfg.out = dfg.in + set_size * blocks_count; - if (zend_build_dfg(op_array, &ssa->cfg, &dfg, build_flags) != SUCCESS) { - free_alloca(dfg.tmp, dfg_use_heap); - return FAILURE; - } + zend_build_dfg(op_array, &ssa->cfg, &dfg, build_flags); if (build_flags & ZEND_SSA_DEBUG_LIVENESS) { zend_dump_dfg(op_array, &ssa->cfg, &dfg); From ad3544b08cd09697bfc15743f892483cb83cae6c Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:12:31 +0100 Subject: [PATCH 0082/1346] Voidify zend_ssa_find_sccs() It always returned SUCCESS --- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_inference.c | 4 +--- Zend/Optimizer/zend_inference.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 299f15526fb2a..da9236f06c459 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -97,9 +97,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct return FAILURE; } - if (zend_ssa_find_sccs(op_array, ssa) != SUCCESS){ - return FAILURE; - } + zend_ssa_find_sccs(op_array, ssa); if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa, ctx->optimization_level) != SUCCESS) { return FAILURE; diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index b321555859ca1..b7011dc2e68eb 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -210,7 +210,7 @@ static void zend_ssa_check_scc_var(const zend_op_array *op_array, zend_ssa *ssa, } /* }}} */ -ZEND_API int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ +ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ { int index = 0, *dfs, *root; zend_worklist_stack stack; @@ -251,8 +251,6 @@ ZEND_API int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) /* ZEND_WORKLIST_STACK_FREE_ALLOCA(&stack, stack_use_heap); free_alloca(root, root_use_heap); free_alloca(dfs, dfs_use_heap); - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_inference.h b/Zend/Optimizer/zend_inference.h index 767295ab72d1e..b670662995778 100644 --- a/Zend/Optimizer/zend_inference.h +++ b/Zend/Optimizer/zend_inference.h @@ -229,7 +229,7 @@ static zend_always_inline bool zend_sub_will_overflow(zend_long a, zend_long b) BEGIN_EXTERN_C() ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa); -ZEND_API int zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa); +ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa); ZEND_API int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level); ZEND_API uint32_t zend_array_element_type(uint32_t t1, zend_uchar op_type, int write, int insert); diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 22d06d4e658e9..a0bd825b7a952 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1323,9 +1323,7 @@ static int zend_jit_op_array_analyze1(const zend_op_array *op_array, zend_script return FAILURE; } - if (zend_ssa_find_sccs(op_array, ssa) != SUCCESS){ - return FAILURE; - } + zend_ssa_find_sccs(op_array, ssa); } return SUCCESS; From 6c928f3529d2da25c3c2a3c22666a020a67fe8bd Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:14:42 +0100 Subject: [PATCH 0083/1346] Voidify zend_ssa_find_false_dependencies() It always returned SUCCESS --- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_inference.c | 6 ++---- Zend/Optimizer/zend_inference.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index da9236f06c459..90e89d9818f49 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -93,9 +93,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct return FAILURE; } - if (zend_ssa_find_false_dependencies(op_array, ssa) != SUCCESS) { - return FAILURE; - } + zend_ssa_find_false_dependencies(op_array, ssa); zend_ssa_find_sccs(op_array, ssa); diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index b7011dc2e68eb..c282b618a2355 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -254,7 +254,7 @@ ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa) / } /* }}} */ -ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ +ZEND_API void zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ { zend_ssa_var *ssa_vars = ssa->vars; zend_ssa_op *ssa_ops = ssa->ops; @@ -265,7 +265,7 @@ ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zen ALLOCA_FLAG(use_heap); if (!op_array->function_name || !ssa->vars || !ssa->ops) { - return SUCCESS; + return; } worklist = do_alloca(sizeof(zend_ulong) * zend_bitset_len(ssa_vars_count), use_heap); @@ -306,8 +306,6 @@ ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zen } WHILE_WORKLIST_END(); free_alloca(worklist, use_heap); - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_inference.h b/Zend/Optimizer/zend_inference.h index b670662995778..f3c20c3ea499a 100644 --- a/Zend/Optimizer/zend_inference.h +++ b/Zend/Optimizer/zend_inference.h @@ -228,7 +228,7 @@ static zend_always_inline bool zend_sub_will_overflow(zend_long a, zend_long b) BEGIN_EXTERN_C() -ZEND_API int zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa); +ZEND_API void zend_ssa_find_false_dependencies(const zend_op_array *op_array, zend_ssa *ssa); ZEND_API void zend_ssa_find_sccs(const zend_op_array *op_array, zend_ssa *ssa); ZEND_API int zend_ssa_inference(zend_arena **raena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level); diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index a0bd825b7a952..210cf2323a20b 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1319,9 +1319,7 @@ static int zend_jit_op_array_analyze1(const zend_op_array *op_array, zend_script return FAILURE; } - if (zend_ssa_find_false_dependencies(op_array, ssa) != SUCCESS) { - return FAILURE; - } + zend_ssa_find_false_dependencies(op_array, ssa); zend_ssa_find_sccs(op_array, ssa); } From 85634c9c1cf3ce9442801a5f67fb91df6482eade Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:16:16 +0100 Subject: [PATCH 0084/1346] Voidify zend_infer_ranges() It always returned SUCCESS --- Zend/Optimizer/zend_inference.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index c282b618a2355..55c44dbd8efff 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -1768,7 +1768,7 @@ static void zend_infer_ranges_warmup(const zend_op_array *op_array, zend_ssa *ss free_alloca(worklist, use_heap); } -static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ +static void zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ { int worklist_len = zend_bitset_len(ssa->vars_count); zend_bitset worklist; @@ -1882,8 +1882,6 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{ } free_alloca(worklist, use_heap); - - return SUCCESS; } /* }}} */ @@ -4530,9 +4528,7 @@ ZEND_API zend_result zend_ssa_inference(zend_arena **arena, const zend_op_array return FAILURE; } - if (zend_infer_ranges(op_array, ssa) != SUCCESS) { - return FAILURE; - } + zend_infer_ranges(op_array, ssa); if (zend_infer_types(op_array, script, ssa, optimization_level) != SUCCESS) { return FAILURE; From 25deb7d254461458bf3d0c13eb57536d1c995e3b Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:17:53 +0100 Subject: [PATCH 0085/1346] Voidify zend_mark_cv_references() It always returned SUCCESS --- Zend/Optimizer/zend_inference.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 55c44dbd8efff..a37c0d7152625 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -4357,7 +4357,7 @@ static zend_result zend_infer_types(const zend_op_array *op_array, const zend_sc return SUCCESS; } -static int zend_mark_cv_references(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa) +static void zend_mark_cv_references(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa) { int var, def; const zend_op *opline; @@ -4492,7 +4492,6 @@ static int zend_mark_cv_references(const zend_op_array *op_array, const zend_scr } WHILE_WORKLIST_END(); free_alloca(worklist, use_heap); - return SUCCESS; } ZEND_API zend_result zend_ssa_inference(zend_arena **arena, const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_long optimization_level) /* {{{ */ @@ -4524,9 +4523,7 @@ ZEND_API zend_result zend_ssa_inference(zend_arena **arena, const zend_op_array ssa_var_info[i].has_range = 0; } - if (zend_mark_cv_references(op_array, script, ssa) != SUCCESS) { - return FAILURE; - } + zend_mark_cv_references(op_array, script, ssa); zend_infer_ranges(op_array, ssa); From 35dfdd9b1b370739426c72964d77d83be46c9925 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:24:40 +0100 Subject: [PATCH 0086/1346] Voidify zend_ssa_compute_use_def_chains() It always returned SUCCESS --- Zend/Optimizer/dfa_pass.c | 4 +--- Zend/Optimizer/zend_ssa.c | 4 +--- Zend/Optimizer/zend_ssa.h | 2 +- ext/opcache/jit/zend_jit.c | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 90e89d9818f49..48bc8232cba41 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -89,9 +89,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct } - if (zend_ssa_compute_use_def_chains(&ctx->arena, op_array, ssa) != SUCCESS){ - return FAILURE; - } + zend_ssa_compute_use_def_chains(&ctx->arena, op_array, ssa); zend_ssa_find_false_dependencies(op_array, ssa); diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index faa61c31ea9c6..c5b7d29f116b2 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -1043,7 +1043,7 @@ ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *scrip } /* }}} */ -ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ +ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa) /* {{{ */ { zend_ssa_var *ssa_vars; int i; @@ -1158,8 +1158,6 @@ ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_a ssa_vars[i].alias = ssa_vars[ssa_vars[i].var].alias; } } - - return SUCCESS; } /* }}} */ diff --git a/Zend/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h index 88c4a9c671e76..da75595abfa15 100644 --- a/Zend/Optimizer/zend_ssa.h +++ b/Zend/Optimizer/zend_ssa.h @@ -146,7 +146,7 @@ typedef struct _zend_ssa { BEGIN_EXTERN_C() ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa); -ZEND_API int zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa); +ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa); ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var); int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var); diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 210cf2323a20b..f7926c9fb040f 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -1315,9 +1315,7 @@ static int zend_jit_op_array_analyze1(const zend_op_array *op_array, zend_script return FAILURE; } - if (zend_ssa_compute_use_def_chains(&CG(arena), op_array, ssa) != SUCCESS) { - return FAILURE; - } + zend_ssa_compute_use_def_chains(&CG(arena), op_array, ssa); zend_ssa_find_false_dependencies(op_array, ssa); From 87ea3c1f4c174b8d66af9d42e8387a2016c21c54 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:30:37 +0100 Subject: [PATCH 0087/1346] Voidify zend_ssa_unlink_use_chain() It always returned 1 or threw an assertion failure Also drop else branch by moving it to the main scope --- Zend/Optimizer/dfa_pass.c | 169 +++++++++++++++++++------------------- Zend/Optimizer/zend_ssa.c | 58 +++++++------ Zend/Optimizer/zend_ssa.h | 2 +- 3 files changed, 113 insertions(+), 116 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 48bc8232cba41..f385bd2a032e5 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -1273,24 +1273,23 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx // op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP int orig_var = ssa->ops[op_1].op1_use; - if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { + zend_ssa_unlink_use_chain(ssa, op_1, orig_var); - int ret = ssa->vars[v].use_chain; - if (ret >= 0) { - ssa->ops[ret].op1_use = orig_var; - ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; - ssa->vars[orig_var].use_chain = ret; - } + int ret = ssa->vars[v].use_chain; + if (ret >= 0) { + ssa->ops[ret].op1_use = orig_var; + ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; + ssa->vars[orig_var].use_chain = ret; + } - ssa->vars[v].definition = -1; - ssa->vars[v].use_chain = -1; + ssa->vars[v].definition = -1; + ssa->vars[v].use_chain = -1; - ssa->ops[op_1].op1_def = -1; - ssa->ops[op_1].op1_use = -1; + ssa->ops[op_1].op1_def = -1; + ssa->ops[op_1].op1_use = -1; - MAKE_NOP(opline); - remove_nops = 1; - } + MAKE_NOP(opline); + remove_nops = 1; } } @@ -1322,7 +1321,8 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx // op_2: #src_var.T = OP ... => #v.CV = OP ... // op_1: QM_ASSIGN #src_var.T #orig_var.CV [undef,scalar] -> #v.CV, NOP - if (orig_var < 0 || zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { + if (orig_var < 0) { + zend_ssa_unlink_use_chain(ssa, op_1, orig_var); /* Reconstruct SSA */ ssa->vars[v].definition = op_2; ssa->ops[op_2].result_def = v; @@ -1476,80 +1476,79 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx // op_2: #src_var.T = OP ... => #v.CV = OP ... // op_1: ASSIGN #orig_var.CV [undef,scalar] -> #v.CV, #src_var.T NOP - if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) { - /* Reconstruct SSA */ - ssa->vars[v].definition = op_2; - ssa->ops[op_2].result_def = v; + zend_ssa_unlink_use_chain(ssa, op_1, orig_var); + /* Reconstruct SSA */ + ssa->vars[v].definition = op_2; + ssa->ops[op_2].result_def = v; - ssa->vars[src_var].definition = -1; - ssa->vars[src_var].use_chain = -1; + ssa->vars[src_var].definition = -1; + ssa->vars[src_var].use_chain = -1; - ssa->ops[op_1].op1_use = -1; - ssa->ops[op_1].op2_use = -1; - ssa->ops[op_1].op1_def = -1; - ssa->ops[op_1].op1_use_chain = -1; + ssa->ops[op_1].op1_use = -1; + ssa->ops[op_1].op2_use = -1; + ssa->ops[op_1].op1_def = -1; + ssa->ops[op_1].op1_use_chain = -1; - /* Update opcodes */ - op_array->opcodes[op_2].result_type = opline->op1_type; - op_array->opcodes[op_2].result.var = opline->op1.var; + /* Update opcodes */ + op_array->opcodes[op_2].result_type = opline->op1_type; + op_array->opcodes[op_2].result.var = opline->op1.var; - MAKE_NOP(opline); - remove_nops = 1; - - if (op_array->opcodes[op_2].opcode == ZEND_SUB - && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type - && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var - && op_array->opcodes[op_2].op2_type == IS_CONST - && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG - && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 - && ssa->ops[op_2].op1_use >= 0 - && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { - - op_array->opcodes[op_2].opcode = ZEND_PRE_DEC; - SET_UNUSED(op_array->opcodes[op_2].op2); - SET_UNUSED(op_array->opcodes[op_2].result); - - ssa->ops[op_2].result_def = -1; - ssa->ops[op_2].op1_def = v; - - } else if (op_array->opcodes[op_2].opcode == ZEND_ADD - && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type - && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var - && op_array->opcodes[op_2].op2_type == IS_CONST - && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG - && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 - && ssa->ops[op_2].op1_use >= 0 - && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { - - op_array->opcodes[op_2].opcode = ZEND_PRE_INC; - SET_UNUSED(op_array->opcodes[op_2].op2); - SET_UNUSED(op_array->opcodes[op_2].result); - - ssa->ops[op_2].result_def = -1; - ssa->ops[op_2].op1_def = v; - - } else if (op_array->opcodes[op_2].opcode == ZEND_ADD - && op_array->opcodes[op_2].op2_type == op_array->opcodes[op_2].result_type - && op_array->opcodes[op_2].op2.var == op_array->opcodes[op_2].result.var - && op_array->opcodes[op_2].op1_type == IS_CONST - && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == IS_LONG - && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == 1 - && ssa->ops[op_2].op2_use >= 0 - && !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { - - op_array->opcodes[op_2].opcode = ZEND_PRE_INC; - op_array->opcodes[op_2].op1_type = op_array->opcodes[op_2].op2_type; - op_array->opcodes[op_2].op1.var = op_array->opcodes[op_2].op2.var; - SET_UNUSED(op_array->opcodes[op_2].op2); - SET_UNUSED(op_array->opcodes[op_2].result); - - ssa->ops[op_2].result_def = -1; - ssa->ops[op_2].op1_def = v; - ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use; - ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain; - ssa->ops[op_2].op2_use = -1; - ssa->ops[op_2].op2_use_chain = -1; - } + MAKE_NOP(opline); + remove_nops = 1; + + if (op_array->opcodes[op_2].opcode == ZEND_SUB + && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type + && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var + && op_array->opcodes[op_2].op2_type == IS_CONST + && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG + && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 + && ssa->ops[op_2].op1_use >= 0 + && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + + op_array->opcodes[op_2].opcode = ZEND_PRE_DEC; + SET_UNUSED(op_array->opcodes[op_2].op2); + SET_UNUSED(op_array->opcodes[op_2].result); + + ssa->ops[op_2].result_def = -1; + ssa->ops[op_2].op1_def = v; + + } else if (op_array->opcodes[op_2].opcode == ZEND_ADD + && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type + && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var + && op_array->opcodes[op_2].op2_type == IS_CONST + && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG + && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 + && ssa->ops[op_2].op1_use >= 0 + && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + + op_array->opcodes[op_2].opcode = ZEND_PRE_INC; + SET_UNUSED(op_array->opcodes[op_2].op2); + SET_UNUSED(op_array->opcodes[op_2].result); + + ssa->ops[op_2].result_def = -1; + ssa->ops[op_2].op1_def = v; + + } else if (op_array->opcodes[op_2].opcode == ZEND_ADD + && op_array->opcodes[op_2].op2_type == op_array->opcodes[op_2].result_type + && op_array->opcodes[op_2].op2.var == op_array->opcodes[op_2].result.var + && op_array->opcodes[op_2].op1_type == IS_CONST + && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == IS_LONG + && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == 1 + && ssa->ops[op_2].op2_use >= 0 + && !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + + op_array->opcodes[op_2].opcode = ZEND_PRE_INC; + op_array->opcodes[op_2].op1_type = op_array->opcodes[op_2].op2_type; + op_array->opcodes[op_2].op1.var = op_array->opcodes[op_2].op2.var; + SET_UNUSED(op_array->opcodes[op_2].op2); + SET_UNUSED(op_array->opcodes[op_2].result); + + ssa->ops[op_2].result_def = -1; + ssa->ops[op_2].op1_def = v; + ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use; + ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain; + ssa->ops[op_2].op2_use = -1; + ssa->ops[op_2].op2_use_chain = -1; } } else if (opline->op2_type == IS_CONST || ((opline->op2_type & (IS_TMP_VAR|IS_VAR|IS_CV)) diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index c5b7d29f116b2..63097a21f9ad1 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -1161,44 +1161,42 @@ ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_ } /* }}} */ -int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */ +void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */ { if (ssa->vars[var].use_chain == op) { ssa->vars[var].use_chain = zend_ssa_next_use(ssa->ops, var, op); - return 1; - } else { - int use = ssa->vars[var].use_chain; + return; + } + int use = ssa->vars[var].use_chain; - while (use >= 0) { - if (ssa->ops[use].result_use == var) { - if (ssa->ops[use].res_use_chain == op) { - ssa->ops[use].res_use_chain = zend_ssa_next_use(ssa->ops, var, op); - return 1; - } else { - use = ssa->ops[use].res_use_chain; - } - } else if (ssa->ops[use].op1_use == var) { - if (ssa->ops[use].op1_use_chain == op) { - ssa->ops[use].op1_use_chain = zend_ssa_next_use(ssa->ops, var, op); - return 1; - } else { - use = ssa->ops[use].op1_use_chain; - } - } else if (ssa->ops[use].op2_use == var) { - if (ssa->ops[use].op2_use_chain == op) { - ssa->ops[use].op2_use_chain = zend_ssa_next_use(ssa->ops, var, op); - return 1; - } else { - use = ssa->ops[use].op2_use_chain; - } + while (use >= 0) { + if (ssa->ops[use].result_use == var) { + if (ssa->ops[use].res_use_chain == op) { + ssa->ops[use].res_use_chain = zend_ssa_next_use(ssa->ops, var, op); + return; } else { - break; + use = ssa->ops[use].res_use_chain; + } + } else if (ssa->ops[use].op1_use == var) { + if (ssa->ops[use].op1_use_chain == op) { + ssa->ops[use].op1_use_chain = zend_ssa_next_use(ssa->ops, var, op); + return; + } else { + use = ssa->ops[use].op1_use_chain; + } + } else if (ssa->ops[use].op2_use == var) { + if (ssa->ops[use].op2_use_chain == op) { + ssa->ops[use].op2_use_chain = zend_ssa_next_use(ssa->ops, var, op); + return; + } else { + use = ssa->ops[use].op2_use_chain; } + } else { + break; } - /* something wrong */ - ZEND_UNREACHABLE(); - return 0; } + /* something wrong */ + ZEND_UNREACHABLE(); } /* }}} */ diff --git a/Zend/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h index da75595abfa15..93e6e8b26be53 100644 --- a/Zend/Optimizer/zend_ssa.h +++ b/Zend/Optimizer/zend_ssa.h @@ -148,7 +148,7 @@ BEGIN_EXTERN_C() ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *script, const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa); ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa); ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var); -int zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var); +void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var); void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to); void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op); From 4818765560b5fdd41f9ee5dedde95e17da0f1def Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:33:15 +0100 Subject: [PATCH 0088/1346] Voidify zend_worklist_prepare() It always returned SUCCESS --- Zend/Optimizer/zend_worklist.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Zend/Optimizer/zend_worklist.h b/Zend/Optimizer/zend_worklist.h index 29a21269c6e96..69cc41c437af7 100644 --- a/Zend/Optimizer/zend_worklist.h +++ b/Zend/Optimizer/zend_worklist.h @@ -37,15 +37,13 @@ typedef struct _zend_worklist_stack { #define ZEND_WORKLIST_STACK_FREE_ALLOCA(s, use_heap) \ free_alloca((s)->buf, use_heap) -static inline int zend_worklist_stack_prepare(zend_arena **arena, zend_worklist_stack *stack, int len) +static inline void zend_worklist_stack_prepare(zend_arena **arena, zend_worklist_stack *stack, int len) { ZEND_ASSERT(len >= 0); stack->buf = (int*)zend_arena_calloc(arena, sizeof(*stack->buf), len); stack->len = 0; stack->capacity = len; - - return SUCCESS; } static inline void zend_worklist_stack_push(zend_worklist_stack *stack, int i) @@ -82,11 +80,11 @@ typedef struct _zend_worklist { #define ZEND_WORKLIST_FREE_ALLOCA(w, use_heap) \ free_alloca((w)->stack.buf, use_heap) -static inline int zend_worklist_prepare(zend_arena **arena, zend_worklist *worklist, int len) +static inline void zend_worklist_prepare(zend_arena **arena, zend_worklist *worklist, int len) { ZEND_ASSERT(len >= 0); worklist->visited = (zend_bitset)zend_arena_calloc(arena, sizeof(zend_ulong), zend_bitset_len(len)); - return zend_worklist_stack_prepare(arena, &worklist->stack, len); + zend_worklist_stack_prepare(arena, &worklist->stack, len); } static inline int zend_worklist_len(zend_worklist *worklist) From f345f6d529283e1dae03f5a1a411c5527dfe59b9 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 18:43:19 +0100 Subject: [PATCH 0089/1346] Voidify zend_optimize_script() It always returned 1 As a consequence voidify preload_optimize() --- Zend/Optimizer/zend_optimizer.c | 4 +--- Zend/Optimizer/zend_optimizer.h | 2 +- ext/opcache/ZendAccelerator.c | 26 ++++++-------------------- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index db8bc56c9d973..7fa5d82bf2469 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -1424,7 +1424,7 @@ static void zend_optimizer_call_registered_passes(zend_script *script, void *ctx } } -ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level) +ZEND_API void zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level) { zend_class_entry *ce; zend_string *key; @@ -1575,8 +1575,6 @@ ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_le zend_hash_destroy(ctx.constants); } zend_arena_destroy(ctx.arena); - - return 1; } ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass) diff --git a/Zend/Optimizer/zend_optimizer.h b/Zend/Optimizer/zend_optimizer.h index 07136cfc860ec..7a68cbd101e6d 100644 --- a/Zend/Optimizer/zend_optimizer.h +++ b/Zend/Optimizer/zend_optimizer.h @@ -92,7 +92,7 @@ typedef struct _zend_script { typedef void (*zend_optimizer_pass_t)(zend_script *, void *context); BEGIN_EXTERN_C() -ZEND_API int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level); +ZEND_API void zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level); ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass); ZEND_API void zend_optimizer_unregister_pass(int idx); zend_result zend_optimizer_startup(void); diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index b70ddcc3e401d..b453cd2390bf2 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1470,10 +1470,7 @@ static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script orig_compiler_options = CG(compiler_options); CG(compiler_options) |= ZEND_COMPILE_WITH_FILE_CACHE; - if (!zend_optimize_script(&new_persistent_script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level)) { - CG(compiler_options) = orig_compiler_options; - return new_persistent_script; - } + zend_optimize_script(&new_persistent_script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); CG(compiler_options) = orig_compiler_options; *from_shared_memory = 1; @@ -1490,10 +1487,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr if (ZCG(accel_directives).file_cache) { CG(compiler_options) |= ZEND_COMPILE_WITH_FILE_CACHE; } - if (!zend_optimize_script(&new_persistent_script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level)) { - CG(compiler_options) = orig_compiler_options; - return new_persistent_script; - } + zend_optimize_script(&new_persistent_script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); CG(compiler_options) = orig_compiler_options; /* exclusive lock */ @@ -4179,7 +4173,7 @@ static void preload_fix_trait_methods(zend_class_entry *ce) } ZEND_HASH_FOREACH_END(); } -static int preload_optimize(zend_persistent_script *script) +static void preload_optimize(zend_persistent_script *script) { zend_class_entry *ce; zend_persistent_script *tmp_script; @@ -4200,9 +4194,7 @@ static int preload_optimize(zend_persistent_script *script) } ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END(); - if (!zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level)) { - return FAILURE; - } + zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { preload_fix_trait_methods(ce); @@ -4217,11 +4209,8 @@ static int preload_optimize(zend_persistent_script *script) zend_shared_alloc_destroy_xlat_table(); ZEND_HASH_FOREACH_PTR(preload_scripts, script) { - if (!zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level)) { - return FAILURE; - } + zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); } ZEND_HASH_FOREACH_END(); - return SUCCESS; } static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_script *new_persistent_script) @@ -4540,10 +4529,7 @@ static int accel_preload(const char *config, bool in_child) zend_hash_sort_ex(&script->script.class_table, preload_sort_classes, NULL, 0); - if (preload_optimize(script) != SUCCESS) { - zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Optimization error during preloading!"); - return FAILURE; - } + preload_optimize(script); zend_shared_alloc_init_xlat_table(); From 44bc9556192322ee2999dbe05e00e7b38a3f132f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Sep 2021 16:17:57 +0100 Subject: [PATCH 0090/1346] Check against FAILURE instead of different then SUCCESS --- Zend/Optimizer/dfa_pass.c | 8 ++++---- Zend/Optimizer/escape_analysis.c | 2 +- Zend/Optimizer/sccp.c | 10 +++++----- Zend/Optimizer/zend_inference.c | 6 +++--- Zend/Optimizer/zend_ssa.c | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index f385bd2a032e5..bdee7ef1c17bc 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -80,7 +80,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct if (ctx->debug_level & ZEND_DUMP_DFA_PHI) { build_flags |= ZEND_SSA_DEBUG_PHI_PLACEMENT; } - if (zend_build_ssa(&ctx->arena, ctx->script, op_array, build_flags, ssa) != SUCCESS) { + if (zend_build_ssa(&ctx->arena, ctx->script, op_array, build_flags, ssa) == FAILURE) { return FAILURE; } @@ -95,11 +95,11 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct zend_ssa_find_sccs(op_array, ssa); - if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa, ctx->optimization_level) != SUCCESS) { + if (zend_ssa_inference(&ctx->arena, op_array, ctx->script, ssa, ctx->optimization_level) == FAILURE) { return FAILURE; } - if (zend_ssa_escape_analysis(ctx->script, op_array, ssa) != SUCCESS) { + if (zend_ssa_escape_analysis(ctx->script, op_array, ssa) == FAILURE) { return FAILURE; } @@ -1657,7 +1657,7 @@ void zend_optimize_dfa(zend_op_array *op_array, zend_optimizer_ctx *ctx) void *checkpoint = zend_arena_checkpoint(ctx->arena); zend_ssa ssa; - if (zend_dfa_analyze_op_array(op_array, ctx, &ssa) != SUCCESS) { + if (zend_dfa_analyze_op_array(op_array, ctx, &ssa) == FAILURE) { zend_arena_release(&ctx->arena, checkpoint); return; } diff --git a/Zend/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c index 26c62b76d58db..e13015ceb7cd8 100644 --- a/Zend/Optimizer/escape_analysis.c +++ b/Zend/Optimizer/escape_analysis.c @@ -401,7 +401,7 @@ zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *o return FAILURE; } - if (zend_build_equi_escape_sets(ees, op_array, ssa) != SUCCESS) { + if (zend_build_equi_escape_sets(ees, op_array, ssa) == FAILURE) { return FAILURE; } diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 11a6a07db9cf5..4d4cd710e87dd 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -1435,7 +1435,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o break; } - if (ct_eval_binary_op(&tmp, opline->extended_value, &tmp, data) != SUCCESS) { + if (ct_eval_binary_op(&tmp, opline->extended_value, &tmp, data) == FAILURE) { SET_RESULT_BOT(result); SET_RESULT_BOT(op1); zval_ptr_dtor_nogc(&tmp); @@ -1480,7 +1480,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o break; } - if (ct_eval_binary_op(&tmp, opline->extended_value, &tmp, data) != SUCCESS) { + if (ct_eval_binary_op(&tmp, opline->extended_value, &tmp, data) == FAILURE) { SET_RESULT_BOT(result); SET_RESULT_BOT(op1); zval_ptr_dtor_nogc(&tmp); @@ -2049,17 +2049,17 @@ static void join_phi_values(zval *a, zval *b, bool escape) { return; } if (IS_PARTIAL_ARRAY(a) || IS_PARTIAL_ARRAY(b)) { - if (join_partial_arrays(a, b) != SUCCESS) { + if (join_partial_arrays(a, b) == FAILURE) { zval_ptr_dtor_nogc(a); MAKE_BOT(a); } } else if (IS_PARTIAL_OBJECT(a) || IS_PARTIAL_OBJECT(b)) { - if (escape || join_partial_objects(a, b) != SUCCESS) { + if (escape || join_partial_objects(a, b) == FAILURE) { zval_ptr_dtor_nogc(a); MAKE_BOT(a); } } else if (!zend_is_identical(a, b)) { - if (join_partial_arrays(a, b) != SUCCESS) { + if (join_partial_arrays(a, b) == FAILURE) { zval_ptr_dtor_nogc(a); MAKE_BOT(a); } diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index a37c0d7152625..8850d7163783a 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -4055,7 +4055,7 @@ static zend_result zend_type_narrowing(const zend_op_array *op_array, const zend return SUCCESS; } - if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) != SUCCESS) { + if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) == FAILURE) { free_alloca(visited, use_heap); return FAILURE; } @@ -4341,7 +4341,7 @@ static zend_result zend_infer_types(const zend_op_array *op_array, const zend_sc zend_bitset_incl(worklist, j); } - if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) != SUCCESS) { + if (zend_infer_types_ex(op_array, script, ssa, worklist, optimization_level) == FAILURE) { free_alloca(worklist, use_heap); return FAILURE; } @@ -4527,7 +4527,7 @@ ZEND_API zend_result zend_ssa_inference(zend_arena **arena, const zend_op_array zend_infer_ranges(op_array, ssa); - if (zend_infer_types(op_array, script, ssa, optimization_level) != SUCCESS) { + if (zend_infer_types(op_array, script, ssa, optimization_level) == FAILURE) { return FAILURE; } diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 63097a21f9ad1..1000d8611228a 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -882,7 +882,7 @@ static zend_result zend_ssa_rename(const zend_op_array *op_array, uint32_t build j = blocks[n].children; while (j >= 0) { // FIXME: Tail call optimization? - if (zend_ssa_rename(op_array, build_flags, ssa, var, j) != SUCCESS) + if (zend_ssa_rename(op_array, build_flags, ssa, var, j) == FAILURE) return FAILURE; j = blocks[j].next_child; } @@ -1030,7 +1030,7 @@ ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *scrip var[j] = j; } ssa->vars_count = op_array->last_var; - if (zend_ssa_rename(op_array, build_flags, ssa, var, 0) != SUCCESS) { + if (zend_ssa_rename(op_array, build_flags, ssa, var, 0) == FAILURE) { free_alloca(var, var_use_heap); free_alloca(dfg.tmp, dfg_use_heap); return FAILURE; From 7e565daad9b8da393337f13906dcbd1c3f47abd7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 21 Sep 2021 14:34:46 +0200 Subject: [PATCH 0091/1346] Fix incorrect use chain unlink This issue has been introduced in 87ea3c1f4c174b8d66af9d42e8387a2016c21c54, where an || has been misinterpreted as an &&. --- Zend/Optimizer/dfa_pass.c | 141 +++++++++--------- .../tests/qm_assign_unlink_use_chain.phpt | 11 ++ 2 files changed, 82 insertions(+), 70 deletions(-) create mode 100644 ext/opcache/tests/qm_assign_unlink_use_chain.phpt diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index bdee7ef1c17bc..9eddbde3b717b 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -1321,83 +1321,84 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx // op_2: #src_var.T = OP ... => #v.CV = OP ... // op_1: QM_ASSIGN #src_var.T #orig_var.CV [undef,scalar] -> #v.CV, NOP - if (orig_var < 0) { + if (orig_var >= 0) { zend_ssa_unlink_use_chain(ssa, op_1, orig_var); - /* Reconstruct SSA */ - ssa->vars[v].definition = op_2; - ssa->ops[op_2].result_def = v; - - ssa->vars[src_var].definition = -1; - ssa->vars[src_var].use_chain = -1; - - ssa->ops[op_1].op1_use = -1; - ssa->ops[op_1].op1_def = -1; - ssa->ops[op_1].op1_use_chain = -1; - ssa->ops[op_1].result_use = -1; - ssa->ops[op_1].result_def = -1; - ssa->ops[op_1].res_use_chain = -1; - - /* Update opcodes */ - op_array->opcodes[op_2].result_type = opline->result_type; - op_array->opcodes[op_2].result.var = opline->result.var; - - MAKE_NOP(opline); - remove_nops = 1; - - if (op_array->opcodes[op_2].opcode == ZEND_SUB - && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type - && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var - && op_array->opcodes[op_2].op2_type == IS_CONST - && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG - && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 - && ssa->ops[op_2].op1_use >= 0 - && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + } - op_array->opcodes[op_2].opcode = ZEND_PRE_DEC; - SET_UNUSED(op_array->opcodes[op_2].op2); - SET_UNUSED(op_array->opcodes[op_2].result); + /* Reconstruct SSA */ + ssa->vars[v].definition = op_2; + ssa->ops[op_2].result_def = v; - ssa->ops[op_2].result_def = -1; - ssa->ops[op_2].op1_def = v; + ssa->vars[src_var].definition = -1; + ssa->vars[src_var].use_chain = -1; - } else if (op_array->opcodes[op_2].opcode == ZEND_ADD - && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type - && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var - && op_array->opcodes[op_2].op2_type == IS_CONST - && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG - && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 - && ssa->ops[op_2].op1_use >= 0 - && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { - - op_array->opcodes[op_2].opcode = ZEND_PRE_INC; - SET_UNUSED(op_array->opcodes[op_2].op2); - SET_UNUSED(op_array->opcodes[op_2].result); - - ssa->ops[op_2].result_def = -1; - ssa->ops[op_2].op1_def = v; + ssa->ops[op_1].op1_use = -1; + ssa->ops[op_1].op1_def = -1; + ssa->ops[op_1].op1_use_chain = -1; + ssa->ops[op_1].result_use = -1; + ssa->ops[op_1].result_def = -1; + ssa->ops[op_1].res_use_chain = -1; - } else if (op_array->opcodes[op_2].opcode == ZEND_ADD - && op_array->opcodes[op_2].op2_type == op_array->opcodes[op_2].result_type - && op_array->opcodes[op_2].op2.var == op_array->opcodes[op_2].result.var - && op_array->opcodes[op_2].op1_type == IS_CONST - && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == IS_LONG - && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == 1 - && ssa->ops[op_2].op2_use >= 0 - && !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + /* Update opcodes */ + op_array->opcodes[op_2].result_type = opline->result_type; + op_array->opcodes[op_2].result.var = opline->result.var; - op_array->opcodes[op_2].opcode = ZEND_PRE_INC; - op_array->opcodes[op_2].op1_type = op_array->opcodes[op_2].op2_type; - op_array->opcodes[op_2].op1.var = op_array->opcodes[op_2].op2.var; - SET_UNUSED(op_array->opcodes[op_2].op2); - SET_UNUSED(op_array->opcodes[op_2].result); + MAKE_NOP(opline); + remove_nops = 1; - ssa->ops[op_2].result_def = -1; - ssa->ops[op_2].op1_def = v; - ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use; - ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain; - ssa->ops[op_2].op2_use = -1; - ssa->ops[op_2].op2_use_chain = -1; - } + if (op_array->opcodes[op_2].opcode == ZEND_SUB + && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type + && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var + && op_array->opcodes[op_2].op2_type == IS_CONST + && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG + && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 + && ssa->ops[op_2].op1_use >= 0 + && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + + op_array->opcodes[op_2].opcode = ZEND_PRE_DEC; + SET_UNUSED(op_array->opcodes[op_2].op2); + SET_UNUSED(op_array->opcodes[op_2].result); + + ssa->ops[op_2].result_def = -1; + ssa->ops[op_2].op1_def = v; + + } else if (op_array->opcodes[op_2].opcode == ZEND_ADD + && op_array->opcodes[op_2].op1_type == op_array->opcodes[op_2].result_type + && op_array->opcodes[op_2].op1.var == op_array->opcodes[op_2].result.var + && op_array->opcodes[op_2].op2_type == IS_CONST + && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == IS_LONG + && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op2.constant)) == 1 + && ssa->ops[op_2].op1_use >= 0 + && !(ssa->var_info[ssa->ops[op_2].op1_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + + op_array->opcodes[op_2].opcode = ZEND_PRE_INC; + SET_UNUSED(op_array->opcodes[op_2].op2); + SET_UNUSED(op_array->opcodes[op_2].result); + + ssa->ops[op_2].result_def = -1; + ssa->ops[op_2].op1_def = v; + + } else if (op_array->opcodes[op_2].opcode == ZEND_ADD + && op_array->opcodes[op_2].op2_type == op_array->opcodes[op_2].result_type + && op_array->opcodes[op_2].op2.var == op_array->opcodes[op_2].result.var + && op_array->opcodes[op_2].op1_type == IS_CONST + && Z_TYPE_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == IS_LONG + && Z_LVAL_P(CT_CONSTANT_EX(op_array, op_array->opcodes[op_2].op1.constant)) == 1 + && ssa->ops[op_2].op2_use >= 0 + && !(ssa->var_info[ssa->ops[op_2].op2_use].type & (MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { + + op_array->opcodes[op_2].opcode = ZEND_PRE_INC; + op_array->opcodes[op_2].op1_type = op_array->opcodes[op_2].op2_type; + op_array->opcodes[op_2].op1.var = op_array->opcodes[op_2].op2.var; + SET_UNUSED(op_array->opcodes[op_2].op2); + SET_UNUSED(op_array->opcodes[op_2].result); + + ssa->ops[op_2].result_def = -1; + ssa->ops[op_2].op1_def = v; + ssa->ops[op_2].op1_use = ssa->ops[op_2].op2_use; + ssa->ops[op_2].op1_use_chain = ssa->ops[op_2].op2_use_chain; + ssa->ops[op_2].op2_use = -1; + ssa->ops[op_2].op2_use_chain = -1; } } } diff --git a/ext/opcache/tests/qm_assign_unlink_use_chain.phpt b/ext/opcache/tests/qm_assign_unlink_use_chain.phpt new file mode 100644 index 0000000000000..cd9300e753ae0 --- /dev/null +++ b/ext/opcache/tests/qm_assign_unlink_use_chain.phpt @@ -0,0 +1,11 @@ +--TEST-- +Don't try to unlink use chain of QM_ASSIGN without result use +--FILE-- + +--EXPECT-- +int(1) From 06a25c774dbaa19a0ec4382d9a34ea44aaa7f6dd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 21 Sep 2021 15:26:04 +0200 Subject: [PATCH 0092/1346] Add fuzzer for tracing jit --- sapi/fuzzer/Makefile.frag | 7 +- sapi/fuzzer/README.md | 10 ++- sapi/fuzzer/config.m4 | 3 +- sapi/fuzzer/fuzzer-execute-common.h | 25 +++++++ .../{fuzzer-jit.c => fuzzer-function-jit.c} | 24 +----- sapi/fuzzer/fuzzer-tracing-jit.c | 75 +++++++++++++++++++ 6 files changed, 117 insertions(+), 27 deletions(-) rename sapi/fuzzer/{fuzzer-jit.c => fuzzer-function-jit.c} (79%) create mode 100644 sapi/fuzzer/fuzzer-tracing-jit.c diff --git a/sapi/fuzzer/Makefile.frag b/sapi/fuzzer/Makefile.frag index fc8fa8410cb1a..2f15ad92f8999 100644 --- a/sapi/fuzzer/Makefile.frag +++ b/sapi/fuzzer/Makefile.frag @@ -8,8 +8,11 @@ $(SAPI_FUZZER_PATH)/php-fuzz-parser: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_F $(SAPI_FUZZER_PATH)/php-fuzz-execute: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_EXECUTE_OBJS) $(FUZZER_BUILD) $(PHP_FUZZER_EXECUTE_OBJS) -o $@ -$(SAPI_FUZZER_PATH)/php-fuzz-jit: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_JIT_OBJS) - $(FUZZER_BUILD) $(PHP_FUZZER_JIT_OBJS) -o $@ +$(SAPI_FUZZER_PATH)/php-fuzz-function-jit: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_FUNCTION_JIT_OBJS) + $(FUZZER_BUILD) $(PHP_FUZZER_FUNCTION_JIT_OBJS) -o $@ + +$(SAPI_FUZZER_PATH)/php-fuzz-tracing-jit: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_TRACING_JIT_OBJS) + $(FUZZER_BUILD) $(PHP_FUZZER_TRACING_JIT_OBJS) -o $@ $(SAPI_FUZZER_PATH)/php-fuzz-unserialize: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_UNSERIALIZE_OBJS) $(FUZZER_BUILD) $(PHP_FUZZER_UNSERIALIZE_OBJS) -o $@ diff --git a/sapi/fuzzer/README.md b/sapi/fuzzer/README.md index e8f60ac40ad4b..2099a34bfbf40 100644 --- a/sapi/fuzzer/README.md +++ b/sapi/fuzzer/README.md @@ -30,7 +30,8 @@ When running `make` it creates these binaries in `sapi/fuzzer/`: * `php-fuzz-exif`: Fuzzing `exif_read_data()` function (requires --enable-exif) * `php-fuzz-mbstring`: Fuzzing `mb_ereg[i]()` (requires --enable-mbstring) * `php-fuzz-execute`: Fuzzing the executor -* `php-fuzz-jit`: Fuzzing the function JIT (requires --enable-opcache) +* `php-fuzz-function-jit`: Fuzzing the function JIT (requires --enable-opcache) +* `php-fuzz-tracing-jit`: Fuzzing the tracing JIT (requires --enable-opcache) Some fuzzers have a seed corpus in `sapi/fuzzer/corpus`. You can use it as follows: @@ -64,6 +65,13 @@ sapi/fuzzer/php-fuzz-parser -merge=1 ./my-parser-corpus sapi/fuzzer/corpus/parse sapi/fuzzer/php-fuzz-parser -only_ascii=1 ./my-parser-corpus ``` +For the execute, function-jit and tracing-jit fuzzers, a corpus may be generated from any set of test files: + +```sh +sapi/cli/php sapi/fuzzer/generate_execute_corpus.php ./execute-corpus Zend/tests ext/opcache/tests/jit +sapi/fuzzer/php-fuzzer-function-jit ./execute-corpus +``` + For the mbstring fuzzer, you may want to build the libonig dependency with instrumentation. At this time, libonig is not clean under ubsan, so only the fuzzer and address sanitizers may be used. ```sh diff --git a/sapi/fuzzer/config.m4 b/sapi/fuzzer/config.m4 index f7125365d0e0a..72953a8295d79 100644 --- a/sapi/fuzzer/config.m4 +++ b/sapi/fuzzer/config.m4 @@ -54,7 +54,8 @@ if test "$PHP_FUZZER" != "no"; then PHP_FUZZER_TARGET([parser], PHP_FUZZER_PARSER_OBJS) PHP_FUZZER_TARGET([execute], PHP_FUZZER_EXECUTE_OBJS) - PHP_FUZZER_TARGET([jit], PHP_FUZZER_JIT_OBJS) + PHP_FUZZER_TARGET([function-jit], PHP_FUZZER_FUNCTION_JIT_OBJS) + PHP_FUZZER_TARGET([tracing-jit], PHP_FUZZER_TRACING_JIT_OBJS) PHP_FUZZER_TARGET([unserialize], PHP_FUZZER_UNSERIALIZE_OBJS) PHP_FUZZER_TARGET([unserializehash], PHP_FUZZER_UNSERIALIZEHASH_OBJS) PHP_FUZZER_TARGET([json], PHP_FUZZER_JSON_OBJS) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index 092a662c42f98..d0e80b8bb4444 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -18,6 +18,7 @@ #include "fuzzer.h" #include "fuzzer-sapi.h" +#include "zend_exceptions.h" #define MAX_STEPS 1000 #define MAX_SIZE (8 * 1024) @@ -38,6 +39,8 @@ static zend_always_inline void fuzzer_step(void) { } } +static void (*orig_execute_ex)(zend_execute_data *execute_data); + static void fuzzer_execute_ex(zend_execute_data *execute_data) { while (1) { int ret; @@ -91,9 +94,31 @@ static void fuzzer_init_php_for_execute(const char *extra_ini) { fuzzer_init_php(extra_ini); + orig_execute_ex = zend_execute_ex; zend_execute_ex = fuzzer_execute_ex; orig_execute_internal = zend_execute_internal ? zend_execute_internal : execute_internal; zend_execute_internal = fuzzer_execute_internal; orig_compile_string = zend_compile_string; zend_compile_string = fuzzer_compile_string; } + +ZEND_ATTRIBUTE_UNUSED static void opcache_invalidate(void) { + steps_left = MAX_STEPS; + zend_exception_save(); + zval retval, func, args[2]; + ZVAL_STRING(&func, "opcache_invalidate"); + ZVAL_STRING(&args[0], "/fuzzer.php"); + ZVAL_TRUE(&args[1]); + call_user_function(CG(function_table), NULL, &func, &retval, 2, args); + ZEND_ASSERT(Z_TYPE(retval) == IS_TRUE); + zval_ptr_dtor(&args[0]); + zval_ptr_dtor(&retval); + zval_ptr_dtor(&func); + zend_exception_restore(); +} + +ZEND_ATTRIBUTE_UNUSED char *get_opcache_path(void) { + // TODO: Make this more general. + char *opcache_path = "modules/opcache.so"; + return realpath(opcache_path, NULL); +} diff --git a/sapi/fuzzer/fuzzer-jit.c b/sapi/fuzzer/fuzzer-function-jit.c similarity index 79% rename from sapi/fuzzer/fuzzer-jit.c rename to sapi/fuzzer/fuzzer-function-jit.c index 04313bf9b74d1..4bebc4ce927da 100644 --- a/sapi/fuzzer/fuzzer-jit.c +++ b/sapi/fuzzer/fuzzer-function-jit.c @@ -15,22 +15,6 @@ */ #include "fuzzer-execute-common.h" -#include "zend_exceptions.h" - -static void opcache_invalidate(void) { - steps_left = MAX_STEPS; - zend_exception_save(); - zval retval, func, args[2]; - ZVAL_STRING(&func, "opcache_invalidate"); - ZVAL_STRING(&args[0], "/fuzzer.php"); - ZVAL_TRUE(&args[1]); - call_user_function(CG(function_table), NULL, &func, &retval, 2, args); - ZEND_ASSERT(Z_TYPE(retval) == IS_TRUE); - zval_ptr_dtor(&args[0]); - zval_ptr_dtor(&retval); - zval_ptr_dtor(&func); - zend_exception_restore(); -} int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { if (Size > MAX_SIZE) { @@ -63,12 +47,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } -char *get_opcache_path(void) { - // TODO: Make this more general. - char *opcache_path = "modules/opcache.so"; - return realpath(opcache_path, NULL); -} - int LLVMFuzzerInitialize(int *argc, char ***argv) { char *opcache_path = get_opcache_path(); assert(opcache_path && "Failed to determine opcache path"); @@ -78,7 +56,7 @@ int LLVMFuzzerInitialize(int *argc, char ***argv) { "zend_extension=%s\n" "opcache.validate_timestamps=0\n" "opcache.file_update_protection=0\n" - "opcache.jit_buffer_size=512M", + "opcache.jit_buffer_size=256M", opcache_path); free(opcache_path); fuzzer_init_php_for_execute(ini_buf); diff --git a/sapi/fuzzer/fuzzer-tracing-jit.c b/sapi/fuzzer/fuzzer-tracing-jit.c new file mode 100644 index 0000000000000..f4387dc1f9ba4 --- /dev/null +++ b/sapi/fuzzer/fuzzer-tracing-jit.c @@ -0,0 +1,75 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | https://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Nikita Popov | + +----------------------------------------------------------------------+ + */ + +#include "fuzzer-execute-common.h" + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + if (Size > MAX_SIZE) { + /* Large inputs have a large impact on fuzzer performance, + * but are unlikely to be necessary to reach new codepaths. */ + return 0; + } + + zend_string *jit_option = zend_string_init("opcache.jit", sizeof("opcache.jit") - 1, 1); + + /* First run without JIT to determine whether we bail out. We should not run JITed code if + * we bail out here, as the JIT code may loop infinitely. */ + steps_left = MAX_STEPS; + bailed_out = false; + zend_alter_ini_entry_chars( + jit_option, "off", sizeof("off")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); + fuzzer_do_request_from_buffer( + "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + + if (!bailed_out) { + steps_left = MAX_STEPS; + zend_alter_ini_entry_chars(jit_option, + "tracing", sizeof("tracing")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); + zend_execute_ex = orig_execute_ex; + /* Trace & compile */ + fuzzer_do_request_from_buffer( + "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, NULL); + /* Execute trace */ + fuzzer_do_request_from_buffer( + "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + zend_execute_ex = fuzzer_execute_ex; + } + + zend_string_release(jit_option); + + return 0; +} + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + char *opcache_path = get_opcache_path(); + assert(opcache_path && "Failed to determine opcache path"); + + char ini_buf[512]; + snprintf(ini_buf, sizeof(ini_buf), + "zend_extension=%s\n" + "opcache.validate_timestamps=0\n" + "opcache.file_update_protection=0\n" + "opcache.jit_buffer_size=256M\n" + "opcache.jit_hot_func=1\n" + "opcache.jit_hot_loop=1\n" + "opcache.jit_hot_return=1\n" + "opcache.jit_hot_side_exit=1\n" + "opcache.jit_max_root_traces=32768", + opcache_path); + free(opcache_path); + fuzzer_init_php_for_execute(ini_buf); + return 0; +} From 9d0c018668f8604e99d3752bf42b7b1d4ee3466b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 22 Sep 2021 10:58:25 +0200 Subject: [PATCH 0093/1346] Make sure dummy file for fuzzing exists --- sapi/fuzzer/fuzzer-execute-common.h | 10 +++++++++- sapi/fuzzer/fuzzer-execute.c | 2 +- sapi/fuzzer/fuzzer-function-jit.c | 6 ++++-- sapi/fuzzer/fuzzer-tracing-jit.c | 8 +++++--- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index d0e80b8bb4444..97e90fb7e8a22 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -20,6 +20,7 @@ #include "fuzzer-sapi.h" #include "zend_exceptions.h" +#define FILE_NAME "/tmp/fuzzer.php" #define MAX_STEPS 1000 #define MAX_SIZE (8 * 1024) static uint32_t steps_left; @@ -102,12 +103,19 @@ static void fuzzer_init_php_for_execute(const char *extra_ini) { zend_compile_string = fuzzer_compile_string; } +ZEND_ATTRIBUTE_UNUSED static void create_file(void) { + /* For opcache_invalidate() to work, the dummy file name used for fuzzing needs to + * actually exist. */ + FILE *f = fopen(FILE_NAME, "w"); + fclose(f); +} + ZEND_ATTRIBUTE_UNUSED static void opcache_invalidate(void) { steps_left = MAX_STEPS; zend_exception_save(); zval retval, func, args[2]; ZVAL_STRING(&func, "opcache_invalidate"); - ZVAL_STRING(&args[0], "/fuzzer.php"); + ZVAL_STRING(&args[0], FILE_NAME); ZVAL_TRUE(&args[1]); call_user_function(CG(function_table), NULL, &func, &retval, 2, args); ZEND_ASSERT(Z_TYPE(retval) == IS_TRUE); diff --git a/sapi/fuzzer/fuzzer-execute.c b/sapi/fuzzer/fuzzer-execute.c index 75bacf8e75fe1..aa456a175f54f 100644 --- a/sapi/fuzzer/fuzzer-execute.c +++ b/sapi/fuzzer/fuzzer-execute.c @@ -25,7 +25,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { steps_left = MAX_STEPS; fuzzer_do_request_from_buffer( - "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, /* before_shutdown */ NULL); + FILE_NAME, (const char *) Data, Size, /* execute */ 1, /* before_shutdown */ NULL); return 0; } diff --git a/sapi/fuzzer/fuzzer-function-jit.c b/sapi/fuzzer/fuzzer-function-jit.c index 4bebc4ce927da..0c4cd0f918f61 100644 --- a/sapi/fuzzer/fuzzer-function-jit.c +++ b/sapi/fuzzer/fuzzer-function-jit.c @@ -32,14 +32,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { zend_alter_ini_entry_chars( jit_option, "off", sizeof("off")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); fuzzer_do_request_from_buffer( - "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + FILE_NAME, (const char *) Data, Size, /* execute */ 1, opcache_invalidate); if (!bailed_out) { steps_left = MAX_STEPS; zend_alter_ini_entry_chars(jit_option, "function", sizeof("function")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); fuzzer_do_request_from_buffer( - "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + FILE_NAME, (const char *) Data, Size, /* execute */ 1, opcache_invalidate); } zend_string_release(jit_option); @@ -59,6 +59,8 @@ int LLVMFuzzerInitialize(int *argc, char ***argv) { "opcache.jit_buffer_size=256M", opcache_path); free(opcache_path); + + create_file(); fuzzer_init_php_for_execute(ini_buf); return 0; } diff --git a/sapi/fuzzer/fuzzer-tracing-jit.c b/sapi/fuzzer/fuzzer-tracing-jit.c index f4387dc1f9ba4..585bf55304a44 100644 --- a/sapi/fuzzer/fuzzer-tracing-jit.c +++ b/sapi/fuzzer/fuzzer-tracing-jit.c @@ -32,7 +32,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { zend_alter_ini_entry_chars( jit_option, "off", sizeof("off")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); fuzzer_do_request_from_buffer( - "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + FILE_NAME, (const char *) Data, Size, /* execute */ 1, opcache_invalidate); if (!bailed_out) { steps_left = MAX_STEPS; @@ -41,10 +41,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { zend_execute_ex = orig_execute_ex; /* Trace & compile */ fuzzer_do_request_from_buffer( - "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, NULL); + FILE_NAME, (const char *) Data, Size, /* execute */ 1, NULL); /* Execute trace */ fuzzer_do_request_from_buffer( - "/fuzzer.php", (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + FILE_NAME, (const char *) Data, Size, /* execute */ 1, opcache_invalidate); zend_execute_ex = fuzzer_execute_ex; } @@ -70,6 +70,8 @@ int LLVMFuzzerInitialize(int *argc, char ***argv) { "opcache.jit_max_root_traces=32768", opcache_path); free(opcache_path); + + create_file(); fuzzer_init_php_for_execute(ini_buf); return 0; } From b3d37e9c915ec6058c04f288ffc77d6e079222cd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 22 Sep 2021 11:05:17 +0200 Subject: [PATCH 0094/1346] Generate function-jit corpus in generate_all.php For use by oss-fuzz. --- sapi/fuzzer/generate_all.php | 13 ++++++++++++- sapi/fuzzer/generate_corpus_util.php | 25 ++++++++++++++++++++++++ sapi/fuzzer/generate_execute_corpus.php | 26 +++---------------------- 3 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 sapi/fuzzer/generate_corpus_util.php diff --git a/sapi/fuzzer/generate_all.php b/sapi/fuzzer/generate_all.php index 589781b004068..9c6f97ca6ceee 100644 --- a/sapi/fuzzer/generate_all.php +++ b/sapi/fuzzer/generate_all.php @@ -2,4 +2,15 @@ require __DIR__ . '/generate_unserialize_dict.php'; require __DIR__ . '/generate_unserializehash_corpus.php'; require __DIR__ . '/generate_parser_corpus.php'; -require __DIR__ . '/generate_execute_corpus.php'; + +require __DIR__ . '/generate_corpus_util.php'; + +$baseDir = __DIR__ . '/../..'; +generate_corpus_from_phpt( + __DIR__ . '/corpus/execute', + ["$baseDir/Zend/tests", "$baseDir/ext/reflection"] +); +generate_corpus_from_phpt( + __DIR__ . '/corpus/function-jit', + ["$baseDir/Zend/tests", "$baseDir/ext/opcache/tests/jit"] +); diff --git a/sapi/fuzzer/generate_corpus_util.php b/sapi/fuzzer/generate_corpus_util.php new file mode 100644 index 0000000000000..29d152a1fae1a --- /dev/null +++ b/sapi/fuzzer/generate_corpus_util.php @@ -0,0 +1,25 @@ + $maxLen) continue; + + $outFile = str_replace($testDir, '', $file); + $outFile = str_replace('/', '_', $outFile); + if (!preg_match('/SKIP_SLOW_TESTS|SKIP_PERF_SENSITIVE|USE_ZEND_ALLOC/', $fullCode)) { + file_put_contents($corpusDir . '/' . $outFile, $code); + } + } + } +} diff --git a/sapi/fuzzer/generate_execute_corpus.php b/sapi/fuzzer/generate_execute_corpus.php index e7e72f5b2e563..8ed922df64629 100644 --- a/sapi/fuzzer/generate_execute_corpus.php +++ b/sapi/fuzzer/generate_execute_corpus.php @@ -1,5 +1,7 @@ = 2) { $corpusDir = $argv[1]; } else { @@ -12,26 +14,4 @@ $testDirs = ["$baseDir/Zend/tests", "$baseDir/ext/reflection"]; } -$maxLen = 8 * 1024; -@mkdir($corpusDir); - -foreach ($testDirs as $testDir) { - $it = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($testDir), - RecursiveIteratorIterator::LEAVES_ONLY - ); - - foreach ($it as $file) { - if (!preg_match('/\.phpt$/', $file)) continue; - $fullCode = file_get_contents($file); - if (!preg_match('/--FILE--\R(.*?)\R--([_A-Z]+)--/s', $fullCode, $matches)) continue; - $code = $matches[1]; - if (strlen($code) > $maxLen) continue; - - $outFile = str_replace($testDir, '', $file); - $outFile = str_replace('/', '_', $outFile); - if (!preg_match('/SKIP_SLOW_TESTS|SKIP_PERF_SENSITIVE|USE_ZEND_ALLOC/', $fullCode)) { - file_put_contents($corpusDir . '/' . $outFile, $code); - } - } -} +generate_corpus_from_phpt($corpusDir, $testDirs); From 831a2b3c3d64406eb80022a664aa71533cc86886 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 22 Sep 2021 12:48:52 +0200 Subject: [PATCH 0095/1346] Disable custom execute_ex during function JIT fuzzing as well Having zend_execute_ex set is normally not a problem for the function JIT, but there is an edge case leak due to special RELEASE_THIS handling during generator creation. As this is an unsupported mode of operation, reset to the original handler for the function jit fuzzer as well. --- sapi/fuzzer/fuzzer-function-jit.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapi/fuzzer/fuzzer-function-jit.c b/sapi/fuzzer/fuzzer-function-jit.c index 0c4cd0f918f61..61c70a311b7cd 100644 --- a/sapi/fuzzer/fuzzer-function-jit.c +++ b/sapi/fuzzer/fuzzer-function-jit.c @@ -38,8 +38,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { steps_left = MAX_STEPS; zend_alter_ini_entry_chars(jit_option, "function", sizeof("function")-1, PHP_INI_USER, PHP_INI_STAGE_RUNTIME); + zend_execute_ex = orig_execute_ex; fuzzer_do_request_from_buffer( FILE_NAME, (const char *) Data, Size, /* execute */ 1, opcache_invalidate); + zend_execute_ex = fuzzer_execute_ex; } zend_string_release(jit_option); From b7409d3a634c013a3581981cb162a56f4b41c481 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 22 Sep 2021 12:58:20 +0200 Subject: [PATCH 0096/1346] Disable chdir in execute fuzzers We don't want the current working directory to change during fuzzing, as that breaks corpus access unless an absolute path is used. I'm not sure why this issue never came up before. --- sapi/fuzzer/fuzzer-sapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fuzzer/fuzzer-sapi.c b/sapi/fuzzer/fuzzer-sapi.c index 7f019b4452cbf..a9d2ce89a8b6e 100644 --- a/sapi/fuzzer/fuzzer-sapi.c +++ b/sapi/fuzzer/fuzzer-sapi.c @@ -47,7 +47,7 @@ const char HARDCODED_INI[] = "open_basedir=/tmp\n" "disable_functions=dl,mail,mb_send_mail" ",shell_exec,exec,system,proc_open,popen,passthru,pcntl_exec" - ",chgrp,chmod,chown,copy,file_put_contents,lchgrp,lchown,link,mkdir" + ",chdir,chgrp,chmod,chown,copy,file_put_contents,lchgrp,lchown,link,mkdir" ",move_uploaded_file,rename,rmdir,symlink,tempname,touch,unlink,fopen" /* Networking code likes to wait and wait. */ ",fsockopen,pfsockopen" From 5c13587aadc3733b9d43659b81b5feed13eb8eca Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Wed, 22 Sep 2021 18:58:51 +0100 Subject: [PATCH 0097/1346] Remove php_mysqli_persistent_helper_once (#7507) --- ext/mysqli/mysqli.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 7379c89754483..6e8bc2081053e 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -827,23 +827,6 @@ PHP_RINIT_FUNCTION(mysqli) } /* }}} */ -#if defined(A0) && defined(MYSQLI_USE_MYSQLND) -static void php_mysqli_persistent_helper_for_every(void *p) -{ - mysqlnd_end_psession((MYSQLND *) p); -} /* }}} */ - - -static int php_mysqli_persistent_helper_once(zend_rsrc_list_entry *le) -{ - if (le->type == php_le_pmysqli()) { - mysqli_plist_entry *plist = (mysqli_plist_entry *) le->ptr; - zend_ptr_stack_apply(&plist->free_links, php_mysqli_persistent_helper_for_every); - } - return ZEND_HASH_APPLY_KEEP; -} /* }}} */ -#endif - /* {{{ PHP_RSHUTDOWN_FUNCTION */ PHP_RSHUTDOWN_FUNCTION(mysqli) @@ -856,10 +839,7 @@ PHP_RSHUTDOWN_FUNCTION(mysqli) if (MyG(error_msg)) { efree(MyG(error_msg)); } -#if defined(A0) && defined(MYSQLI_USE_MYSQLND) - /* psession is being called when the connection is freed - explicitly or implicitly */ - zend_hash_apply(&EG(persistent_list), (apply_func_t) php_mysqli_persistent_helper_once); -#endif + return SUCCESS; } /* }}} */ From 40aa6b63d1074d6cb4e648f3da61defa1781f8c4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 23 Sep 2021 13:11:21 +0200 Subject: [PATCH 0098/1346] Further limit max input size in parser fuzzer It's easy to cause stack overflows with degenerate cases like "$$$$$x" repeated thousands of times. We have no interest in addressing these. Make the input size smaller to hopefully avoid these stack overflows. --- sapi/fuzzer/fuzzer-parser.c | 4 ++-- sapi/fuzzer/generate_parser_corpus.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sapi/fuzzer/fuzzer-parser.c b/sapi/fuzzer/fuzzer-parser.c index 55669c70c02d3..427720a1dcad9 100644 --- a/sapi/fuzzer/fuzzer-parser.c +++ b/sapi/fuzzer/fuzzer-parser.c @@ -26,8 +26,8 @@ #include "fuzzer-sapi.h" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { - if (Size > 32 * 1024) { - /* Large inputs have a large impact on fuzzer performance, + if (Size > 7 * 1024) { + /* Large inputs have a large impact on fuzzer performance and may cause stack overflows, * but are unlikely to be necessary to reach new codepaths. */ return 0; } diff --git a/sapi/fuzzer/generate_parser_corpus.php b/sapi/fuzzer/generate_parser_corpus.php index 699c1219014b7..308c4fdee3069 100644 --- a/sapi/fuzzer/generate_parser_corpus.php +++ b/sapi/fuzzer/generate_parser_corpus.php @@ -9,7 +9,7 @@ $corpusDir = __DIR__ . '/corpus/parser'; @mkdir($corpusDir); -$maxLen = 32 * 1024; +$maxLen = 7 * 1024; foreach ($it as $file) { if (!preg_match('/\.phpt$/', $file)) continue; $code = file_get_contents($file); From ac34648cf6bf5493a8cd1a4c9a82406599f3f25c Mon Sep 17 00:00:00 2001 From: Mahmood Dhia Date: Wed, 17 Mar 2021 12:23:33 +0100 Subject: [PATCH 0099/1346] Fix DATE_FORMAT_COOKIE definition In all of http://curl.haxx.se/rfc/cookie_spec.html, https://docs.microsoft.com/de-de/windows/win32/wininet/http-cookies and https://tools.ietf.org/html/rfc7234#section-5.3 the cookie datetime is specified as Mon, DD-Mon-YYYY HH:MM:SS GMT. However, the current definition returns Monday, DD-Mon-YYY HH:MM:SS GMT. Therefore, the "l" in "l, d-M-Y H:i:s T" must be changed to "D". Closes GH-6783. --- UPGRADING | 4 ++++ ext/date/php_date.c | 2 +- ext/date/tests/DateTime_format_basic2.phpt | 2 +- ext/date/tests/bug52063.phpt | 4 ++-- ext/date/tests/date_constants.phpt | 4 ++-- ext/date/tests/gmdate_variation13.phpt | 2 +- ext/date/tests/test-parse-from-format.phpt | 4 ++-- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/UPGRADING b/UPGRADING index 850bc2e13b13d..dcdfb29b0d6b2 100644 --- a/UPGRADING +++ b/UPGRADING @@ -19,6 +19,10 @@ PHP 8.2 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== +- Datetime: + . DateTime::COOKIE has been changed from "l, d-M-Y H:i:s T" to + "D, d-M-Y H:i:s T" in line with IETF RFC 7234 section 5.3. + ======================================== 2. New Features ======================================== diff --git a/ext/date/php_date.c b/ext/date/php_date.c index f11357691e2a8..7d480a1fec72d 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -375,7 +375,7 @@ ZEND_MODULE_POST_ZEND_DEACTIVATE_D(date) * http://msdn.microsoft.com/en-us/library/windows/desktop/aa384321%28v=vs.85%29.aspx * and http://curl.haxx.se/rfc/cookie_spec.html */ -#define DATE_FORMAT_COOKIE "l, d-M-Y H:i:s T" +#define DATE_FORMAT_COOKIE "D, d-M-Y H:i:s T" #define SUNFUNCS_RET_TIMESTAMP 0 #define SUNFUNCS_RET_STRING 1 diff --git a/ext/date/tests/DateTime_format_basic2.phpt b/ext/date/tests/DateTime_format_basic2.phpt index df38cf44c44c6..7c843485da184 100644 --- a/ext/date/tests/DateTime_format_basic2.phpt +++ b/ext/date/tests/DateTime_format_basic2.phpt @@ -24,7 +24,7 @@ var_dump( $date->format( DateTime::W3C) ) ; --EXPECT-- *** Testing date_format() : basic functionality - formatting coinstants *** string(25) "2005-07-14T22:30:41+01:00" -string(34) "Thursday, 14-Jul-2005 22:30:41 BST" +string(29) "Thu, 14-Jul-2005 22:30:41 BST" string(24) "2005-07-14T22:30:41+0100" string(29) "Thu, 14 Jul 05 22:30:41 +0100" string(32) "Thursday, 14-Jul-05 22:30:41 BST" diff --git a/ext/date/tests/bug52063.phpt b/ext/date/tests/bug52063.phpt index 9818c88ce7b80..86900cd5dbe1b 100644 --- a/ext/date/tests/bug52063.phpt +++ b/ext/date/tests/bug52063.phpt @@ -11,5 +11,5 @@ echo $a->format(DateTime::COOKIE); echo "\n"; ?> --EXPECT-- -Thursday, 01-Jan-2009 00:00:00 WET -Thursday, 01-Jan-2009 00:00:00 WET +Thu, 01-Jan-2009 00:00:00 WET +Thu, 01-Jan-2009 00:00:00 WET diff --git a/ext/date/tests/date_constants.phpt b/ext/date/tests/date_constants.phpt index 043b6b45cd8cd..f8c50d4f5e909 100644 --- a/ext/date/tests/date_constants.phpt +++ b/ext/date/tests/date_constants.phpt @@ -41,8 +41,8 @@ Date constants --EXPECT-- string(25) "2006-07-01T14:27:30+02:00" string(25) "2006-05-30T14:32:13+02:00" -string(35) "Saturday, 01-Jul-2006 14:27:30 CEST" -string(34) "Tuesday, 30-May-2006 14:32:13 CEST" +string(30) "Sat, 01-Jul-2006 14:27:30 CEST" +string(30) "Tue, 30-May-2006 14:32:13 CEST" string(24) "2006-07-01T14:27:30+0200" string(24) "2006-05-30T14:32:13+0200" string(29) "Sat, 01 Jul 06 14:27:30 +0200" diff --git a/ext/date/tests/gmdate_variation13.phpt b/ext/date/tests/gmdate_variation13.phpt index c8ded47ee4499..90b52d360687e 100644 --- a/ext/date/tests/gmdate_variation13.phpt +++ b/ext/date/tests/gmdate_variation13.phpt @@ -39,7 +39,7 @@ string(25) "2008-08-08T08:08:08+00:00" string(%d) "%s" --DATE_COOKIE Constant-- -string(32) "Friday, 08-Aug-2008 08:08:08 GMT" +string(29) "Fri, 08-Aug-2008 08:08:08 GMT" string(%d) "%s" --DATE_RFC822 Constant-- diff --git a/ext/date/tests/test-parse-from-format.phpt b/ext/date/tests/test-parse-from-format.phpt index 670a316859371..5c1376ec62c75 100644 --- a/ext/date/tests/test-parse-from-format.phpt +++ b/ext/date/tests/test-parse-from-format.phpt @@ -32,8 +32,8 @@ object(DateTime)#2 (3) { string(6) "+02:00" } -string(16) "l, d-M-Y H:i:s T" -string(38) "Tuesday, 08-Jul-2008 22:14:12 GMT+0200" +string(16) "D, d-M-Y H:i:s T" +string(34) "Tue, 08-Jul-2008 22:14:12 GMT+0200" object(DateTime)#1 (3) { ["date"]=> string(26) "2008-07-08 22:14:12.000000" From b732b6d06fab96c7875d31d94588b3b1057124b9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 23 Sep 2021 16:42:24 +0200 Subject: [PATCH 0100/1346] Try to fetch opcache.so path relative to binary While the cwd-relative lookup worked for the oss-fuzz docker images, it doesn't seem to work on the cluster infrastructure. Try finding opcache.so relative to the binary instead. --- sapi/fuzzer/fuzzer-execute-common.h | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index 97e90fb7e8a22..2a9bcc03bcf00 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -126,7 +126,18 @@ ZEND_ATTRIBUTE_UNUSED static void opcache_invalidate(void) { } ZEND_ATTRIBUTE_UNUSED char *get_opcache_path(void) { - // TODO: Make this more general. - char *opcache_path = "modules/opcache.so"; - return realpath(opcache_path, NULL); + /* Try relative to cwd. */ + char *p = realpath("modules/opcache.so", NULL); + if (p) { + return p; + } + + /* Try relative to binary location. */ + char path[MAXPATHLEN]; + if (readlink("/proc/self/exe", path, sizeof(path)) < 0) { + ZEND_ASSERT(0 && "Failed to get binary path"); + return NULL; + } + strlcat(path, "/modules/opcache.so", sizeof(path)); + return realpath(path, NULL); } From 498674058c7c77e5e7d86c00c20b39f530a8b801 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 09:38:08 +0200 Subject: [PATCH 0101/1346] Remove zend_binary_zval_strcasecmp() APIs These are thin wrappers ... around the wrong functions. They call the "_l()" version of the underlying APIs. For clarify, just call the wrapped API directly. --- UPGRADING.INTERNALS | 5 +++++ Zend/zend_operators.c | 14 -------------- Zend/zend_operators.h | 2 -- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 18a6239410e0f..b5d6f0be53d90 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -10,6 +10,11 @@ PHP 8.2 INTERNALS UPGRADE NOTES 1. Internal API changes ======================== +* Removed zend_binary_zval_str(n)casecmp() APIs. These were thin wrappers + around zend_binary_str(n)casecmp_l() -- rather than + zend_binary_str(n)casecmp() as one would expect. Call the appropriate + wrapped function directly instead. + ======================== 2. Build system changes ======================== diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index f1846030b94bf..a6488e532920f 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -79,8 +79,6 @@ static const unsigned char tolower_map[256] = { * Functions using locale lowercase: zend_binary_strncasecmp_l zend_binary_strcasecmp_l - zend_binary_zval_strcasecmp - zend_binary_zval_strncasecmp string_compare_function_ex string_case_compare_function * Functions using ascii lowercase: @@ -2919,18 +2917,6 @@ ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3 } /* }}} */ -ZEND_API int ZEND_FASTCALL zend_binary_zval_strcasecmp(zval *s1, zval *s2) /* {{{ */ -{ - return zend_binary_strcasecmp_l(Z_STRVAL_P(s1), Z_STRLEN_P(s1), Z_STRVAL_P(s2), Z_STRLEN_P(s2)); -} -/* }}} */ - -ZEND_API int ZEND_FASTCALL zend_binary_zval_strncasecmp(zval *s1, zval *s2, zval *s3) /* {{{ */ -{ - return zend_binary_strncasecmp_l(Z_STRVAL_P(s1), Z_STRLEN_P(s1), Z_STRVAL_P(s2), Z_STRLEN_P(s2), Z_LVAL_P(s3)); -} -/* }}} */ - ZEND_API bool ZEND_FASTCALL zendi_smart_streq(zend_string *s1, zend_string *s2) /* {{{ */ { zend_uchar ret1, ret2; diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 5610d34dedb3b..c92456fb1a385 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -443,8 +443,6 @@ ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, boo ZEND_API int ZEND_FASTCALL zend_binary_zval_strcmp(zval *s1, zval *s2); ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3); -ZEND_API int ZEND_FASTCALL zend_binary_zval_strcasecmp(zval *s1, zval *s2); -ZEND_API int ZEND_FASTCALL zend_binary_zval_strncasecmp(zval *s1, zval *s2, zval *s3); ZEND_API int ZEND_FASTCALL zend_binary_strcmp(const char *s1, size_t len1, const char *s2, size_t len2); ZEND_API int ZEND_FASTCALL zend_binary_strncmp(const char *s1, size_t len1, const char *s2, size_t len2, size_t length); ZEND_API int ZEND_FASTCALL zend_binary_strcasecmp(const char *s1, size_t len1, const char *s2, size_t len2); From 1487dd03bc19c0c55ab4271558922df1306c647c Mon Sep 17 00:00:00 2001 From: "git@k47.cz" Date: Mon, 20 Sep 2021 23:34:37 +0200 Subject: [PATCH 0102/1346] Speed up SQLite3Result::fetchArray() by caching column names Closes GH-7505. --- ext/sqlite3/php_sqlite3_structs.h | 5 +++ ext/sqlite3/sqlite3.c | 43 ++++++++++++++++++-- ext/sqlite3/tests/sqlite3_rename_column.phpt | 36 ++++++++++++++++ 3 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 ext/sqlite3/tests/sqlite3_rename_column.phpt diff --git a/ext/sqlite3/php_sqlite3_structs.h b/ext/sqlite3/php_sqlite3_structs.h index cec32691e2ff0..15cb8a8cb303d 100644 --- a/ext/sqlite3/php_sqlite3_structs.h +++ b/ext/sqlite3/php_sqlite3_structs.h @@ -107,6 +107,11 @@ struct _php_sqlite3_result_object { php_sqlite3_stmt *stmt_obj; zval stmt_obj_zval; + /* Cache of column names to speed up repeated fetchArray(SQLITE3_ASSOC) calls. + * Cache is cleared on reset() and finalize() calls. */ + int column_count; + zend_string **column_names; + int is_prepared_statement; zend_object zo; }; diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index 007eef7a744ab..55ebf911e94d4 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -586,6 +586,8 @@ PHP_METHOD(SQLite3, query) result = Z_SQLITE3_RESULT_P(return_value); result->db_obj = db_obj; result->stmt_obj = stmt_obj; + result->column_names = NULL; + result->column_count = -1; ZVAL_OBJ(&result->stmt_obj_zval, Z_OBJ(stmt)); return_code = sqlite3_step(result->stmt_obj->stmt); @@ -1792,6 +1794,8 @@ PHP_METHOD(SQLite3Stmt, execute) result->is_prepared_statement = 1; result->db_obj = stmt_obj->db_obj; result->stmt_obj = stmt_obj; + result->column_names = NULL; + result->column_count = -1; ZVAL_OBJ_COPY(&result->stmt_obj_zval, Z_OBJ_P(object)); break; @@ -1945,11 +1949,25 @@ PHP_METHOD(SQLite3Result, fetchArray) RETURN_FALSE; } + if (result_obj->column_count == -1) { + result_obj->column_count = sqlite3_column_count(result_obj->stmt_obj->stmt); + } + + int n_cols = result_obj->column_count; + + /* Cache column names to speed up repeated fetchArray calls. */ + if (mode & PHP_SQLITE3_ASSOC && !result_obj->column_names) { + result_obj->column_names = emalloc(n_cols * sizeof(zend_string*)); + + for (int i = 0; i < n_cols; i++) { + const char *column = sqlite3_column_name(result_obj->stmt_obj->stmt, i); + result_obj->column_names[i] = zend_string_init(column, strlen(column), 0); + } + } + array_init(return_value); - - int column_count = sqlite3_data_count(result_obj->stmt_obj->stmt); - for (i = 0; i < column_count; i++) { + for (i = 0; i < n_cols; i++) { zval data; sqlite_value_to_zval(result_obj->stmt_obj->stmt, i, &data); @@ -1964,7 +1982,7 @@ PHP_METHOD(SQLite3Result, fetchArray) Z_ADDREF(data); } } - add_assoc_zval(return_value, (char*)sqlite3_column_name(result_obj->stmt_obj->stmt, i), &data); + zend_symtable_add_new(Z_ARR_P(return_value), result_obj->column_names[i], &data); } } break; @@ -1979,6 +1997,17 @@ PHP_METHOD(SQLite3Result, fetchArray) } /* }}} */ +static void sqlite3result_clear_column_names_cache(php_sqlite3_result *result) { + if (result->column_names) { + for (int i = 0; i < result->column_count; i++) { + zend_string_release(result->column_names[i]); + } + efree(result->column_names); + } + result->column_names = NULL; + result->column_count = -1; +} + /* {{{ Resets the result set back to the first row. */ PHP_METHOD(SQLite3Result, reset) { @@ -1990,6 +2019,8 @@ PHP_METHOD(SQLite3Result, reset) SQLITE3_CHECK_INITIALIZED(result_obj->db_obj, result_obj->stmt_obj->initialised, SQLite3Result) + sqlite3result_clear_column_names_cache(result_obj); + if (sqlite3_reset(result_obj->stmt_obj->stmt) != SQLITE_OK) { RETURN_FALSE; } @@ -2009,6 +2040,8 @@ PHP_METHOD(SQLite3Result, finalize) SQLITE3_CHECK_INITIALIZED(result_obj->db_obj, result_obj->stmt_obj->initialised, SQLite3Result) + sqlite3result_clear_column_names_cache(result_obj); + /* We need to finalize an internal statement */ if (result_obj->is_prepared_statement == 0) { zend_llist_del_element(&(result_obj->db_obj->free_list), &result_obj->stmt_obj_zval, @@ -2235,6 +2268,8 @@ static void php_sqlite3_result_object_free_storage(zend_object *object) /* {{{ * return; } + sqlite3result_clear_column_names_cache(intern); + if (!Z_ISNULL(intern->stmt_obj_zval)) { if (intern->stmt_obj && intern->stmt_obj->initialised) { sqlite3_reset(intern->stmt_obj->stmt); diff --git a/ext/sqlite3/tests/sqlite3_rename_column.phpt b/ext/sqlite3/tests/sqlite3_rename_column.phpt new file mode 100644 index 0000000000000..6b4e23bc7186b --- /dev/null +++ b/ext/sqlite3/tests/sqlite3_rename_column.phpt @@ -0,0 +1,36 @@ +--TEST-- +SQLite3 - rename column while SQLite3Result is open +--EXTENSIONS-- +sqlite3 +--SKIPIF-- + +--FILE-- +exec('CREATE TABLE tbl (orig text)'); +$db->exec('insert into tbl values ("one"), ("two")'); + +$res1 = $db->prepare('select * from tbl')->execute(); +$res2 = $db->prepare('select * from tbl')->execute(); + +var_dump(array_key_first($res1->fetchArray(SQLITE3_ASSOC))); +var_dump(array_key_first($res2->fetchArray(SQLITE3_ASSOC))); + +$db->exec('alter table tbl rename column orig to changed'); + +$res1->reset(); +var_dump(array_key_first($res1->fetchArray(SQLITE3_ASSOC))); +var_dump(array_key_first($res2->fetchArray(SQLITE3_ASSOC))); + +?> +--EXPECT-- +string(4) "orig" +string(4) "orig" +string(7) "changed" +string(4) "orig" From 644710eef01153d6fcf84c513f230c4aaaf33449 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 12:02:25 +0200 Subject: [PATCH 0103/1346] Remove unused flags from spl_heap_it Which makes it equivalent to just zend_user_iterator, so drop the wrapper entirely. --- ext/spl/spl_heap.c | 51 ++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 5f38df97943cc..bb874e47dc828 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -73,12 +73,6 @@ struct _spl_heap_object { zend_object std; }; -/* define an overloaded iterator structure */ -struct _spl_heap_it { - zend_user_iterator intern; - int flags; -}; - typedef struct _spl_pqueue_elem { zval data; zval priority; @@ -892,10 +886,8 @@ PHP_METHOD(SplMaxHeap, compare) static void spl_heap_it_dtor(zend_object_iterator *iter) /* {{{ */ { - spl_heap_it *iterator = (spl_heap_it *)iter; - zend_user_it_invalidate_current(iter); - zval_ptr_dtor(&iterator->intern.it.data); + zval_ptr_dtor(&iter->data); } /* }}} */ @@ -1102,52 +1094,39 @@ static const zend_object_iterator_funcs spl_pqueue_it_funcs = { zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ { - spl_heap_it *iterator; - spl_heap_object *heap_object = Z_SPLHEAP_P(object); - if (by_ref) { zend_throw_error(NULL, "An iterator cannot be used with foreach by reference"); return NULL; } - iterator = emalloc(sizeof(spl_heap_it)); + zend_user_iterator *iterator = emalloc(sizeof(zend_user_iterator)); + zend_iterator_init(&iterator->it); - zend_iterator_init(&iterator->intern.it); + ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object)); + iterator->it.funcs = &spl_heap_it_funcs; + iterator->ce = ce; + ZVAL_UNDEF(&iterator->value); - Z_ADDREF_P(object); - ZVAL_OBJ(&iterator->intern.it.data, Z_OBJ_P(object)); - iterator->intern.it.funcs = &spl_heap_it_funcs; - iterator->intern.ce = ce; - iterator->flags = heap_object->flags; - ZVAL_UNDEF(&iterator->intern.value); - - return &iterator->intern.it; + return &iterator->it; } /* }}} */ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ { - spl_heap_it *iterator; - spl_heap_object *heap_object = Z_SPLHEAP_P(object); - if (by_ref) { zend_throw_error(NULL, "An iterator cannot be used with foreach by reference"); return NULL; } - iterator = emalloc(sizeof(spl_heap_it)); - - zend_iterator_init((zend_object_iterator*)iterator); - - Z_ADDREF_P(object); - ZVAL_OBJ(&iterator->intern.it.data, Z_OBJ_P(object)); - iterator->intern.it.funcs = &spl_pqueue_it_funcs; - iterator->intern.ce = ce; - iterator->flags = heap_object->flags; + zend_user_iterator *iterator = emalloc(sizeof(zend_user_iterator)); + zend_iterator_init(&iterator->it); - ZVAL_UNDEF(&iterator->intern.value); + ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object)); + iterator->it.funcs = &spl_pqueue_it_funcs; + iterator->ce = ce; + ZVAL_UNDEF(&iterator->value); - return &iterator->intern.it; + return &iterator->it; } /* }}} */ From 3fd252e374de9e40f3c4115ce31564d47dc62105 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 12:18:21 +0200 Subject: [PATCH 0104/1346] Remove unnecessary zend_user_iterator use in spl_dllist_it We don't make use of any functionality of zend_user_iterator, a plain zend_object_iterator will do. --- ext/spl/spl_dllist.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index f83d43446e684..893f81325baf1 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -91,7 +91,7 @@ struct _spl_dllist_object { /* define an overloaded iterator structure */ struct _spl_dllist_it { - zend_user_iterator intern; + zend_object_iterator intern; spl_ptr_llist_element *traverse_pointer; int traverse_position; int flags; @@ -817,8 +817,7 @@ static void spl_dllist_it_dtor(zend_object_iterator *iter) /* {{{ */ SPL_LLIST_CHECK_DELREF(iterator->traverse_pointer); - zend_user_it_invalidate_current(iter); - zval_ptr_dtor(&iterator->intern.it.data); + zval_ptr_dtor(&iterator->intern.data); } /* }}} */ @@ -917,8 +916,6 @@ static void spl_dllist_it_move_forward(zend_object_iterator *iter) /* {{{ */ spl_dllist_it *iterator = (spl_dllist_it *)iter; spl_dllist_object *object = Z_SPLDLLIST_P(&iter->data); - zend_user_it_invalidate_current(iter); - spl_dllist_it_helper_move_forward(&iterator->traverse_pointer, &iterator->traverse_position, object->llist, iterator->flags); } /* }}} */ @@ -1237,7 +1234,6 @@ static const zend_object_iterator_funcs spl_dllist_it_funcs = { zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ { - spl_dllist_it *iterator; spl_dllist_object *dllist_object = Z_SPLDLLIST_P(object); if (by_ref) { @@ -1245,21 +1241,19 @@ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object return NULL; } - iterator = emalloc(sizeof(spl_dllist_it)); + spl_dllist_it *iterator = emalloc(sizeof(spl_dllist_it)); - zend_iterator_init((zend_object_iterator*)iterator); + zend_iterator_init(&iterator->intern); - ZVAL_OBJ_COPY(&iterator->intern.it.data, Z_OBJ_P(object)); - iterator->intern.it.funcs = &spl_dllist_it_funcs; - iterator->intern.ce = ce; + ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object)); + iterator->intern.funcs = &spl_dllist_it_funcs; iterator->traverse_position = dllist_object->traverse_position; iterator->traverse_pointer = dllist_object->traverse_pointer; iterator->flags = dllist_object->flags & SPL_DLLIST_IT_MASK; - ZVAL_UNDEF(&iterator->intern.value); SPL_LLIST_CHECK_ADDREF(iterator->traverse_pointer); - return &iterator->intern.it; + return &iterator->intern; } /* }}} */ From 4448934820ddc51224c92c5f046d0024ca7f96f8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 12:40:46 +0200 Subject: [PATCH 0105/1346] Don't mark SplFixedArray as REUSE_GET_ITERATOR This flag only has an effect (or use) for Iterators, not for IteratorAggregates. Removing the confusing flag. --- ext/spl/spl_fixedarray.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 0fd5717224bec..b147a84d366e9 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -887,7 +887,6 @@ PHP_MINIT_FUNCTION(spl_fixedarray) zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_countable, php_json_serializable_ce); spl_ce_SplFixedArray->create_object = spl_fixedarray_new; spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator; - spl_ce_SplFixedArray->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; memcpy(&spl_handler_SplFixedArray, &std_object_handlers, sizeof(zend_object_handlers)); From 088e5478029f7b3482a9c5ae2b06b77772b92480 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 14:40:46 +0200 Subject: [PATCH 0106/1346] Fix FileSystemIterator without SKIP_DOTS There were two separate bugs here: * The get_iterator implementation did not match the Iterator implementation. In particular, get_iterator did not respect SKIP_DOTS. * The constructor did not honor an explicitly omitted SKIP_DOTS flag. It could still be unset through setFlags() though. --- ext/spl/spl_directory.c | 18 ++++------ .../filesystemiterator_no_skip_dots.phpt | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 ext/spl/tests/filesystemiterator_no_skip_dots.phpt diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 72e6d00c43c8d..866f53b4a1404 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -706,22 +706,16 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto spl_filesystem_object *intern; zend_string *path; int parsed; - zend_long flags; + zend_long flags = (ctor_flags & ~DIT_CTOR_FLAGS); zend_error_handling error_handling; if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_FLAGS)) { - flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO; + flags |= SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO; parsed = zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &path, &flags); } else { - flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF; + flags |= SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF; parsed = zend_parse_parameters(ZEND_NUM_ARGS(), "P", &path); } - if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_SKIPDOTS)) { - flags |= SPL_FILE_DIR_SKIPDOTS; - } - if (SPL_HAS_FLAG(ctor_flags, SPL_FILE_DIR_UNIXPATHS)) { - flags |= SPL_FILE_DIR_UNIXPATHS; - } if (parsed == FAILURE) { RETURN_THROWS(); } @@ -1763,11 +1757,12 @@ static void spl_filesystem_tree_it_move_forward(zend_object_iterator *iter) { spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator); + bool skip_dots = SPL_HAS_FLAG(object->flags, SPL_FILE_DIR_SKIPDOTS); object->u.dir.index++; do { spl_filesystem_dir_read(object); - } while (spl_filesystem_is_dot(object->u.dir.entry.d_name)); + } while (skip_dots && spl_filesystem_is_dot(object->u.dir.entry.d_name)); if (object->file_name) { zend_string_release(object->file_name); object->file_name = NULL; @@ -1784,6 +1779,7 @@ static void spl_filesystem_tree_it_rewind(zend_object_iterator *iter) { spl_filesystem_iterator *iterator = (spl_filesystem_iterator *)iter; spl_filesystem_object *object = spl_filesystem_iterator_to_object(iterator); + bool skip_dots = SPL_HAS_FLAG(object->flags, SPL_FILE_DIR_SKIPDOTS); object->u.dir.index = 0; if (object->u.dir.dirp) { @@ -1791,7 +1787,7 @@ static void spl_filesystem_tree_it_rewind(zend_object_iterator *iter) } do { spl_filesystem_dir_read(object); - } while (spl_filesystem_is_dot(object->u.dir.entry.d_name)); + } while (skip_dots && spl_filesystem_is_dot(object->u.dir.entry.d_name)); if (!Z_ISUNDEF(iterator->current)) { zval_ptr_dtor(&iterator->current); ZVAL_UNDEF(&iterator->current); diff --git a/ext/spl/tests/filesystemiterator_no_skip_dots.phpt b/ext/spl/tests/filesystemiterator_no_skip_dots.phpt new file mode 100644 index 0000000000000..f04bd59268b65 --- /dev/null +++ b/ext/spl/tests/filesystemiterator_no_skip_dots.phpt @@ -0,0 +1,33 @@ +--TEST-- +FileSystemIterator without SKIP_DOTS +--FILE-- +getFileName(); +} +sort($files); +var_dump($files); + +?> +--CLEAN-- + +--EXPECT-- +array(3) { + [0]=> + string(1) "." + [1]=> + string(2) ".." + [2]=> + string(4) "file" +} From d0dbf7296bef841d3c5c4d871a716b425ebdbb99 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 12:52:37 +0200 Subject: [PATCH 0107/1346] Initialize iterator_funcs_ptr upfront Same as we do for the IteratorAggregate case, initialize the Iterator methods upfront. This is preparation for an upcoming change to automatically determine whether get_iterator can be reused in a child class, in the same way we already do for IteratorAggregate. --- Zend/zend_interfaces.c | 31 +++++++++++++++++++++++-------- ext/spl/spl_array.c | 7 ------- ext/spl/spl_observer.c | 12 ++++++------ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 54a2d61c38c29..c972234049598 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -124,10 +124,9 @@ ZEND_API int zend_user_it_valid(zend_object_iterator *_iter) zend_user_iterator *iter = (zend_user_iterator*)_iter; zval *object = &iter->it.data; zval more; - bool result; - zend_call_method_with_0_params(Z_OBJ_P(object), iter->ce, &iter->ce->iterator_funcs_ptr->zf_valid, "valid", &more); - result = i_zend_is_true(&more); + zend_call_known_instance_method_with_0_params(iter->ce->iterator_funcs_ptr->zf_valid, Z_OBJ_P(object), &more); + bool result = i_zend_is_true(&more); zval_ptr_dtor(&more); return result ? SUCCESS : FAILURE; } @@ -142,7 +141,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter) zval *object = &iter->it.data; if (Z_ISUNDEF(iter->value)) { - zend_call_method_with_0_params(Z_OBJ_P(object), iter->ce, &iter->ce->iterator_funcs_ptr->zf_current, "current", &iter->value); + zend_call_known_instance_method_with_0_params(iter->ce->iterator_funcs_ptr->zf_current, Z_OBJ_P(object), &iter->value); } return &iter->value; } @@ -153,7 +152,7 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke { zend_user_iterator *iter = (zend_user_iterator*)_iter; zval *object = &iter->it.data; - zend_call_method_with_0_params(Z_OBJ_P(object), iter->ce, &iter->ce->iterator_funcs_ptr->zf_key, "key", key); + zend_call_known_instance_method_with_0_params(iter->ce->iterator_funcs_ptr->zf_key, Z_OBJ_P(object), key); if (UNEXPECTED(Z_ISREF_P(key))) { zend_unwrap_reference(key); } @@ -167,7 +166,7 @@ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter) zval *object = &iter->it.data; zend_user_it_invalidate_current(_iter); - zend_call_method_with_0_params(Z_OBJ_P(object), iter->ce, &iter->ce->iterator_funcs_ptr->zf_next, "next", NULL); + zend_call_known_instance_method_with_0_params(iter->ce->iterator_funcs_ptr->zf_next, Z_OBJ_P(object), NULL); } /* }}} */ @@ -178,7 +177,7 @@ ZEND_API void zend_user_it_rewind(zend_object_iterator *_iter) zval *object = &iter->it.data; zend_user_it_invalidate_current(_iter); - zend_call_method_with_0_params(Z_OBJ_P(object), iter->ce, &iter->ce->iterator_funcs_ptr->zf_rewind, "rewind", NULL); + zend_call_known_instance_method_with_0_params(iter->ce->iterator_funcs_ptr->zf_rewind, Z_OBJ_P(object), NULL); } /* }}} */ @@ -317,6 +316,16 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry ZSTR_VAL(class_type->name)); } + zend_function *zf_rewind = zend_hash_str_find_ptr( + &class_type->function_table, "rewind", sizeof("rewind") - 1); + zend_function *zf_valid = zend_hash_str_find_ptr( + &class_type->function_table, "valid", sizeof("valid") - 1); + zend_function *zf_key = zend_hash_str_find_ptr( + &class_type->function_table, "key", sizeof("key") - 1); + zend_function *zf_current = zend_hash_str_find_ptr( + &class_type->function_table, "current", sizeof("current") - 1); + zend_function *zf_next = zend_hash_str_find_ptr( + &class_type->function_table, "next", sizeof("next") - 1); if (class_type->get_iterator && class_type->get_iterator != zend_user_it_get_iterator) { if (!class_type->parent || class_type->parent->get_iterator != class_type->get_iterator) { /* get_iterator was explicitly assigned for an internal class. */ @@ -337,9 +346,15 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry zend_class_iterator_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS ? pemalloc(sizeof(zend_class_iterator_funcs), 1) : zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs)); - memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); class_type->iterator_funcs_ptr = funcs_ptr; + memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); + funcs_ptr->zf_rewind = zf_rewind; + funcs_ptr->zf_valid = zf_valid; + funcs_ptr->zf_key = zf_key; + funcs_ptr->zf_current = zf_current; + funcs_ptr->zf_next = zf_next; + return SUCCESS; } /* }}} */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index ce169123c62b1..167d1941ecce9 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -234,13 +234,6 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o if (intern->std.handlers == &spl_handler_ArrayIterator) { zend_class_iterator_funcs *funcs_ptr = class_type->iterator_funcs_ptr; - if (!funcs_ptr->zf_current) { - funcs_ptr->zf_rewind = zend_hash_str_find_ptr(&class_type->function_table, "rewind", sizeof("rewind") - 1); - funcs_ptr->zf_valid = zend_hash_str_find_ptr(&class_type->function_table, "valid", sizeof("valid") - 1); - funcs_ptr->zf_key = zend_hash_str_find_ptr(&class_type->function_table, "key", sizeof("key") - 1); - funcs_ptr->zf_current = zend_hash_str_find_ptr(&class_type->function_table, "current", sizeof("current") - 1); - funcs_ptr->zf_next = zend_hash_str_find_ptr(&class_type->function_table, "next", sizeof("next") - 1); - } if (inherited) { if (funcs_ptr->zf_rewind->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_REWIND; if (funcs_ptr->zf_valid->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_VALID; diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 61b258b9bdf00..be826b2f06d4d 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -1017,7 +1017,7 @@ PHP_METHOD(MultipleIterator, rewind) zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos); while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) { zend_object *it = element->obj; - zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_rewind, "rewind", NULL); + zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_rewind, it, NULL); zend_hash_move_forward_ex(&intern->storage, &intern->pos); } } @@ -1038,7 +1038,7 @@ PHP_METHOD(MultipleIterator, next) zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos); while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) { zend_object *it = element->obj; - zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_next, "next", NULL); + zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_next, it, NULL); zend_hash_move_forward_ex(&intern->storage, &intern->pos); } } @@ -1067,7 +1067,7 @@ PHP_METHOD(MultipleIterator, valid) zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos); while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) { zend_object *it = element->obj; - zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_valid, "valid", &retval); + zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_valid, it, &retval); if (!Z_ISUNDEF(retval)) { valid = (Z_TYPE(retval) == IS_TRUE); @@ -1105,7 +1105,7 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_ zend_hash_internal_pointer_reset_ex(&intern->storage, &intern->pos); while ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) != NULL && !EG(exception)) { zend_object *it = element->obj; - zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_valid, "valid", &retval); + zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_valid, it, &retval); if (!Z_ISUNDEF(retval)) { valid = Z_TYPE(retval) == IS_TRUE; @@ -1116,9 +1116,9 @@ static void spl_multiple_iterator_get_all(spl_SplObjectStorage *intern, int get_ if (valid) { if (SPL_MULTIPLE_ITERATOR_GET_ALL_CURRENT == get_type) { - zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_current, "current", &retval); + zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_current, it, &retval); } else { - zend_call_method_with_0_params(it, it->ce, &it->ce->iterator_funcs_ptr->zf_key, "key", &retval); + zend_call_known_instance_method_with_0_params(it->ce->iterator_funcs_ptr->zf_key, it, &retval); } if (Z_ISUNDEF(retval)) { zend_throw_exception(spl_ce_RuntimeException, "Failed to call sub iterator method", 0); From 15bbf6f3377e6446e88300b9c5383179091fe270 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 13:11:11 +0200 Subject: [PATCH 0108/1346] Automatically determine whether to reuse get_iterator() Same as with the IteratorAggregate case, allow reusing get_iterator if none of the Iterator methods are overridden. Drop the REUSE_GET_ITERATOR flag that previously allowed ArrayIterator to opt-in to unconditional get_iterator reuse, and drop the override handling it did, in favor of the automated approach. --- Zend/tests/foreach_004.phpt | 65 ----------------- Zend/zend_compile.h | 5 +- Zend/zend_interfaces.c | 17 +++-- ext/spl/spl_array.c | 72 +++---------------- ext/spl/tests/bug54281.phpt | 5 +- ...iveIteratorIterator_endchildren_error.phpt | 5 +- 6 files changed, 24 insertions(+), 145 deletions(-) delete mode 100644 Zend/tests/foreach_004.phpt diff --git a/Zend/tests/foreach_004.phpt b/Zend/tests/foreach_004.phpt deleted file mode 100644 index afb98a9988137..0000000000000 --- a/Zend/tests/foreach_004.phpt +++ /dev/null @@ -1,65 +0,0 @@ ---TEST-- -Iterator exceptions in foreach by reference ---FILE-- -trap = $trap; - } - - function trap($trap) { - if ($trap === $this->trap) { - throw new Exception($trap); - } - } - - function rewind(): void {$this->trap(__FUNCTION__); parent::rewind();} - function valid(): bool {$this->trap(__FUNCTION__); return parent::valid();} - function key(): string|int|null { $this->trap(__FUNCTION__); return parent::key(); } - function next(): void {$this->trap(__FUNCTION__); parent::next();} -} - -foreach(['rewind', 'valid', 'key', 'next'] as $trap) { - $obj = new IT($trap); - try { - // IS_CV - foreach ($obj as $key => &$val) echo "$val\n"; - } catch (Exception $e) { - echo $e->getMessage() . "\n"; - } - unset($obj); - - try { - // IS_VAR - foreach (new IT($trap) as $key => &$val) echo "$val\n"; - } catch (Exception $e) { - echo $e->getMessage() . "\n"; - } - - try { - // IS_TMP_VAR - foreach ((object)new IT($trap) as $key => &$val) echo "$val\n"; - } catch (Exception $e) { - echo $e->getMessage() . "\n"; - } -} -?> ---EXPECT-- -rewind -rewind -rewind -valid -valid -valid -key -key -key -0 -next -0 -next -0 -next diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 462fc3f7c0276..90ce5504499b8 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -240,7 +240,7 @@ typedef struct _zend_oparray_context { /* or IS_CONSTANT_VISITED_MARK | | | */ #define ZEND_CLASS_CONST_IS_CASE (1 << 6) /* | | | X */ /* | | | */ -/* Class Flags (unused: 15,21,30,31) | | | */ +/* Class Flags (unused: 15,16,21,30,31) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -269,9 +269,6 @@ typedef struct _zend_oparray_context { /* User class has methods with static variables | | | */ #define ZEND_HAS_STATIC_IN_METHODS (1 << 14) /* X | | | */ /* | | | */ -/* Children must reuse parent get_iterator() | | | */ -#define ZEND_ACC_REUSE_GET_ITERATOR (1 << 16) /* X | | | */ -/* | | | */ /* Parent class is resolved (CE). | | | */ #define ZEND_ACC_RESOLVED_PARENT (1 << 17) /* X | | | */ /* | | | */ diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index c972234049598..595bc3924ffe4 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -332,20 +332,23 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry ZEND_ASSERT(class_type->type == ZEND_INTERNAL_CLASS); return SUCCESS; } - /* Otherwise get_iterator was inherited from the parent by default. */ - } - if (class_type->parent && (class_type->parent->ce_flags & ZEND_ACC_REUSE_GET_ITERATOR)) { - /* Keep the inherited get_iterator handler. */ - class_type->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; - } else { - class_type->get_iterator = zend_user_it_get_iterator; + /* None of the Iterator methods have been overwritten, use inherited get_iterator(). */ + if (zf_rewind->common.scope != class_type && zf_valid->common.scope != class_type && + zf_key->common.scope != class_type && zf_current->common.scope != class_type && + zf_next->common.scope != class_type) { + return SUCCESS; + } + + /* One of the Iterator methods has been overwritten, + * switch to zend_user_it_get_new_iterator. */ } ZEND_ASSERT(!class_type->iterator_funcs_ptr && "Iterator funcs already set?"); zend_class_iterator_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS ? pemalloc(sizeof(zend_class_iterator_funcs), 1) : zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs)); + class_type->get_iterator = zend_user_it_get_iterator; class_type->iterator_funcs_ptr = funcs_ptr; memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 167d1941ecce9..0fa34b3d40428 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -44,11 +44,6 @@ PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator; #define SPL_ARRAY_STD_PROP_LIST 0x00000001 #define SPL_ARRAY_ARRAY_AS_PROPS 0x00000002 #define SPL_ARRAY_CHILD_ARRAYS_ONLY 0x00000004 -#define SPL_ARRAY_OVERLOADED_REWIND 0x00010000 -#define SPL_ARRAY_OVERLOADED_VALID 0x00020000 -#define SPL_ARRAY_OVERLOADED_KEY 0x00040000 -#define SPL_ARRAY_OVERLOADED_CURRENT 0x00080000 -#define SPL_ARRAY_OVERLOADED_NEXT 0x00100000 #define SPL_ARRAY_IS_SELF 0x01000000 #define SPL_ARRAY_USE_OTHER 0x02000000 #define SPL_ARRAY_INT_MASK 0xFFFF0000 @@ -229,19 +224,6 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o intern->fptr_count = NULL; } } - /* Cache iterator functions if ArrayIterator or derived. Check current's */ - /* cache since only current is always required */ - if (intern->std.handlers == &spl_handler_ArrayIterator) { - zend_class_iterator_funcs *funcs_ptr = class_type->iterator_funcs_ptr; - - if (inherited) { - if (funcs_ptr->zf_rewind->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_REWIND; - if (funcs_ptr->zf_valid->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_VALID; - if (funcs_ptr->zf_key->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_KEY; - if (funcs_ptr->zf_current->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_CURRENT; - if (funcs_ptr->zf_next->common.scope != parent) intern->ar_flags |= SPL_ARRAY_OVERLOADED_NEXT; - } - } intern->ht_iter = (uint32_t)-1; return &intern->std; @@ -952,12 +934,7 @@ static int spl_array_it_valid(zend_object_iterator *iter) /* {{{ */ { spl_array_object *object = Z_SPLARRAY_P(&iter->data); HashTable *aht = spl_array_get_hash_table(object); - - if (object->ar_flags & SPL_ARRAY_OVERLOADED_VALID) { - return zend_user_it_valid(iter); - } else { - return zend_hash_has_more_elements_ex(aht, spl_array_get_pos_ptr(aht, object)); - } + return zend_hash_has_more_elements_ex(aht, spl_array_get_pos_ptr(aht, object)); } /* }}} */ @@ -965,16 +942,11 @@ static zval *spl_array_it_get_current_data(zend_object_iterator *iter) /* {{{ */ { spl_array_object *object = Z_SPLARRAY_P(&iter->data); HashTable *aht = spl_array_get_hash_table(object); - - if (object->ar_flags & SPL_ARRAY_OVERLOADED_CURRENT) { - return zend_user_it_get_current_data(iter); - } else { - zval *data = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, object)); - if (data && Z_TYPE_P(data) == IS_INDIRECT) { - data = Z_INDIRECT_P(data); - } - return data; + zval *data = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, object)); + if (data && Z_TYPE_P(data) == IS_INDIRECT) { + data = Z_INDIRECT_P(data); } + return data; } /* }}} */ @@ -982,12 +954,7 @@ static void spl_array_it_get_current_key(zend_object_iterator *iter, zval *key) { spl_array_object *object = Z_SPLARRAY_P(&iter->data); HashTable *aht = spl_array_get_hash_table(object); - - if (object->ar_flags & SPL_ARRAY_OVERLOADED_KEY) { - zend_user_it_get_current_key(iter, key); - } else { - zend_hash_get_current_key_zval_ex(aht, key, spl_array_get_pos_ptr(aht, object)); - } + zend_hash_get_current_key_zval_ex(aht, key, spl_array_get_pos_ptr(aht, object)); } /* }}} */ @@ -995,13 +962,8 @@ static void spl_array_it_move_forward(zend_object_iterator *iter) /* {{{ */ { spl_array_object *object = Z_SPLARRAY_P(&iter->data); HashTable *aht = spl_array_get_hash_table(object); - - if (object->ar_flags & SPL_ARRAY_OVERLOADED_NEXT) { - zend_user_it_move_forward(iter); - } else { - zend_user_it_invalidate_current(iter); - spl_array_next_ex(object, aht); - } + zend_user_it_invalidate_current(iter); + spl_array_next_ex(object, aht); } /* }}} */ @@ -1021,13 +983,8 @@ static void spl_array_rewind(spl_array_object *intern) /* {{{ */ static void spl_array_it_rewind(zend_object_iterator *iter) /* {{{ */ { spl_array_object *object = Z_SPLARRAY_P(&iter->data); - - if (object->ar_flags & SPL_ARRAY_OVERLOADED_REWIND) { - zend_user_it_rewind(iter); - } else { zend_user_it_invalidate_current(iter); spl_array_rewind(object); - } } /* }}} */ @@ -1099,16 +1056,7 @@ static const zend_object_iterator_funcs spl_array_it_funcs = { zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ { - zend_user_iterator *iterator; - spl_array_object *array_object = Z_SPLARRAY_P(object); - - if (by_ref && (array_object->ar_flags & SPL_ARRAY_OVERLOADED_CURRENT)) { - zend_throw_error(NULL, "An iterator cannot be used with foreach by reference"); - return NULL; - } - - iterator = emalloc(sizeof(zend_user_iterator)); - + zend_user_iterator *iterator = emalloc(sizeof(zend_user_iterator)); zend_iterator_init(&iterator->it); ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object)); @@ -1864,7 +1812,6 @@ PHP_MINIT_FUNCTION(spl_array) spl_ce_ArrayIterator = register_class_ArrayIterator(spl_ce_SeekableIterator, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable); spl_ce_ArrayIterator->create_object = spl_array_object_new; spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; - spl_ce_ArrayIterator->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); @@ -1877,7 +1824,6 @@ PHP_MINIT_FUNCTION(spl_array) spl_ce_RecursiveArrayIterator = register_class_RecursiveArrayIterator(spl_ce_ArrayIterator, spl_ce_RecursiveIterator); spl_ce_RecursiveArrayIterator->create_object = spl_array_object_new; spl_ce_RecursiveArrayIterator->get_iterator = spl_array_get_iterator; - spl_ce_RecursiveArrayIterator->ce_flags |= ZEND_ACC_REUSE_GET_ITERATOR; REGISTER_SPL_CLASS_CONST_LONG(RecursiveArrayIterator, "CHILD_ARRAYS_ONLY", SPL_ARRAY_CHILD_ARRAYS_ONLY); diff --git a/ext/spl/tests/bug54281.phpt b/ext/spl/tests/bug54281.phpt index a2dbcd74476f0..f2ac782e41ead 100644 --- a/ext/spl/tests/bug54281.phpt +++ b/ext/spl/tests/bug54281.phpt @@ -12,8 +12,7 @@ foreach($it as $k=>$v) { } ?> --EXPECTF-- -Fatal error: Uncaught Error: The object is in an invalid state as the parent constructor was not called in %s:%d +Fatal error: Uncaught Error: Object is not initialized in %s:%d Stack trace: -#0 %s%ebug54281.php(8): RecursiveIteratorIterator->rewind() -#1 {main} +#0 {main} thrown in %s%ebug54281.php on line 8 diff --git a/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt b/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt index 7f9f9411dd98b..13af7ce01986d 100644 --- a/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt +++ b/ext/spl/tests/recursiveIteratorIterator_endchildren_error.phpt @@ -36,7 +36,6 @@ foreach ($recItIt2 as $val) echo "$val\n"; Fatal error: Uncaught Exception in %s Stack trace: -#0 [internal function]: MyRecursiveIteratorIterator->endchildren() -#1 %s: RecursiveIteratorIterator->next() -#2 {main} +#0 %s(%d): MyRecursiveIteratorIterator->endchildren() +#1 {main} thrown in %s on line %d From f13c22fbfb76c0a6af05bfed2a64d32c053e66d7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 15:12:55 +0200 Subject: [PATCH 0109/1346] Remove unnecessary zend_user_iterator use in spl_array We no longer use any functionality of zend_user_iterator here. --- ext/spl/spl_array.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 0fa34b3d40428..8a429fdf3f8bc 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -925,7 +925,6 @@ static int spl_array_next(spl_array_object *intern) /* {{{ */ static void spl_array_it_dtor(zend_object_iterator *iter) /* {{{ */ { - zend_user_it_invalidate_current(iter); zval_ptr_dtor(&iter->data); } /* }}} */ @@ -962,7 +961,6 @@ static void spl_array_it_move_forward(zend_object_iterator *iter) /* {{{ */ { spl_array_object *object = Z_SPLARRAY_P(&iter->data); HashTable *aht = spl_array_get_hash_table(object); - zend_user_it_invalidate_current(iter); spl_array_next_ex(object, aht); } /* }}} */ @@ -983,8 +981,7 @@ static void spl_array_rewind(spl_array_object *intern) /* {{{ */ static void spl_array_it_rewind(zend_object_iterator *iter) /* {{{ */ { spl_array_object *object = Z_SPLARRAY_P(&iter->data); - zend_user_it_invalidate_current(iter); - spl_array_rewind(object); + spl_array_rewind(object); } /* }}} */ @@ -1056,15 +1053,13 @@ static const zend_object_iterator_funcs spl_array_it_funcs = { zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref) /* {{{ */ { - zend_user_iterator *iterator = emalloc(sizeof(zend_user_iterator)); - zend_iterator_init(&iterator->it); + zend_object_iterator *iterator = emalloc(sizeof(zend_object_iterator)); + zend_iterator_init(iterator); - ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object)); - iterator->it.funcs = &spl_array_it_funcs; - iterator->ce = ce; - ZVAL_UNDEF(&iterator->value); + ZVAL_OBJ_COPY(&iterator->data, Z_OBJ_P(object)); + iterator->funcs = &spl_array_it_funcs; - return &iterator->it; + return iterator; } /* }}} */ From 0eb5c1a01871c00948610e8d4249b89bf1dce079 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 16:02:43 +0200 Subject: [PATCH 0110/1346] Update test expectation The new output is correct, though the fix here was rather accidental. We still need a proper fix for bug #78308 on earlier branches, but for now update the test to make the build green again. --- .../tests/breakiter_getPartsIterator_var1.phpt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/intl/tests/breakiter_getPartsIterator_var1.phpt b/ext/intl/tests/breakiter_getPartsIterator_var1.phpt index dd6fff8045172..26e91f68a2513 100644 --- a/ext/intl/tests/breakiter_getPartsIterator_var1.phpt +++ b/ext/intl/tests/breakiter_getPartsIterator_var1.phpt @@ -33,24 +33,24 @@ array(5) { array(5) { [0]=> string(3) "foo" - [4]=> + [3]=> string(1) " " - [5]=> + [4]=> string(3) "bar" - [8]=> + [7]=> string(1) " " - [9]=> + [8]=> string(3) "tao" } array(5) { [3]=> string(3) "foo" - [5]=> + [4]=> string(1) " " - [8]=> + [7]=> string(3) "bar" - [9]=> + [8]=> string(1) " " - [12]=> + [11]=> string(3) "tao" } From a12aee5cb3e9820513da6565fcae8c082e2bd35f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 24 Sep 2021 16:22:39 +0200 Subject: [PATCH 0111/1346] Fix opcache path determination, again We shouldn't be appending to the executable path, but rather to the directory of the executable. --- sapi/fuzzer/fuzzer-execute-common.h | 7 +++++++ sapi/fuzzer/fuzzer-function-jit.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index 2a9bcc03bcf00..cc1df1a12fc6b 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -138,6 +138,13 @@ ZEND_ATTRIBUTE_UNUSED char *get_opcache_path(void) { ZEND_ASSERT(0 && "Failed to get binary path"); return NULL; } + + /* Get basename. */ + char *last_sep = strrchr(path, '/'); + if (last_sep) { + *last_sep = '\0'; + } + strlcat(path, "/modules/opcache.so", sizeof(path)); return realpath(path, NULL); } diff --git a/sapi/fuzzer/fuzzer-function-jit.c b/sapi/fuzzer/fuzzer-function-jit.c index 61c70a311b7cd..c637bcfa608f6 100644 --- a/sapi/fuzzer/fuzzer-function-jit.c +++ b/sapi/fuzzer/fuzzer-function-jit.c @@ -53,7 +53,7 @@ int LLVMFuzzerInitialize(int *argc, char ***argv) { char *opcache_path = get_opcache_path(); assert(opcache_path && "Failed to determine opcache path"); - char ini_buf[256]; + char ini_buf[512]; snprintf(ini_buf, sizeof(ini_buf), "zend_extension=%s\n" "opcache.validate_timestamps=0\n" From 1553dfaf428a67a61e3bede5e0426baa22994a57 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 27 Sep 2021 16:45:53 +0200 Subject: [PATCH 0112/1346] Avoid __zend_malloc() wrapper in tracked_malloc() oss-fuzz currently coalesces all leaks into one issue, presumably because the five lowest stack frames always look the same. Let's see whether dropping the __zend_malloc() frame helps. --- Zend/zend_alloc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 6af234b4d75a8..aa0fe9fad5908 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2708,6 +2708,12 @@ ZEND_API void shutdown_memory_manager(bool silent, bool full_shutdown) zend_mm_shutdown(AG(mm_heap), full_shutdown, silent); } +static ZEND_COLD ZEND_NORETURN void zend_out_of_memory(void) +{ + fprintf(stderr, "Out of memory\n"); + exit(1); +} + #if ZEND_MM_CUSTOM static zend_always_inline void tracked_add(zend_mm_heap *heap, void *ptr, size_t size) { zval size_zv; @@ -2743,7 +2749,11 @@ static void *tracked_malloc(size_t size) zend_mm_heap *heap = AG(mm_heap); tracked_check_limit(heap, size); - void *ptr = __zend_malloc(size); + void *ptr = malloc(size); + if (!ptr) { + zend_out_of_memory(); + } + tracked_add(heap, ptr, size); heap->size += size; return ptr; @@ -3032,12 +3042,6 @@ ZEND_API zend_mm_heap *zend_mm_startup_ex(const zend_mm_handlers *handlers, void #endif } -static ZEND_COLD ZEND_NORETURN void zend_out_of_memory(void) -{ - fprintf(stderr, "Out of memory\n"); - exit(1); -} - ZEND_API void * __zend_malloc(size_t len) { void *tmp = malloc(len); From 83697aa95e1d3eefe7bbc4da5e77d899be091be2 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Mon, 27 Sep 2021 21:16:23 +0100 Subject: [PATCH 0113/1346] fpm allow to ptrace/make the the process dumpable for FreeBSD. (#7375) --- sapi/fpm/config.m4 | 13 +++++++++++++ sapi/fpm/fpm/fpm_unix.c | 11 +++++++++++ sapi/fpm/www.conf.in | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index 7c2fdec122028..af6cae8ca957a 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -25,6 +25,18 @@ AC_DEFUN([AC_FPM_PRCTL], ]) ]) +AC_DEFUN([AC_FPM_PROCCTL], +[ + AC_MSG_CHECKING([for procctl]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[procctl(0, 0, 0, 0);]])], [ + AC_DEFINE([HAVE_PROCCTL], 1, [do we have procctl?]) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) +]) + AC_DEFUN([AC_FPM_CLOCK], [ have_clock_gettime=no @@ -494,6 +506,7 @@ if test "$PHP_FPM" != "no"; then AC_FPM_STDLIBS AC_FPM_PRCTL + AC_FPM_PROCCTL AC_FPM_CLOCK AC_FPM_TRACE AC_FPM_BUILTIN_ATOMIC diff --git a/sapi/fpm/fpm/fpm_unix.c b/sapi/fpm/fpm/fpm_unix.c index 02893b1d49872..acf38ce660d67 100644 --- a/sapi/fpm/fpm/fpm_unix.c +++ b/sapi/fpm/fpm/fpm_unix.c @@ -15,6 +15,10 @@ #include #endif +#ifdef HAVE_PROCCTL +#include +#endif + #ifdef HAVE_APPARMOR #include #endif @@ -409,6 +413,13 @@ int fpm_unix_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ } #endif +#ifdef HAVE_PROCCTL + int dumpable = PROC_TRACE_CTL_ENABLE; + if (wp->config->process_dumpable && -1 == procctl(P_PID, getpid(), PROC_TRACE_CTL, &dumpable)) { + zlog(ZLOG_SYSERROR, "[pool %s] failed to procctl(PROC_TRACE_CTL)", wp->config->name); + } +#endif + if (0 > fpm_clock_init()) { return -1; } diff --git a/sapi/fpm/www.conf.in b/sapi/fpm/www.conf.in index d13b60067fb38..d01753283e947 100644 --- a/sapi/fpm/www.conf.in +++ b/sapi/fpm/www.conf.in @@ -70,7 +70,8 @@ listen = 127.0.0.1:9000 ; Default Value: no set ; process.priority = -19 -; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; Set the process dumpable flag (PR_SET_DUMPABLE prctl for Linux or +; PROC_TRACE_CTL procctl for FreeBSD) even if the process user ; or group is different than the master process user. It allows to create process ; core dump and ptrace the process for the pool user. ; Default Value: no From 1441271f18bcadcaf4c192654b06e70d475dfec9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 28 Sep 2021 09:43:13 +0200 Subject: [PATCH 0114/1346] Don't use else after return in php_string_tolower() --- ext/standard/string.c | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 8a223b72f4e33..3614e94baceab 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1421,36 +1421,32 @@ PHPAPI char *php_strtolower(char *s, size_t len) /* {{{ php_string_tolower */ PHPAPI zend_string *php_string_tolower(zend_string *s) { - unsigned char *c; - const unsigned char *e; - if (EXPECTED(!BG(ctype_string))) { return zend_string_tolower(s); - } else { - c = (unsigned char *)ZSTR_VAL(s); - e = c + ZSTR_LEN(s); + } - while (c < e) { - if (isupper(*c)) { - unsigned char *r; - zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0); + unsigned char *c = (unsigned char *)ZSTR_VAL(s); + const unsigned char *e = c + ZSTR_LEN(s); + while (c < e) { + if (isupper(*c)) { + unsigned char *r; + zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0); - if (c != (unsigned char*)ZSTR_VAL(s)) { - memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s)); - } - r = c + (ZSTR_VAL(res) - ZSTR_VAL(s)); - while (c < e) { - *r = tolower(*c); - r++; - c++; - } - *r = '\0'; - return res; + if (c != (unsigned char*)ZSTR_VAL(s)) { + memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s)); + } + r = c + (ZSTR_VAL(res) - ZSTR_VAL(s)); + while (c < e) { + *r = tolower(*c); + r++; + c++; } - c++; + *r = '\0'; + return res; } - return zend_string_copy(s); + c++; } + return zend_string_copy(s); } /* }}} */ From 83fccc68d7b400257cf4d098528e8b36022f2741 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 28 Sep 2021 12:16:22 +0200 Subject: [PATCH 0115/1346] Consistently set bailed_out flag It was not set for some of the bailouts, resulting in timeouts in the function JIT fuzzer. Fixes oss-fuzz #39293. --- sapi/fuzzer/fuzzer-execute-common.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index cc1df1a12fc6b..16834e303835f 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -30,13 +30,17 @@ static bool bailed_out = false; * we can assume that we don't use global registers / hybrid VM. */ typedef int (ZEND_FASTCALL *opcode_handler_t)(zend_execute_data *); +static zend_always_inline void fuzzer_bailout(void) { + bailed_out = true; + zend_bailout(); +} + static zend_always_inline void fuzzer_step(void) { if (--steps_left == 0) { /* Reset steps before bailing out, so code running after bailout (e.g. in * destructors) will get another MAX_STEPS, rather than UINT32_MAX steps. */ steps_left = MAX_STEPS; - bailed_out = true; - zend_bailout(); + fuzzer_bailout(); } } @@ -61,7 +65,7 @@ static zend_op_array *(*orig_compile_string)(zend_string *source_string, const c static zend_op_array *fuzzer_compile_string(zend_string *str, const char *filename) { if (ZSTR_LEN(str) > MAX_SIZE) { /* Avoid compiling huge inputs via eval(). */ - zend_bailout(); + fuzzer_bailout(); } return orig_compile_string(str, filename); @@ -78,7 +82,7 @@ static void fuzzer_execute_internal(zend_execute_data *execute_data, zval *retur * Limit the maximum size of string inputs. */ zval *arg = ZEND_CALL_VAR_NUM(execute_data, i); if (Z_TYPE_P(arg) == IS_STRING && Z_STRLEN_P(arg) > MAX_SIZE) { - zend_bailout(); + fuzzer_bailout(); } } From 9d8f97d58d90225c825d314c30ce7c2cf8f2a421 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 29 Sep 2021 09:22:17 +0200 Subject: [PATCH 0116/1346] Revert "Fix DATE_FORMAT_COOKIE definition" This reverts commit ac34648cf6bf5493a8cd1a4c9a82406599f3f25c. As pointed out on GH-6783, the new format doesn't match any of the specified formats. Previously the constant generated Thursday, 14-Jul-2005 22:30:41 BST which is obsolete. Now it generates Thu, 14-Jul-2005 22:30:41 BST which is not specified at all. The correct version would be: Thu, 14 Jul 2005 22:30:41 BST Reverting the change for now. --- UPGRADING | 4 ---- ext/date/php_date.c | 2 +- ext/date/tests/DateTime_format_basic2.phpt | 2 +- ext/date/tests/bug52063.phpt | 4 ++-- ext/date/tests/date_constants.phpt | 4 ++-- ext/date/tests/gmdate_variation13.phpt | 2 +- ext/date/tests/test-parse-from-format.phpt | 4 ++-- 7 files changed, 9 insertions(+), 13 deletions(-) diff --git a/UPGRADING b/UPGRADING index dcdfb29b0d6b2..850bc2e13b13d 100644 --- a/UPGRADING +++ b/UPGRADING @@ -19,10 +19,6 @@ PHP 8.2 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== -- Datetime: - . DateTime::COOKIE has been changed from "l, d-M-Y H:i:s T" to - "D, d-M-Y H:i:s T" in line with IETF RFC 7234 section 5.3. - ======================================== 2. New Features ======================================== diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 7d480a1fec72d..f11357691e2a8 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -375,7 +375,7 @@ ZEND_MODULE_POST_ZEND_DEACTIVATE_D(date) * http://msdn.microsoft.com/en-us/library/windows/desktop/aa384321%28v=vs.85%29.aspx * and http://curl.haxx.se/rfc/cookie_spec.html */ -#define DATE_FORMAT_COOKIE "D, d-M-Y H:i:s T" +#define DATE_FORMAT_COOKIE "l, d-M-Y H:i:s T" #define SUNFUNCS_RET_TIMESTAMP 0 #define SUNFUNCS_RET_STRING 1 diff --git a/ext/date/tests/DateTime_format_basic2.phpt b/ext/date/tests/DateTime_format_basic2.phpt index 7c843485da184..df38cf44c44c6 100644 --- a/ext/date/tests/DateTime_format_basic2.phpt +++ b/ext/date/tests/DateTime_format_basic2.phpt @@ -24,7 +24,7 @@ var_dump( $date->format( DateTime::W3C) ) ; --EXPECT-- *** Testing date_format() : basic functionality - formatting coinstants *** string(25) "2005-07-14T22:30:41+01:00" -string(29) "Thu, 14-Jul-2005 22:30:41 BST" +string(34) "Thursday, 14-Jul-2005 22:30:41 BST" string(24) "2005-07-14T22:30:41+0100" string(29) "Thu, 14 Jul 05 22:30:41 +0100" string(32) "Thursday, 14-Jul-05 22:30:41 BST" diff --git a/ext/date/tests/bug52063.phpt b/ext/date/tests/bug52063.phpt index 86900cd5dbe1b..9818c88ce7b80 100644 --- a/ext/date/tests/bug52063.phpt +++ b/ext/date/tests/bug52063.phpt @@ -11,5 +11,5 @@ echo $a->format(DateTime::COOKIE); echo "\n"; ?> --EXPECT-- -Thu, 01-Jan-2009 00:00:00 WET -Thu, 01-Jan-2009 00:00:00 WET +Thursday, 01-Jan-2009 00:00:00 WET +Thursday, 01-Jan-2009 00:00:00 WET diff --git a/ext/date/tests/date_constants.phpt b/ext/date/tests/date_constants.phpt index f8c50d4f5e909..043b6b45cd8cd 100644 --- a/ext/date/tests/date_constants.phpt +++ b/ext/date/tests/date_constants.phpt @@ -41,8 +41,8 @@ Date constants --EXPECT-- string(25) "2006-07-01T14:27:30+02:00" string(25) "2006-05-30T14:32:13+02:00" -string(30) "Sat, 01-Jul-2006 14:27:30 CEST" -string(30) "Tue, 30-May-2006 14:32:13 CEST" +string(35) "Saturday, 01-Jul-2006 14:27:30 CEST" +string(34) "Tuesday, 30-May-2006 14:32:13 CEST" string(24) "2006-07-01T14:27:30+0200" string(24) "2006-05-30T14:32:13+0200" string(29) "Sat, 01 Jul 06 14:27:30 +0200" diff --git a/ext/date/tests/gmdate_variation13.phpt b/ext/date/tests/gmdate_variation13.phpt index 90b52d360687e..c8ded47ee4499 100644 --- a/ext/date/tests/gmdate_variation13.phpt +++ b/ext/date/tests/gmdate_variation13.phpt @@ -39,7 +39,7 @@ string(25) "2008-08-08T08:08:08+00:00" string(%d) "%s" --DATE_COOKIE Constant-- -string(29) "Fri, 08-Aug-2008 08:08:08 GMT" +string(32) "Friday, 08-Aug-2008 08:08:08 GMT" string(%d) "%s" --DATE_RFC822 Constant-- diff --git a/ext/date/tests/test-parse-from-format.phpt b/ext/date/tests/test-parse-from-format.phpt index 5c1376ec62c75..670a316859371 100644 --- a/ext/date/tests/test-parse-from-format.phpt +++ b/ext/date/tests/test-parse-from-format.phpt @@ -32,8 +32,8 @@ object(DateTime)#2 (3) { string(6) "+02:00" } -string(16) "D, d-M-Y H:i:s T" -string(34) "Tue, 08-Jul-2008 22:14:12 GMT+0200" +string(16) "l, d-M-Y H:i:s T" +string(38) "Tuesday, 08-Jul-2008 22:14:12 GMT+0200" object(DateTime)#1 (3) { ["date"]=> string(26) "2008-07-08 22:14:12.000000" From da0c70508e9bdf9e82af4e8eb5fed977e2dad33f Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Wed, 29 Sep 2021 17:37:40 +1000 Subject: [PATCH 0117/1346] Add upper case functions to zend_operators.c and use them (#7521) Add a family of upper case conversion functions to zend_operators.c, by analogy with the lower case functions. Move the single-character conversion macros to the header so that they can be used as a locale-independent replacement for tolower() and toupper(). Factor out the ugly bits of the SSE2 case conversion so that the four functions that use it are easy to read and processor-independent. Use the new ASCII upper case functions in ext/xml, ext/pdo_dblib and as an optimization for strtoupper() when the locale is "C". --- Zend/zend_operators.c | 216 +++++++++++++++++--- Zend/zend_operators.h | 12 ++ ext/pdo_dblib/dblib_stmt.c | 2 +- ext/standard/string.c | 3 + ext/standard/tests/strings/strtolower.phpt | 18 ++ ext/standard/tests/strings/strtoupper1.phpt | 17 ++ ext/xml/xml.c | 2 +- 7 files changed, 236 insertions(+), 34 deletions(-) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index a6488e532920f..4d3fe72476988 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -54,7 +54,36 @@ static _locale_t current_locale = NULL; #define TYPE_PAIR(t1,t2) (((t1) << 4) | (t2)) -static const unsigned char tolower_map[256] = { +#if __SSE2__ +#define HAVE_BLOCKCONV + +/* Common code for SSE2 accelerated character case conversion */ + +#define BLOCKCONV_INIT_RANGE(start, end) \ + const __m128i blconv_start_minus_1 = _mm_set1_epi8((start) - 1); \ + const __m128i blconv_end_plus_1 = _mm_set1_epi8((end) + 1); + +#define BLOCKCONV_STRIDE sizeof(__m128i) + +#define BLOCKCONV_INIT_DELTA(delta) \ + const __m128i blconv_delta = _mm_set1_epi8(delta); + +#define BLOCKCONV_LOAD(input) \ + __m128i blconv_operand = _mm_loadu_si128((__m128i*)(input)); \ + __m128i blconv_gt = _mm_cmpgt_epi8(blconv_operand, blconv_start_minus_1); \ + __m128i blconv_lt = _mm_cmplt_epi8(blconv_operand, blconv_end_plus_1); \ + __m128i blconv_mingle = _mm_and_si128(blconv_gt, blconv_lt); + +#define BLOCKCONV_FOUND() _mm_movemask_epi8(blconv_mingle) + +#define BLOCKCONV_STORE(dest) \ + __m128i blconv_add = _mm_and_si128(blconv_mingle, blconv_delta); \ + __m128i blconv_result = _mm_add_epi8(blconv_operand, blconv_add); \ + _mm_storeu_si128((__m128i *)(dest), blconv_result); + +#endif /* __SSE2__ */ + +ZEND_API const unsigned char zend_tolower_map[256] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, @@ -73,7 +102,25 @@ static const unsigned char tolower_map[256] = { 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff }; -#define zend_tolower_ascii(c) (tolower_map[(unsigned char)(c)]) +ZEND_API const unsigned char zend_toupper_map[256] = { +0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, +0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, +0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, +0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, +0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f, +0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, +0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x7b,0x7c,0x7d,0x7e,0x7f, +0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, +0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, +0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf, +0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, +0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, +0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, +0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, +0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff +}; + /** * Functions using locale lowercase: @@ -2665,22 +2712,16 @@ static zend_always_inline void zend_str_tolower_impl(char *dest, const char *str unsigned char *p = (unsigned char*)str; unsigned char *q = (unsigned char*)dest; unsigned char *end = p + length; -#ifdef __SSE2__ - if (length >= 16) { - const __m128i _A = _mm_set1_epi8('A' - 1); - const __m128i Z_ = _mm_set1_epi8('Z' + 1); - const __m128i delta = _mm_set1_epi8('a' - 'A'); +#ifdef HAVE_BLOCKCONV + if (length >= BLOCKCONV_STRIDE) { + BLOCKCONV_INIT_RANGE('A', 'Z'); + BLOCKCONV_INIT_DELTA('a' - 'A'); do { - __m128i op = _mm_loadu_si128((__m128i*)p); - __m128i gt = _mm_cmpgt_epi8(op, _A); - __m128i lt = _mm_cmplt_epi8(op, Z_); - __m128i mingle = _mm_and_si128(gt, lt); - __m128i add = _mm_and_si128(mingle, delta); - __m128i lower = _mm_add_epi8(op, add); - _mm_storeu_si128((__m128i *)q, lower); - p += 16; - q += 16; - } while (p + 16 <= end); + BLOCKCONV_LOAD(p); + BLOCKCONV_STORE(q); + p += BLOCKCONV_STRIDE; + q += BLOCKCONV_STRIDE; + } while (p + BLOCKCONV_STRIDE <= end); } #endif while (p < end) { @@ -2689,6 +2730,28 @@ static zend_always_inline void zend_str_tolower_impl(char *dest, const char *str } /* }}} */ +static zend_always_inline void zend_str_toupper_impl(char *dest, const char *str, size_t length) /* {{{ */ { + unsigned char *p = (unsigned char*)str; + unsigned char *q = (unsigned char*)dest; + unsigned char *end = p + length; +#ifdef HAVE_BLOCKCONV + if (length >= BLOCKCONV_STRIDE) { + BLOCKCONV_INIT_RANGE('a', 'z'); + BLOCKCONV_INIT_DELTA('A' - 'a'); + do { + BLOCKCONV_LOAD(p); + BLOCKCONV_STORE(q); + p += BLOCKCONV_STRIDE; + q += BLOCKCONV_STRIDE; + } while (p + BLOCKCONV_STRIDE <= end); + } +#endif + while (p < end) { + *q++ = zend_toupper_ascii(*p++); + } +} +/* }}} */ + ZEND_API char* ZEND_FASTCALL zend_str_tolower_copy(char *dest, const char *source, size_t length) /* {{{ */ { zend_str_tolower_impl(dest, source, length); @@ -2697,18 +2760,39 @@ ZEND_API char* ZEND_FASTCALL zend_str_tolower_copy(char *dest, const char *sourc } /* }}} */ +ZEND_API char* ZEND_FASTCALL zend_str_toupper_copy(char *dest, const char *source, size_t length) /* {{{ */ +{ + zend_str_toupper_impl(dest, source, length); + dest[length] = '\0'; + return dest; +} +/* }}} */ + ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup(const char *source, size_t length) /* {{{ */ { return zend_str_tolower_copy((char *)emalloc(length+1), source, length); } /* }}} */ +ZEND_API char* ZEND_FASTCALL zend_str_toupper_dup(const char *source, size_t length) /* {{{ */ +{ + return zend_str_toupper_copy((char *)emalloc(length+1), source, length); +} +/* }}} */ + ZEND_API void ZEND_FASTCALL zend_str_tolower(char *str, size_t length) /* {{{ */ { zend_str_tolower_impl(str, (const char*)str, length); } /* }}} */ +ZEND_API void ZEND_FASTCALL zend_str_toupper(char *str, size_t length) /* {{{ */ +{ + zend_str_toupper_impl(str, (const char*)str, length); +} +/* }}} */ + + ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t length) /* {{{ */ { const unsigned char *p = (const unsigned char*)source; @@ -2733,38 +2817,57 @@ ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t } /* }}} */ +ZEND_API char* ZEND_FASTCALL zend_str_toupper_dup_ex(const char *source, size_t length) /* {{{ */ +{ + const unsigned char *p = (const unsigned char*)source; + const unsigned char *end = p + length; + + while (p < end) { + if (*p != zend_toupper_ascii(*p)) { + char *res = (char*)emalloc(length + 1); + unsigned char *r; + + if (p != (const unsigned char*)source) { + memcpy(res, source, p - (const unsigned char*)source); + } + r = (unsigned char*)p + (res - source); + zend_str_toupper_impl((char *)r, (const char*)p, end - p); + res[length] = '\0'; + return res; + } + p++; + } + return NULL; +} +/* }}} */ + ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, bool persistent) /* {{{ */ { size_t length = ZSTR_LEN(str); unsigned char *p = (unsigned char *) ZSTR_VAL(str); unsigned char *end = p + length; -#ifdef __SSE2__ - while (p + 16 <= end) { - const __m128i _A = _mm_set1_epi8('A' - 1); - const __m128i Z_ = _mm_set1_epi8('Z' + 1); - __m128i op = _mm_loadu_si128((__m128i*)p); - __m128i gt = _mm_cmpgt_epi8(op, _A); - __m128i lt = _mm_cmplt_epi8(op, Z_); - __m128i mingle = _mm_and_si128(gt, lt); - if (_mm_movemask_epi8(mingle)) { +#ifdef HAVE_BLOCKCONV + BLOCKCONV_INIT_RANGE('A', 'Z'); + while (p + BLOCKCONV_STRIDE <= end) { + BLOCKCONV_LOAD(p); + if (BLOCKCONV_FOUND()) { zend_string *res = zend_string_alloc(length, persistent); memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char *) ZSTR_VAL(str)); unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str)); /* Lowercase the chunk we already compared. */ - const __m128i delta = _mm_set1_epi8('a' - 'A'); - __m128i add = _mm_and_si128(mingle, delta); - __m128i lower = _mm_add_epi8(op, add); - _mm_storeu_si128((__m128i *) q, lower); + BLOCKCONV_INIT_DELTA('a' - 'A'); + BLOCKCONV_STORE(q); /* Lowercase the rest of the string. */ - p += 16; q += 16; + p += BLOCKCONV_STRIDE; + q += BLOCKCONV_STRIDE; zend_str_tolower_impl((char *) q, (const char *) p, end - p); ZSTR_VAL(res)[length] = '\0'; return res; } - p += 16; + p += BLOCKCONV_STRIDE; } #endif @@ -2787,6 +2890,55 @@ ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, boo } /* }}} */ +ZEND_API zend_string* ZEND_FASTCALL zend_string_toupper_ex(zend_string *str, bool persistent) /* {{{ */ +{ + size_t length = ZSTR_LEN(str); + unsigned char *p = (unsigned char *) ZSTR_VAL(str); + unsigned char *end = p + length; + +#ifdef HAVE_BLOCKCONV + BLOCKCONV_INIT_RANGE('a', 'z'); + while (p + BLOCKCONV_STRIDE <= end) { + BLOCKCONV_LOAD(p); + if (BLOCKCONV_FOUND()) { + zend_string *res = zend_string_alloc(length, persistent); + memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char *) ZSTR_VAL(str)); + unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str)); + + /* Uppercase the chunk we already compared. */ + BLOCKCONV_INIT_DELTA('A' - 'a'); + BLOCKCONV_STORE(q); + + /* Uppercase the rest of the string. */ + p += BLOCKCONV_STRIDE; + q += BLOCKCONV_STRIDE; + zend_str_toupper_impl((char *) q, (const char *) p, end - p); + ZSTR_VAL(res)[length] = '\0'; + return res; + } + p += BLOCKCONV_STRIDE; + } +#endif + + while (p < end) { + if (*p != zend_toupper_ascii(*p)) { + zend_string *res = zend_string_alloc(length, persistent); + memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char*) ZSTR_VAL(str)); + + unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str)); + while (p < end) { + *q++ = zend_toupper_ascii(*p++); + } + ZSTR_VAL(res)[length] = '\0'; + return res; + } + p++; + } + + return zend_string_copy(str); +} +/* }}} */ + ZEND_API int ZEND_FASTCALL zend_binary_strcmp(const char *s1, size_t len1, const char *s2, size_t len2) /* {{{ */ { int retval; diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index c92456fb1a385..a09e821373868 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -433,13 +433,25 @@ ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2); ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2); ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2); +ZEND_API extern const unsigned char zend_tolower_map[256]; +ZEND_API extern const unsigned char zend_toupper_map[256]; + +#define zend_tolower_ascii(c) (zend_tolower_map[(unsigned char)(c)]) +#define zend_toupper_ascii(c) (zend_toupper_map[(unsigned char)(c)]) + ZEND_API void ZEND_FASTCALL zend_str_tolower(char *str, size_t length); +ZEND_API void ZEND_FASTCALL zend_str_toupper(char *str, size_t length); ZEND_API char* ZEND_FASTCALL zend_str_tolower_copy(char *dest, const char *source, size_t length); +ZEND_API char* ZEND_FASTCALL zend_str_toupper_copy(char *dest, const char *source, size_t length); ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup(const char *source, size_t length); +ZEND_API char* ZEND_FASTCALL zend_str_toupper_dup(const char *source, size_t length); ZEND_API char* ZEND_FASTCALL zend_str_tolower_dup_ex(const char *source, size_t length); +ZEND_API char* ZEND_FASTCALL zend_str_toupper_dup_ex(const char *source, size_t length); ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, bool persistent); +ZEND_API zend_string* ZEND_FASTCALL zend_string_toupper_ex(zend_string *str, bool persistent); #define zend_string_tolower(str) zend_string_tolower_ex(str, 0) +#define zend_string_toupper(str) zend_string_toupper_ex(str, 0) ZEND_API int ZEND_FASTCALL zend_binary_zval_strcmp(zval *s1, zval *s2); ZEND_API int ZEND_FASTCALL zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3); diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c index 2bef466f46b00..f415a8d7f44be 100644 --- a/ext/pdo_dblib/dblib_stmt.c +++ b/ext/pdo_dblib/dblib_stmt.c @@ -438,7 +438,7 @@ static int pdo_dblib_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *zv, enum pd tmp_data_len = 36; tmp_data = safe_emalloc(tmp_data_len, sizeof(char), 1); data_len = dbconvert(NULL, SQLUNIQUE, data, data_len, SQLCHAR, (LPBYTE) tmp_data, tmp_data_len); - php_strtoupper(tmp_data, data_len); + zend_str_toupper(tmp_data, data_len); ZVAL_STRINGL(zv, tmp_data, data_len); efree(tmp_data); } else { diff --git a/ext/standard/string.c b/ext/standard/string.c index 3614e94baceab..e6a4c69a759ce 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1362,6 +1362,9 @@ PHPAPI zend_string *php_string_toupper(zend_string *s) unsigned char *c; const unsigned char *e; + if (EXPECTED(!BG(ctype_string))) { + return zend_string_toupper(s); + } c = (unsigned char *)ZSTR_VAL(s); e = c + ZSTR_LEN(s); diff --git a/ext/standard/tests/strings/strtolower.phpt b/ext/standard/tests/strings/strtolower.phpt index efea4022d05c9..37a38493ce114 100644 --- a/ext/standard/tests/strings/strtolower.phpt +++ b/ext/standard/tests/strings/strtolower.phpt @@ -41,6 +41,12 @@ $strings = array ( "ABCD\0abcdABCD", TRUE, FALSE, + + /* Check for off-by-one errors in the SSE implementation */ + "AAAAAAAAAAAAAAAAAAAA", + "ZZZZZZZZZZZZZZZZZZZZ", + "@@@@@@@@@@@@@@@@@@@@", + "[[[[[[[[[[[[[[[[[[[[", ); $count = 0; @@ -218,6 +224,18 @@ string(1) "1" -- Iteration 7 -- string(0) "" +-- Iteration 8 -- +string(20) "aaaaaaaaaaaaaaaaaaaa" + +-- Iteration 9 -- +string(20) "zzzzzzzzzzzzzzzzzzzz" + +-- Iteration 10 -- +string(20) "@@@@@@@@@@@@@@@@@@@@" + +-- Iteration 11 -- +string(20) "[[[[[[[[[[[[[[[[[[[[" + *** Testing strtolower() with two different case strings *** strings are same, with Case Insensitive *** Done *** diff --git a/ext/standard/tests/strings/strtoupper1.phpt b/ext/standard/tests/strings/strtoupper1.phpt index f0254905dc8a4..7b79f6f457be9 100644 --- a/ext/standard/tests/strings/strtoupper1.phpt +++ b/ext/standard/tests/strings/strtoupper1.phpt @@ -41,6 +41,11 @@ $strings = array ( "ABCD\0abcdABCD", TRUE, FALSE, + /* Check for off-by-one errors in the SSE implementation */ + "aaaaaaaaaaaaaaaaaaaa", + "zzzzzzzzzzzzzzzzzzzz", + "````````````````````", + "{{{{{{{{{{{{{{{{{{{{", ); $count = 0; @@ -219,6 +224,18 @@ string(1) "1" -- Iteration 7 -- string(0) "" +-- Iteration 8 -- +string(20) "AAAAAAAAAAAAAAAAAAAA" + +-- Iteration 9 -- +string(20) "ZZZZZZZZZZZZZZZZZZZZ" + +-- Iteration 10 -- +string(20) "````````````````````" + +-- Iteration 11 -- +string(20) "{{{{{{{{{{{{{{{{{{{{" + *** Testing strtoupper() with two different case strings *** strings are same, with Case Insensitive *** Done *** diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 904ad305b173e..5c73837c385a1 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -611,7 +611,7 @@ static zend_string *_xml_decode_tag(xml_parser *parser, const char *tag) str = xml_utf8_decode((const XML_Char *)tag, strlen(tag), parser->target_encoding); if (parser->case_folding) { - php_strtoupper(ZSTR_VAL(str), ZSTR_LEN(str)); + zend_str_toupper(ZSTR_VAL(str), ZSTR_LEN(str)); } return str; From f3ca0813790cffb78fa7b276651ec0a96acfa59a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 02:19:34 +0100 Subject: [PATCH 0118/1346] Refactor php_com_do_invoke() Use zend_string* Return zend_result --- ext/com_dotnet/com_com.c | 6 +++--- ext/com_dotnet/com_handlers.c | 6 +++--- ext/com_dotnet/com_saproxy.c | 8 ++++---- ext/com_dotnet/php_com_dotnet_internal.h | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 72b41a43083a9..951c9713ddf99 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -633,14 +633,14 @@ int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, return SUCCEEDED(hr) ? SUCCESS : FAILURE; } -int php_com_do_invoke(php_com_dotnet_object *obj, char *name, size_t namelen, - WORD flags, VARIANT *v, int nargs, zval *args, int allow_noarg) +zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, + WORD flags, VARIANT *v, int nargs, zval *args, bool allow_noarg) { DISPID dispid; HRESULT hr; char *msg = NULL; - hr = php_com_get_id_of_name(obj, name, namelen, &dispid); + hr = php_com_get_id_of_name(obj, ZSTR_VAL(name), ZSTR_LEN(name), &dispid); if (FAILED(hr)) { char *winerr = php_win32_error_to_msg(hr); diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index afab1dc069ba0..90fffaf2304da 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -38,8 +38,8 @@ static zval *com_property_read(zend_object *object, zend_string *member, int typ if (V_VT(&obj->v) == VT_DISPATCH) { VariantInit(&v); - res = php_com_do_invoke(obj, ZSTR_VAL(member), ZSTR_LEN(member), - DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, 0, NULL, 1); + res = php_com_do_invoke(obj, member, DISPATCH_METHOD|DISPATCH_PROPERTYGET, + &v, 0, NULL, 1); if (res == SUCCESS) { php_com_zval_from_variant(rv, &v, obj->code_page); @@ -67,7 +67,7 @@ static zval *com_property_write(zend_object *object, zend_string *member, zval * if (V_VT(&obj->v) == VT_DISPATCH) { VariantInit(&v); - if (SUCCESS == php_com_do_invoke(obj, ZSTR_VAL(member), ZSTR_LEN(member), + if (SUCCESS == php_com_do_invoke(obj, member, DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF, &v, 1, value, 0)) { VariantClear(&v); } diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index f5149b90dd2c3..6c2106d196085 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -111,8 +111,8 @@ static zval *saproxy_read_dimension(zend_object *object, zval *offset, int type, } VariantInit(&v); - res = php_com_do_invoke(proxy->obj, Z_STRVAL(proxy->indices[0]), - Z_STRLEN(proxy->indices[0]), DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, + res = php_com_do_invoke(proxy->obj, Z_STR(proxy->indices[0]), + DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, proxy->dimensions, args, 0); efree(args); @@ -228,8 +228,8 @@ static void saproxy_write_dimension(zend_object *object, zval *offset, zval *val return; } VariantInit(&v); - if (SUCCESS == php_com_do_invoke(proxy->obj, Z_STRVAL(proxy->indices[0]), - Z_STRLEN(proxy->indices[0]), DISPATCH_PROPERTYPUT, &v, proxy->dimensions + 1, + if (SUCCESS == php_com_do_invoke(proxy->obj, Z_STR(proxy->indices[0]), + DISPATCH_PROPERTYPUT, &v, proxy->dimensions + 1, args, 0)) { VariantClear(&v); } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index de5f1a5462db0..1f38bacb07f25 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -97,8 +97,8 @@ HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, char *name, size_t namelen, DISPID *dispid); int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, WORD flags, VARIANT *v, int nargs, zval *args, int silent, int allow_noarg); -int php_com_do_invoke(php_com_dotnet_object *obj, char *name, size_t namelen, - WORD flags, VARIANT *v, int nargs, zval *args, int allow_noarg); +zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, + WORD flags, VARIANT *v, int nargs, zval *args, bool allow_noarg); int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, WORD flags, VARIANT *v, int nargs, zval *args); From 3dc4863f2bda0666f023a140548b81077c7b7a49 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 02:23:39 +0100 Subject: [PATCH 0119/1346] Refactor php_com_get_id_of_name() Use zend_string* --- ext/com_dotnet/com_com.c | 18 +++++++----------- ext/com_dotnet/com_handlers.c | 4 ++-- ext/com_dotnet/php_com_dotnet_internal.h | 4 ++-- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 951c9713ddf99..b921b0ee0fcda 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -408,23 +408,19 @@ HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, } /* map an ID to a name */ -HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, char *name, - size_t namelen, DISPID *dispid) +HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, zend_string *name, + DISPID *dispid) { OLECHAR *olename; HRESULT hr; zval *tmp; - if (namelen == -1) { - namelen = strlen(name); - } - - if (obj->id_of_name_cache && NULL != (tmp = zend_hash_str_find(obj->id_of_name_cache, name, namelen))) { + if (obj->id_of_name_cache && NULL != (tmp = zend_hash_find(obj->id_of_name_cache, name))) { *dispid = (DISPID)Z_LVAL_P(tmp); return S_OK; } - olename = php_com_string_to_olestring(name, namelen, obj->code_page); + olename = php_com_string_to_olestring(ZSTR_VAL(name), ZSTR_LEN(name), obj->code_page); if (obj->typeinfo) { hr = ITypeInfo_GetIDsOfNames(obj->typeinfo, &olename, 1, dispid); @@ -451,7 +447,7 @@ HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, char *name, zend_hash_init(obj->id_of_name_cache, 2, NULL, NULL, 0); } ZVAL_LONG(&tmp, *dispid); - zend_hash_str_update(obj->id_of_name_cache, name, namelen, &tmp); + zend_hash_update(obj->id_of_name_cache, name, &tmp); } return hr; @@ -472,7 +468,7 @@ int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function * return FAILURE; } - hr = php_com_get_id_of_name(obj, f->function_name->val, f->function_name->len, &dispid); + hr = php_com_get_id_of_name(obj, f->function_name, &dispid); if (FAILED(hr)) { char *msg = NULL; @@ -640,7 +636,7 @@ zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, HRESULT hr; char *msg = NULL; - hr = php_com_get_id_of_name(obj, ZSTR_VAL(name), ZSTR_LEN(name), &dispid); + hr = php_com_get_id_of_name(obj, name, &dispid); if (FAILED(hr)) { char *winerr = php_win32_error_to_msg(hr); diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 90fffaf2304da..57518914c37d3 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -190,7 +190,7 @@ static int com_property_exists(zend_object *object, zend_string *member, int che obj = (php_com_dotnet_object*) object; if (V_VT(&obj->v) == VT_DISPATCH) { - if (SUCCEEDED(php_com_get_id_of_name(obj, ZSTR_VAL(member), ZSTR_LEN(member), &dispid))) { + if (SUCCEEDED(php_com_get_id_of_name(obj, member, &dispid))) { /* TODO: distinguish between property and method! */ return 1; } @@ -298,7 +298,7 @@ static zend_function *com_method_get(zend_object **object_ptr, zend_string *name return NULL; } - if (FAILED(php_com_get_id_of_name(obj, name->val, name->len, &dummy))) { + if (FAILED(php_com_get_id_of_name(obj, name, &dummy))) { return NULL; } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 1f38bacb07f25..7b0d93fa679bb 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -93,8 +93,8 @@ PHP_METHOD(com, __construct); HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, WORD flags, DISPPARAMS *disp_params, VARIANT *v, int silent, int allow_noarg); -HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, char *name, - size_t namelen, DISPID *dispid); +HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, zend_string *name, + DISPID *dispid); int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, WORD flags, VARIANT *v, int nargs, zval *args, int silent, int allow_noarg); zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, From 9409c8f11ba5c52b87b5417019c82a5d7b1530b5 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 03:20:03 +0100 Subject: [PATCH 0120/1346] Refactor php_com_olestring_to_string() Return a zend_string* instead of a char* with an out-param for the length --- ext/com_dotnet/com_com.c | 40 +++++------ ext/com_dotnet/com_olechar.c | 25 +++---- ext/com_dotnet/com_persist.c | 9 +-- ext/com_dotnet/com_typeinfo.c | 89 ++++++++++++------------ ext/com_dotnet/com_wrapper.c | 20 +++--- ext/com_dotnet/php_com_dotnet_internal.h | 3 +- 6 files changed, 85 insertions(+), 101 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index b921b0ee0fcda..adc7f7927734f 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -251,15 +251,15 @@ PHP_METHOD(com, __construct) BSTR name; if (SUCCEEDED(ITypeLib_GetDocumentation(TL, -1, &name, NULL, NULL, NULL))) { - typelib_name = php_com_olestring_to_string(name, &typelib_name_len, obj->code_page); + zend_string *typelib_str = php_com_olestring_to_string(name, obj->code_page); - if (NULL != php_com_cache_typelib(TL, typelib_name, typelib_name_len)) { + if (NULL != php_com_cache_typelib(TL, ZSTR_VAL(typelib_str), ZSTR_LEN(typelib_str))) { php_com_import_typelib(TL, mode, obj->code_page); /* add a reference for the hash */ ITypeLib_AddRef(TL); } - efree(typelib_name); + zend_string_release_ex(typelib_str, /* persistent */ false); } else { /* try it anyway */ php_com_import_typelib(TL, mode, obj->code_page); @@ -341,39 +341,39 @@ HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, &IID_NULL, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), flags, disp_params, v, &e, &arg_err); if (silent == 0 && FAILED(hr)) { - char *source = NULL, *desc = NULL, *msg = NULL; - size_t source_len, desc_len; + char *desc = NULL, *msg = NULL; switch (hr) { - case DISP_E_EXCEPTION: + case DISP_E_EXCEPTION: { + zend_string *source = NULL, *desc_str = NULL; if (e.bstrSource) { - source = php_com_olestring_to_string(e.bstrSource, &source_len, obj->code_page); + source = php_com_olestring_to_string(e.bstrSource, obj->code_page); SysFreeString(e.bstrSource); } if (e.bstrDescription) { - desc = php_com_olestring_to_string(e.bstrDescription, &desc_len, obj->code_page); + desc_str = php_com_olestring_to_string(e.bstrDescription, obj->code_page); SysFreeString(e.bstrDescription); } if (PG(html_errors)) { spprintf(&msg, 0, "Source: %s
Description: %s", - source ? source : "Unknown", - desc ? desc : "Unknown"); + source ? ZSTR_VAL(source) : "Unknown", + desc_str ? ZSTR_VAL(desc_str) : "Unknown"); } else { spprintf(&msg, 0, "Source: %s\nDescription: %s", - source ? source : "Unknown", - desc ? desc : "Unknown"); + source ? ZSTR_VAL(source) : "Unknown", + desc_str ? ZSTR_VAL(desc_str) : "Unknown"); } - if (desc) { - efree(desc); + if (desc_str) { + zend_string_release_ex(desc_str, /* persistent */ false); } if (source) { - efree(source); + zend_string_release_ex(source, /* persistent */ false); } if (e.bstrHelpFile) { SysFreeString(e.bstrHelpFile); } break; - + } case DISP_E_PARAMNOTFOUND: case DISP_E_TYPEMISMATCH: desc = php_win32_error_to_msg(hr); @@ -662,13 +662,7 @@ PHP_FUNCTION(com_create_guid) php_com_initialize(); if (CoCreateGuid(&retval) == S_OK && StringFromCLSID(&retval, &guid_string) == S_OK) { - size_t len; - char *str; - - str = php_com_olestring_to_string(guid_string, &len, CP_ACP); - RETVAL_STRINGL(str, len); - // TODO: avoid reallocation ??? - efree(str); + RETVAL_STR(php_com_olestring_to_string(guid_string, CP_ACP)); CoTaskMemFree(guid_string); } else { diff --git a/ext/com_dotnet/com_olechar.c b/ext/com_dotnet/com_olechar.c index b0b968dd6479a..560524e45d1d4 100644 --- a/ext/com_dotnet/com_olechar.c +++ b/ext/com_dotnet/com_olechar.c @@ -67,26 +67,25 @@ PHP_COM_DOTNET_API OLECHAR *php_com_string_to_olestring(const char *string, size return olestring; } -PHP_COM_DOTNET_API char *php_com_olestring_to_string(OLECHAR *olestring, size_t *string_len, int codepage) +PHP_COM_DOTNET_API zend_string *php_com_olestring_to_string(OLECHAR *olestring, int codepage) { - char *string; + zend_string *string; uint32_t length = 0; - BOOL ok; length = WideCharToMultiByte(codepage, 0, olestring, -1, NULL, 0, NULL, NULL); if (length) { - string = (char*)safe_emalloc(length, sizeof(char), 0); - length = WideCharToMultiByte(codepage, 0, olestring, -1, string, length, NULL, NULL); - ok = length > 0; + /* We remove 1 from the length as it takes into account the terminating null byte + * which zend_string alloc already takes into consideration */ + /* TODO Should use safe alloc? */ + string = zend_string_alloc(length - 1, /* persistent */ false); + length = WideCharToMultiByte(codepage, 0, olestring, -1, ZSTR_VAL(string), length, NULL, NULL); } else { - string = (char*)emalloc(sizeof(char)); - *string = '\0'; - ok = FALSE; - length = 0; + string = ZSTR_EMPTY_ALLOC(); } - if (!ok) { + /* Failure to determine length of WideChar */ + if (length == 0) { char *msg = php_win32_error_to_msg(GetLastError()); php_error_docref(NULL, E_WARNING, @@ -95,10 +94,6 @@ PHP_COM_DOTNET_API char *php_com_olestring_to_string(OLECHAR *olestring, size_t php_win32_error_msg_free(msg); } - if (string_len) { - *string_len = length-1; - } - return string; } diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c index f4c8c04694928..e2eb5aef282df 100644 --- a/ext/com_dotnet/com_persist.c +++ b/ext/com_dotnet/com_persist.c @@ -337,14 +337,9 @@ CPH_METHOD(GetCurFileName) res = IPersistFile_GetCurFile(helper->ipf, &olename); if (res == S_OK) { - size_t len; - char *str = php_com_olestring_to_string(olename, - &len, helper->codepage); - RETVAL_STRINGL(str, len); - // TODO: avoid reallocarion??? - efree(str); + zend_string *str = php_com_olestring_to_string(olename, helper->codepage); CoTaskMemFree(olename); - return; + RETURN_STR(str); } else if (res == S_FALSE) { CoTaskMemFree(olename); RETURN_FALSE; diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index f9b6e4157f82a..99ff73ea87506 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -186,8 +186,6 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa BSTR bstr_ids; zend_constant c; zval *exists, results, value; - char *const_name; - size_t len; if (TL == NULL) { return FAILURE; @@ -199,6 +197,8 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa if (pTKind == TKIND_ENUM) { ITypeLib_GetTypeInfo(TL, i, &TypeInfo); for (j = 0; ; j++) { + zend_string *const_name; + if (FAILED(ITypeInfo_GetVarDesc(TypeInfo, j, &pVarDesc))) { break; } @@ -208,16 +208,16 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa continue; } - const_name = php_com_olestring_to_string(bstr_ids, &len, codepage); + const_name = php_com_olestring_to_string(bstr_ids, codepage); SysFreeString(bstr_ids); /* sanity check for the case where the constant is already defined */ php_com_zval_from_variant(&value, pVarDesc->lpvarValue, codepage); - if ((exists = zend_get_constant_str(const_name, len)) != NULL) { + if ((exists = zend_get_constant(const_name)) != NULL) { if (COMG(autoreg_verbose) && !compare_function(&results, &value, exists)) { - php_error_docref(NULL, E_WARNING, "Type library constant %s is already defined", const_name); + php_error_docref(NULL, E_WARNING, "Type library constant %s is already defined", ZSTR_VAL(const_name)); } - efree(const_name); + zend_string_release_ex(const_name, /* persistent */ false); ITypeInfo_ReleaseVarDesc(TypeInfo, pVarDesc); continue; } @@ -226,8 +226,13 @@ PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepa if (Z_TYPE(value) == IS_LONG) { ZEND_CONSTANT_SET_FLAGS(&c, mode, 0); ZVAL_LONG(&c.value, Z_LVAL(value)); - c.name = zend_string_init(const_name, len, mode & CONST_PERSISTENT); - efree(const_name); + if (mode & CONST_PERSISTENT) { + /* duplicate string in a persistent manner */ + c.name = zend_string_dup(const_name, /* persistent */ true); + zend_string_release_ex(const_name, /* persistent */ false); + } else { + c.name = const_name; + } zend_register_constant(&c); } ITypeInfo_ReleaseVarDesc(TypeInfo, pVarDesc); @@ -457,13 +462,13 @@ static inline const char *vt_to_string(VARTYPE vt) return "?"; } -static char *php_com_string_from_clsid(const CLSID *clsid, int codepage) +static zend_string *php_com_string_from_clsid(const CLSID *clsid, int codepage) { LPOLESTR ole_clsid; - char *clsid_str; + zend_string *clsid_str; StringFromCLSID(clsid, &ole_clsid); - clsid_str = php_com_olestring_to_string(ole_clsid, NULL, codepage); + clsid_str = php_com_olestring_to_string(ole_clsid, codepage); LocalFree(ole_clsid); return clsid_str; @@ -476,8 +481,7 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri FUNCDESC *func; int i; OLECHAR *olename; - char *ansiname = NULL; - size_t ansinamelen; + zend_string *ansi_name = NULL; int ret = 0; DISPID lastid = 0; /* for props */ @@ -493,17 +497,16 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri } if (printdef) { - char *guidstring; + zend_string *guid_str; ITypeInfo_GetDocumentation(typeinfo, MEMBERID_NIL, &olename, NULL, NULL, NULL); - ansiname = php_com_olestring_to_string(olename, &ansinamelen, codepage); + ansi_name = php_com_olestring_to_string(olename, codepage); SysFreeString(olename); - guidstring = php_com_string_from_clsid(&attr->guid, codepage); - php_printf("class %s { /* GUID=%s */\n", ansiname, guidstring); - efree(guidstring); - - efree(ansiname); + guid_str = php_com_string_from_clsid(&attr->guid, codepage); + php_printf("class %s { /* GUID=%s */\n", ZSTR_VAL(ansi_name), ZSTR_VAL(guid_str)); + zend_string_release_ex(guid_str, /* persistent */ false); + zend_string_release_ex(ansi_name, /* persistent */ false); } if (id_to_name) { @@ -525,13 +528,12 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri lastid = func->memid; ITypeInfo_GetDocumentation(typeinfo, func->memid, &olename, NULL, NULL, NULL); - ansiname = php_com_olestring_to_string(olename, &ansinamelen, codepage); + ansi_name = php_com_olestring_to_string(olename, codepage); SysFreeString(olename); if (printdef) { int j; - char *funcdesc; - size_t funcdesclen; + zend_string *func_desc; unsigned int cnames = 0; BSTR *names; @@ -554,18 +556,18 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri ITypeInfo_GetDocumentation(typeinfo, func->memid, NULL, &olename, NULL, NULL); if (olename) { - funcdesc = php_com_olestring_to_string(olename, &funcdesclen, codepage); + func_desc = php_com_olestring_to_string(olename, codepage); SysFreeString(olename); - php_printf("\t/* %s */\n", funcdesc); - efree(funcdesc); + php_printf("\t/* %s */\n", ZSTR_VAL(func_desc)); + zend_string_release_ex(func_desc, /* persistent */ false); } - php_printf("\tvar $%s;\n\n", ansiname); + php_printf("\tvar $%s;\n\n", ZSTR_VAL(ansi_name)); } else { /* a function */ - php_printf("\tfunction %s(\n", ansiname); + php_printf("\tfunction %s(\n", ZSTR_VAL(ansi_name)); for (j = 0; j < func->cParams; j++) { ELEMDESC *elem = &func->lprgelemdescParam[j]; @@ -587,20 +589,22 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri /* when we handle prop put and get, this will look nicer */ if (j+1 < (int)cnames) { - funcdesc = php_com_olestring_to_string(names[j+1], &funcdesclen, codepage); + func_desc = php_com_olestring_to_string(names[j+1], codepage); SysFreeString(names[j+1]); + php_printf(" */ %s%s%c\n", + elem->tdesc.vt == VT_PTR ? "&$" : "$", + ZSTR_VAL(func_desc), + j == func->cParams - 1 ? ' ' : ',' + ); } else { - funcdesc = "???"; - } - - php_printf(" */ %s%s%c\n", + php_printf(" */ %s???%c\n", elem->tdesc.vt == VT_PTR ? "&$" : "$", - funcdesc, j == func->cParams - 1 ? ' ' : ',' - ); + ); + } if (j+1 < (int)cnames) { - efree(funcdesc); + zend_string_release_ex(func_desc, /* persistent */ false); } } @@ -608,10 +612,10 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri ITypeInfo_GetDocumentation(typeinfo, func->memid, NULL, &olename, NULL, NULL); if (olename) { - funcdesc = php_com_olestring_to_string(olename, &funcdesclen, codepage); + func_desc = php_com_olestring_to_string(olename, codepage); SysFreeString(olename); - php_printf("\t\t/* %s */\n", funcdesc); - efree(funcdesc); + php_printf("\t\t/* %s */\n", ZSTR_VAL(func_desc)); + zend_string_release_ex(func_desc, /* persistent */ false); } php_printf("\t}\n"); @@ -621,12 +625,11 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri } if (id_to_name) { - zend_str_tolower(ansiname, ansinamelen); - ZVAL_STRINGL(&tmp, ansiname, ansinamelen); + zend_string *lc_ansi_name = zend_string_tolower(ansi_name); + ZVAL_STR(&tmp, lc_ansi_name); zend_hash_index_update(id_to_name, func->memid, &tmp); - // TODO: avoid reallocation??? } - efree(ansiname); + zend_string_release_ex(ansi_name, /* persistent */ false); } ITypeInfo_ReleaseFuncDesc(typeinfo, func); } diff --git a/ext/com_dotnet/com_wrapper.c b/ext/com_dotnet/com_wrapper.c index 5bfc7f1e02590..a2bb419340e86 100644 --- a/ext/com_dotnet/com_wrapper.c +++ b/ext/com_dotnet/com_wrapper.c @@ -170,21 +170,20 @@ static HRESULT STDMETHODCALLTYPE disp_getidsofnames( FETCH_DISP("GetIDsOfNames"); for (i = 0; i < cNames; i++) { - char *name; - size_t namelen; + zend_string *name; zval *tmp; - name = php_com_olestring_to_string(rgszNames[i], &namelen, COMG(code_page)); + name = php_com_olestring_to_string(rgszNames[i], COMG(code_page)); /* Lookup the name in the hash */ - if ((tmp = zend_hash_str_find(disp->name_to_dispid, name, namelen)) == NULL) { + if ((tmp = zend_hash_find(disp->name_to_dispid, name)) == NULL) { ret = DISP_E_UNKNOWNNAME; rgDispId[i] = 0; } else { rgDispId[i] = (DISPID)Z_LVAL_P(tmp); } - efree(name); + zend_string_release_ex(name, /* persistent */ false); } @@ -214,23 +213,22 @@ static HRESULT STDMETHODCALLTYPE disp_getdispid( /* [out] */ DISPID *pid) { HRESULT ret = DISP_E_UNKNOWNNAME; - char *name; - size_t namelen; + zend_string *name; zval *tmp; FETCH_DISP("GetDispID"); - name = php_com_olestring_to_string(bstrName, &namelen, COMG(code_page)); + name = php_com_olestring_to_string(bstrName, COMG(code_page)); - trace("Looking for %s, namelen=%d in %p\n", name, namelen, disp->name_to_dispid); + trace("Looking for %s, namelen=%d in %p\n", ZSTR_VAL(name), ZSTR_LEN(name), disp->name_to_dispid); /* Lookup the name in the hash */ - if ((tmp = zend_hash_str_find(disp->name_to_dispid, name, namelen)) != NULL) { + if ((tmp = zend_hash_find(disp->name_to_dispid, name)) != NULL) { trace("found it\n"); *pid = (DISPID)Z_LVAL_P(tmp); ret = S_OK; } - efree(name); + zend_string_release_ex(name, /* persistent */ false); return ret; } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 7b0d93fa679bb..4875b788c7ad3 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -80,8 +80,7 @@ zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *objec int php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index); /* com_olechar.c */ -PHP_COM_DOTNET_API char *php_com_olestring_to_string(OLECHAR *olestring, - size_t *string_len, int codepage); +PHP_COM_DOTNET_API zend_string *php_com_olestring_to_string(OLECHAR *olestring, int codepage); PHP_COM_DOTNET_API OLECHAR *php_com_string_to_olestring(const char *string, size_t string_len, int codepage); BSTR php_com_string_to_bstr(zend_string *string, int codepage); From bc8703d8613f5b26d5f0fb4b6023d3e9496f3831 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 04:10:36 +0100 Subject: [PATCH 0121/1346] Use standard bool/zend_result instead of int --- ext/com_dotnet/com_com.c | 14 ++++++------- ext/com_dotnet/com_handlers.c | 9 ++++----- ext/com_dotnet/com_iterator.c | 2 +- ext/com_dotnet/com_misc.c | 2 +- ext/com_dotnet/com_typeinfo.c | 11 ++++------- ext/com_dotnet/com_variant.c | 10 +++++----- ext/com_dotnet/php_com_dotnet_internal.h | 25 ++++++++++++------------ 7 files changed, 34 insertions(+), 39 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index adc7f7927734f..4d02e5fb7c3d3 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -331,7 +331,7 @@ PHP_FUNCTION(com_get_active_object) /* Performs an Invoke on the given com object. * returns a failure code and creates an exception if there was an error */ HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, - WORD flags, DISPPARAMS *disp_params, VARIANT *v, int silent, int allow_noarg) + WORD flags, DISPPARAMS *disp_params, VARIANT *v, bool silent, bool allow_noarg) { HRESULT hr; unsigned int arg_err; @@ -340,7 +340,7 @@ HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, hr = IDispatch_Invoke(V_DISPATCH(&obj->v), id_member, &IID_NULL, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), flags, disp_params, v, &e, &arg_err); - if (silent == 0 && FAILED(hr)) { + if (!silent && FAILED(hr)) { char *desc = NULL, *msg = NULL; switch (hr) { @@ -382,7 +382,7 @@ HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, break; case DISP_E_BADPARAMCOUNT: - if ((disp_params->cArgs + disp_params->cNamedArgs == 0) && (allow_noarg == 1)) { + if ((disp_params->cArgs + disp_params->cNamedArgs == 0) && allow_noarg) { /* if getting a property and they are missing all parameters, * we want to create a proxy object for them; so lets not create an * exception here */ @@ -454,7 +454,7 @@ HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, zend_string *name, } /* the core of COM */ -int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, +zend_result php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, WORD flags, VARIANT *v, int nargs, zval *args) { DISPID dispid, altdispid; @@ -582,8 +582,8 @@ int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function * -int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, - WORD flags, VARIANT *v, int nargs, zval *args, int silent, int allow_noarg) +zend_result php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, + WORD flags, VARIANT *v, int nargs, zval *args, bool silent, bool allow_noarg) { DISPID altdispid; DISPPARAMS disp_params; @@ -718,7 +718,7 @@ PHP_FUNCTION(com_event_sink) obj->sink_dispatch = php_com_wrapper_export_as_sink(sinkobject, &obj->sink_id, id_to_name); /* Now hook it up to the source */ - php_com_object_enable_event_sink(obj, TRUE); + php_com_object_enable_event_sink(obj, /* enable */ true); RETVAL_TRUE; } else { diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 57518914c37d3..7f8f0e8614a79 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -254,7 +254,7 @@ static PHP_FUNCTION(com_method_handler) php_com_dotnet_object *obj = CDNO_FETCH(object); int nargs; VARIANT v; - int ret = FAILURE; + zend_result ret = FAILURE; if (V_VT(&obj->v) != VT_DISPATCH) { goto exit; @@ -270,8 +270,7 @@ static PHP_FUNCTION(com_method_handler) VariantInit(&v); if (SUCCESS == php_com_do_invoke_byref(obj, (zend_internal_function*)EX(func), DISPATCH_METHOD|DISPATCH_PROPERTYGET, &v, nargs, args)) { - php_com_zval_from_variant(return_value, &v, obj->code_page); - ret = SUCCESS; + ret = php_com_zval_from_variant(return_value, &v, obj->code_page); VariantClear(&v); } @@ -534,7 +533,7 @@ zend_object_handlers php_com_object_handlers = { NULL, /* get_properties_for */ }; -void php_com_object_enable_event_sink(php_com_dotnet_object *obj, int enable) +void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable) { if (obj->sink_dispatch) { IConnectionPointContainer *cont; @@ -568,7 +567,7 @@ void php_com_object_free_storage(zend_object *object) } if (obj->sink_dispatch) { - php_com_object_enable_event_sink(obj, FALSE); + php_com_object_enable_event_sink(obj, /* enable */ false); IDispatch_Release(obj->sink_dispatch); obj->sink_dispatch = NULL; } diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c index 4b38f47fd4551..15e9b5df840c5 100644 --- a/ext/com_dotnet/com_iterator.c +++ b/ext/com_dotnet/com_iterator.c @@ -108,7 +108,7 @@ static void com_iter_move_forwards(zend_object_iterator *iter) return; } I->key++; - if (php_com_safearray_get_elem(&I->safe_array, &I->v, (LONG)I->key) == 0) { + if (!php_com_safearray_get_elem(&I->safe_array, &I->v, (LONG)I->key)) { I->key = (zend_ulong)-1; return; } diff --git a/ext/com_dotnet/com_misc.c b/ext/com_dotnet/com_misc.c index a48168b0e8661..b2920ddba62c2 100644 --- a/ext/com_dotnet/com_misc.c +++ b/ext/com_dotnet/com_misc.c @@ -91,7 +91,7 @@ PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, /* this is a convenience function for fetching a particular * element from a (possibly multi-dimensional) safe array */ -PHP_COM_DOTNET_API int php_com_safearray_get_elem(VARIANT *array, VARIANT *dest, LONG dim1) +PHP_COM_DOTNET_API bool php_com_safearray_get_elem(VARIANT *array, VARIANT *dest, LONG dim1) { UINT dims; LONG lbound, ubound; diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index 99ff73ea87506..40f27e696d971 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -176,7 +176,7 @@ PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib(char *search_string, int codep } /* Given a type-library, merge it into the current engine state */ -PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, int codepage) +PHP_COM_DOTNET_API zend_result php_com_import_typelib(ITypeLib *TL, int mode, int codepage) { int i, j, interfaces; TYPEKIND pTKind; @@ -475,18 +475,17 @@ static zend_string *php_com_string_from_clsid(const CLSID *clsid, int codepage) } -int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int printdef, GUID *guid, int codepage) +bool php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, bool printdef, GUID *guid, int codepage) { TYPEATTR *attr; FUNCDESC *func; int i; OLECHAR *olename; zend_string *ansi_name = NULL; - int ret = 0; DISPID lastid = 0; /* for props */ if (FAILED(ITypeInfo_GetTypeAttr(typeinfo, &attr))) { - return 0; + return false; } /* verify that it is suitable */ @@ -637,13 +636,11 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri if (printdef) { php_printf("}\n"); } - - ret = 1; } else { zend_throw_error(NULL, "Type kind must be dispatchable, %08x given", attr->typekind); } ITypeInfo_ReleaseTypeAttr(typeinfo, attr); - return ret; + return true; } diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c index 193eca3d77b58..40106e3d8f4ff 100644 --- a/ext/com_dotnet/com_variant.c +++ b/ext/com_dotnet/com_variant.c @@ -172,10 +172,10 @@ PHP_COM_DOTNET_API void php_com_variant_from_zval(VARIANT *v, zval *z, int codep } } -PHP_COM_DOTNET_API int php_com_zval_from_variant(zval *z, VARIANT *v, int codepage) +PHP_COM_DOTNET_API zend_result php_com_zval_from_variant(zval *z, VARIANT *v, int codepage) { OLECHAR *olestring = NULL; - int ret = SUCCESS; + zend_result ret = SUCCESS; switch (V_VT(v)) { case VT_EMPTY: @@ -271,9 +271,9 @@ PHP_COM_DOTNET_API int php_com_zval_from_variant(zval *z, VARIANT *v, int codepa } -PHP_COM_DOTNET_API int php_com_copy_variant(VARIANT *dstvar, VARIANT *srcvar) +PHP_COM_DOTNET_API zend_result php_com_copy_variant(VARIANT *dstvar, VARIANT *srcvar) { - int ret = SUCCESS; + zend_result ret = SUCCESS; switch (V_VT(dstvar) & ~VT_BYREF) { case VT_EMPTY: @@ -510,7 +510,7 @@ PHP_FUNCTION(variant_set) obj->typeinfo = NULL; } if (obj->sink_dispatch) { - php_com_object_enable_event_sink(obj, FALSE); + php_com_object_enable_event_sink(obj, /* enable */ false); IDispatch_Release(obj->sink_dispatch); obj->sink_dispatch = NULL; } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 4875b788c7ad3..30f9175051c57 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -29,7 +29,7 @@ typedef struct _php_com_dotnet_object { zend_object zo; VARIANT v; - int modified; + bool modified; int code_page; @@ -48,7 +48,7 @@ typedef struct _php_com_dotnet_object { HashTable *id_of_name_cache; } php_com_dotnet_object; -static inline int php_com_is_valid_object(zval *zv) +static inline bool php_com_is_valid_object(zval *zv) { zend_class_entry *ce = Z_OBJCE_P(zv); return zend_string_equals_literal(ce->name, "com") || @@ -73,7 +73,7 @@ zend_object* php_com_object_new(zend_class_entry *ce); zend_object* php_com_object_clone(zend_object *object); void php_com_object_free_storage(zend_object *object); zend_object_handlers php_com_object_handlers; -void php_com_object_enable_event_sink(php_com_dotnet_object *obj, int enable); +void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable); /* com_saproxy.c */ zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object, int by_ref); @@ -91,14 +91,14 @@ zend_string *php_com_bstr_to_string(BSTR bstr, int codepage); PHP_METHOD(com, __construct); HRESULT php_com_invoke_helper(php_com_dotnet_object *obj, DISPID id_member, - WORD flags, DISPPARAMS *disp_params, VARIANT *v, int silent, int allow_noarg); + WORD flags, DISPPARAMS *disp_params, VARIANT *v, bool silent, bool allow_noarg); HRESULT php_com_get_id_of_name(php_com_dotnet_object *obj, zend_string *name, DISPID *dispid); -int php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, - WORD flags, VARIANT *v, int nargs, zval *args, int silent, int allow_noarg); +zend_result php_com_do_invoke_by_id(php_com_dotnet_object *obj, DISPID dispid, + WORD flags, VARIANT *v, int nargs, zval *args, bool silent, bool allow_noarg); zend_result php_com_do_invoke(php_com_dotnet_object *obj, zend_string *name, WORD flags, VARIANT *v, int nargs, zval *args, bool allow_noarg); -int php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, +zend_result php_com_do_invoke_byref(php_com_dotnet_object *obj, zend_internal_function *f, WORD flags, VARIANT *v, int nargs, zval *args); /* com_wrapper.c */ @@ -114,8 +114,8 @@ PHP_METHOD(variant, __construct); PHP_COM_DOTNET_API void php_com_variant_from_zval_with_type(VARIANT *v, zval *z, VARTYPE type, int codepage); PHP_COM_DOTNET_API void php_com_variant_from_zval(VARIANT *v, zval *z, int codepage); -PHP_COM_DOTNET_API int php_com_zval_from_variant(zval *z, VARIANT *v, int codepage); -PHP_COM_DOTNET_API int php_com_copy_variant(VARIANT *dst, VARIANT *src); +PHP_COM_DOTNET_API zend_result php_com_zval_from_variant(zval *z, VARIANT *v, int codepage); +PHP_COM_DOTNET_API zend_result php_com_copy_variant(VARIANT *dst, VARIANT *src); /* com_dotnet.c */ PHP_METHOD(dotnet, __construct); @@ -128,16 +128,15 @@ PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp, int codepage); PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, int codepage); -PHP_COM_DOTNET_API int php_com_safearray_get_elem(VARIANT *array, VARIANT *dest, LONG dim1); +PHP_COM_DOTNET_API bool php_com_safearray_get_elem(VARIANT *array, VARIANT *dest, LONG dim1); /* com_typeinfo.c */ PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib_via_cache(const char *search_string, int codepage); PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib(char *search_string, int codepage); -PHP_COM_DOTNET_API int php_com_import_typelib(ITypeLib *TL, int mode, - int codepage); +PHP_COM_DOTNET_API zend_result php_com_import_typelib(ITypeLib *TL, int mode, int codepage); void php_com_typelibrary_dtor(zval *pDest); ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj, char *dispname, int sink); -int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int printdef, GUID *guid, int codepage); +bool php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, bool printdef, GUID *guid, int codepage); ITypeLib *php_com_cache_typelib(ITypeLib* TL, char *cache_key, zend_long cache_key_len); PHP_MINIT_FUNCTION(com_typeinfo); PHP_MSHUTDOWN_FUNCTION(com_typeinfo); From 68702b7e7896f6db99bdedfbfbae37a0787f4168 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 04:14:30 +0100 Subject: [PATCH 0122/1346] Voidify php_com_persist_minit() --- ext/com_dotnet/com_persist.c | 4 +--- ext/com_dotnet/php_com_dotnet_internal.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c index e2eb5aef282df..ec5271c908c6b 100644 --- a/ext/com_dotnet/com_persist.c +++ b/ext/com_dotnet/com_persist.c @@ -714,7 +714,7 @@ static zend_object* helper_new(zend_class_entry *ce) return &helper->std; } -int php_com_persist_minit(INIT_FUNC_ARGS) +void php_com_persist_minit(INIT_FUNC_ARGS) { memcpy(&helper_handlers, &std_object_handlers, sizeof(helper_handlers)); helper_handlers.free_obj = helper_free_storage; @@ -725,6 +725,4 @@ int php_com_persist_minit(INIT_FUNC_ARGS) le_istream = zend_register_list_destructors_ex(istream_dtor, NULL, "com_dotnet_istream_wrapper", module_number); - - return SUCCESS; } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 30f9175051c57..7c05165d1d50d 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -107,7 +107,7 @@ PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export_as_sink(zval *val, GUID *si PHP_COM_DOTNET_API IDispatch *php_com_wrapper_export(zval *val); /* com_persist.c */ -int php_com_persist_minit(INIT_FUNC_ARGS); +void php_com_persist_minit(INIT_FUNC_ARGS); /* com_variant.c */ PHP_METHOD(variant, __construct); From 816d4ac7a8113ca27e1ca5f72b29b5e0f79dfca3 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 14:24:45 +0100 Subject: [PATCH 0123/1346] Voidify php_com_saproxy_create() --- ext/com_dotnet/com_saproxy.c | 4 +--- ext/com_dotnet/php_com_dotnet_internal.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index 6c2106d196085..4e19f6e78e5d2 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -415,7 +415,7 @@ zend_object_handlers php_com_saproxy_handlers = { NULL, /* get_properties_for */ }; -int php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index) +void php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index) { php_com_saproxy *proxy, *rel = NULL; @@ -442,8 +442,6 @@ int php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index zend_object_std_init(&proxy->std, php_com_saproxy_class_entry); proxy->std.handlers = &php_com_saproxy_handlers; ZVAL_OBJ(proxy_out, &proxy->std); - - return 1; } /* iterator */ diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 7c05165d1d50d..9f545875e6ab5 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -77,7 +77,7 @@ void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable); /* com_saproxy.c */ zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object, int by_ref); -int php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index); +void php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index); /* com_olechar.c */ PHP_COM_DOTNET_API zend_string *php_com_olestring_to_string(OLECHAR *olestring, int codepage); From da012ba3245037f1ff35f30445ee13170edff927 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 04:53:06 +0100 Subject: [PATCH 0124/1346] Refactor php_com_locate_typeinfo() Use zend_string pointers Use bool --- ext/com_dotnet/com_com.c | 29 +++++++++++------------- ext/com_dotnet/com_typeinfo.c | 21 +++++++++-------- ext/com_dotnet/php_com_dotnet_internal.h | 3 ++- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 4d02e5fb7c3d3..c068f642f44a3 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -677,7 +677,8 @@ PHP_FUNCTION(com_event_sink) zval *object, *sinkobject; zend_string *sink_str = NULL; HashTable *sink_ht = NULL; - char *dispname = NULL, *typelibname = NULL; + zend_string *type_lib_name = NULL; + zend_string *dispatch_name = NULL; php_com_dotnet_object *obj; ITypeInfo *typeinfo = NULL; @@ -698,14 +699,14 @@ PHP_FUNCTION(com_event_sink) zval *tmp; if ((tmp = zend_hash_index_find(sink_ht, 0)) != NULL && Z_TYPE_P(tmp) == IS_STRING) - typelibname = Z_STRVAL_P(tmp); + type_lib_name = Z_STR_P(tmp); if ((tmp = zend_hash_index_find(sink_ht, 1)) != NULL && Z_TYPE_P(tmp) == IS_STRING) - dispname = Z_STRVAL_P(tmp); + dispatch_name = Z_STR_P(tmp); } else if (sink_str) { - dispname = ZSTR_VAL(sink_str); + dispatch_name = sink_str; } - typeinfo = php_com_locate_typeinfo(typelibname, obj, dispname, 1); + typeinfo = php_com_locate_typeinfo(type_lib_name, obj, dispatch_name, /* sink */ true); if (typeinfo) { HashTable *id_to_name; @@ -737,29 +738,25 @@ PHP_FUNCTION(com_event_sink) PHP_FUNCTION(com_print_typeinfo) { zend_object *object_zpp; - zend_string *typelib_name_zpp = NULL; - char *ifacename = NULL; - char *typelibname = NULL; - size_t ifacelen; - bool wantsink = 0; + zend_string *type_lib_name = NULL; + zend_string *interface_name = NULL; + bool want_sink = false; php_com_dotnet_object *obj = NULL; ITypeInfo *typeinfo; ZEND_PARSE_PARAMETERS_START(1, 3) - Z_PARAM_OBJ_OF_CLASS_OR_STR(object_zpp, php_com_variant_class_entry, typelib_name_zpp) + Z_PARAM_OBJ_OF_CLASS_OR_STR(object_zpp, php_com_variant_class_entry, type_lib_name) Z_PARAM_OPTIONAL - Z_PARAM_STRING_OR_NULL(ifacename, ifacelen) - Z_PARAM_BOOL(wantsink) + Z_PARAM_STR_OR_NULL(interface_name) + Z_PARAM_BOOL(want_sink) ZEND_PARSE_PARAMETERS_END(); php_com_initialize(); if (object_zpp) { obj = (php_com_dotnet_object*)object_zpp; - } else { - typelibname = ZSTR_VAL(typelib_name_zpp); } - typeinfo = php_com_locate_typeinfo(typelibname, obj, ifacename, wantsink ? 1 : 0); + typeinfo = php_com_locate_typeinfo(type_lib_name, obj, interface_name, want_sink); if (typeinfo) { php_com_process_typeinfo(typeinfo, NULL, 1, NULL, obj ? obj->code_page : COMG(code_page)); ITypeInfo_Release(typeinfo); diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index 40f27e696d971..ccdcc3ff7e8c8 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -302,7 +302,8 @@ PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib_via_cache(const char *search_s return TL; } -ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj, char *dispname, int sink) +ITypeInfo *php_com_locate_typeinfo(zend_string *type_lib_name, php_com_dotnet_object *obj, + zend_string *dispatch_name, bool sink) { ITypeInfo *typeinfo = NULL; ITypeLib *typelib = NULL; @@ -310,7 +311,7 @@ ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj GUID iid; if (obj) { - if (dispname == NULL && sink) { + if (dispatch_name == NULL && sink) { if (V_VT(&obj->v) == VT_DISPATCH) { IProvideClassInfo2 *pci2; IProvideClassInfo *pci; @@ -326,7 +327,7 @@ ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj IProvideClassInfo_Release(pci); } } - } else if (dispname == NULL) { + } else if (dispatch_name == NULL) { if (obj->typeinfo) { ITypeInfo_AddRef(obj->typeinfo); return obj->typeinfo; @@ -336,14 +337,14 @@ ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj return typeinfo; } } - } else if (dispname && obj->typeinfo) { + } else if (dispatch_name && obj->typeinfo) { unsigned int idx; /* get the library from the object; the rest will be dealt with later */ ITypeInfo_GetContainingTypeLib(obj->typeinfo, &typelib, &idx); - } else if (typelibname == NULL) { + } else if (type_lib_name == NULL) { if (V_VT(&obj->v) == VT_DISPATCH) { IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &typeinfo); - if (dispname) { + if (dispatch_name) { unsigned int idx; /* get the library from the object; the rest will be dealt with later */ ITypeInfo_GetContainingTypeLib(typeinfo, &typelib, &idx); @@ -355,15 +356,15 @@ ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj } } } - } else if (typelibname) { + } else if (type_lib_name) { /* Fetch the typelibrary and use that to look things up */ - typelib = php_com_load_typelib(typelibname, CP_THREAD_ACP); + typelib = php_com_load_typelib(ZSTR_VAL(type_lib_name), CP_THREAD_ACP); } - if (!gotguid && dispname && typelib) { + if (!gotguid && dispatch_name && typelib) { unsigned short cfound; MEMBERID memid; - OLECHAR *olename = php_com_string_to_olestring(dispname, strlen(dispname), CP_ACP); + OLECHAR *olename = php_com_string_to_olestring(ZSTR_VAL(dispatch_name), ZSTR_LEN(dispatch_name), CP_ACP); cfound = 1; if (FAILED(ITypeLib_FindName(typelib, olename, 0, &typeinfo, &memid, &cfound)) || cfound == 0) { diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 9f545875e6ab5..f3405b5cb6a6b 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -135,7 +135,8 @@ PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib_via_cache(const char *search_s PHP_COM_DOTNET_API ITypeLib *php_com_load_typelib(char *search_string, int codepage); PHP_COM_DOTNET_API zend_result php_com_import_typelib(ITypeLib *TL, int mode, int codepage); void php_com_typelibrary_dtor(zval *pDest); -ITypeInfo *php_com_locate_typeinfo(char *typelibname, php_com_dotnet_object *obj, char *dispname, int sink); +ITypeInfo *php_com_locate_typeinfo(zend_string *type_lib_name, php_com_dotnet_object *obj, + zend_string *dispatch_name, bool sink); bool php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, bool printdef, GUID *guid, int codepage); ITypeLib *php_com_cache_typelib(ITypeLib* TL, char *cache_key, zend_long cache_key_len); PHP_MINIT_FUNCTION(com_typeinfo); From 4a4c35cfaf5f7011170a53b74b0d73c672e88691 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 29 Sep 2021 13:55:04 +0100 Subject: [PATCH 0125/1346] Use bool instead of zend_long in Calendar ext internal function handler --- ext/calendar/easter.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/calendar/easter.c b/ext/calendar/easter.c index e26febc26f2e4..c319abd17fef0 100644 --- a/ext/calendar/easter.c +++ b/ext/calendar/easter.c @@ -21,7 +21,7 @@ #include "sdncal.h" #include -static void _cal_easter(INTERNAL_FUNCTION_PARAMETERS, zend_long gm) +static void _cal_easter(INTERNAL_FUNCTION_PARAMETERS, bool gm) { /* based on code by Simon Kershaw, */ @@ -118,13 +118,13 @@ static void _cal_easter(INTERNAL_FUNCTION_PARAMETERS, zend_long gm) /* {{{ Return the timestamp of midnight on Easter of a given year (defaults to current year) */ PHP_FUNCTION(easter_date) { - _cal_easter(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); + _cal_easter(INTERNAL_FUNCTION_PARAM_PASSTHRU, true); } /* }}} */ /* {{{ Return the number of days after March 21 that Easter falls on for a given year (defaults to current year) */ PHP_FUNCTION(easter_days) { - _cal_easter(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); + _cal_easter(INTERNAL_FUNCTION_PARAM_PASSTHRU, false); } /* }}} */ From c19977d054da5bcff1a610b2a43af3eae4435fdd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 27 Sep 2021 12:21:40 +0200 Subject: [PATCH 0126/1346] Fix delayed early binding with optimization It's possible for delayed early binding opcodes to get optimized away if they are "unreachable". However, we still need to attempt early binding for them. (In some cases we also corrupt the early binding list outright during optimization, which is how I got here.) Fix this by storing information about delayed early binding independently of DECLARE_CLASS_DELAYED opcodes, so early binding is performed even after the opcode has been dropped. --- Zend/Optimizer/block_pass.c | 7 -- Zend/Optimizer/dfa_pass.c | 11 -- Zend/Optimizer/nop_removal.c | 11 -- Zend/Optimizer/zend_optimizer.h | 1 - Zend/tests/early_binding_unreachable.inc | 6 ++ Zend/tests/early_binding_unreachable.phpt | 10 ++ Zend/zend_compile.c | 67 ------------ Zend/zend_compile.h | 2 - Zend/zend_inheritance.c | 2 +- Zend/zend_inheritance.h | 2 +- ext/opcache/ZendAccelerator.c | 17 ++- ext/opcache/ZendAccelerator.h | 9 ++ ext/opcache/zend_accelerator_util_funcs.c | 120 +++++++++++++++++++++- ext/opcache/zend_accelerator_util_funcs.h | 3 + ext/opcache/zend_file_cache.c | 29 ++++++ ext/opcache/zend_persist.c | 16 +++ ext/opcache/zend_persist_calc.c | 14 +++ 17 files changed, 212 insertions(+), 115 deletions(-) create mode 100644 Zend/tests/early_binding_unreachable.inc create mode 100644 Zend/tests/early_binding_unreachable.phpt diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 95cd6b1bcee52..c4fea15328172 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -1119,13 +1119,6 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array, zend_op free_alloca(map, use_heap); } - /* adjust early binding list */ - if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) { - ZEND_ASSERT(op_array == &ctx->script->main_op_array); - ctx->script->first_early_binding_opline = - zend_build_delayed_early_binding_list(op_array); - } - /* rebuild map (just for printing) */ memset(cfg->map, -1, sizeof(int) * op_array->last); for (int n = 0; n < cfg->blocks_count; n++) { diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index dc79bc986c7c7..17030cae17889 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -235,17 +235,6 @@ static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_op } } - /* update early binding list */ - if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) { - uint32_t *opline_num = &ctx->script->first_early_binding_opline; - - ZEND_ASSERT(op_array == &ctx->script->main_op_array); - do { - *opline_num -= shiftlist[*opline_num]; - opline_num = &op_array->opcodes[*opline_num].result.opline_num; - } while (*opline_num != (uint32_t)-1); - } - /* update call graph */ if (func_info) { zend_call_info *call_info = func_info->callee_info; diff --git a/Zend/Optimizer/nop_removal.c b/Zend/Optimizer/nop_removal.c index 0d32cfed94ab9..fd5a87cbfb287 100644 --- a/Zend/Optimizer/nop_removal.c +++ b/Zend/Optimizer/nop_removal.c @@ -89,17 +89,6 @@ void zend_optimizer_nop_removal(zend_op_array *op_array, zend_optimizer_ctx *ctx op_array->try_catch_array[j].finally_end -= shiftlist[op_array->try_catch_array[j].finally_end]; } } - - /* update early binding list */ - if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) { - uint32_t *opline_num = &ctx->script->first_early_binding_opline; - - ZEND_ASSERT(op_array == &ctx->script->main_op_array); - do { - *opline_num -= shiftlist[*opline_num]; - opline_num = &op_array->opcodes[*opline_num].result.opline_num; - } while (*opline_num != (uint32_t)-1); - } } free_alloca(shiftlist, use_heap); } diff --git a/Zend/Optimizer/zend_optimizer.h b/Zend/Optimizer/zend_optimizer.h index 7a68cbd101e6d..c063d65a45927 100644 --- a/Zend/Optimizer/zend_optimizer.h +++ b/Zend/Optimizer/zend_optimizer.h @@ -86,7 +86,6 @@ typedef struct _zend_script { zend_op_array main_op_array; HashTable function_table; HashTable class_table; - uint32_t first_early_binding_opline; /* the linked list of delayed declarations */ } zend_script; typedef void (*zend_optimizer_pass_t)(zend_script *, void *context); diff --git a/Zend/tests/early_binding_unreachable.inc b/Zend/tests/early_binding_unreachable.inc new file mode 100644 index 0000000000000..a831d34833984 --- /dev/null +++ b/Zend/tests/early_binding_unreachable.inc @@ -0,0 +1,6 @@ + +--EXPECT-- +object(B)#1 (0) { +} diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 824a625e38f11..3af0d6e46070c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1322,73 +1322,6 @@ static void zend_mark_function_as_generator(void) /* {{{ */ } /* }}} */ -ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array) /* {{{ */ -{ - if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) { - uint32_t first_early_binding_opline = (uint32_t)-1; - uint32_t *prev_opline_num = &first_early_binding_opline; - zend_op *opline = op_array->opcodes; - zend_op *end = opline + op_array->last; - - while (opline < end) { - if (opline->opcode == ZEND_DECLARE_CLASS_DELAYED) { - *prev_opline_num = opline - op_array->opcodes; - prev_opline_num = &opline->result.opline_num; - } - ++opline; - } - *prev_opline_num = -1; - return first_early_binding_opline; - } - return (uint32_t)-1; -} -/* }}} */ - -ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline) /* {{{ */ -{ - if (first_early_binding_opline != (uint32_t)-1) { - bool orig_in_compilation = CG(in_compilation); - uint32_t opline_num = first_early_binding_opline; - void **run_time_cache; - - if (!ZEND_MAP_PTR(op_array->run_time_cache)) { - void *ptr; - - ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE); - ptr = emalloc(op_array->cache_size + sizeof(void*)); - ZEND_MAP_PTR_INIT(op_array->run_time_cache, ptr); - ptr = (char*)ptr + sizeof(void*); - ZEND_MAP_PTR_SET(op_array->run_time_cache, ptr); - memset(ptr, 0, op_array->cache_size); - } - run_time_cache = RUN_TIME_CACHE(op_array); - - CG(in_compilation) = 1; - while (opline_num != (uint32_t)-1) { - const zend_op *opline = &op_array->opcodes[opline_num]; - zval *lcname = RT_CONSTANT(opline, opline->op1); - zval *zv = zend_hash_find_known_hash(EG(class_table), Z_STR_P(lcname + 1)); - - if (zv) { - zend_class_entry *ce = Z_CE_P(zv); - zend_string *lc_parent_name = Z_STR_P(RT_CONSTANT(opline, opline->op2)); - zend_class_entry *parent_ce = zend_hash_find_ex_ptr(EG(class_table), lc_parent_name, 1); - - if (parent_ce) { - ce = zend_try_early_bind(ce, parent_ce, Z_STR_P(lcname), zv); - if (ce) { - /* Store in run-time cache */ - ((void**)((char*)run_time_cache + opline->extended_value))[0] = ce; - } - } - } - opline_num = op_array->opcodes[opline_num].result.opline_num; - } - CG(in_compilation) = orig_in_compilation; - } -} -/* }}} */ - ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_length, const char *src2, size_t src2_length, bool internal) /* {{{ */ { size_t prop_name_length = 1 + src1_length + 1 + src2_length; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 90ce5504499b8..95d7984fdc958 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -791,8 +791,6 @@ ZEND_API zend_class_entry *zend_bind_class_in_slot( zval *class_table_slot, zval *lcname, zend_string *lc_parent_name); ZEND_API zend_result do_bind_function(zend_function *func, zval *lcname); ZEND_API zend_result do_bind_class(zval *lcname, zend_string *lc_parent_name); -ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array); -ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array, uint32_t first_early_binding_opline); void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline); diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 5360b2c702712..596d2e302b3b7 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -3029,7 +3029,7 @@ static zend_always_inline bool register_early_bound_ce(zval *delayed_early_bindi return zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL; } -zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding) /* {{{ */ +ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding) /* {{{ */ { inheritance_status status; zend_class_entry *proto = NULL; diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index c67032f1295f3..ec943119f8b63 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -34,7 +34,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string void zend_verify_abstract_class(zend_class_entry *ce); void zend_build_properties_info_table(zend_class_entry *ce); -zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding); +ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding); ZEND_API extern zend_class_entry* (*zend_inheritance_cache_get)(zend_class_entry *ce, zend_class_entry *parent, zend_class_entry **traits_and_interfaces); ZEND_API extern zend_class_entry* (*zend_inheritance_cache_add)(zend_class_entry *ce, zend_class_entry *proto, zend_class_entry *parent, zend_class_entry **traits_and_interfaces, HashTable *dependencies); diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index ece89bf348220..11158cead5698 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1471,6 +1471,7 @@ static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script orig_compiler_options = CG(compiler_options); CG(compiler_options) |= ZEND_COMPILE_WITH_FILE_CACHE; zend_optimize_script(&new_persistent_script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); + zend_accel_finalize_delayed_early_binding_list(new_persistent_script); CG(compiler_options) = orig_compiler_options; *from_shared_memory = 1; @@ -1488,6 +1489,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr CG(compiler_options) |= ZEND_COMPILE_WITH_FILE_CACHE; } zend_optimize_script(&new_persistent_script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); + zend_accel_finalize_delayed_early_binding_list(new_persistent_script); CG(compiler_options) = orig_compiler_options; /* exclusive lock */ @@ -1810,10 +1812,7 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl new_persistent_script->script.main_op_array = *op_array; zend_accel_move_user_functions(CG(function_table), CG(function_table)->nNumUsed - orig_functions_count, &new_persistent_script->script); zend_accel_move_user_classes(CG(class_table), CG(class_table)->nNumUsed - orig_class_count, &new_persistent_script->script); - new_persistent_script->script.first_early_binding_opline = - (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) ? - zend_build_delayed_early_binding_list(op_array) : - (uint32_t)-1; + zend_accel_build_delayed_early_binding_list(new_persistent_script); new_persistent_script->num_warnings = EG(num_errors); new_persistent_script->warnings = EG(errors); EG(num_errors) = 0; @@ -3604,7 +3603,6 @@ static zend_op_array *preload_compile_file(zend_file_handle *file_handle, int ty zend_persistent_script *script; script = create_persistent_script(); - script->script.first_early_binding_opline = (uint32_t)-1; script->script.filename = zend_string_copy(op_array->filename); zend_string_hash_val(script->script.filename); script->script.main_op_array = *op_array; @@ -4023,8 +4021,9 @@ static void preload_link(void) preload_remove_declares(op_array); if (op_array->fn_flags & ZEND_ACC_EARLY_BINDING) { - script->script.first_early_binding_opline = zend_build_delayed_early_binding_list(op_array); - if (script->script.first_early_binding_opline == (uint32_t)-1) { + zend_accel_free_delayed_early_binding_list(script); + zend_accel_build_delayed_early_binding_list(script); + if (!script->num_early_bindings) { op_array->fn_flags &= ~ZEND_ACC_EARLY_BINDING; } } @@ -4195,6 +4194,7 @@ static void preload_optimize(zend_persistent_script *script) } ZEND_HASH_FOREACH_END(); zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); + zend_accel_finalize_delayed_early_binding_list(script); ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { preload_fix_trait_methods(ce); @@ -4210,6 +4210,7 @@ static void preload_optimize(zend_persistent_script *script) ZEND_HASH_FOREACH_PTR(preload_scripts, script) { zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); + zend_accel_finalize_delayed_early_binding_list(script); } ZEND_HASH_FOREACH_END(); } @@ -4522,8 +4523,6 @@ static int accel_preload(const char *config, bool in_child) script->script.filename = CG(compiled_filename); CG(compiled_filename) = NULL; - script->script.first_early_binding_opline = (uint32_t)-1; - preload_move_user_functions(CG(function_table), &script->script.function_table); preload_move_user_classes(CG(class_table), &script->script.class_table); diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index 824e3cd3575fd..090d8f41f35a8 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -109,6 +109,13 @@ typedef enum _zend_accel_restart_reason { ACCEL_RESTART_USER /* restart scheduled by opcache_reset() */ } zend_accel_restart_reason; +typedef struct _zend_early_binding { + zend_string *lcname; + zend_string *rtd_key; + zend_string *lc_parent_name; + uint32_t cache_slot; +} zend_early_binding; + typedef struct _zend_persistent_script { zend_script script; zend_long compiler_halt_offset; /* position of __HALT_COMPILER or -1 */ @@ -118,7 +125,9 @@ typedef struct _zend_persistent_script { bool is_phar; bool empty; uint32_t num_warnings; + uint32_t num_early_bindings; zend_error_info **warnings; + zend_early_binding *early_bindings; void *mem; /* shared memory area used by script structures */ size_t size; /* size of used shared memory */ diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index c6710e524991c..b6b182b1d6f10 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -21,6 +21,7 @@ #include "zend_API.h" #include "zend_constants.h" +#include "zend_inheritance.h" #include "zend_accelerator_util_funcs.h" #include "zend_persist.h" #include "zend_shared_alloc.h" @@ -71,6 +72,8 @@ void free_persistent_script(zend_persistent_script *persistent_script, int destr efree(persistent_script->warnings); } + zend_accel_free_delayed_early_binding_list(persistent_script); + efree(persistent_script); } @@ -225,6 +228,116 @@ static void zend_accel_class_hash_copy(HashTable *target, HashTable *source) return; } +void zend_accel_build_delayed_early_binding_list(zend_persistent_script *persistent_script) +{ + zend_op_array *op_array = &persistent_script->script.main_op_array; + if (!(op_array->fn_flags & ZEND_ACC_EARLY_BINDING)) { + return; + } + + zend_op *end = op_array->opcodes + op_array->last; + for (zend_op *opline = op_array->opcodes; opline < end; opline++) { + if (opline->opcode == ZEND_DECLARE_CLASS_DELAYED) { + persistent_script->num_early_bindings++; + } + } + + zend_early_binding *early_binding = persistent_script->early_bindings = + emalloc(sizeof(zend_early_binding) * persistent_script->num_early_bindings); + + for (zend_op *opline = op_array->opcodes; opline < end; opline++) { + if (opline->opcode == ZEND_DECLARE_CLASS_DELAYED) { + zval *lcname = RT_CONSTANT(opline, opline->op1); + early_binding->lcname = zend_string_copy(Z_STR_P(lcname)); + early_binding->rtd_key = zend_string_copy(Z_STR_P(lcname + 1)); + early_binding->lc_parent_name = + zend_string_copy(Z_STR_P(RT_CONSTANT(opline, opline->op2))); + early_binding->cache_slot = (uint32_t) -1; + early_binding++; + } + } +} + +void zend_accel_finalize_delayed_early_binding_list(zend_persistent_script *persistent_script) +{ + if (!persistent_script->num_early_bindings) { + return; + } + + zend_early_binding *early_binding = persistent_script->early_bindings; + zend_early_binding *early_binding_end = early_binding + persistent_script->num_early_bindings; + zend_op_array *op_array = &persistent_script->script.main_op_array; + zend_op *opline_end = op_array->opcodes + op_array->last; + for (zend_op *opline = op_array->opcodes; opline < opline_end; opline++) { + if (opline->opcode == ZEND_DECLARE_CLASS_DELAYED) { + zend_string *rtd_key = Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1); + /* Skip early_binding entries that don't match, maybe their DECLARE_CLASS_DELAYED + * was optimized away. */ + while (!zend_string_equals(early_binding->rtd_key, rtd_key)) { + early_binding++; + if (early_binding >= early_binding_end) { + return; + } + } + + early_binding->cache_slot = opline->extended_value; + early_binding++; + if (early_binding >= early_binding_end) { + return; + } + } + } +} + +void zend_accel_free_delayed_early_binding_list(zend_persistent_script *persistent_script) +{ + if (persistent_script->num_early_bindings) { + for (uint32_t i = 0; i < persistent_script->num_early_bindings; i++) { + zend_early_binding *early_binding = &persistent_script->early_bindings[i]; + zend_string_release(early_binding->lcname); + zend_string_release(early_binding->rtd_key); + zend_string_release(early_binding->lc_parent_name); + } + efree(persistent_script->early_bindings); + persistent_script->early_bindings = NULL; + persistent_script->num_early_bindings = 0; + } +} + +static void zend_accel_do_delayed_early_binding( + zend_persistent_script *persistent_script, zend_op_array *op_array) +{ + ZEND_ASSERT(!ZEND_MAP_PTR(op_array->run_time_cache)); + ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE); + void *ptr = emalloc(op_array->cache_size + sizeof(void*)); + ZEND_MAP_PTR_INIT(op_array->run_time_cache, ptr); + char *run_time_cache = (char *) ptr + sizeof(void*); + ZEND_MAP_PTR_SET(op_array->run_time_cache, run_time_cache); + memset(run_time_cache, 0, op_array->cache_size); + + zend_string *orig_compiled_filename = CG(compiled_filename); + bool orig_in_compilation = CG(in_compilation); + CG(compiled_filename) = persistent_script->script.filename; + CG(in_compilation) = 1; + for (uint32_t i = 0; i < persistent_script->num_early_bindings; i++) { + zend_early_binding *early_binding = &persistent_script->early_bindings[i]; + zval *zv = zend_hash_find_known_hash(EG(class_table), early_binding->rtd_key); + if (zv) { + zend_class_entry *ce = Z_CE_P(zv); + zend_class_entry *parent_ce = + zend_hash_find_ex_ptr(EG(class_table), early_binding->lc_parent_name, 1); + if (parent_ce) { + ce = zend_try_early_bind(ce, parent_ce, early_binding->lcname, zv); + if (ce && early_binding->cache_slot != (uint32_t) -1) { + *(void**)(run_time_cache + early_binding->cache_slot) = ce; + } + } + } + } + CG(compiled_filename) = orig_compiled_filename; + CG(in_compilation) = orig_in_compilation; +} + zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, int from_shared_memory) { zend_op_array *op_array; @@ -259,11 +372,8 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, } } - if (persistent_script->script.first_early_binding_opline != (uint32_t)-1) { - zend_string *orig_compiled_filename = CG(compiled_filename); - CG(compiled_filename) = persistent_script->script.filename; - zend_do_delayed_early_binding(op_array, persistent_script->script.first_early_binding_opline); - CG(compiled_filename) = orig_compiled_filename; + if (persistent_script->num_early_bindings) { + zend_accel_do_delayed_early_binding(persistent_script, op_array); } if (UNEXPECTED(!from_shared_memory)) { diff --git a/ext/opcache/zend_accelerator_util_funcs.h b/ext/opcache/zend_accelerator_util_funcs.h index 88362436026d0..1ce661635c19a 100644 --- a/ext/opcache/zend_accelerator_util_funcs.h +++ b/ext/opcache/zend_accelerator_util_funcs.h @@ -30,6 +30,9 @@ void free_persistent_script(zend_persistent_script *persistent_script, int destr void zend_accel_move_user_functions(HashTable *str, uint32_t count, zend_script *script); void zend_accel_move_user_classes(HashTable *str, uint32_t count, zend_script *script); +void zend_accel_build_delayed_early_binding_list(zend_persistent_script *persistent_script); +void zend_accel_finalize_delayed_early_binding_list(zend_persistent_script *persistent_script); +void zend_accel_free_delayed_early_binding_list(zend_persistent_script *persistent_script); zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, int from_shared_memory); diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 22ccc4d84305d..9f96bf885abee 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -889,6 +889,21 @@ static void zend_file_cache_serialize_warnings( } } +static void zend_file_cache_serialize_early_bindings( + zend_persistent_script *script, zend_file_cache_metainfo *info, void *buf) +{ + if (script->early_bindings) { + SERIALIZE_PTR(script->early_bindings); + zend_early_binding *early_bindings = script->early_bindings; + UNSERIALIZE_PTR(early_bindings); + for (uint32_t i = 0; i < script->num_early_bindings; i++) { + SERIALIZE_STR(early_bindings[i].lcname); + SERIALIZE_STR(early_bindings[i].rtd_key); + SERIALIZE_STR(early_bindings[i].lc_parent_name); + } + } +} + static void zend_file_cache_serialize(zend_persistent_script *script, zend_file_cache_metainfo *info, void *buf) @@ -911,6 +926,7 @@ static void zend_file_cache_serialize(zend_persistent_script *script, zend_file_cache_serialize_hash(&new_script->script.function_table, script, info, buf, zend_file_cache_serialize_func); zend_file_cache_serialize_op_array(&new_script->script.main_op_array, script, info, buf); zend_file_cache_serialize_warnings(new_script, info, buf); + zend_file_cache_serialize_early_bindings(new_script, info, buf); new_script->mem = NULL; } @@ -1667,6 +1683,18 @@ static void zend_file_cache_unserialize_warnings(zend_persistent_script *script, } } +static void zend_file_cache_unserialize_early_bindings(zend_persistent_script *script, void *buf) +{ + if (script->early_bindings) { + UNSERIALIZE_PTR(script->early_bindings); + for (uint32_t i = 0; i < script->num_early_bindings; i++) { + UNSERIALIZE_STR(script->early_bindings[i].lcname); + UNSERIALIZE_STR(script->early_bindings[i].rtd_key); + UNSERIALIZE_STR(script->early_bindings[i].lc_parent_name); + } + } +} + static void zend_file_cache_unserialize(zend_persistent_script *script, void *buf) { @@ -1680,6 +1708,7 @@ static void zend_file_cache_unserialize(zend_persistent_script *script, script, buf, zend_file_cache_unserialize_func, ZEND_FUNCTION_DTOR); zend_file_cache_unserialize_op_array(&script->script.main_op_array, script, buf); zend_file_cache_unserialize_warnings(script, buf); + zend_file_cache_unserialize_early_bindings(script, buf); } zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle) diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index d2b62c30eb9b4..c2dbd5c19cc4c 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -1278,6 +1278,20 @@ zend_error_info **zend_persist_warnings(uint32_t num_warnings, zend_error_info * return warnings; } +static zend_early_binding *zend_persist_early_bindings( + uint32_t num_early_bindings, zend_early_binding *early_bindings) { + if (early_bindings) { + early_bindings = zend_shared_memdup_free( + early_bindings, num_early_bindings * sizeof(zend_early_binding)); + for (uint32_t i = 0; i < num_early_bindings; i++) { + zend_accel_store_interned_string(early_bindings[i].lcname); + zend_accel_store_interned_string(early_bindings[i].rtd_key); + zend_accel_store_interned_string(early_bindings[i].lc_parent_name); + } + } + return early_bindings; +} + zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script, int for_shm) { Bucket *p; @@ -1332,6 +1346,8 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script #endif } script->warnings = zend_persist_warnings(script->num_warnings, script->warnings); + script->early_bindings = zend_persist_early_bindings( + script->num_early_bindings, script->early_bindings); if (for_shm) { ZCSG(map_ptr_last) = CG(map_ptr_last); diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 3f79290841a0c..ed9a75bfced7c 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -568,6 +568,18 @@ void zend_persist_warnings_calc(uint32_t num_warnings, zend_error_info **warning } } +static void zend_persist_early_bindings_calc( + uint32_t num_early_bindings, zend_early_binding *early_bindings) +{ + ADD_SIZE(sizeof(zend_early_binding) * num_early_bindings); + for (uint32_t i = 0; i < num_early_bindings; i++) { + zend_early_binding *early_binding = &early_bindings[i]; + ADD_INTERNED_STRING(early_binding->lcname); + ADD_INTERNED_STRING(early_binding->rtd_key); + ADD_INTERNED_STRING(early_binding->lc_parent_name); + } +} + uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_script, int for_shm) { Bucket *p; @@ -606,6 +618,8 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s zend_persist_op_array_calc_ex(&new_persistent_script->script.main_op_array); zend_persist_warnings_calc( new_persistent_script->num_warnings, new_persistent_script->warnings); + zend_persist_early_bindings_calc( + new_persistent_script->num_early_bindings, new_persistent_script->early_bindings); new_persistent_script->corrupted = 0; From 492980c540045ce7999faabaf8b87f14e46f9a0d Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 29 Sep 2021 16:44:52 +0100 Subject: [PATCH 0127/1346] Use bool/zend_result instead of int in Date extension --- ext/date/php_date.c | 75 +++++++++++++++++++++++---------------------- ext/date/php_date.h | 18 +++++------ 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index f11357691e2a8..e914f5d6c0532 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -621,7 +621,7 @@ static const char *php_date_short_day_name(timelib_sll y, timelib_sll m, timelib /* }}} */ /* {{{ date_format - (gm)date helper */ -static zend_string *date_format(const char *format, size_t format_len, timelib_time *t, int localtime) +static zend_string *date_format(const char *format, size_t format_len, timelib_time *t, bool localtime) { smart_str string = {0}; size_t i; @@ -629,7 +629,7 @@ static zend_string *date_format(const char *format, size_t format_len, timelib_t char buffer[97]; timelib_time_offset *offset = NULL; timelib_sll isoweek, isoyear; - int rfc_colon; + bool rfc_colon; int weekYearSet = 0; if (!format_len) { @@ -788,7 +788,7 @@ static zend_string *date_format(const char *format, size_t format_len, timelib_t return string.s; } -static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime) +static void php_date(INTERNAL_FUNCTION_PARAMETERS, bool localtime) { zend_string *format; zend_long ts; @@ -808,7 +808,7 @@ static void php_date(INTERNAL_FUNCTION_PARAMETERS, int localtime) } /* }}} */ -PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_t ts, int localtime) /* {{{ */ +PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_t ts, bool localtime) /* {{{ */ { timelib_time *t; timelib_tzinfo *tzi; @@ -834,7 +834,7 @@ PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_ /* }}} */ /* {{{ php_idate */ -PHPAPI int php_idate(char format, time_t ts, int localtime) +PHPAPI int php_idate(char format, time_t ts, bool localtime) { timelib_time *t; timelib_tzinfo *tzi; @@ -1069,7 +1069,7 @@ PHP_FUNCTION(strtotime) /* }}} */ /* {{{ php_mktime - (gm)mktime helper */ -PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt) +PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, bool gmt) { zend_long hou, min, sec, mon, day, yea; bool min_is_null = 1, sec_is_null = 1, mon_is_null = 1, day_is_null = 1, yea_is_null = 1; @@ -1182,7 +1182,7 @@ PHP_FUNCTION(checkdate) /* }}} */ /* {{{ php_strftime - (gm)strftime helper */ -PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gmt) +PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, bool gmt) { zend_string *format; zend_long timestamp; @@ -2191,7 +2191,7 @@ static void php_date_get_current_time_with_fraction(time_t *sec, suseconds_t *us #endif } -PHPAPI int php_date_initialize(php_date_obj *dateobj, const char *time_str, size_t time_str_len, const char *format, zval *timezone_object, int flags) /* {{{ */ +PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, size_t time_str_len, const char *format, zval *timezone_object, int flags) /* {{{ */ { timelib_time *now; timelib_tzinfo *tzi = NULL; @@ -2526,13 +2526,13 @@ static bool php_date_initialize_from_hash(php_date_obj **dateobj, HashTable *myh zend_string *tmp = zend_string_concat3( Z_STRVAL_P(z_date), Z_STRLEN_P(z_date), " ", 1, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone)); - int ret = php_date_initialize(*dateobj, ZSTR_VAL(tmp), ZSTR_LEN(tmp), NULL, NULL, 0); + bool ret = php_date_initialize(*dateobj, ZSTR_VAL(tmp), ZSTR_LEN(tmp), NULL, NULL, 0); zend_string_release(tmp); - return 1 == ret; + return ret; } case TIMELIB_ZONETYPE_ID: { - int ret; + bool ret; php_timezone_obj *tzobj; tzi = php_date_parse_tzfile(Z_STRVAL_P(z_timezone), DATE_TIMEZONEDB); @@ -2548,7 +2548,7 @@ static bool php_date_initialize_from_hash(php_date_obj **dateobj, HashTable *myh ret = php_date_initialize(*dateobj, Z_STRVAL_P(z_date), Z_STRLEN_P(z_date), NULL, &tmp_obj, 0); zval_ptr_dtor(&tmp_obj); - return 1 == ret; + return ret; } } return false; @@ -2793,7 +2793,7 @@ PHP_FUNCTION(date_format) } /* }}} */ -static int php_date_modify(zval *object, char *modify, size_t modify_len) /* {{{ */ +static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{{ */ { php_date_obj *dateobj; timelib_time *tmp_time; @@ -3389,7 +3389,7 @@ PHP_FUNCTION(date_diff) } /* }}} */ -static int timezone_initialize(php_timezone_obj *tzobj, const char *tz, size_t tz_len) /* {{{ */ +static zend_result timezone_initialize(php_timezone_obj *tzobj, const char *tz, size_t tz_len) /* {{{ */ { timelib_time *dummy_t = ecalloc(1, sizeof(timelib_time)); int dst, not_found; @@ -3425,7 +3425,7 @@ PHP_FUNCTION(timezone_open) ZEND_PARSE_PARAMETERS_END(); tzobj = Z_PHPTIMEZONE_P(php_date_instantiate(date_ce_timezone, return_value)); - if (SUCCESS != timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz))) { + if (FAILURE == timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz))) { zval_ptr_dtor(return_value); RETURN_FALSE; } @@ -3450,26 +3450,27 @@ PHP_METHOD(DateTimeZone, __construct) } /* }}} */ -static int php_date_timezone_initialize_from_hash(zval **return_value, php_timezone_obj **tzobj, HashTable *myht) /* {{{ */ +static zend_result php_date_timezone_initialize_from_hash(zval **return_value, php_timezone_obj **tzobj, HashTable *myht) /* {{{ */ { zval *z_timezone_type; - if ((z_timezone_type = zend_hash_str_find(myht, "timezone_type", sizeof("timezone_type") - 1)) != NULL) { - zval *z_timezone; + if ((z_timezone_type = zend_hash_str_find(myht, "timezone_type", sizeof("timezone_type") - 1)) == NULL) { + return FAILURE; + } - if ((z_timezone = zend_hash_str_find(myht, "timezone", sizeof("timezone") - 1)) != NULL) { - if (Z_TYPE_P(z_timezone_type) != IS_LONG) { - return FAILURE; - } - if (Z_TYPE_P(z_timezone) != IS_STRING) { - return FAILURE; - } - if (SUCCESS == timezone_initialize(*tzobj, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone))) { - return SUCCESS; - } - } + zval *z_timezone; + + if ((z_timezone = zend_hash_str_find(myht, "timezone", sizeof("timezone") - 1)) == NULL) { + return FAILURE; + } + + if (Z_TYPE_P(z_timezone_type) != IS_LONG) { + return FAILURE; } - return FAILURE; + if (Z_TYPE_P(z_timezone) != IS_STRING) { + return FAILURE; + } + return timezone_initialize(*tzobj, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone)); } /* }}} */ /* {{{ */ @@ -3487,7 +3488,7 @@ PHP_METHOD(DateTimeZone, __set_state) php_date_instantiate(date_ce_timezone, return_value); tzobj = Z_PHPTIMEZONE_P(return_value); - if(php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) != SUCCESS) { + if (php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) == FAILURE) { zend_throw_error(NULL, "Timezone initialization failed"); zval_ptr_dtor(return_value); } @@ -3507,7 +3508,7 @@ PHP_METHOD(DateTimeZone, __wakeup) myht = Z_OBJPROP_P(object); - if(php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) != SUCCESS) { + if (php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) == FAILURE) { zend_throw_error(NULL, "Timezone initialization failed"); } } @@ -3590,7 +3591,8 @@ PHP_FUNCTION(timezone_transitions_get) { zval *object, element; php_timezone_obj *tzobj; - unsigned int begin = 0, found; + int begin = 0; + bool found; zend_long timestamp_begin = ZEND_LONG_MIN, timestamp_end = INT32_MAX; if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O|ll", &object, date_ce_timezone, ×tamp_begin, ×tamp_end) == FAILURE) { @@ -3899,7 +3901,6 @@ PHP_METHOD(DateInterval, __construct) } /* }}} */ - static int php_date_interval_initialize_from_hash(zval **return_value, php_interval_obj **intobj, HashTable *myht) /* {{{ */ { (*intobj)->diff = timelib_rel_time_ctor(); @@ -4511,7 +4512,7 @@ PHP_FUNCTION(date_default_timezone_get) /* {{{ php_do_date_sunrise_sunset * Common for date_sunrise() and date_sunset() functions */ -static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_sunset) +static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, bool calc_sunset) { double latitude, longitude, zenith, gmt_offset, altitude; bool latitude_is_null = 1, longitude_is_null = 1, zenith_is_null = 1, gmt_offset_is_null = 1; @@ -4788,7 +4789,7 @@ static HashTable *date_object_get_properties_period(zend_object *object) /* {{{ return props; } /* }}} */ -static int php_date_period_initialize_from_hash(php_period_obj *period_obj, HashTable *myht) /* {{{ */ +static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, HashTable *myht) /* {{{ */ { zval *ht_entry; @@ -4911,7 +4912,7 @@ PHP_METHOD(DatePeriod, __wakeup) /* {{{ date_period_is_magic_property * Common for date_period_read_property() and date_period_write_property() functions */ -static int date_period_is_magic_property(zend_string *name) +static bool date_period_is_magic_property(zend_string *name) { if (zend_string_equals_literal(name, "recurrences") || zend_string_equals_literal(name, "include_start_date") diff --git a/ext/date/php_date.h b/ext/date/php_date.h index fb01437479ccf..c30d34d3aa76a 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -50,7 +50,7 @@ static inline php_date_obj *php_date_obj_from_obj(zend_object *obj) { #define Z_PHPDATE_P(zv) php_date_obj_from_obj(Z_OBJ_P((zv))) struct _php_timezone_obj { - int initialized; + bool initialized; int type; union { timelib_tzinfo *tz; /* TIMELIB_ZONETYPE_ID */ @@ -72,7 +72,7 @@ static inline php_timezone_obj *php_timezone_obj_from_obj(zend_object *obj) { struct _php_interval_obj { timelib_rel_time *diff; int civil_or_wall; - int initialized; + bool initialized; zend_object std; }; @@ -89,8 +89,8 @@ struct _php_period_obj { timelib_time *end; timelib_rel_time *interval; int recurrences; - int initialized; - int include_start_date; + bool initialized; + bool include_start_date; zend_object std; }; @@ -114,13 +114,13 @@ PHPAPI time_t php_time(void); /* Backwards compatibility wrapper */ PHPAPI zend_long php_parse_date(const char *string, zend_long *now); -PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, int gmt); -PHPAPI int php_idate(char format, time_t ts, int localtime); +PHPAPI void php_mktime(INTERNAL_FUNCTION_PARAMETERS, bool gmt); +PHPAPI int php_idate(char format, time_t ts, bool localtime); #define _php_strftime php_strftime -PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, int gm); -PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_t ts, int localtime); +PHPAPI void php_strftime(INTERNAL_FUNCTION_PARAMETERS, bool gm); +PHPAPI zend_string *php_format_date(const char *format, size_t format_len, time_t ts, bool localtime); /* Mechanism to set new TZ database */ PHPAPI void php_date_set_tzdb(timelib_tzdb *tzdb); @@ -139,7 +139,7 @@ PHPAPI zend_class_entry *php_date_get_period_ce(void); #define PHP_DATE_INIT_FORMAT 0x02 PHPAPI zval *php_date_instantiate(zend_class_entry *pce, zval *object); -PHPAPI int php_date_initialize(php_date_obj *dateobj, const char *time_str, size_t time_str_len, const char *format, zval *timezone_object, int flags); +PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, size_t time_str_len, const char *format, zval *timezone_object, int flags); #endif /* PHP_DATE_H */ From 0663c64f41766a38e3a26563898303ed48438ad2 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 29 Sep 2021 16:45:22 +0100 Subject: [PATCH 0128/1346] Voidify php_date_interval_initialize_from_hash() --- ext/date/php_date.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e914f5d6c0532..93d5efbc709ba 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3901,7 +3901,7 @@ PHP_METHOD(DateInterval, __construct) } /* }}} */ -static int php_date_interval_initialize_from_hash(zval **return_value, php_interval_obj **intobj, HashTable *myht) /* {{{ */ +static void php_date_interval_initialize_from_hash(zval **return_value, php_interval_obj **intobj, HashTable *myht) /* {{{ */ { (*intobj)->diff = timelib_rel_time_ctor(); @@ -3986,8 +3986,6 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter } } (*intobj)->initialized = 1; - - return 0; } /* }}} */ /* {{{ */ From abf83e507912b0b0b398800698a18b5956cdf620 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 18 Oct 2020 19:24:25 +0200 Subject: [PATCH 0129/1346] Rename php_mb_safe_strrchr_ex to php_mb_safe_strrchr ...And remove the original php_mb_safe_strrchr, which was not being used anywhere. --- ext/mbstring/mbstring.c | 15 +++------------ ext/mbstring/mbstring.h | 5 +---- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index cccd57aa22df6..bf51132ab2599 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -651,8 +651,8 @@ static char *php_mb_rfc1867_basename(const zend_encoding *encoding, char *filena * the full path of the file on the user's filesystem, which means that unless * the user does basename() they get a bogus file name. Until IE's user base drops * to nill or problem is fixed this code must remain enabled for all systems. */ - s = php_mb_safe_strrchr_ex(filename, '\\', filename_len, (const mbfl_encoding *)encoding); - s2 = php_mb_safe_strrchr_ex(filename, '/', filename_len, (const mbfl_encoding *)encoding); + s = php_mb_safe_strrchr(filename, '\\', filename_len, (const mbfl_encoding *)encoding); + s2 = php_mb_safe_strrchr(filename, '/', filename_len, (const mbfl_encoding *)encoding); if (s && s2) { if (s > s2) { @@ -4229,8 +4229,7 @@ MBSTRING_API size_t php_mb_mbchar_bytes(const char *s) } /* }}} */ -/* {{{ MBSTRING_API char *php_mb_safe_strrchr_ex() */ -MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c, size_t nbytes, const mbfl_encoding *enc) +MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes, const mbfl_encoding *enc) { const char *p = s; char *last=NULL; @@ -4268,14 +4267,6 @@ MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c, size_t } return last; } -/* }}} */ - -/* {{{ MBSTRING_API char *php_mb_safe_strrchr() */ -MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes) -{ - return php_mb_safe_strrchr_ex(s, c, nbytes, MBSTRG(internal_encoding)); -} -/* }}} */ /* {{{ MBSTRING_API int php_mb_stripos() */ MBSTRING_API size_t php_mb_stripos(int mode, const char *old_haystack, size_t old_haystack_len, const char *old_needle, size_t old_needle_len, zend_long offset, const mbfl_encoding *enc) diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 7142d875d1b70..05016aa08dd14 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -53,10 +53,7 @@ PHP_RINIT_FUNCTION(mbstring); PHP_RSHUTDOWN_FUNCTION(mbstring); PHP_MINFO_FUNCTION(mbstring); -MBSTRING_API char *php_mb_safe_strrchr_ex(const char *s, unsigned int c, - size_t nbytes, const mbfl_encoding *enc); -MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, - size_t nbytes); +MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes, const mbfl_encoding *enc); MBSTRING_API char *php_mb_convert_encoding_ex( const char *input, size_t length, From 774cd960ab25b65898738d98801026da556758e6 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 18 Oct 2020 21:57:50 +0200 Subject: [PATCH 0130/1346] No need to null-terminate buffer in php_mb_chr `mbfl_buffer_converter_feed_result` will not overrun the specified length. --- ext/mbstring/mbstring.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index bf51132ab2599..36c5da6171708 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -4050,7 +4050,7 @@ static inline zend_string *php_mb_chr(zend_long cp, zend_string *enc_name, uint3 const mbfl_encoding *enc; enum mbfl_no_encoding no_enc; zend_string *ret; - char buf[5]; + char buf[4]; enc = php_mb_get_encoding(enc_name, enc_name_arg_num); if (!enc) { @@ -4101,7 +4101,6 @@ static inline zend_string *php_mb_chr(zend_long cp, zend_string *enc_name, uint3 buf[1] = (cp >> 16) & 0xff; buf[2] = (cp >> 8) & 0xff; buf[3] = cp & 0xff; - buf[4] = 0; size_t ret_len; long orig_illegalchars = MBSTRG(illegalchars); From d3f56e5ac922ba2555a7a8d8097c07da52adef39 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 18 Oct 2020 20:02:13 +0200 Subject: [PATCH 0131/1346] Rename php_mb_mbchar_bytes_ex to php_mb_mbchar_bytes ...And remove the original php_mb_mbchar_bytes, which was not being used. --- ext/mbstring/mbstring.c | 21 ++++++--------------- ext/mbstring/mbstring.h | 3 +-- ext/mbstring/php_mbregex.c | 8 ++++---- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 36c5da6171708..f99ceea4180cb 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -562,7 +562,7 @@ static char *php_mb_rfc1867_substring_conf(const zend_encoding *encoding, char * if (start[i] == '\\' && (start[i + 1] == '\\' || (quote && start[i + 1] == quote))) { *resp++ = start[++i]; } else { - size_t j = php_mb_mbchar_bytes_ex(start+i, (const mbfl_encoding *)encoding); + size_t j = php_mb_mbchar_bytes(start+i, (const mbfl_encoding *)encoding); while (j-- > 0 && i < len) { *resp++ = start[i++]; @@ -594,7 +594,7 @@ static char *php_mb_rfc1867_getword(const zend_encoding *encoding, char **line, ++pos; } } else { - pos += php_mb_mbchar_bytes_ex(pos, (const mbfl_encoding *)encoding); + pos += php_mb_mbchar_bytes(pos, (const mbfl_encoding *)encoding); } } @@ -607,7 +607,7 @@ static char *php_mb_rfc1867_getword(const zend_encoding *encoding, char **line, res = estrndup(*line, pos - *line); while (*pos == stop) { - pos += php_mb_mbchar_bytes_ex(pos, (const mbfl_encoding *)encoding); + pos += php_mb_mbchar_bytes(pos, (const mbfl_encoding *)encoding); } *line = pos; @@ -4203,8 +4203,7 @@ static int php_mb_encoding_translation(void) } /* }}} */ -/* {{{ MBSTRING_API size_t php_mb_mbchar_bytes_ex() */ -MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc) +MBSTRING_API size_t php_mb_mbchar_bytes(const char *s, const mbfl_encoding *enc) { if (enc) { if (enc->mblen_table) { @@ -4219,14 +4218,6 @@ MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *e } return 1; } -/* }}} */ - -/* {{{ MBSTRING_API size_t php_mb_mbchar_bytes() */ -MBSTRING_API size_t php_mb_mbchar_bytes(const char *s) -{ - return php_mb_mbchar_bytes_ex(s, MBSTRG(internal_encoding)); -} -/* }}} */ MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nbytes, const mbfl_encoding *enc) { @@ -4241,7 +4232,7 @@ MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nby if ((unsigned char)*p == (unsigned char)c) { last = (char *)p; } - nb = php_mb_mbchar_bytes_ex(p, enc); + nb = php_mb_mbchar_bytes(p, enc); if (nb == 0) { return NULL; /* something is going wrong! */ } @@ -4256,7 +4247,7 @@ MBSTRING_API char *php_mb_safe_strrchr(const char *s, unsigned int c, size_t nby if ((unsigned char)*p == (unsigned char)c) { last = (char *)p; } - nbytes_char = php_mb_mbchar_bytes_ex(p, enc); + nbytes_char = php_mb_mbchar_bytes(p, enc); if (bcnt < nbytes_char) { return NULL; } diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 05016aa08dd14..82b28dbef00e4 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -62,8 +62,7 @@ MBSTRING_API char * php_mb_convert_encoding( const char *input, size_t length, const mbfl_encoding *to_encoding, const mbfl_encoding **from_encodings, size_t num_from_encodings, size_t *output_len); -MBSTRING_API size_t php_mb_mbchar_bytes_ex(const char *s, const mbfl_encoding *enc); -MBSTRING_API size_t php_mb_mbchar_bytes(const char *s); +MBSTRING_API size_t php_mb_mbchar_bytes(const char *s, const mbfl_encoding *enc); MBSTRING_API size_t php_mb_stripos(int mode, const char *old_haystack, size_t old_haystack_len, const char *old_needle, size_t old_needle_len, zend_long offset, const mbfl_encoding *encoding); MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const mbfl_encoding *encoding); diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index 06f65f5c56735..1cedee5d79e40 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -721,7 +721,7 @@ static inline void mb_regex_substitute( eos = replace + replace_len; while (p < eos) { - clen = (int) php_mb_mbchar_bytes_ex(p, enc); + clen = (int) php_mb_mbchar_bytes(p, enc); if (clen != 1 || p == eos || p[0] != '\\') { /* skip anything that's not an ascii backslash */ smart_str_appendl(pbuf, p, clen); @@ -729,7 +729,7 @@ static inline void mb_regex_substitute( continue; } sp = p; /* save position */ - clen = (int) php_mb_mbchar_bytes_ex(++p, enc); + clen = (int) php_mb_mbchar_bytes(++p, enc); if (clen != 1 || p == eos) { /* skip backslash followed by multibyte char */ smart_str_appendl(pbuf, sp, p - sp); @@ -759,7 +759,7 @@ static inline void mb_regex_substitute( break; case 'k': { - clen = (int) php_mb_mbchar_bytes_ex(++p, enc); + clen = (int) php_mb_mbchar_bytes(++p, enc); if (clen != 1 || p == eos || (p[0] != '<' && p[0] != '\'')) { /* not a backref delimiter */ p += clen; @@ -772,7 +772,7 @@ static inline void mb_regex_substitute( char maybe_num = 1; name_end = name = p + 1; while (name_end < eos) { - clen = (int) php_mb_mbchar_bytes_ex(name_end, enc); + clen = (int) php_mb_mbchar_bytes(name_end, enc); if (clen != 1) { name_end += clen; maybe_num = 0; From bf78070cbec6fc7b3a8e121d05548c328227e7d1 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 18 Oct 2020 19:49:05 +0200 Subject: [PATCH 0132/1346] Don't check for impossible error condition in mb_strlen --- ext/mbstring/libmbfl/mbfl/mbfilter.c | 4 +--- ext/mbstring/mbstring.c | 6 +----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 1f2a8b867b37f..8b51b80ec8602 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -461,9 +461,7 @@ mbfl_strlen(const mbfl_string *string) string->encoding, &mbfl_encoding_wchar, filter_count_output, 0, &len); - if (filter == NULL) { - return (size_t) -1; - } + ZEND_ASSERT(filter); /* count */ n = string->len; p = string->val; diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index f99ceea4180cb..7c324b73d3b3c 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -1823,11 +1823,7 @@ PHP_FUNCTION(mb_strlen) RETURN_THROWS(); } - size_t n = mbfl_strlen(&string); - /* Only way this can fail is if the conversion creation fails - * this would imply some sort of memory allocation failure which is a bug */ - ZEND_ASSERT(!mbfl_is_error(n)); - RETVAL_LONG(n); + RETVAL_LONG(mbfl_strlen(&string)); } /* }}} */ From 8c32deb6054369556350bcd3a7f07156bbf85e65 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 18 Oct 2020 19:54:38 +0200 Subject: [PATCH 0133/1346] Don't check for impossible error condition in mb_strwidth --- ext/mbstring/libmbfl/mbfl/mbfilter.c | 5 +---- ext/mbstring/mbstring.c | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 8b51b80ec8602..42a493d88a271 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -1250,10 +1250,7 @@ mbfl_strwidth(mbfl_string *string) string->encoding, &mbfl_encoding_wchar, filter_count_width, 0, &len); - if (filter == NULL) { - mbfl_convert_filter_delete(filter); - return -1; - } + ZEND_ASSERT(filter); /* feed data */ p = string->val; diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 7c324b73d3b3c..0711729f49dd5 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2255,9 +2255,7 @@ PHP_FUNCTION(mb_strwidth) RETURN_THROWS(); } - size_t n = mbfl_strwidth(&string); - ZEND_ASSERT(n != (size_t) -1); - RETVAL_LONG(n); + RETVAL_LONG(mbfl_strwidth(&string)); } /* }}} */ From 3bf431969e69673c7d52d09b09afedb2b61784d2 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sat, 18 Sep 2021 19:22:20 +0200 Subject: [PATCH 0134/1346] Don't check for impossible error condition in mb_substr_count --- ext/mbstring/libmbfl/mbfl/mbfilter.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 42a493d88a271..85444a4c47703 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -692,9 +692,7 @@ mbfl_substr_count( needle->encoding, &mbfl_encoding_wchar, mbfl_wchar_device_output, 0, &pc.needle); - if (filter == NULL) { - return MBFL_ERROR_ENCODING; - } + ZEND_ASSERT(filter); mbfl_convert_filter_feed_string(filter, needle->val, needle->len); mbfl_convert_filter_flush(filter); mbfl_convert_filter_delete(filter); @@ -711,10 +709,7 @@ mbfl_substr_count( haystack->encoding, &mbfl_encoding_wchar, collector_strpos, 0, &pc); - if (filter == NULL) { - mbfl_wchar_device_clear(&pc.needle); - return MBFL_ERROR_ENCODING; - } + ZEND_ASSERT(filter); pc.start = 0; pc.output = 0; pc.needle_pos = 0; From f4365d2c26215e8eda7ccc79a4d2837fedc2fed3 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sat, 18 Sep 2021 21:32:56 +0200 Subject: [PATCH 0135/1346] Remove unused typedef 'mbfl_encoding_id' --- ext/mbstring/libmbfl/mbfl/mbfl_encoding.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h index c99b42dcc6eab..daeace934c93b 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h @@ -118,8 +118,6 @@ enum mbfl_no_encoding { mbfl_no_encoding_charset_max }; -typedef enum mbfl_no_encoding mbfl_encoding_id; - struct _mbfl_convert_filter; struct mbfl_convert_vtbl { enum mbfl_no_encoding from; From 0b32a15eb015ae01cdee0a1c675509c2323ffd1f Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 22 Sep 2021 21:13:12 +0200 Subject: [PATCH 0136/1346] Optimize mb_str{,im}width for performance Rather than doing a linear search of a table of fullwidth codepoint ranges for every input character, 1) Short-cut the search if the codepoint is below the first such range 2) Otherwise, do a binary (rather than linear) search --- ext/mbstring/libmbfl/mbfl/eaw_table.h | 2 ++ ext/mbstring/libmbfl/mbfl/mbfilter.c | 40 ++++++++++++++------------- ext/mbstring/ucgendat/ucgendat.php | 9 ++++-- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/ext/mbstring/libmbfl/mbfl/eaw_table.h b/ext/mbstring/libmbfl/mbfl/eaw_table.h index 1ab2e58f1e34f..59190406321d3 100644 --- a/ext/mbstring/libmbfl/mbfl/eaw_table.h +++ b/ext/mbstring/libmbfl/mbfl/eaw_table.h @@ -14,6 +14,8 @@ * which should be displayed as double-width. */ +#define FIRST_DOUBLEWIDTH_CODEPOINT 0x1100 + static const struct { int begin; int end; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 85444a4c47703..93ea36aa2c608 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -1203,31 +1203,33 @@ mbfl_strcut( return result; } - -/* - * strwidth - */ -static size_t is_fullwidth(int c) +/* Some East Asian characters, when printed at a terminal (or the like), require double + * the usual amount of horizontal space. We call these "fullwidth" characters. */ +static size_t character_width(int c) { - int i; - - if (c < mbfl_eaw_table[0].begin) { - return 0; - } - - for (i = 0; i < sizeof(mbfl_eaw_table) / sizeof(mbfl_eaw_table[0]); i++) { - if (mbfl_eaw_table[i].begin <= c && c <= mbfl_eaw_table[i].end) { - return 1; + if (c < FIRST_DOUBLEWIDTH_CODEPOINT) { + return 1; + } + + /* Do a binary search to see if we fall in any of the fullwidth ranges */ + int lo = 0, hi = sizeof(mbfl_eaw_table) / sizeof(mbfl_eaw_table[0]); + while (lo < hi) { + int probe = (lo + hi) / 2; + if (c < mbfl_eaw_table[probe].begin) { + hi = probe; + } else if (c > mbfl_eaw_table[probe].end) { + lo = probe + 1; + } else { + return 2; } } - return 0; + return 1; } -static int -filter_count_width(int c, void* data) +static int filter_count_width(int c, void* data) { - (*(size_t *)data) += (is_fullwidth(c) ? 2: 1); + (*(size_t *)data) += character_width(c); return 0; } @@ -1289,7 +1291,7 @@ collector_strimwidth(int c, void* data) break; default: if (pc->outchar >= pc->from) { - pc->outwidth += (is_fullwidth(c) ? 2: 1); + pc->outwidth += character_width(c); if (pc->outwidth > pc->width) { if (pc->status == 0) { diff --git a/ext/mbstring/ucgendat/ucgendat.php b/ext/mbstring/ucgendat/ucgendat.php index 031b60eb7fc3d..c962c57939aa4 100755 --- a/ext/mbstring/ucgendat/ucgendat.php +++ b/ext/mbstring/ucgendat/ucgendat.php @@ -700,7 +700,7 @@ function generateMPH(array $map, bool $fast) { } function generateEastAsianWidthData(array $wideRanges) { - $result = <<<'HEADER' + $result = <<<'HEADER' /* This file was generated by ext/mbstring/ucgendat/ucgendat.php. * * DO NOT EDIT THIS FILE! @@ -717,12 +717,17 @@ function generateEastAsianWidthData(array $wideRanges) { * which should be displayed as double-width. */ +HEADER; + + $result .= "\n#define FIRST_DOUBLEWIDTH_CODEPOINT 0x" . dechex($wideRanges[0]->start) . "\n\n"; + + $result .= <<<'TABLESTART' static const struct { int begin; int end; } mbfl_eaw_table[] = { -HEADER; +TABLESTART; foreach ($wideRanges as $range) { $startCode = dechex($range->start); From 780049128997c0c8b833dc68279089a566d2fb39 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 22 Sep 2021 21:50:08 +0200 Subject: [PATCH 0137/1346] Inline SKIP_LONG_HEADER... macro which is only used once I don't find that pulling this code out into a macro makes anything clearer. Not at all. --- ext/mbstring/mbstring.c | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 0711729f49dd5..e48b718b96b94 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -3253,16 +3253,6 @@ PHP_FUNCTION(mb_decode_numericentity) /* }}} */ /* {{{ Sends an email message with MIME scheme */ - -#define SKIP_LONG_HEADER_SEP_MBSTRING(str, pos) \ - if (str[pos] == '\r' && str[pos + 1] == '\n' && (str[pos + 2] == ' ' || str[pos + 2] == '\t')) { \ - pos += 2; \ - while (str[pos + 1] == ' ' || str[pos + 1] == '\t') { \ - pos++; \ - } \ - continue; \ - } - static int _php_mbstr_parse_mail_headers(HashTable *ht, const char *str, size_t str_len) { const char *ps; @@ -3567,15 +3557,20 @@ PHP_FUNCTION(mb_send_mail) to_r[to_len - 1] = '\0'; } for (i = 0; to_r[i]; i++) { - if (iscntrl((unsigned char) to_r[i])) { - /* According to RFC 822, section 3.1.1 long headers may be separated into - * parts using CRLF followed at least one linear-white-space character ('\t' or ' '). - * To prevent these separators from being replaced with a space, we use the - * SKIP_LONG_HEADER_SEP_MBSTRING to skip over them. - */ - SKIP_LONG_HEADER_SEP_MBSTRING(to_r, i); - to_r[i] = ' '; - } + if (iscntrl((unsigned char) to_r[i])) { + /* According to RFC 822, section 3.1.1 long headers may be separated into + * parts using CRLF followed at least one linear-white-space character ('\t' or ' '). + * To prevent these separators from being replaced with a space, we skip over them. */ + if (to_r[i] == '\r' && to_r[i + 1] == '\n' && (to_r[i + 2] == ' ' || to_r[i + 2] == '\t')) { + i += 2; + while (to_r[i + 1] == ' ' || to_r[i + 1] == '\t') { + i++; + } + continue; + } + + to_r[i] = ' '; + } } } else { to_r = to; @@ -3694,7 +3689,6 @@ PHP_FUNCTION(mb_send_mail) } } -#undef SKIP_LONG_HEADER_SEP_MBSTRING #undef MAIL_ASCIIZ_CHECK_MBSTRING #undef PHP_MBSTR_MAIL_MIME_HEADER1 #undef PHP_MBSTR_MAIL_MIME_HEADER2 From 5bda4cd25a14754966a71469c7e2089749cdf516 Mon Sep 17 00:00:00 2001 From: codinghuang Date: Sun, 5 Sep 2021 00:53:51 +0800 Subject: [PATCH 0138/1346] Support specifying start position in compile_string Add additional zend_compile_position argument, which can be either AT_SHEBANG, AT_OPEN_TAG or AFTER_OPEN_TAG. The previous behavior corresponds to AFTER_OPEN_TAG. Closes GH-7462. --- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 10 +++- Zend/zend_execute.c | 2 +- Zend/zend_execute_API.c | 2 +- Zend/zend_language_scanner.l | 16 +++++- ext/zend_test/test.c | 35 ++++++++++++ ext/zend_test/test.stub.php | 2 + ext/zend_test/test_arginfo.h | 10 +++- .../tests/zend_test_compile_string.phpt | 55 +++++++++++++++++++ sapi/fuzzer/fuzzer-execute-common.h | 8 ++- sapi/phpdbg/phpdbg.h | 2 +- sapi/phpdbg/phpdbg_bp.c | 2 +- sapi/phpdbg/phpdbg_list.c | 6 +- sapi/phpdbg/phpdbg_prompt.c | 2 +- 14 files changed, 137 insertions(+), 17 deletions(-) create mode 100644 ext/zend_test/tests/zend_test_compile_string.phpt diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3af0d6e46070c..395e0045253de 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -80,7 +80,7 @@ static inline uint32_t zend_alloc_cache_slot(void) { } ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type); -ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename); +ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename, zend_compile_position position); #ifndef ZTS ZEND_API zend_compiler_globals compiler_globals; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 95d7984fdc958..1a4d3afcac04e 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -740,6 +740,12 @@ struct _zend_execute_data { #include "zend_globals.h" +typedef enum _zend_compile_position { + ZEND_COMPILE_POSITION_AT_SHEBANG = 0, + ZEND_COMPILE_POSITION_AT_OPEN_TAG, + ZEND_COMPILE_POSITION_AFTER_OPEN_TAG +} zend_compile_position; + BEGIN_EXTERN_C() void init_compiler(void); @@ -752,7 +758,7 @@ void zend_file_context_begin(zend_file_context *prev_context); void zend_file_context_end(zend_file_context *prev_context); extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type); -extern ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename); +extern ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename, zend_compile_position position); ZEND_API int ZEND_FASTCALL lex_scan(zval *zendlval, zend_parser_stack_elem *elem); void startup_scanner(void); @@ -805,7 +811,7 @@ zend_string *zval_make_interned_string(zval *zv); struct _zend_arena; ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type); -ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename); +ZEND_API zend_op_array *compile_string(zend_string *source_string, const char *filename, zend_compile_position position); ZEND_API zend_op_array *compile_filename(int type, zend_string *filename); ZEND_API zend_ast *zend_compile_string_to_ast( zend_string *code, struct _zend_arena **ast_arena, zend_string *filename); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e59642292ba51..a4f8657a9b391 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4394,7 +4394,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval break; case ZEND_EVAL: { char *eval_desc = zend_make_compiled_string_description("eval()'d code"); - new_op_array = zend_compile_string(inc_filename, eval_desc); + new_op_array = zend_compile_string(inc_filename, eval_desc, ZEND_COMPILE_POSITION_AFTER_OPEN_TAG); efree(eval_desc); } break; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 481105d14c3f2..4c3d1fe2b5e87 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1223,7 +1223,7 @@ ZEND_API zend_result zend_eval_stringl(const char *str, size_t str_len, zval *re original_compiler_options = CG(compiler_options); CG(compiler_options) = ZEND_COMPILE_DEFAULT_FOR_EVAL; - new_op_array = zend_compile_string(code_str, string_name); + new_op_array = zend_compile_string(code_str, string_name, ZEND_COMPILE_POSITION_AFTER_OPEN_TAG); CG(compiler_options) = original_compiler_options; if (new_op_array) { diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 56c57a5a08543..ff70ff2282f7f 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -782,7 +782,7 @@ ZEND_API size_t zend_get_scanned_file_offset(void) return offset; } -zend_op_array *compile_string(zend_string *source_string, const char *filename) +zend_op_array *compile_string(zend_string *source_string, const char *filename, zend_compile_position position) { zend_lex_state original_lex_state; zend_op_array *op_array = NULL; @@ -799,7 +799,19 @@ zend_op_array *compile_string(zend_string *source_string, const char *filename) filename_str = zend_string_init(filename, strlen(filename), 0); zend_prepare_string_for_scanning(&tmp, filename_str); zend_string_release(filename_str); - BEGIN(ST_IN_SCRIPTING); + + switch (position) { + case ZEND_COMPILE_POSITION_AT_SHEBANG: + BEGIN(SHEBANG); + break; + case ZEND_COMPILE_POSITION_AT_OPEN_TAG: + BEGIN(INITIAL); + break; + case ZEND_COMPILE_POSITION_AFTER_OPEN_TAG: + BEGIN(ST_IN_SCRIPTING); + break; + } + op_array = zend_compile(ZEND_EVAL_CODE); zend_restore_lexical_state(&original_lex_state); diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 4746787b9160f..677061998d5b0 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -199,6 +199,41 @@ static ZEND_FUNCTION(zend_string_or_stdclass) } } +static ZEND_FUNCTION(zend_test_compile_string) +{ + zend_string *source_string = NULL; + zend_string *filename = NULL; + zend_long position = ZEND_COMPILE_POSITION_AT_OPEN_TAG; + + ZEND_PARSE_PARAMETERS_START(3, 3) + Z_PARAM_STR(source_string) + Z_PARAM_STR(filename) + Z_PARAM_LONG(position) + ZEND_PARSE_PARAMETERS_END(); + + zend_op_array *op_array = NULL; + + op_array = compile_string(source_string, ZSTR_VAL(filename), position); + + if (op_array) { + zval retval; + + zend_try { + ZVAL_UNDEF(&retval); + zend_execute(op_array, &retval); + } zend_catch { + destroy_op_array(op_array); + efree_size(op_array, sizeof(zend_op_array)); + zend_bailout(); + } zend_end_try(); + + destroy_op_array(op_array); + efree_size(op_array, sizeof(zend_op_array)); + } + + return; +} + /* Tests Z_PARAM_OBJ_OF_CLASS_OR_STR_OR_NULL */ static ZEND_FUNCTION(zend_string_or_stdclass_or_null) { diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index d83632691140a..f8b8b7f11156a 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -62,6 +62,8 @@ function zend_test_nullable_array_return(): ?array {} function zend_test_void_return(): void {} + function zend_test_compile_string(string $source_string, string $filename, int $position): void {} + /** @deprecated */ function zend_test_deprecated(mixed $arg = null): void {} diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index a77bf0d60b271..e1f9b72e7d47d 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: 53832c784e59195e8ef41710c1e4e778f396c99b */ + * Stub hash: 91ffc3205c6ac7b07953c9446e9cb9988d893dd4 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -10,6 +10,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_void_return, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_compile_string, 0, 3, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, source_string, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, position, IS_LONG, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_deprecated, 0, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arg, IS_MIXED, 0, "null") ZEND_END_ARG_INFO() @@ -84,6 +90,7 @@ ZEND_END_ARG_INFO() static ZEND_FUNCTION(zend_test_array_return); static ZEND_FUNCTION(zend_test_nullable_array_return); static ZEND_FUNCTION(zend_test_void_return); +static ZEND_FUNCTION(zend_test_compile_string); static ZEND_FUNCTION(zend_test_deprecated); static ZEND_FUNCTION(zend_create_unterminated_string); static ZEND_FUNCTION(zend_terminate_string); @@ -111,6 +118,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_test_array_return, arginfo_zend_test_array_return) ZEND_FE(zend_test_nullable_array_return, arginfo_zend_test_nullable_array_return) ZEND_FE(zend_test_void_return, arginfo_zend_test_void_return) + ZEND_FE(zend_test_compile_string, arginfo_zend_test_compile_string) ZEND_DEP_FE(zend_test_deprecated, arginfo_zend_test_deprecated) ZEND_FE(zend_create_unterminated_string, arginfo_zend_create_unterminated_string) ZEND_FE(zend_terminate_string, arginfo_zend_terminate_string) diff --git a/ext/zend_test/tests/zend_test_compile_string.phpt b/ext/zend_test/tests/zend_test_compile_string.phpt new file mode 100644 index 0000000000000..f2449d86ffa20 --- /dev/null +++ b/ext/zend_test/tests/zend_test_compile_string.phpt @@ -0,0 +1,55 @@ +--TEST-- +Zend: Test compile string +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +string(3) "php" +#!/path/to/php +string(3) "php" +string(3) "php" +string(3) "php" + +Parse error: syntax error, unexpected token "<", expecting end of file in Source string on line 1 diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index 16834e303835f..3189d514c02e3 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -60,15 +60,17 @@ static void fuzzer_execute_ex(zend_execute_data *execute_data) { } } -static zend_op_array *(*orig_compile_string)(zend_string *source_string, const char *filename); +static zend_op_array *(*orig_compile_string)( + zend_string *source_string, const char *filename, zend_compile_position position); -static zend_op_array *fuzzer_compile_string(zend_string *str, const char *filename) { +static zend_op_array *fuzzer_compile_string( + zend_string *str, const char *filename, zend_compile_position position) { if (ZSTR_LEN(str) > MAX_SIZE) { /* Avoid compiling huge inputs via eval(). */ fuzzer_bailout(); } - return orig_compile_string(str, filename); + return orig_compile_string(str, filename, position); } static void (*orig_execute_internal)(zend_execute_data *execute_data, zval *return_value); diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h index 789abecc9e704..45c5eb0593b7b 100644 --- a/sapi/phpdbg/phpdbg.h +++ b/sapi/phpdbg/phpdbg.h @@ -270,7 +270,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) zend_op_array *(*compile_file)(zend_file_handle *file_handle, int type); zend_op_array *(*init_compile_file)(zend_file_handle *file_handle, int type); - zend_op_array *(*compile_string)(zend_string *source_string, const char *filename); + zend_op_array *(*compile_string)(zend_string *source_string, const char *filename, zend_compile_position position); HashTable file_sources; zend_arena *oplog_arena; /* arena for storing oplog */ diff --git a/sapi/phpdbg/phpdbg_bp.c b/sapi/phpdbg/phpdbg_bp.c index e48ed5ceba2a9..3780c89033553 100644 --- a/sapi/phpdbg/phpdbg_bp.c +++ b/sapi/phpdbg/phpdbg_bp.c @@ -878,7 +878,7 @@ static inline void phpdbg_create_conditional_break(phpdbg_breakcond_t *brake, co bp_code = zend_string_concat3( "return ", sizeof("return ")-1, expr, expr_len, ";", sizeof(";")-1); - new_break.ops = zend_compile_string(bp_code, "Conditional Breakpoint Code"); + new_break.ops = zend_compile_string(bp_code, "Conditional Breakpoint Code", ZEND_COMPILE_POSITION_AFTER_OPEN_TAG); zend_string_release(bp_code); if (new_break.ops) { diff --git a/sapi/phpdbg/phpdbg_list.c b/sapi/phpdbg/phpdbg_list.c index 2c4d3bbe0bac6..00ef995d897e4 100644 --- a/sapi/phpdbg/phpdbg_list.c +++ b/sapi/phpdbg/phpdbg_list.c @@ -309,7 +309,7 @@ zend_op_array *phpdbg_init_compile_file(zend_file_handle *file, int type) { return op_array; } -zend_op_array *phpdbg_compile_string(zend_string *source_string, const char *filename) { +zend_op_array *phpdbg_compile_string(zend_string *source_string, const char *filename, zend_compile_position position) { zend_string *fake_name; zend_op_array *op_array; phpdbg_file_source *dataptr; @@ -317,7 +317,7 @@ zend_op_array *phpdbg_compile_string(zend_string *source_string, const char *fil char *bufptr, *endptr; if (PHPDBG_G(flags) & PHPDBG_IN_EVAL) { - return PHPDBG_G(compile_string)(source_string, filename); + return PHPDBG_G(compile_string)(source_string, filename, position); } dataptr = emalloc(sizeof(phpdbg_file_source) + sizeof(uint32_t) * ZSTR_LEN(source_string)); @@ -332,7 +332,7 @@ zend_op_array *phpdbg_compile_string(zend_string *source_string, const char *fil dataptr->lines = ++line; dataptr->line[line] = endptr - dataptr->buf; - op_array = PHPDBG_G(compile_string)(source_string, filename); + op_array = PHPDBG_G(compile_string)(source_string, filename, position); if (op_array == NULL) { efree(dataptr->buf); diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index 6597f5fe42cf8..dfdac95cae58d 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -514,7 +514,7 @@ PHPDBG_COMMAND(stdin) } /* }}} */ int phpdbg_compile_stdin(zend_string *code) { - PHPDBG_G(ops) = zend_compile_string(code, "Standard input code"); + PHPDBG_G(ops) = zend_compile_string(code, "Standard input code", ZEND_COMPILE_POSITION_AFTER_OPEN_TAG); zend_string_release(code); if (EG(exception)) { From 6e1d9f6a0946d01b8e9eee6a67dce3e62d0b94cb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 30 Sep 2021 11:48:01 +0200 Subject: [PATCH 0139/1346] Don't rely on HT internals in datefmt_format_object Use ZEND_HASH_FOREACH_VAL instead. --- .../dateformat/dateformat_format_object.cpp | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/ext/intl/dateformat/dateformat_format_object.cpp b/ext/intl/dateformat/dateformat_format_object.cpp index 2f82cfe3b9ab9..6afc9e6dca503 100644 --- a/ext/intl/dateformat/dateformat_format_object.cpp +++ b/ext/intl/dateformat/dateformat_format_object.cpp @@ -89,10 +89,7 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object) if (format == NULL || Z_TYPE_P(format) == IS_NULL) { //nothing } else if (Z_TYPE_P(format) == IS_ARRAY) { - HashTable *ht = Z_ARRVAL_P(format); - uint32_t idx; - zval *z; - + HashTable *ht = Z_ARRVAL_P(format); if (zend_hash_num_elements(ht) != 2) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, "datefmt_format_object: bad format; if array, it must have " @@ -100,37 +97,31 @@ U_CFUNC PHP_FUNCTION(datefmt_format_object) RETURN_FALSE; } - idx = 0; - while (idx < ht->nNumUsed) { - z = &ht->arData[idx].val; - if (Z_TYPE_P(z) != IS_UNDEF) { - break; + uint32_t idx = 0; + zval *z; + ZEND_HASH_FOREACH_VAL(ht, z) { + if (!valid_format(z)) { + if (idx == 0) { + intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "datefmt_format_object: bad format; the date format (first " + "element of the array) is not valid", 0); + } else { + ZEND_ASSERT(idx == 1 && "We checked that there are two elements above"); + intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, + "datefmt_format_object: bad format; the time format (second " + "element of the array) is not valid", 0); + } + RETURN_FALSE; } - idx++; - } - if (idx >= ht->nNumUsed || !valid_format(z)) { - intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, - "datefmt_format_object: bad format; the date format (first " - "element of the array) is not valid", 0); - RETURN_FALSE; - } - dateStyle = (DateFormat::EStyle)Z_LVAL_P(z); - - idx++; - while (idx < ht->nNumUsed) { - z = &ht->arData[idx].val; - if (Z_TYPE_P(z) != IS_UNDEF) { - break; + if (idx == 0) { + dateStyle = (DateFormat::EStyle)Z_LVAL_P(z); + } else { + ZEND_ASSERT(idx == 1 && "We checked that there are two elements above"); + timeStyle = (DateFormat::EStyle)Z_LVAL_P(z); } idx++; - } - if (idx >= ht->nNumUsed || !valid_format(z)) { - intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, - "datefmt_format_object: bad format; the time format (" - "second element of the array) is not valid", 0); - RETURN_FALSE; - } - timeStyle = (DateFormat::EStyle)Z_LVAL_P(z); + } ZEND_HASH_FOREACH_END(); + ZEND_ASSERT(idx == 2 && "We checked that there are two elements above"); } else if (Z_TYPE_P(format) == IS_LONG) { if (!valid_format(format)) { intl_error_set(NULL, U_ILLEGAL_ARGUMENT_ERROR, From 8d9306327adfff73624288dc4a27f0f3ac6be781 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 30 Sep 2021 03:14:52 +0100 Subject: [PATCH 0140/1346] Use bool/zend_result instead of int in FFI Also use == FAILURE instead of != SUCCESS --- ext/ffi/ffi.c | 114 +++++++++++++++++++++++----------------------- ext/ffi/ffi.g | 4 +- ext/ffi/php_ffi.h | 6 +-- 3 files changed, 61 insertions(+), 63 deletions(-) diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 963df0671a0a7..2ccb9ae849e47 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -206,7 +206,7 @@ static zend_internal_function zend_ffi_type_fn; /* forward declarations */ static void _zend_ffi_type_dtor(zend_ffi_type *type); static void zend_ffi_finalize_type(zend_ffi_dcl *dcl); -static int zend_ffi_is_same_type(zend_ffi_type *type1, zend_ffi_type *type2); +static bool zend_ffi_is_same_type(zend_ffi_type *type1, zend_ffi_type *type2); static zend_ffi_type *zend_ffi_remember_type(zend_ffi_type *type); static char *zend_ffi_parse_directives(const char *filename, char *code_pos, char **scope_name, char **lib, bool preload); static ZEND_FUNCTION(ffi_trampoline); @@ -254,7 +254,7 @@ static zend_object *zend_ffi_cdata_new(zend_class_entry *class_type) /* {{{ */ } /* }}} */ -static int zend_ffi_is_compatible_type(zend_ffi_type *dst_type, zend_ffi_type *src_type) /* {{{ */ +static bool zend_ffi_is_compatible_type(zend_ffi_type *dst_type, zend_ffi_type *src_type) /* {{{ */ { while (1) { if (dst_type == src_type) { @@ -333,7 +333,7 @@ static ffi_type* zend_ffi_face_struct_add_fields(ffi_type* t, zend_ffi_type *typ case ZEND_FFI_TYPE_STRUCT: { zend_ffi_type *field_type = ZEND_FFI_TYPE(field->type); /* for unions we use only the first field */ - int num_fields = !(field_type->attr & ZEND_FFI_ATTR_UNION) ? + uint32_t num_fields = !(field_type->attr & ZEND_FFI_ATTR_UNION) ? zend_hash_num_elements(&field_type->record.fields) : 1; if (num_fields > 1) { @@ -359,7 +359,7 @@ static ffi_type* zend_ffi_face_struct_add_fields(ffi_type* t, zend_ffi_type *typ static ffi_type *zend_ffi_make_fake_struct_type(zend_ffi_type *type) /* {{{ */ { /* for unions we use only the first field */ - int num_fields = !(type->attr & ZEND_FFI_ATTR_UNION) ? + uint32_t num_fields = !(type->attr & ZEND_FFI_ATTR_UNION) ? zend_hash_num_elements(&type->record.fields) : 1; size_t size = sizeof(ffi_type) + sizeof(ffi_type*) * (num_fields + 1); ffi_type *t = emalloc(size); @@ -675,7 +675,7 @@ static int zend_ffi_zval_to_bit_field(void *ptr, zend_ffi_field *field, zval *va } /* }}} */ -static zend_always_inline int zend_ffi_zval_to_cdata(void *ptr, zend_ffi_type *type, zval *value) /* {{{ */ +static zend_always_inline zend_result zend_ffi_zval_to_cdata(void *ptr, zend_ffi_type *type, zval *value) /* {{{ */ { zend_long lval; double dval; @@ -1386,7 +1386,7 @@ typedef struct _zend_ffi_ctype_name_buf { char buf[MAX_TYPE_NAME_LEN]; } zend_ffi_ctype_name_buf; -static int zend_ffi_ctype_name_prepend(zend_ffi_ctype_name_buf *buf, const char *str, size_t len) /* {{{ */ +static bool zend_ffi_ctype_name_prepend(zend_ffi_ctype_name_buf *buf, const char *str, size_t len) /* {{{ */ { buf->start -= len; if (buf->start < buf->buf) { @@ -1397,7 +1397,7 @@ static int zend_ffi_ctype_name_prepend(zend_ffi_ctype_name_buf *buf, const char } /* }}} */ -static int zend_ffi_ctype_name_append(zend_ffi_ctype_name_buf *buf, const char *str, size_t len) /* {{{ */ +static bool zend_ffi_ctype_name_append(zend_ffi_ctype_name_buf *buf, const char *str, size_t len) /* {{{ */ { if (buf->end + len > buf->buf + MAX_TYPE_NAME_LEN) { return 0; @@ -1408,10 +1408,10 @@ static int zend_ffi_ctype_name_append(zend_ffi_ctype_name_buf *buf, const char * } /* }}} */ -static int zend_ffi_ctype_name(zend_ffi_ctype_name_buf *buf, const zend_ffi_type *type) /* {{{ */ +static bool zend_ffi_ctype_name(zend_ffi_ctype_name_buf *buf, const zend_ffi_type *type) /* {{{ */ { const char *name = NULL; - int is_ptr = 0; + bool is_ptr = 0; while (1) { switch (type->kind) { @@ -2110,7 +2110,7 @@ static void zend_ffi_ctype_free_obj(zend_object *object) /* {{{ */ } /* }}} */ -static int zend_ffi_is_same_type(zend_ffi_type *type1, zend_ffi_type *type2) /* {{{ */ +static bool zend_ffi_is_same_type(zend_ffi_type *type1, zend_ffi_type *type2) /* {{{ */ { while (1) { if (type1 == type2) { @@ -2433,7 +2433,7 @@ static zval *zend_ffi_write_var(zend_object *obj, zend_string *var_name, zval *v } /* }}} */ -static int zend_ffi_pass_arg(zval *arg, zend_ffi_type *type, ffi_type **pass_type, void **arg_values, uint32_t n, zend_execute_data *execute_data) /* {{{ */ +static zend_result zend_ffi_pass_arg(zval *arg, zend_ffi_type *type, ffi_type **pass_type, void **arg_values, uint32_t n, zend_execute_data *execute_data) /* {{{ */ { zend_long lval; double dval; @@ -2576,7 +2576,7 @@ static int zend_ffi_pass_arg(zval *arg, zend_ffi_type *type, ffi_type **pass_typ } /* }}} */ -static int zend_ffi_pass_var_arg(zval *arg, ffi_type **pass_type, void **arg_values, uint32_t n, zend_execute_data *execute_data) /* {{{ */ +static zend_result zend_ffi_pass_var_arg(zval *arg, ffi_type **pass_type, void **arg_values, uint32_t n, zend_execute_data *execute_data) /* {{{ */ { ZVAL_DEREF(arg); switch (Z_TYPE_P(arg)) { @@ -2657,7 +2657,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */ ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n); - if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) != SUCCESS) { + if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) == FAILURE) { free_alloca(arg_types, arg_types_use_heap); free_alloca(arg_values, arg_values_use_heap); goto exit; @@ -2667,7 +2667,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */ } for (; n < EX_NUM_ARGS(); n++) { arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n); - if (zend_ffi_pass_var_arg(EX_VAR_NUM(n), &arg_types[n], arg_values, n, execute_data) != SUCCESS) { + if (zend_ffi_pass_var_arg(EX_VAR_NUM(n), &arg_types[n], arg_values, n, execute_data) == FAILURE) { free_alloca(arg_types, arg_types_use_heap); free_alloca(arg_values, arg_values_use_heap); goto exit; @@ -2702,7 +2702,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */ ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n); - if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) != SUCCESS) { + if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) == FAILURE) { free_alloca(arg_types, arg_types_use_heap); free_alloca(arg_values, arg_values_use_heap); goto exit; @@ -2829,7 +2829,7 @@ static zend_never_inline int zend_ffi_disabled(void) /* {{{ */ } /* }}} */ -static zend_always_inline int zend_ffi_validate_api_restriction(zend_execute_data *execute_data) /* {{{ */ +static zend_always_inline bool zend_ffi_validate_api_restriction(zend_execute_data *execute_data) /* {{{ */ { if (EXPECTED(FFI_G(restriction) > ZEND_FFI_ENABLED)) { ZEND_ASSERT(FFI_G(restriction) == ZEND_FFI_PRELOAD); @@ -2887,7 +2887,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */ /* Parse C definitions */ FFI_G(default_type_attr) = ZEND_FFI_ATTR_STORED; - if (zend_ffi_parse_decl(ZSTR_VAL(code), ZSTR_LEN(code)) != SUCCESS) { + if (zend_ffi_parse_decl(ZSTR_VAL(code), ZSTR_LEN(code)) == FAILURE) { if (FFI_G(symbols)) { zend_hash_destroy(FFI_G(symbols)); efree(FFI_G(symbols)); @@ -2940,7 +2940,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */ } /* }}} */ -static int zend_ffi_same_types(zend_ffi_type *old, zend_ffi_type *type) /* {{{ */ +static bool zend_ffi_same_types(zend_ffi_type *old, zend_ffi_type *type) /* {{{ */ { if (old == type) { return 1; @@ -3022,7 +3022,7 @@ static int zend_ffi_same_types(zend_ffi_type *old, zend_ffi_type *type) /* {{{ * } /* }}} */ -static int zend_ffi_same_symbols(zend_ffi_symbol *old, zend_ffi_symbol *sym) /* {{{ */ +static bool zend_ffi_same_symbols(zend_ffi_symbol *old, zend_ffi_symbol *sym) /* {{{ */ { if (old->kind != sym->kind || old->is_const != sym->is_const) { return 0; @@ -3038,7 +3038,7 @@ static int zend_ffi_same_symbols(zend_ffi_symbol *old, zend_ffi_symbol *sym) /* } /* }}} */ -static int zend_ffi_same_tags(zend_ffi_tag *old, zend_ffi_tag *tag) /* {{{ */ +static bool zend_ffi_same_tags(zend_ffi_tag *old, zend_ffi_tag *tag) /* {{{ */ { if (old->kind != tag->kind) { return 0; @@ -3048,7 +3048,7 @@ static int zend_ffi_same_tags(zend_ffi_tag *old, zend_ffi_tag *tag) /* {{{ */ } /* }}} */ -static int zend_ffi_subst_old_type(zend_ffi_type **dcl, zend_ffi_type *old, zend_ffi_type *type) /* {{{ */ +static bool zend_ffi_subst_old_type(zend_ffi_type **dcl, zend_ffi_type *old, zend_ffi_type *type) /* {{{ */ { zend_ffi_type *dcl_type; zend_ffi_field *field; @@ -3187,7 +3187,7 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */ } code_size -= code_pos - code; - if (zend_ffi_parse_decl(code_pos, code_size) != SUCCESS) { + if (zend_ffi_parse_decl(code_pos, code_size) == FAILURE) { if (preload) { zend_error(E_WARNING, "FFI: failed pre-loading '%s'", filename); } else { @@ -3468,7 +3468,7 @@ static void zend_ffi_throw_parser_error(const char *format, ...) /* {{{ */ } /* }}} */ -static int zend_ffi_validate_vla(zend_ffi_type *type) /* {{{ */ +static zend_result zend_ffi_validate_vla(zend_ffi_type *type) /* {{{ */ { if (!FFI_G(allow_vla) && (type->attr & ZEND_FFI_ATTR_VLA)) { zend_ffi_throw_parser_error("\"[*]\" is not allowed in other than function prototype scope at line %d", FFI_G(line)); @@ -3478,7 +3478,7 @@ static int zend_ffi_validate_vla(zend_ffi_type *type) /* {{{ */ } /* }}} */ -static int zend_ffi_validate_incomplete_type(zend_ffi_type *type, bool allow_incomplete_tag, bool allow_incomplete_array) /* {{{ */ +static zend_result zend_ffi_validate_incomplete_type(zend_ffi_type *type, bool allow_incomplete_tag, bool allow_incomplete_array) /* {{{ */ { if (!allow_incomplete_tag && (type->attr & ZEND_FFI_ATTR_INCOMPLETE_TAG)) { if (FFI_G(tags)) { @@ -3522,7 +3522,7 @@ static int zend_ffi_validate_incomplete_type(zend_ffi_type *type, bool allow_inc } /* }}} */ -static int zend_ffi_validate_type(zend_ffi_type *type, bool allow_incomplete_tag, bool allow_incomplete_array) /* {{{ */ +static zend_result zend_ffi_validate_type(zend_ffi_type *type, bool allow_incomplete_tag, bool allow_incomplete_array) /* {{{ */ { if (type->kind == ZEND_FFI_TYPE_VOID) { zend_ffi_throw_parser_error("void type is not allowed at line %d", FFI_G(line)); @@ -3532,7 +3532,7 @@ static int zend_ffi_validate_type(zend_ffi_type *type, bool allow_incomplete_tag } /* }}} */ -static int zend_ffi_validate_var_type(zend_ffi_type *type, bool allow_incomplete_array) /* {{{ */ +static zend_result zend_ffi_validate_var_type(zend_ffi_type *type, bool allow_incomplete_array) /* {{{ */ { if (type->kind == ZEND_FFI_TYPE_FUNC) { zend_ffi_throw_parser_error("function type is not allowed at line %d", FFI_G(line)); @@ -3545,14 +3545,14 @@ static int zend_ffi_validate_var_type(zend_ffi_type *type, bool allow_incomplete void zend_ffi_validate_type_name(zend_ffi_dcl *dcl) /* {{{ */ { zend_ffi_finalize_type(dcl); - if (zend_ffi_validate_var_type(ZEND_FFI_TYPE(dcl->type), 0) != SUCCESS) { + if (zend_ffi_validate_var_type(ZEND_FFI_TYPE(dcl->type), 0) == FAILURE) { zend_ffi_cleanup_dcl(dcl); LONGJMP(FFI_G(bailout), FAILURE); } } /* }}} */ -static int zend_ffi_subst_type(zend_ffi_type **dcl, zend_ffi_type *type) /* {{{ */ +static bool zend_ffi_subst_type(zend_ffi_type **dcl, zend_ffi_type *type) /* {{{ */ { zend_ffi_type *dcl_type; zend_ffi_field *field; @@ -3651,7 +3651,7 @@ ZEND_METHOD(FFI, new) /* {{{ */ FFI_G(default_type_attr) = 0; - if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) != SUCCESS) { + if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) { zend_ffi_type_dtor(dcl.type); if (Z_TYPE(EX(This)) != IS_OBJECT) { if (FFI_G(tags)) { @@ -3795,7 +3795,7 @@ ZEND_METHOD(FFI, cast) /* {{{ */ FFI_G(default_type_attr) = 0; - if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) != SUCCESS) { + if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) { zend_ffi_type_dtor(dcl.type); if (Z_TYPE(EX(This)) != IS_OBJECT) { if (FFI_G(tags)) { @@ -3956,7 +3956,7 @@ ZEND_METHOD(FFI, type) /* {{{ */ FFI_G(default_type_attr) = 0; - if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) != SUCCESS) { + if (zend_ffi_parse_type(ZSTR_VAL(type_def), ZSTR_LEN(type_def), &dcl) == FAILURE) { zend_ffi_type_dtor(dcl.type); if (Z_TYPE(EX(This)) != IS_OBJECT) { if (FFI_G(tags)) { @@ -5102,7 +5102,7 @@ ZEND_INI_BEGIN() STD_ZEND_INI_ENTRY("ffi.preload", NULL, ZEND_INI_SYSTEM, OnUpdateString, preload, zend_ffi_globals, ffi_globals) ZEND_INI_END() -static int zend_ffi_preload_glob(const char *filename) /* {{{ */ +static zend_result zend_ffi_preload_glob(const char *filename) /* {{{ */ { #ifdef HAVE_GLOB glob_t globbuf; @@ -5141,7 +5141,7 @@ static int zend_ffi_preload_glob(const char *filename) /* {{{ */ } /* }}} */ -static int zend_ffi_preload(char *preload) /* {{{ */ +static zend_result zend_ffi_preload(char *preload) /* {{{ */ { zend_ffi *ffi; char *s = NULL, *e, *filename; @@ -5162,10 +5162,10 @@ static int zend_ffi_preload(char *preload) /* {{{ */ } efree(ffi); } else { - int ret = zend_ffi_preload_glob(filename); + zend_result ret = zend_ffi_preload_glob(filename); efree(filename); - if (ret != SUCCESS) { + if (ret == FAILURE) { return FAILURE; } is_glob = 0; @@ -5195,9 +5195,9 @@ static int zend_ffi_preload(char *preload) /* {{{ */ } efree(ffi); } else { - int ret = zend_ffi_preload_glob(filename); + zend_result ret = zend_ffi_preload_glob(filename); efree(filename); - if (ret != SUCCESS) { + if (ret == FAILURE) { return FAILURE; } } @@ -5398,9 +5398,7 @@ ZEND_MINIT_FUNCTION(ffi) REGISTER_FFI_TYPE_CONSTANT(ABI_VECTORCALL); if (FFI_G(preload)) { - if (zend_ffi_preload(FFI_G(preload)) != SUCCESS) { - return FAILURE; - } + return zend_ffi_preload(FFI_G(preload)); } return SUCCESS; @@ -5669,7 +5667,7 @@ static void zend_ffi_finalize_type(zend_ffi_dcl *dcl) /* {{{ */ } /* }}} */ -int zend_ffi_is_typedef_name(const char *name, size_t name_len) /* {{{ */ +bool zend_ffi_is_typedef_name(const char *name, size_t name_len) /* {{{ */ { zend_ffi_symbol *sym; zend_ffi_type *type; @@ -5900,7 +5898,7 @@ void zend_ffi_make_struct_type(zend_ffi_dcl *dcl) /* {{{ */ } /* }}} */ -static int zend_ffi_validate_prev_field_type(zend_ffi_type *struct_type) /* {{{ */ +static zend_result zend_ffi_validate_prev_field_type(zend_ffi_type *struct_type) /* {{{ */ { if (zend_hash_num_elements(&struct_type->record.fields) > 0) { zend_ffi_field *field = NULL; @@ -5917,12 +5915,12 @@ static int zend_ffi_validate_prev_field_type(zend_ffi_type *struct_type) /* {{{ } /* }}} */ -static int zend_ffi_validate_field_type(zend_ffi_type *type, zend_ffi_type *struct_type) /* {{{ */ +static zend_result zend_ffi_validate_field_type(zend_ffi_type *type, zend_ffi_type *struct_type) /* {{{ */ { if (type == struct_type) { zend_ffi_throw_parser_error("Struct/union can't contain an instance of itself at line %d", FFI_G(line)); return FAILURE; - } else if (zend_ffi_validate_var_type(type, 1) != SUCCESS) { + } else if (zend_ffi_validate_var_type(type, 1) == FAILURE) { return FAILURE; } else if (struct_type->attr & ZEND_FFI_ATTR_UNION) { if (type->attr & ZEND_FFI_ATTR_INCOMPLETE_ARRAY) { @@ -5943,7 +5941,7 @@ void zend_ffi_add_field(zend_ffi_dcl *struct_dcl, const char *name, size_t name_ ZEND_ASSERT(struct_type && struct_type->kind == ZEND_FFI_TYPE_STRUCT); zend_ffi_finalize_type(field_dcl); field_type = ZEND_FFI_TYPE(field_dcl->type); - if (zend_ffi_validate_field_type(field_type, struct_type) != SUCCESS) { + if (zend_ffi_validate_field_type(field_type, struct_type) == FAILURE) { zend_ffi_cleanup_dcl(field_dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -5998,7 +5996,7 @@ void zend_ffi_add_anonymous_field(zend_ffi_dcl *struct_dcl, zend_ffi_dcl *field_ struct_type->align = MAX(struct_type->align, MAX(field_type->align, field_dcl->align)); } if (!(struct_type->attr & ZEND_FFI_ATTR_UNION)) { - if (zend_ffi_validate_prev_field_type(struct_type) != SUCCESS) { + if (zend_ffi_validate_prev_field_type(struct_type) == FAILURE) { zend_ffi_cleanup_dcl(field_dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -6055,7 +6053,7 @@ void zend_ffi_add_bit_field(zend_ffi_dcl *struct_dcl, const char *name, size_t n ZEND_ASSERT(struct_type && struct_type->kind == ZEND_FFI_TYPE_STRUCT); zend_ffi_finalize_type(field_dcl); field_type = ZEND_FFI_TYPE(field_dcl->type); - if (zend_ffi_validate_field_type(field_type, struct_type) != SUCCESS) { + if (zend_ffi_validate_field_type(field_type, struct_type) == FAILURE) { zend_ffi_cleanup_dcl(field_dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -6171,7 +6169,7 @@ void zend_ffi_make_pointer_type(zend_ffi_dcl *dcl) /* {{{ */ type->size = sizeof(void*); type->align = _Alignof(void*); zend_ffi_finalize_type(dcl); - if (zend_ffi_validate_vla(ZEND_FFI_TYPE(dcl->type)) != SUCCESS) { + if (zend_ffi_validate_vla(ZEND_FFI_TYPE(dcl->type)) == FAILURE) { zend_ffi_cleanup_dcl(dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -6183,7 +6181,7 @@ void zend_ffi_make_pointer_type(zend_ffi_dcl *dcl) /* {{{ */ } /* }}} */ -static int zend_ffi_validate_array_element_type(zend_ffi_type *type) /* {{{ */ +static zend_result zend_ffi_validate_array_element_type(zend_ffi_type *type) /* {{{ */ { if (type->kind == ZEND_FFI_TYPE_FUNC) { zend_ffi_throw_parser_error("Array of functions is not allowed at line %d", FFI_G(line)); @@ -6224,7 +6222,7 @@ void zend_ffi_make_array_type(zend_ffi_dcl *dcl, zend_ffi_val *len) /* {{{ */ return; } - if (zend_ffi_validate_array_element_type(element_type) != SUCCESS) { + if (zend_ffi_validate_array_element_type(element_type) == FAILURE) { zend_ffi_cleanup_dcl(dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -6243,7 +6241,7 @@ void zend_ffi_make_array_type(zend_ffi_dcl *dcl, zend_ffi_val *len) /* {{{ */ } /* }}} */ -static int zend_ffi_validate_func_ret_type(zend_ffi_type *type) /* {{{ */ +static zend_result zend_ffi_validate_func_ret_type(zend_ffi_type *type) /* {{{ */ { if (type->kind == ZEND_FFI_TYPE_FUNC) { zend_ffi_throw_parser_error("Function returning function is not allowed at line %d", FFI_G(line)); @@ -6313,7 +6311,7 @@ void zend_ffi_make_func_type(zend_ffi_dcl *dcl, HashTable *args, zend_ffi_dcl *n } #endif - if (zend_ffi_validate_func_ret_type(ret_type) != SUCCESS) { + if (zend_ffi_validate_func_ret_type(ret_type) == FAILURE) { zend_ffi_cleanup_dcl(nested_dcl); zend_ffi_cleanup_dcl(dcl); if (args) { @@ -6426,7 +6424,7 @@ void zend_ffi_add_arg(HashTable **args, const char *name, size_t name_len, zend_ new_type->pointer.type = arg_dcl->type; arg_dcl->type = ZEND_FFI_TYPE_MAKE_OWNED(new_type); } - if (zend_ffi_validate_incomplete_type(type, 1, 1) != SUCCESS) { + if (zend_ffi_validate_incomplete_type(type, 1, 1) == FAILURE) { zend_ffi_cleanup_dcl(arg_dcl); zend_hash_destroy(*args); pefree(*args, FFI_G(persistent)); @@ -6479,7 +6477,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* { zend_ffi_parser_error("Redeclaration of \"%.*s\" at line %d", name_len, name, FFI_G(line)); } else { if ((dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) == ZEND_FFI_DCL_TYPEDEF) { - if (zend_ffi_validate_vla(ZEND_FFI_TYPE(dcl->type)) != SUCCESS) { + if (zend_ffi_validate_vla(ZEND_FFI_TYPE(dcl->type)) == FAILURE) { zend_ffi_cleanup_dcl(dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -6505,7 +6503,7 @@ void zend_ffi_declare(const char *name, size_t name_len, zend_ffi_dcl *dcl) /* { zend_ffi_type *type; type = ZEND_FFI_TYPE(dcl->type); - if (zend_ffi_validate_type(type, (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) == ZEND_FFI_DCL_EXTERN, 1) != SUCCESS) { + if (zend_ffi_validate_type(type, (dcl->flags & ZEND_FFI_DCL_STORAGE_CLASS) == ZEND_FFI_DCL_EXTERN, 1) == FAILURE) { zend_ffi_cleanup_dcl(dcl); LONGJMP(FFI_G(bailout), FAILURE); } @@ -6851,7 +6849,7 @@ void zend_ffi_add_msvc_attribute_value(zend_ffi_dcl *dcl, const char *name, size } /* }}} */ -static int zend_ffi_nested_type(zend_ffi_type *type, zend_ffi_type *nested_type) /* {{{ */ +static zend_result zend_ffi_nested_type(zend_ffi_type *type, zend_ffi_type *nested_type) /* {{{ */ { nested_type = ZEND_FFI_TYPE(nested_type); switch (nested_type->kind) { @@ -6868,7 +6866,7 @@ static int zend_ffi_nested_type(zend_ffi_type *type, zend_ffi_type *nested_type) /* "char" is used as a terminator of nested declaration */ if (nested_type->array.type == &zend_ffi_type_char) { nested_type->array.type = type; - if (zend_ffi_validate_array_element_type(ZEND_FFI_TYPE(type)) != SUCCESS) { + if (zend_ffi_validate_array_element_type(ZEND_FFI_TYPE(type)) == FAILURE) { return FAILURE; } } else { @@ -6902,7 +6900,7 @@ void zend_ffi_nested_declaration(zend_ffi_dcl *dcl, zend_ffi_dcl *nested_dcl) /* if (!nested_dcl->type || nested_dcl->type == &zend_ffi_type_char) { nested_dcl->type = dcl->type; } else { - if (zend_ffi_nested_type(dcl->type, nested_dcl->type) != SUCCESS) { + if (zend_ffi_nested_type(dcl->type, nested_dcl->type) == FAILURE) { zend_ffi_cleanup_dcl(nested_dcl); LONGJMP(FFI_G(bailout), FAILURE); } diff --git a/ext/ffi/ffi.g b/ext/ffi/ffi.g index 3c6c4f609cd51..b70e3f1299629 100644 --- a/ext/ffi/ffi.g +++ b/ext/ffi/ffi.g @@ -878,7 +878,7 @@ COMMENT: /\/\*([^\*]|\*+[^\*\/])*\*+\//; SKIP: ( EOL | WS | ONE_LINE_COMMENT | COMMENT )*; %% -int zend_ffi_parse_decl(const char *str, size_t len) { +zend_result zend_ffi_parse_decl(const char *str, size_t len) { if (SETJMP(FFI_G(bailout))==0) { FFI_G(allow_vla) = 0; FFI_G(attribute_parsing) = 0; @@ -891,7 +891,7 @@ int zend_ffi_parse_decl(const char *str, size_t len) { } } -int zend_ffi_parse_type(const char *str, size_t len, zend_ffi_dcl *dcl) { +zend_result zend_ffi_parse_type(const char *str, size_t len, zend_ffi_dcl *dcl) { int sym; if (SETJMP(FFI_G(bailout))==0) { diff --git a/ext/ffi/php_ffi.h b/ext/ffi/php_ffi.h index 74dc5896ee929..02a241c6bb691 100644 --- a/ext/ffi/php_ffi.h +++ b/ext/ffi/php_ffi.h @@ -206,12 +206,12 @@ typedef struct _zend_ffi_val { }; } zend_ffi_val; -int zend_ffi_parse_decl(const char *str, size_t len); -int zend_ffi_parse_type(const char *str, size_t len, zend_ffi_dcl *dcl); +zend_result zend_ffi_parse_decl(const char *str, size_t len); +zend_result zend_ffi_parse_type(const char *str, size_t len, zend_ffi_dcl *dcl); /* parser callbacks */ void ZEND_NORETURN zend_ffi_parser_error(const char *msg, ...); -int zend_ffi_is_typedef_name(const char *name, size_t name_len); +bool zend_ffi_is_typedef_name(const char *name, size_t name_len); void zend_ffi_resolve_typedef(const char *name, size_t name_len, zend_ffi_dcl *dcl); void zend_ffi_resolve_const(const char *name, size_t name_len, zend_ffi_val *val); void zend_ffi_declare_tag(const char *name, size_t name_len, zend_ffi_dcl *dcl, bool incomplete); From 875a43a42c63097cace9d9a6e6f65014df946626 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 30 Sep 2021 03:15:31 +0100 Subject: [PATCH 0141/1346] Voidify zend_ffi_zval_to_bit_field() --- ext/ffi/ffi.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 2ccb9ae849e47..e108ca61be6f5 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -632,7 +632,7 @@ static void zend_ffi_bit_field_to_zval(void *ptr, zend_ffi_field *field, zval *r } /* }}} */ -static int zend_ffi_zval_to_bit_field(void *ptr, zend_ffi_field *field, zval *value) /* {{{ */ +static void zend_ffi_zval_to_bit_field(void *ptr, zend_ffi_field *field, zval *value) /* {{{ */ { uint64_t val = zval_get_long(value); size_t bit = field->first_bit; @@ -646,7 +646,7 @@ static int zend_ffi_zval_to_bit_field(void *ptr, zend_ffi_field *field, zval *va if (p == last_p) { mask = ((1U << field->bits) - 1U) << pos; *p = (*p & ~mask) | ((val << pos) & mask); - return SUCCESS; + return; } /* Write partial prefix byte */ @@ -670,8 +670,6 @@ static int zend_ffi_zval_to_bit_field(void *ptr, zend_ffi_field *field, zval *va mask = (1U << num_bits) - 1U; *p = (*p & ~mask) | (val & mask); } - - return SUCCESS; } /* }}} */ From 0d013cd0d76e255077efa3c74f5940e237019d27 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 29 Sep 2021 13:59:28 +0100 Subject: [PATCH 0142/1346] Use zend_update_property_str() where appropriate This prevent needless recomputation of the string length --- ext/curl/curl_file.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/curl/curl_file.c b/ext/curl/curl_file.c index 7322a187c8a76..fdb6ea3596079 100644 --- a/ext/curl/curl_file.c +++ b/ext/curl/curl_file.c @@ -38,14 +38,14 @@ static void curlfile_ctor(INTERNAL_FUNCTION_PARAMETERS) Z_PARAM_STR_OR_NULL(postname) ZEND_PARSE_PARAMETERS_END(); - zend_update_property_string(curl_CURLFile_class, Z_OBJ_P(cf), "name", sizeof("name")-1, ZSTR_VAL(fname)); + zend_update_property_str(curl_CURLFile_class, Z_OBJ_P(cf), "name", sizeof("name")-1, fname); if (mime) { - zend_update_property_string(curl_CURLFile_class, Z_OBJ_P(cf), "mime", sizeof("mime")-1, ZSTR_VAL(mime)); + zend_update_property_str(curl_CURLFile_class, Z_OBJ_P(cf), "mime", sizeof("mime")-1, mime); } if (postname) { - zend_update_property_string(curl_CURLFile_class, Z_OBJ_P(cf), "postname", sizeof("postname")-1, ZSTR_VAL(postname)); + zend_update_property_str(curl_CURLFile_class, Z_OBJ_P(cf), "postname", sizeof("postname")-1, postname); } } @@ -82,7 +82,7 @@ static void curlfile_set_property(char *name, size_t name_len, INTERNAL_FUNCTION Z_PARAM_STR(arg) ZEND_PARSE_PARAMETERS_END(); - zend_update_property_string(curl_CURLFile_class, Z_OBJ_P(ZEND_THIS), name, name_len, ZSTR_VAL(arg)); + zend_update_property_str(curl_CURLFile_class, Z_OBJ_P(ZEND_THIS), name, name_len, arg); } /* {{{ Get file name */ From 5ad1b89789648269480429762fe548b95b6f3a4f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 29 Sep 2021 14:32:44 +0100 Subject: [PATCH 0143/1346] Use more specific types instead of int in cURL extension --- ext/curl/curl_private.h | 2 +- ext/curl/interface.c | 52 ++++++++++++++++++++--------------------- ext/curl/multi.c | 13 ++++++----- ext/curl/share.c | 3 ++- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/ext/curl/curl_private.h b/ext/curl/curl_private.h index 45392a677f0b4..842ee5fb79c2a 100644 --- a/ext/curl/curl_private.h +++ b/ext/curl/curl_private.h @@ -140,7 +140,7 @@ php_curl *init_curl_handle_into_zval(zval *curl); void init_curl_handle(php_curl *ch); void _php_curl_cleanup_handle(php_curl *); void _php_curl_multi_cleanup_list(void *data); -void _php_curl_verify_handlers(php_curl *ch, int reporterror); +void _php_curl_verify_handlers(php_curl *ch, bool reporterror); void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source); static inline php_curl *curl_from_obj(zend_object *obj) { diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 319137b38d88f..459bfbab0bbe4 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -96,7 +96,7 @@ static ZEND_ATTRIBUTE_UNUSED unsigned long php_curl_ssl_id(void) # define php_curl_ret(__ret) RETVAL_FALSE; return; #endif -static int php_curl_option_str(php_curl *ch, zend_long option, const char *str, const size_t len) +static zend_result php_curl_option_str(php_curl *ch, zend_long option, const char *str, const size_t len) { if (strlen(str) != len) { zend_value_error("%s(): cURL option must not contain any null bytes", get_active_function_name()); @@ -109,7 +109,7 @@ static int php_curl_option_str(php_curl *ch, zend_long option, const char *str, return error == CURLE_OK ? SUCCESS : FAILURE; } -static int php_curl_option_url(https://redirect.github.com/php_curl%20*ch,%20const%20char%20*url,%20const%20size_t%20len) /* {{{ */ +static zend_result php_curl_option_url(https://redirect.github.com/php_curl%20*ch,%20const%20char%20*url,%20const%20size_t%20len) /* {{{ */ { /* Disable file:// if open_basedir are used */ if (PG(open_basedir) && *PG(open_basedir)) { @@ -131,7 +131,7 @@ static int php_curl_option_url(https://redirect.github.com/php_curl%20*ch,%20const%20char%20*url,%20const%20size_t%20len) } /* }}} */ -void _php_curl_verify_handlers(php_curl *ch, int reporterror) /* {{{ */ +void _php_curl_verify_handlers(php_curl *ch, bool reporterror) /* {{{ */ { php_stream *stream; @@ -226,7 +226,7 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n); static zend_function *curl_get_constructor(zend_object *object); static zend_object *curl_clone_obj(zend_object *object); php_curl *init_curl_handle_into_zval(zval *curl); -static inline int build_mime_structure_from_hash(php_curl *ch, zval *zpostfields); +static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpostfields); /* {{{ PHP_INI_BEGIN */ PHP_INI_BEGIN() @@ -1249,7 +1249,7 @@ static zend_object *curl_clone_obj(zend_object *object) { postfields = &clone_ch->postfields; if (Z_TYPE_P(postfields) != IS_UNDEF) { - if (build_mime_structure_from_hash(clone_ch, postfields) != SUCCESS) { + if (build_mime_structure_from_hash(clone_ch, postfields) == FAILURE) { zend_throw_exception(NULL, "Failed to clone CurlHandle", 0); return &clone_ch->std; } @@ -1391,7 +1391,7 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx) php_error_docref(NULL, E_WARNING, "Could not call the CURLOPT_WRITEFUNCTION"); length = -1; } else if (!Z_ISUNDEF(retval)) { - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); length = zval_get_long(&retval); } @@ -1413,7 +1413,7 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string) int rval = CURL_FNMATCHFUNC_FAIL; zval argv[3]; zval retval; - int error; + zend_result error; zend_fcall_info fci; GC_ADDREF(&ch->std); @@ -1435,7 +1435,7 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string) if (error == FAILURE) { php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_FNMATCH_FUNCTION"); } else if (!Z_ISUNDEF(retval)) { - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); rval = zval_get_long(&retval); } zval_ptr_dtor(&argv[0]); @@ -1459,7 +1459,7 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double zval argv[5]; zval retval; - int error; + zend_result error; zend_fcall_info fci; GC_ADDREF(&ch->std); @@ -1483,7 +1483,7 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double if (error == FAILURE) { php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_PROGRESSFUNCTION"); } else if (!Z_ISUNDEF(retval)) { - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); if (0 != zval_get_long(&retval)) { rval = 1; } @@ -1509,7 +1509,7 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx) case PHP_CURL_USER: { zval argv[3]; zval retval; - int error; + zend_result error; zend_fcall_info fci; GC_ADDREF(&ch->std); @@ -1537,7 +1537,7 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx) php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_READFUNCTION"); length = CURL_READFUNC_ABORT; } else if (!Z_ISUNDEF(retval)) { - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); if (Z_TYPE(retval) == IS_STRING) { length = MIN((int) (size * nmemb), Z_STRLEN(retval)); memcpy(data, Z_STRVAL(retval), length); @@ -1577,7 +1577,7 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx case PHP_CURL_USER: { zval argv[2]; zval retval; - int error; + zend_result error; zend_fcall_info fci; GC_ADDREF(&ch->std); @@ -1599,7 +1599,7 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx php_error_docref(NULL, E_WARNING, "Could not call the CURLOPT_HEADERFUNCTION"); length = -1; } else if (!Z_ISUNDEF(retval)) { - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); length = zval_get_long(&retval); } zval_ptr_dtor(&argv[0]); @@ -1988,7 +1988,7 @@ static void free_cb(void *arg) /* {{{ */ /* }}} */ #endif -static inline int build_mime_structure_from_hash(php_curl *ch, zval *zpostfields) /* {{{ */ +static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpostfields) /* {{{ */ { HashTable *postfields = Z_ARRVAL_P(zpostfields); CURLcode error = CURLE_OK; @@ -2260,7 +2260,7 @@ PHP_FUNCTION(curl_copy_handle) postfields = &ch->postfields; if (Z_TYPE_P(postfields) != IS_UNDEF) { - if (build_mime_structure_from_hash(dupch, postfields) != SUCCESS) { + if (build_mime_structure_from_hash(dupch, postfields) == FAILURE) { zval_ptr_dtor(return_value); php_error_docref(NULL, E_WARNING, "Cannot rebuild mime structure"); RETURN_FALSE; @@ -2269,7 +2269,7 @@ PHP_FUNCTION(curl_copy_handle) } /* }}} */ -static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool is_array_config) /* {{{ */ +static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool is_array_config) /* {{{ */ { CURLcode error = CURLE_OK; zend_long lval; @@ -2435,12 +2435,12 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i if ((option == CURLOPT_PROTOCOLS || option == CURLOPT_REDIR_PROTOCOLS) && (PG(open_basedir) && *PG(open_basedir)) && (lval & CURLPROTO_FILE)) { php_error_docref(NULL, E_WARNING, "CURLPROTO_FILE cannot be activated when an open_basedir is set"); - return 1; + return FAILURE; } # if defined(ZTS) if (option == CURLOPT_DNS_USE_GLOBAL_CACHE && lval) { php_error_docref(NULL, E_WARNING, "CURLOPT_DNS_USE_GLOBAL_CACHE cannot be activated when thread safety is enabled"); - return 1; + return FAILURE; } # endif error = curl_easy_setopt(ch->cp, option, lval); @@ -2533,7 +2533,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i { zend_string *tmp_str; zend_string *str = zval_get_tmp_string(zvalue, &tmp_str); - int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str)); + zend_result ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str)); zend_tmp_string_release(tmp_str); return ret; } @@ -2563,7 +2563,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i } else { zend_string *tmp_str; zend_string *str = zval_get_tmp_string(zvalue, &tmp_str); - int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str)); + zend_result ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str)); zend_tmp_string_release(tmp_str); return ret; } @@ -2583,7 +2583,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i { zend_string *tmp_str; zend_string *str = zval_get_tmp_string(zvalue, &tmp_str); - int ret = php_curl_option_url(https://redirect.github.com/ch,%20ZSTR_VAL(str), ZSTR_LEN(str)); + zend_result ret = php_curl_option_url(https://redirect.github.com/ch,%20ZSTR_VAL(str), ZSTR_LEN(str)); zend_tmp_string_release(tmp_str); return ret; } @@ -2757,7 +2757,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i zend_tmp_string_release(tmp_val); if (!slist) { php_error_docref(NULL, E_WARNING, "Could not build curl_slist"); - return 1; + return FAILURE; } } ZEND_HASH_FOREACH_END(); @@ -2881,7 +2881,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i { zend_string *tmp_str; zend_string *str = zval_get_tmp_string(zvalue, &tmp_str); - int ret; + zend_result ret; if (ZSTR_LEN(str) && php_check_open_basedir(ZSTR_VAL(str))) { zend_tmp_string_release(tmp_str); @@ -3056,7 +3056,7 @@ PHP_FUNCTION(curl_exec) ch = Z_CURL_P(zid); - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); _php_curl_cleanup_handle(ch); @@ -3427,7 +3427,7 @@ static void curl_free_obj(zend_object *object) return; } - _php_curl_verify_handlers(ch, 0); + _php_curl_verify_handlers(ch, /* reporterror */ false); /* * Libcurl is doing connection caching. When easy handle is cleaned up, diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 379f81991e37b..c9ad02d44a1f6 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -88,7 +88,7 @@ PHP_FUNCTION(curl_multi_add_handle) mh = Z_CURL_MULTI_P(z_mh); ch = Z_CURL_P(z_ch); - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); _php_curl_cleanup_handle(ch); @@ -217,7 +217,7 @@ PHP_FUNCTION(curl_multi_exec) pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) { ch = Z_CURL_P(pz_ch); - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); } } @@ -318,7 +318,7 @@ PHP_FUNCTION(curl_multi_close) 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)) { php_curl *ch = Z_CURL_P(pz_ch); - _php_curl_verify_handlers(ch, 1); + _php_curl_verify_handlers(ch, /* reporterror */ true); curl_multi_remove_handle(mh->multi, ch->cp); } zend_llist_clean(&mh->easyh); @@ -374,7 +374,7 @@ static int _php_server_push_callback(CURL *parent_ch, CURL *easy, size_t num_hea zval headers; zval retval; char *header; - int error; + zend_result error; zend_fcall_info fci = empty_fcall_info; pz_parent_ch = _php_curl_multi_find_easy_handle(mh, parent_ch); @@ -428,7 +428,8 @@ static int _php_server_push_callback(CURL *parent_ch, CURL *easy, size_t num_hea #endif -static int _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */ +/* Returns true on failure, false on success */ +static bool _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */ { CURLMcode error = CURLM_OK; @@ -544,7 +545,7 @@ void curl_multi_free_obj(zend_object *object) pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) { if (!(OBJ_FLAGS(Z_OBJ_P(pz_ch)) & IS_OBJ_FREE_CALLED)) { ch = Z_CURL_P(pz_ch); - _php_curl_verify_handlers(ch, 0); + _php_curl_verify_handlers(ch, /* reporterror */ false); } } diff --git a/ext/curl/share.c b/ext/curl/share.c index fa4226277d293..d3adb4c022c73 100644 --- a/ext/curl/share.c +++ b/ext/curl/share.c @@ -53,7 +53,8 @@ PHP_FUNCTION(curl_share_close) } /* }}} */ -static int _php_curl_share_setopt(php_curlsh *sh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */ +/* Returns true on failure, false on success */ +static bool _php_curl_share_setopt(php_curlsh *sh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */ { CURLSHcode error = CURLSHE_OK; From 0dcbe4a5397b9b0d387815a66213af606b8338ae Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 29 Sep 2021 14:43:15 +0100 Subject: [PATCH 0144/1346] Return true for success instead of failure in PHP cURL setopt helpers This also fixes what was an incorrect return value for an intermediate failure in _php_curl_multi_setopt() when setting CURLMOPT_PUSHFUNCTION --- ext/curl/multi.c | 9 ++++----- ext/curl/share.c | 5 ++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ext/curl/multi.c b/ext/curl/multi.c index c9ad02d44a1f6..7ac2aa40ce545 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -428,7 +428,6 @@ static int _php_server_push_callback(CURL *parent_ch, CURL *easy, size_t num_hea #endif -/* Returns true on failure, false on success */ static bool _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */ { CURLMcode error = CURLM_OK; @@ -466,9 +465,9 @@ static bool _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue } ZVAL_COPY(&mh->handlers.server_push->func_name, zvalue); - error = curl_multi_setopt(mh->multi, option, _php_server_push_callback); + error = curl_multi_setopt(mh->multi, CURLMOPT_PUSHFUNCTION, _php_server_push_callback); if (error != CURLM_OK) { - return 0; + return false; } error = curl_multi_setopt(mh->multi, CURLMOPT_PUSHDATA, mh); break; @@ -481,7 +480,7 @@ static bool _php_curl_multi_setopt(php_curlm *mh, zend_long option, zval *zvalue SAVE_CURLM_ERROR(mh, error); - return error != CURLM_OK; + return error == CURLM_OK; } /* }}} */ @@ -500,7 +499,7 @@ PHP_FUNCTION(curl_multi_setopt) mh = Z_CURL_MULTI_P(z_mh); - if (!_php_curl_multi_setopt(mh, options, zvalue, return_value)) { + if (_php_curl_multi_setopt(mh, options, zvalue, return_value)) { RETURN_TRUE; } else { RETURN_FALSE; diff --git a/ext/curl/share.c b/ext/curl/share.c index d3adb4c022c73..7f65cb4a27a94 100644 --- a/ext/curl/share.c +++ b/ext/curl/share.c @@ -53,7 +53,6 @@ PHP_FUNCTION(curl_share_close) } /* }}} */ -/* Returns true on failure, false on success */ static bool _php_curl_share_setopt(php_curlsh *sh, zend_long option, zval *zvalue, zval *return_value) /* {{{ */ { CURLSHcode error = CURLSHE_OK; @@ -72,7 +71,7 @@ static bool _php_curl_share_setopt(php_curlsh *sh, zend_long option, zval *zvalu SAVE_CURLSH_ERROR(sh, error); - return error != CURLSHE_OK; + return error == CURLSHE_OK; } /* }}} */ @@ -91,7 +90,7 @@ PHP_FUNCTION(curl_share_setopt) sh = Z_CURL_SHARE_P(z_sh); - if (!_php_curl_share_setopt(sh, options, zvalue, return_value)) { + if (_php_curl_share_setopt(sh, options, zvalue, return_value)) { RETURN_TRUE; } else { RETURN_FALSE; From 5bf088f6eb54924f1609344d2bf167d79500bb17 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 28 Sep 2021 14:38:59 +0200 Subject: [PATCH 0145/1346] Move TYPE_CHECK handling from sccp to inference The handling of TYPE_CHECK makes for an awkward special case, because it is determined outside the usual SCCP framework. Instead move the logic into type inference (to infer a more specific may_be_true or may_be_false if possible). This will get picked up by SCCP through the existing logic to make use of type and range information. However, this also requires us to make use of type info in feasible edge marking, otherwise we would regress existing optimization power. --- Zend/Optimizer/sccp.c | 111 +++++++++++++------------------- Zend/Optimizer/zend_inference.c | 19 +++++- 2 files changed, 62 insertions(+), 68 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 6c1c0bc2e3417..381220a11468b 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -58,8 +58,7 @@ * e) Otherwise the result is BOT. * * It is sometimes possible to determine a result even if one argument is TOP / BOT, e.g. for things - * like BOT*0. Right now we don't bother with this -- the only thing that is done is evaluating - * TYPE_CHECKS based on the type information. + * like BOT*0. Right now we don't bother with this. * * Feasible successors for conditional branches are determined as follows: * a) If we don't support the branch type or branch on BOT, all successors are feasible. @@ -1002,24 +1001,6 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o SET_RESULT(result, op2); } return; - case ZEND_TYPE_CHECK: - /* We may be able to evaluate TYPE_CHECK based on type inference info, - * even if we don't know the precise value. */ - if (!value_known(op1)) { - uint32_t type = ctx->scdf.ssa->var_info[ssa_op->op1_use].type; - uint32_t expected_type_mask = opline->extended_value; - if (!(type & expected_type_mask) && !(type & MAY_BE_UNDEF)) { - ZVAL_FALSE(&zv); - SET_RESULT(result, &zv); - return; - } else if (!(type & ((MAY_BE_ANY|MAY_BE_UNDEF) - expected_type_mask)) - && !(expected_type_mask & MAY_BE_RESOURCE)) { - ZVAL_TRUE(&zv); - SET_RESULT(result, &zv); - return; - } - } - break; case ZEND_ASSIGN_DIM: { zval *data = get_op1_value(ctx, opline+1, ssa_op+1); @@ -1855,6 +1836,45 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o } } +static zval *value_from_type_and_range(sccp_ctx *ctx, int var_num, zval *tmp) { + zend_ssa *ssa = ctx->scdf.ssa; + zend_ssa_var_info *info = &ssa->var_info[var_num]; + + if (info->type & MAY_BE_UNDEF) { + return NULL; + } + + if (!(info->type & MAY_BE_ANY)) { + /* This code must be unreachable. We could replace operands with NULL, but this doesn't + * really make things better. It would be better to later remove this code entirely. */ + return NULL; + } + + if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_NULL))) { + ZVAL_NULL(tmp); + return tmp; + } + if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_FALSE))) { + ZVAL_FALSE(tmp); + return tmp; + } + if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_TRUE))) { + ZVAL_TRUE(tmp); + return tmp; + } + + if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) + && info->has_range + && !info->range.overflow && !info->range.underflow + && info->range.min == info->range.max) { + ZVAL_LONG(tmp, info->range.min); + return tmp; + } + + return NULL; +} + + /* Returns whether there is a successor */ static void sccp_mark_feasible_successors( scdf_ctx *scdf, @@ -1876,6 +1896,10 @@ static void sccp_mark_feasible_successors( } op1 = get_op1_value(ctx, opline, ssa_op); + if (IS_BOT(op1)) { + ZEND_ASSERT(ssa_op->op1_use >= 0); + op1 = value_from_type_and_range(ctx, ssa_op->op1_use, &zv); + } /* Branch target can be either one */ if (!op1 || IS_BOT(op1)) { @@ -2111,44 +2135,6 @@ static void sccp_visit_phi(scdf_ctx *scdf, zend_ssa_phi *phi) { } } -static zval *value_from_type_and_range(sccp_ctx *ctx, int var_num, zval *tmp) { - zend_ssa *ssa = ctx->scdf.ssa; - zend_ssa_var_info *info = &ssa->var_info[var_num]; - - if (info->type & MAY_BE_UNDEF) { - return NULL; - } - - if (!(info->type & MAY_BE_ANY)) { - /* This code must be unreachable. We could replace operands with NULL, but this doesn't - * really make things better. It would be better to later remove this code entirely. */ - return NULL; - } - - if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_NULL))) { - ZVAL_NULL(tmp); - return tmp; - } - if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_FALSE))) { - ZVAL_FALSE(tmp); - return tmp; - } - if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_TRUE))) { - ZVAL_TRUE(tmp); - return tmp; - } - - if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) - && info->has_range - && !info->range.overflow && !info->range.underflow - && info->range.min == info->range.max) { - ZVAL_LONG(tmp, info->range.min); - return tmp; - } - - return NULL; -} - /* Call instruction -> remove opcodes that are part of the call */ static int remove_call(sccp_ctx *ctx, zend_op *opline, zend_ssa_op *ssa_op) { @@ -2256,15 +2242,6 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var, zend_ssa_remove_result_def(ssa, ssa_op); if (opline->opcode == ZEND_DO_ICALL) { removed_ops = remove_call(ctx, opline, ssa_op); - } else if (opline->opcode == ZEND_TYPE_CHECK - && (opline->op1_type & (IS_VAR|IS_TMP_VAR)) - && !value_known(&ctx->values[ssa_op->op1_use])) { - /* For TYPE_CHECK we may compute the result value without knowing the - * operand, based on type inference information. Make sure the operand is - * freed and leave further cleanup to DCE. */ - opline->opcode = ZEND_FREE; - opline->result_type = IS_UNUSED; - removed_ops++; } else { zend_ssa_remove_instr(ssa, opline, ssa_op); removed_ops++; diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 5a3b725dd16eb..8c4615627fdbc 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3594,7 +3594,24 @@ static zend_always_inline zend_result _zend_update_type_info( case ZEND_GET_TYPE: UPDATE_SSA_TYPE(MAY_BE_STRING|MAY_BE_RC1|MAY_BE_RCN, ssa_op->result_def); break; - case ZEND_TYPE_CHECK: + case ZEND_TYPE_CHECK: { + uint32_t expected_type_mask = opline->extended_value; + if (t1 & MAY_BE_UNDEF) { + t1 |= MAY_BE_NULL; + } + tmp = 0; + if (t1 & expected_type_mask) { + tmp |= MAY_BE_TRUE; + if ((t1 & expected_type_mask) & MAY_BE_RESOURCE) { + tmp |= MAY_BE_FALSE; + } + } + if (t1 & (MAY_BE_ANY - expected_type_mask)) { + tmp |= MAY_BE_FALSE; + } + UPDATE_SSA_TYPE(tmp, ssa_op->result_def); + break; + } case ZEND_DEFINED: UPDATE_SSA_TYPE(MAY_BE_FALSE|MAY_BE_TRUE, ssa_op->result_def); break; From dcaa010fffb23af2fc0fdd20dc3c00d56ca34f3f Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 7 Aug 2020 22:37:28 +0200 Subject: [PATCH 0146/1346] Strict validation of conversion flags to mb_convert_kana mb_convert_kana is controlled by user-provided flags, which specify what it should convert and to what. These flags come in inverse pairs, for example "fullwidth numerals to halfwidth numerals" and "halfwidth numerals to fullwidth numerals". It does not make sense to combine inverse flags. But, clever reader of commit logs, you will surely say: What if I want all my halfwidth numerals to become fullwidth, and all my fullwidth numerals to become halfwidth? Much too clever, you are! Let's put aside the fact that this bizarre switch-up is ridiculous and will never be used, and face up to another stark reality: mb_convert_kana does not work for that case, and never has. This was probably never noticed because nobody ever tried. Disallowing useless combinations of flags gives freedom to rearrange the kana conversion code without changing behavior. We can also reject unrecognized flags. This may help users to catch bugs. Interestingly, the existing tests used a 'Z' flag, which is useless (it's not recognized at all). --- .../libmbfl/filters/mbfilter_cp5022x.c | 4 +- .../filters/mbfilter_tl_jisx0201_jisx0208.c | 46 +++---- .../filters/mbfilter_tl_jisx0201_jisx0208.h | 36 ++--- ext/mbstring/mbstring.c | 128 ++++++++++-------- ext/mbstring/tests/mb_convert_kana.phpt | 121 ++++++++++++++--- 5 files changed, 214 insertions(+), 121 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index 2cf5600895bfa..deb6e8ee0204f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -322,7 +322,7 @@ static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter) static int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter) { - int mode = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE; + int mode = MBFL_HAN2ZEN_KATAKANA | MBFL_HAN2ZEN_GLUE; bool consumed = false; if (filter->cache) { @@ -342,7 +342,7 @@ static int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter) static int mbfl_filt_conv_wchar_cp50220_flush(mbfl_convert_filter *filter) { - int mode = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE; + int mode = MBFL_HAN2ZEN_KATAKANA | MBFL_HAN2ZEN_GLUE; if (filter->cache) { int s = mbfl_convert_kana(filter->cache, 0, NULL, NULL, mode); diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c index f49cadbca7422..58feeedb8a94c 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c @@ -46,21 +46,21 @@ */ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) { - if ((mode & MBFL_FILT_TL_HAN2ZEN_ALL) && c >= 0x21 && c <= 0x7d && c != '"' && c != '\'' && c != '\\') { + if ((mode & MBFL_HAN2ZEN_ALL) && c >= 0x21 && c <= 0x7d && c != '"' && c != '\'' && c != '\\') { return c + 0xfee0; - } else if ((mode & MBFL_FILT_TL_HAN2ZEN_ALPHA) && ((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a))) { /* alphabetic */ + } else if ((mode & MBFL_HAN2ZEN_ALPHA) && ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))) { return c + 0xfee0; - } else if ((mode & MBFL_FILT_TL_HAN2ZEN_NUMERIC) && c >= 0x30 && c <= 0x39) { /* num */ + } else if ((mode & MBFL_HAN2ZEN_NUMERIC) && c >= '0' && c <= '9') { return c + 0xfee0; - } else if ((mode & MBFL_FILT_TL_HAN2ZEN_SPACE) && c == 0x20) { /* space */ + } else if ((mode & MBFL_HAN2ZEN_SPACE) && c == ' ') { return 0x3000; } - if (mode & (MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_HIRAGANA)) { + if (mode & (MBFL_HAN2ZEN_KATAKANA | MBFL_HAN2ZEN_HIRAGANA)) { /* Convert Hankaku kana to Zenkaku kana * Either all Hankaku kana (including katakana and hiragana) will be converted * to Zenkaku katakana, or to Zenkaku hiragana */ - if ((mode & MBFL_FILT_TL_HAN2ZEN_KATAKANA) && (mode & MBFL_FILT_TL_HAN2ZEN_GLUE)) { + if ((mode & MBFL_HAN2ZEN_KATAKANA) && (mode & MBFL_HAN2ZEN_GLUE)) { if (c >= 0xff61 && c <= 0xff9f) { int n = c - 0xff60; if (next >= 0xff61 && next <= 0xff9f) { @@ -78,7 +78,7 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) return 0x3000 + hankana2zenkana_table[n]; } - } else if ((mode & MBFL_FILT_TL_HAN2ZEN_HIRAGANA) && (mode & MBFL_FILT_TL_HAN2ZEN_GLUE)) { + } else if ((mode & MBFL_HAN2ZEN_HIRAGANA) && (mode & MBFL_HAN2ZEN_GLUE)) { if (c >= 0xff61 && c <= 0xff9f) { int n = c - 0xff60; if (next >= 0xff61 && next <= 0xff9f) { @@ -93,14 +93,14 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) return 0x3000 + hankana2zenhira_table[n]; } - } else if ((mode & MBFL_FILT_TL_HAN2ZEN_KATAKANA) && c >= 0xff61 && c <= 0xff9f) { + } else if ((mode & MBFL_HAN2ZEN_KATAKANA) && c >= 0xff61 && c <= 0xff9f) { return 0x3000 + hankana2zenkana_table[c - 0xff60]; - } else if ((mode & MBFL_FILT_TL_HAN2ZEN_HIRAGANA) && c >= 0xff61 && c <= 0xff9f) { + } else if ((mode & MBFL_HAN2ZEN_HIRAGANA) && c >= 0xff61 && c <= 0xff9f) { return 0x3000 + hankana2zenhira_table[c - 0xff60]; } } - if (mode & MBFL_FILT_TL_HAN2ZEN_COMPAT1) { /* special ascii to symbol */ + if (mode & MBFL_HAN2ZEN_SPECIAL) { /* special ascii to symbol */ if (c == 0x5c) { return 0xffe5; /* FULLWIDTH YEN SIGN */ } else if (c == 0xa5) { /* YEN SIGN */ @@ -116,32 +116,32 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) } } - if (mode & (MBFL_FILT_TL_ZEN2HAN_ALL | MBFL_FILT_TL_ZEN2HAN_ALPHA | MBFL_FILT_TL_ZEN2HAN_NUMERIC | MBFL_FILT_TL_ZEN2HAN_SPACE)) { + if (mode & (MBFL_ZEN2HAN_ALL | MBFL_ZEN2HAN_ALPHA | MBFL_ZEN2HAN_NUMERIC | MBFL_ZEN2HAN_SPACE)) { /* Zenkaku to Hankaku */ - if ((mode & MBFL_FILT_TL_ZEN2HAN_ALL) && c >= 0xff01 && c <= 0xff5d && c != 0xff02 && c != 0xff07 && c!= 0xff3c) { + if ((mode & MBFL_ZEN2HAN_ALL) && c >= 0xff01 && c <= 0xff5d && c != 0xff02 && c != 0xff07 && c != 0xff3c) { /* all except " ' \ ~ */ return c - 0xfee0; - } else if ((mode & MBFL_FILT_TL_ZEN2HAN_ALPHA) && ((c >= 0xff21 && c <= 0xff3a) || (c >= 0xff41 && c <= 0xff5a))) { + } else if ((mode & MBFL_ZEN2HAN_ALPHA) && ((c >= 0xff21 && c <= 0xff3a) || (c >= 0xff41 && c <= 0xff5a))) { return c - 0xfee0; - } else if ((mode & MBFL_FILT_TL_ZEN2HAN_NUMERIC) && (c >= 0xff10 && c <= 0xff19)) { + } else if ((mode & MBFL_ZEN2HAN_NUMERIC) && (c >= 0xff10 && c <= 0xff19)) { return c - 0xfee0; - } else if ((mode & MBFL_FILT_TL_ZEN2HAN_SPACE) && (c == 0x3000)) { + } else if ((mode & MBFL_ZEN2HAN_SPACE) && (c == 0x3000)) { return 0x20; - } else if ((mode & MBFL_FILT_TL_ZEN2HAN_ALL) && (c == 0x2212)) { /* MINUS SIGN */ + } else if ((mode & MBFL_ZEN2HAN_ALL) && (c == 0x2212)) { /* MINUS SIGN */ return 0x2d; } } - if (mode & (MBFL_FILT_TL_ZEN2HAN_KATAKANA | MBFL_FILT_TL_ZEN2HAN_HIRAGANA)) { + if (mode & (MBFL_ZEN2HAN_KATAKANA | MBFL_ZEN2HAN_HIRAGANA)) { /* Zenkaku kana to hankaku kana */ - if ((mode & MBFL_FILT_TL_ZEN2HAN_KATAKANA) && c >= 0x30a1 && c <= 0x30f4) { + if ((mode & MBFL_ZEN2HAN_KATAKANA) && c >= 0x30a1 && c <= 0x30f4) { /* Zenkaku katakana to hankaku kana */ int n = c - 0x30a1; if (zenkana2hankana_table[n][1]) { *second = 0xff00 + zenkana2hankana_table[n][1]; } return 0xff00 + zenkana2hankana_table[n][0]; - } else if ((mode & MBFL_FILT_TL_ZEN2HAN_HIRAGANA) && c >= 0x3041 && c <= 0x3093) { + } else if ((mode & MBFL_ZEN2HAN_HIRAGANA) && c >= 0x3041 && c <= 0x3093) { /* Zenkaku hiragana to hankaku kana */ int n = c - 0x3041; if (zenkana2hankana_table[n][1]) { @@ -165,17 +165,17 @@ int mbfl_convert_kana(int c, int next, bool *consumed, int *second, int mode) } else if (c == 0x30fb) { return 0xff65; /* HALFWIDTH KATAKANA MIDDLE DOT */ } - } else if (mode & (MBFL_FILT_TL_ZENKAKU_HIRA2KANA | MBFL_FILT_TL_ZENKAKU_KANA2HIRA)) { - if ((mode & MBFL_FILT_TL_ZENKAKU_HIRA2KANA) && ((c >= 0x3041 && c <= 0x3093) || c == 0x309d || c == 0x309e)) { + } else if (mode & (MBFL_ZENKAKU_HIRA2KATA | MBFL_ZENKAKU_KATA2HIRA)) { + if ((mode & MBFL_ZENKAKU_HIRA2KATA) && ((c >= 0x3041 && c <= 0x3093) || c == 0x309d || c == 0x309e)) { /* Zenkaku hiragana to Zenkaku katakana */ return c + 0x60; - } else if ((mode & MBFL_FILT_TL_ZENKAKU_KANA2HIRA) && ((c >= 0x30a1 && c <= 0x30f3) || c == 0x30fd || c == 0x30fe)) { + } else if ((mode & MBFL_ZENKAKU_KATA2HIRA) && ((c >= 0x30a1 && c <= 0x30f3) || c == 0x30fd || c == 0x30fe)) { /* Zenkaku katakana to Zenkaku hiragana */ return c - 0x60; } } - if (mode & MBFL_FILT_TL_ZEN2HAN_COMPAT1) { /* special symbol to ascii */ + if (mode & MBFL_ZEN2HAN_SPECIAL) { /* special symbol to ascii */ if (c == 0xffe5) { /* FULLWIDTH YEN SIGN */ return 0x5c; } else if (c == 0xff3c) { /* FULLWIDTH REVERSE SOLIDUS */ diff --git a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h index 832225ab1429e..844a858e71b91 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h +++ b/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h @@ -29,23 +29,25 @@ /* "Zen" is 全, or "full"; "Han" is 半, or "half" * This refers to "fullwidth" or "halfwidth" variants of characters used for writing Japanese */ -#define MBFL_FILT_TL_HAN2ZEN_ALL 0x00000001 -#define MBFL_FILT_TL_HAN2ZEN_ALPHA 0x00000002 -#define MBFL_FILT_TL_HAN2ZEN_NUMERIC 0x00000004 -#define MBFL_FILT_TL_HAN2ZEN_SPACE 0x00000008 -#define MBFL_FILT_TL_ZEN2HAN_ALL 0x00000010 -#define MBFL_FILT_TL_ZEN2HAN_ALPHA 0x00000020 -#define MBFL_FILT_TL_ZEN2HAN_NUMERIC 0x00000040 -#define MBFL_FILT_TL_ZEN2HAN_SPACE 0x00000080 -#define MBFL_FILT_TL_HAN2ZEN_KATAKANA 0x00000100 -#define MBFL_FILT_TL_HAN2ZEN_HIRAGANA 0x00000200 -#define MBFL_FILT_TL_HAN2ZEN_GLUE 0x00000800 -#define MBFL_FILT_TL_ZEN2HAN_KATAKANA 0x00001000 -#define MBFL_FILT_TL_ZEN2HAN_HIRAGANA 0x00002000 -#define MBFL_FILT_TL_ZENKAKU_HIRA2KANA 0x00010000 -#define MBFL_FILT_TL_ZENKAKU_KANA2HIRA 0x00020000 -#define MBFL_FILT_TL_HAN2ZEN_COMPAT1 0x00100000 -#define MBFL_FILT_TL_ZEN2HAN_COMPAT1 0x00200000 +#define MBFL_HAN2ZEN_ALL 0x00001 +#define MBFL_HAN2ZEN_ALPHA 0x00002 +#define MBFL_HAN2ZEN_NUMERIC 0x00004 +#define MBFL_HAN2ZEN_SPACE 0x00008 +#define MBFL_HAN2ZEN_KATAKANA 0x00010 +#define MBFL_HAN2ZEN_HIRAGANA 0x00020 +#define MBFL_HAN2ZEN_SPECIAL 0x00040 +#define MBFL_ZENKAKU_HIRA2KATA 0x00080 + +#define MBFL_ZEN2HAN_ALL 0x00100 +#define MBFL_ZEN2HAN_ALPHA 0x00200 +#define MBFL_ZEN2HAN_NUMERIC 0x00400 +#define MBFL_ZEN2HAN_SPACE 0x00800 +#define MBFL_ZEN2HAN_KATAKANA 0x01000 +#define MBFL_ZEN2HAN_HIRAGANA 0x02000 +#define MBFL_ZEN2HAN_SPECIAL 0x04000 +#define MBFL_ZENKAKU_KATA2HIRA 0x08000 + +#define MBFL_HAN2ZEN_GLUE 0x10000 extern const struct mbfl_convert_vtbl vtbl_tl_jisx0201_jisx0208; diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index e48b718b96b94..8cb192fdf13b1 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2848,6 +2848,12 @@ PHP_FUNCTION(mb_decode_mimeheader) } /* }}} */ +char mb_convert_kana_flags[17] = { + 'A', 'R', 'N', 'S', 'K', 'H', 'M', 'C', + 'a', 'r', 'n', 's', 'k', 'h', 'm', 'c', + 'V' +}; + /* {{{ Conversion between full-width character and half-width character (Japanese) */ PHP_FUNCTION(mb_convert_kana) { @@ -2866,70 +2872,78 @@ PHP_FUNCTION(mb_convert_kana) string.val = (unsigned char*)string_val; - /* "Zen" is 全, or "full"; "Han" is 半, or "half" - * This refers to "fullwidth" or "halfwidth" variants of characters used for writing Japanese */ if (optstr != NULL) { char *p = optstr, *e = p + optstr_len; opt = 0; +next_option: while (p < e) { - switch (*p++) { - case 'A': - opt |= MBFL_FILT_TL_HAN2ZEN_ALL; - break; - case 'a': - opt |= MBFL_FILT_TL_ZEN2HAN_ALL; - break; - case 'R': - opt |= MBFL_FILT_TL_HAN2ZEN_ALPHA; - break; - case 'r': - opt |= MBFL_FILT_TL_ZEN2HAN_ALPHA; - break; - case 'N': - opt |= MBFL_FILT_TL_HAN2ZEN_NUMERIC; - break; - case 'n': - opt |= MBFL_FILT_TL_ZEN2HAN_NUMERIC; - break; - case 'S': - opt |= MBFL_FILT_TL_HAN2ZEN_SPACE; - break; - case 's': - opt |= MBFL_FILT_TL_ZEN2HAN_SPACE; - break; - case 'K': - opt |= MBFL_FILT_TL_HAN2ZEN_KATAKANA; - break; - case 'k': - opt |= MBFL_FILT_TL_ZEN2HAN_KATAKANA; - break; - case 'H': - opt |= MBFL_FILT_TL_HAN2ZEN_HIRAGANA; - break; - case 'h': - opt |= MBFL_FILT_TL_ZEN2HAN_HIRAGANA; - break; - case 'V': - opt |= MBFL_FILT_TL_HAN2ZEN_GLUE; - break; - case 'C': - opt |= MBFL_FILT_TL_ZENKAKU_HIRA2KANA; - break; - case 'c': - opt |= MBFL_FILT_TL_ZENKAKU_KANA2HIRA; - break; - case 'M': - /* TODO: figure out what 'M' and 'm' are for, and rename the constant - * to something meaningful */ - opt |= MBFL_FILT_TL_HAN2ZEN_COMPAT1; - break; - case 'm': - opt |= MBFL_FILT_TL_ZEN2HAN_COMPAT1; - break; + /* Walk through option string and convert to bit vector + * See mbfilter_tl_jisx0201_jisx0208.h for the values used */ + char c = *p++; + if (c == 'A') { + opt |= MBFL_HAN2ZEN_ALL | MBFL_HAN2ZEN_ALPHA | MBFL_HAN2ZEN_NUMERIC; + } else if (c == 'a') { + opt |= MBFL_ZEN2HAN_ALL | MBFL_ZEN2HAN_ALPHA | MBFL_ZEN2HAN_NUMERIC; + } else { + for (int i = 0; i < sizeof(mb_convert_kana_flags) / sizeof(char); i++) { + if (c == mb_convert_kana_flags[i]) { + opt |= (1 << i); + goto next_option; + } + } + + zend_argument_value_error(2, "contains invalid flag: '%c'", c); + RETURN_THROWS(); + } + } + + /* Check for illegal combinations of options */ + if (((opt & 0xFF00) >> 8) & opt) { + /* It doesn't make sense to convert the same type of characters from halfwidth to + * fullwidth and then back to halfwidth again. Neither does it make sense to convert + * FW hiragana to FW katakana and then back again. */ + int badflag = ((opt & 0xFF00) >> 8) & opt, i; + for (i = 0; (badflag & 1) == 0; badflag >>= 1, i++); + char flag1 = mb_convert_kana_flags[i], flag2 = mb_convert_kana_flags[i+8]; + if ((flag1 == 'R' || flag1 == 'N') && (opt & MBFL_HAN2ZEN_ALL)) + flag1 = 'A'; + if ((flag2 == 'r' || flag2 == 'n') && (opt & MBFL_ZEN2HAN_ALL)) + flag2 = 'a'; + zend_argument_value_error(2, "must not combine '%c' and '%c' flags", flag1, flag2); + RETURN_THROWS(); + } + + if ((opt & MBFL_HAN2ZEN_HIRAGANA) && (opt & MBFL_HAN2ZEN_KATAKANA)) { + /* We can either convert all HW kana to FW hiragana, or to FW katakana, but not both */ + zend_argument_value_error(2, "must not combine 'H' and 'K' flags"); + RETURN_THROWS(); + } + + /* We can either convert all FW kana to HW hiragana, or all FW kana to HW katakana, + * or all FW hiragana to FW katakana, or all FW katakana to FW hiragana, but not + * more than one of these */ + if (opt & MBFL_ZEN2HAN_HIRAGANA) { + if (opt & MBFL_ZEN2HAN_KATAKANA) { + zend_argument_value_error(2, "must not combine 'h' and 'k' flags"); + RETURN_THROWS(); + } else if (opt & MBFL_ZENKAKU_HIRA2KATA) { + zend_argument_value_error(2, "must not combine 'h' and 'C' flags"); + RETURN_THROWS(); + } else if (opt & MBFL_ZENKAKU_KATA2HIRA) { + zend_argument_value_error(2, "must not combine 'h' and 'c' flags"); + RETURN_THROWS(); + } + } else if (opt & MBFL_ZEN2HAN_KATAKANA) { + if (opt & MBFL_ZENKAKU_HIRA2KATA) { + zend_argument_value_error(2, "must not combine 'k' and 'C' flags"); + RETURN_THROWS(); + } else if (opt & MBFL_ZENKAKU_KATA2HIRA) { + zend_argument_value_error(2, "must not combine 'k' and 'c' flags"); + RETURN_THROWS(); } } } else { - opt = MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_GLUE; + opt = MBFL_HAN2ZEN_KATAKANA | MBFL_HAN2ZEN_GLUE; } /* encoding */ diff --git a/ext/mbstring/tests/mb_convert_kana.phpt b/ext/mbstring/tests/mb_convert_kana.phpt index b430ca8f1a615..99c17d68d5a5b 100644 --- a/ext/mbstring/tests/mb_convert_kana.phpt +++ b/ext/mbstring/tests/mb_convert_kana.phpt @@ -16,17 +16,20 @@ $hanKakuB = 'ーアイウエオカキクケコサシスセソ'; $hanKakuC = 'タチツテトナニヌネノハヒフヘホマ'; $hanKakuD = 'ミムメモヤユヨラリルレロワン゙゚'; -echo $zenKakuA . ' => ' . mb_convert_kana($zenKakuA, 'AZKH', 'utf-8'), "\n"; -echo $zenKakuB . ' => ' . mb_convert_kana($zenKakuB, 'azkh', 'utf-8'), "\n"; -echo $zenKakuC . ' => ' . mb_convert_kana($zenKakuC, 'azkh', 'utf-8'), "\n"; -echo $zenKakuD . ' => ' . mb_convert_kana($zenKakuD, 'azkh', 'utf-8'), "\n"; -echo $zenKakuE . ' => ' . mb_convert_kana($zenKakuE, 'azkh', 'utf-8'), "\n"; -echo $zenKakuF . ' => ' . mb_convert_kana($zenKakuF, 'azkh', 'utf-8'), "\n\n"; - -echo $hanKakuA . ' => ' . mb_convert_kana($hanKakuA, 'AZKH', 'utf-8'), "\n"; -echo $hanKakuB . ' => ' . mb_convert_kana($hanKakuB, 'AZKH', 'utf-8'), "\n"; -echo $hanKakuC . ' => ' . mb_convert_kana($hanKakuC, 'AZKH', 'utf-8'), "\n"; -echo $hanKakuD . ' => ' . mb_convert_kana($hanKakuD, 'AZKH', 'utf-8'), "\n\n"; +// Convert all Zenkaku to Hankaku; no effect +echo "'A': " . $zenKakuA . ' => ' . mb_convert_kana($zenKakuA, 'AK', 'utf-8') . "\n"; +// Convert all Hankaku to Zenkaku; has an effect +echo "'a': " . $zenKakuB . ' => ' . mb_convert_kana($zenKakuB, 'ak', 'utf-8') . "\n"; +echo "'a': " . $zenKakuC . ' => ' . mb_convert_kana($zenKakuC, 'ak', 'utf-8') . "\n"; +echo "'a': " . $zenKakuD . ' => ' . mb_convert_kana($zenKakuD, 'ak', 'utf-8') . "\n"; +echo "'a': " . $zenKakuE . ' => ' . mb_convert_kana($zenKakuE, 'ak', 'utf-8') . "\n"; +echo "'a': " . $zenKakuF . ' => ' . mb_convert_kana($zenKakuF, 'ak', 'utf-8') . "\n"; +echo "\n"; +// Convert all Zenkaku to Hankaku; has an effect +echo "'A': " . $hanKakuA . ' => ' . mb_convert_kana($hanKakuA, 'AK', 'utf-8') . "\n"; +echo "'A': " . $hanKakuB . ' => ' . mb_convert_kana($hanKakuB, 'AK', 'utf-8') . "\n"; +echo "'A': " . $hanKakuC . ' => ' . mb_convert_kana($hanKakuC, 'AK', 'utf-8') . "\n"; +echo "'A': " . $hanKakuD . ' => ' . mb_convert_kana($hanKakuD, 'AK', 'utf-8') . "\n\n"; echo "Convert ASCII letter to full-width: A -> ", bin2hex(mb_convert_kana("\x00A", 'A', 'UTF-16BE')), "\n"; echo "Convert ASCII letter to full-width: A -> ", bin2hex(mb_convert_kana("\x00A", 'R', 'UTF-16BE')), "\n"; @@ -89,19 +92,59 @@ echo bin2hex(mb_convert_kana("\x30\xFD", 'c', 'UTF-16BE')), "\n"; echo bin2hex(mb_convert_kana("\x30\xFE", 'c', 'UTF-16BE')), "\n\n"; echo bin2hex(mb_convert_kana("\x00\x00", 'A', 'UTF-16BE')), "\n"; +echo "\n"; + +// Try combinations of flags which don't make sense +function tryBadFlags($flags) { + try { + mb_convert_kana('abc', $flags, 'UTF-8'); + echo "BAD! mb_convert_kana should have thrown an exception for flags: $flags\n"; + } catch (ValueError $e) { + echo $e->getMessage(), "\n"; + } +} +function tryIncompatibleFlags($flag1, $flag2) { + tryBadFlags($flag1 . $flag2); + tryBadFlags($flag2 . $flag1); +} + +tryIncompatibleFlags('A', 'a'); +tryIncompatibleFlags('A', 'r'); +tryIncompatibleFlags('A', 'n'); +tryIncompatibleFlags('a', 'R'); +tryIncompatibleFlags('a', 'N'); +tryIncompatibleFlags('R', 'r'); +tryIncompatibleFlags('N', 'n'); +tryIncompatibleFlags('S', 's'); +tryIncompatibleFlags('K', 'H'); +tryIncompatibleFlags('k', 'h'); +tryIncompatibleFlags('C', 'c'); +tryIncompatibleFlags('M', 'm'); +tryIncompatibleFlags('h', 'C'); +tryIncompatibleFlags('h', 'c'); +tryIncompatibleFlags('k', 'C'); +tryIncompatibleFlags('k', 'c'); + +// Try non-existent flag +try { + mb_convert_kana($zenKakuA, 'Z', 'UTF-8'); +} catch (ValueError $e) { + echo $e->getMessage() . "\n"; +} + ?> --EXPECT-- -ァアィイゥウェエォオカガキギク => ァアィイゥウェエォオカガキギク -グケゲコゴサザシジスズセゼソゾタ => グケゲコゴサザシジスズセゼソゾタ -ダチヂッツヅテデトドナニヌネノハ => ダチヂッツヅテデトドナニヌネノハ -バパヒビピフブプヘベペホボポマミ => バパヒビピフブプヘベペホボポマミ -ムメモャヤュユョヨラリルレロヮワ => ムメモャヤュユョヨラリルレロワワ -ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾ => イエヲンヴヵヶヷヸヹヺ・ーヽヾ - -⦆。「」、・ヲァィゥェォャュョッ => ⦆。「」、・ヲァィゥェォャュョッ -ーアイウエオカキクケコサシスセソ => ーアイウエオカキクケコサシスセソ -タチツテトナニヌネノハヒフヘホマ => タチツテトナニヌネノハヒフヘホマ -ミムメモヤユヨラリルレロワン゙゚ => ミムメモヤユヨラリルレロワン゛゜ +'A': ァアィイゥウェエォオカガキギク => ァアィイゥウェエォオカガキギク +'a': グケゲコゴサザシジスズセゼソゾタ => グケゲコゴサザシジスズセゼソゾタ +'a': ダチヂッツヅテデトドナニヌネノハ => ダチヂッツヅテデトドナニヌネノハ +'a': バパヒビピフブプヘベペホボポマミ => バパヒビピフブプヘベペホボポマミ +'a': ムメモャヤュユョヨラリルレロヮワ => ムメモャヤュユョヨラリルレロワワ +'a': ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾ => イエヲンヴヵヶヷヸヹヺ・ーヽヾ + +'A': ⦆。「」、・ヲァィゥェォャュョッ => ⦆。「」、・ヲァィゥェォャュョッ +'A': ーアイウエオカキクケコサシスセソ => ーアイウエオカキクケコサシスセソ +'A': タチツテトナニヌネノハヒフヘホマ => タチツテトナニヌネノハヒフヘホマ +'A': ミムメモヤユヨラリルレロワン゙゚ => ミムメモヤユヨラリルレロワン゛゜ Convert ASCII letter to full-width: A -> ff21 Convert ASCII letter to full-width: A -> ff21 @@ -164,6 +207,40 @@ Convert full-width katakana to full-width hiragana: 309e 0000 + +mb_convert_kana(): Argument #2 ($mode) must not combine 'A' and 'a' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'A' and 'a' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'A' and 'r' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'A' and 'r' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'A' and 'n' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'A' and 'n' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'R' and 'a' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'R' and 'a' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'N' and 'a' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'N' and 'a' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'R' and 'r' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'R' and 'r' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'N' and 'n' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'N' and 'n' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'S' and 's' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'S' and 's' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'H' and 'K' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'H' and 'K' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'h' and 'k' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'h' and 'k' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'C' and 'c' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'C' and 'c' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'M' and 'm' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'M' and 'm' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'h' and 'C' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'h' and 'C' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'h' and 'c' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'h' and 'c' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'k' and 'C' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'k' and 'C' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'k' and 'c' flags +mb_convert_kana(): Argument #2 ($mode) must not combine 'k' and 'c' flags +mb_convert_kana(): Argument #2 ($mode) contains invalid flag: 'Z' --CREDITS-- Jason Easter PHPUG Würzburg From 7028c818ca0309551aaafaf3fe97c6a97cfaf2b7 Mon Sep 17 00:00:00 2001 From: Rod Elias Date: Mon, 4 Oct 2021 09:42:23 -0300 Subject: [PATCH 0147/1346] Fix typo in README (#7544) [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d71e1a42fed42..771562bf5d583 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ contribute: - [Contributing to PHP](/CONTRIBUTING.md) - [PHP coding standards](/CODING_STANDARDS.md) -- [Mailinglist rules](/docs/mailinglist-rules.md) +- [Mailing list rules](/docs/mailinglist-rules.md) - [PHP release process](/docs/release-process.md) ## Credits From c3dda473cc044d6c0ba6de36a93dbd0aa08143c2 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sat, 2 Oct 2021 17:38:55 +0100 Subject: [PATCH 0148/1346] Fix 'can not' in test data and in code comments --- Zend/tests/bug47516.phpt | 2 +- Zend/tests/bug70805.phpt | 4 ++-- Zend/tests/bug70957.phpt | 2 +- Zend/zend_vm_gen.php | 4 ++-- ext/curl/tests/curl_copy_handle_basic_006.phpt | 2 +- ext/date/tests/bug45543.phpt | 2 +- ext/intl/grapheme/grapheme_util.c | 2 +- ext/intl/intl_convert.c | 2 +- ext/mysqli/tests/bug34785.phpt | 2 +- ext/mysqli/tests/mysqli_options_openbasedir.phpt | 2 +- ext/mysqli/tests/mysqli_select_db.phpt | 4 ++-- ext/pcntl/tests/pcntl_fork_variation.phpt | 2 +- ext/phar/tar.c | 2 +- ext/reflection/tests/ReflectionClass_CannotClone_basic.phpt | 2 +- ext/simplexml/tests/bug26976.phpt | 2 +- ext/sockets/tests/mcast_ipv6_send.phpt | 3 ++- ext/standard/browscap.c | 2 +- ext/standard/hrtime.c | 2 +- ext/standard/string.c | 2 +- ext/standard/tests/array/array_filter_object.phpt | 2 +- ext/standard/tests/filters/bug22538.phpt | 6 +++--- ext/xmlreader/tests/014.phpt | 2 +- main/network.c | 2 +- tests/classes/interface_constant_inheritance_006.phpt | 2 +- tests/classes/interface_constant_inheritance_007.phpt | 2 +- tests/lang/bug24908.phpt | 2 +- 26 files changed, 32 insertions(+), 31 deletions(-) diff --git a/Zend/tests/bug47516.phpt b/Zend/tests/bug47516.phpt index a9a20710d307f..76d6af196a4ba 100644 --- a/Zend/tests/bug47516.phpt +++ b/Zend/tests/bug47516.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #47516 (nowdoc can not be embed in heredoc but can be embed in double quote) +Bug #47516 (nowdoc cannot be embedded in heredoc but can be embedded in double quote) --FILE-- --EXPECT-- diff --git a/Zend/tests/bug70957.phpt b/Zend/tests/bug70957.phpt index 39970f912380a..9341fcd288d95 100644 --- a/Zend/tests/bug70957.phpt +++ b/Zend/tests/bug70957.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #70957 (self::class can not be resolved with reflection for abstract class) +Bug #70957 (self::class cannot be resolved with reflection for abstract class) --FILE-- diff --git a/ext/date/tests/bug45543.phpt b/ext/date/tests/bug45543.phpt index 1fdb23d4604a2..b96428a3d0e94 100644 --- a/ext/date/tests/bug45543.phpt +++ b/ext/date/tests/bug45543.phpt @@ -1,5 +1,5 @@ --TEST-- -Test for bug #45543: DateTime::setTimezone can not set timezones without ID. +Test for bug #45543: DateTime::setTimezone cannot set timezones without ID. --INI-- date.timezone=UTC --FILE-- diff --git a/ext/intl/grapheme/grapheme_util.c b/ext/intl/grapheme/grapheme_util.c index 25a0b5dfb6309..109172c36a977 100644 --- a/ext/intl/grapheme/grapheme_util.c +++ b/ext/intl/grapheme/grapheme_util.c @@ -53,7 +53,7 @@ void grapheme_substr_ascii(char *str, size_t str_len, int32_t f, int32_t l, char *sub_str = NULL; if(str_len > INT32_MAX) { - /* We can not return long strings from ICU functions, so we won't here too */ + /* We cannot return long strings from ICU functions, so we won't here too */ return; } diff --git a/ext/intl/intl_convert.c b/ext/intl/intl_convert.c index ec66b25d4e150..bb6d236fdfcfc 100644 --- a/ext/intl/intl_convert.c +++ b/ext/intl/intl_convert.c @@ -60,7 +60,7 @@ void intl_convert_utf8_to_utf16( *status = U_ZERO_ERROR; if(src_len > INT32_MAX) { - /* we can not fit this string */ + /* we cannot fit this string */ *status = U_BUFFER_OVERFLOW_ERROR; return; } diff --git a/ext/mysqli/tests/bug34785.phpt b/ext/mysqli/tests/bug34785.phpt index 88817b65062a7..c4bc19d9991ff 100644 --- a/ext/mysqli/tests/bug34785.phpt +++ b/ext/mysqli/tests/bug34785.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #34785 (Can not properly subclass mysqli_stmt) +Bug #34785 (Cannot properly subclass mysqli_stmt) --EXTENSIONS-- mysqli --SKIPIF-- diff --git a/ext/mysqli/tests/mysqli_options_openbasedir.phpt b/ext/mysqli/tests/mysqli_options_openbasedir.phpt index 75d324fd4f99a..0797dd89ea6b8 100644 --- a/ext/mysqli/tests/mysqli_options_openbasedir.phpt +++ b/ext/mysqli/tests/mysqli_options_openbasedir.phpt @@ -15,7 +15,7 @@ if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) if ($IS_MYSQLND) { if (true !== mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, 1)) - printf("[002] Can not set MYSQLI_OPT_LOCAL_INFILE although open_basedir is set!\n"); + printf("[002] Cannot set MYSQLI_OPT_LOCAL_INFILE although open_basedir is set!\n"); } else { if (false !== mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, 1)) diff --git a/ext/mysqli/tests/mysqli_select_db.phpt b/ext/mysqli/tests/mysqli_select_db.phpt index 0a64a7b758444..76f64df743ca8 100644 --- a/ext/mysqli/tests/mysqli_select_db.phpt +++ b/ext/mysqli/tests/mysqli_select_db.phpt @@ -56,11 +56,11 @@ require_once('skipifconnectfailure.inc'); $current_db = $row['dbname']; mysqli_report(MYSQLI_REPORT_OFF); - mysqli_select_db($link, 'I can not imagine that this database exists'); + mysqli_select_db($link, 'I cannot imagine that this database exists'); mysqli_report(MYSQLI_REPORT_ERROR); ob_start(); - mysqli_select_db($link, 'I can not imagine that this database exists'); + mysqli_select_db($link, 'I cannot imagine that this database exists'); $output = ob_get_contents(); ob_end_clean(); if (!stristr($output, "1049") && !stristr($output, "1044") && !stristr($output, "1045")) { diff --git a/ext/pcntl/tests/pcntl_fork_variation.phpt b/ext/pcntl/tests/pcntl_fork_variation.phpt index 81cc8343ac932..744c8aaffcf93 100644 --- a/ext/pcntl/tests/pcntl_fork_variation.phpt +++ b/ext/pcntl/tests/pcntl_fork_variation.phpt @@ -1,5 +1,5 @@ --TEST-- -Test function pcntl_fork() by testing the process isolation in the forking hierarchy father -> son -> grandson where father can not knows his grandson +Test function pcntl_fork() by testing the process isolation in the forking hierarchy father -> son -> grandson where father cannot know his grandson --CREDITS-- Marco Fabbri mrfabbri@gmail.com Francesco Fullone ff@ideato.it diff --git a/ext/phar/tar.c b/ext/phar/tar.c index e56d3e8e3211c..07b784a0b9df2 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -497,7 +497,7 @@ int phar_parse_tarfile(php_stream* fp, char *fname, size_t fname_len, char *alia entry.link = NULL; /* link field is null-terminated unless it has 100 non-null chars. - * Thus we can not use strlen. */ + * Thus we cannot use strlen. */ linkname_len = strnlen(hdr->linkname, 100); if (entry.tar_type == TAR_LINK) { if (!zend_hash_str_exists(&myphar->manifest, hdr->linkname, linkname_len)) { diff --git a/ext/reflection/tests/ReflectionClass_CannotClone_basic.phpt b/ext/reflection/tests/ReflectionClass_CannotClone_basic.phpt index 0e6e249bf9095..58ce9c65dce0f 100644 --- a/ext/reflection/tests/ReflectionClass_CannotClone_basic.phpt +++ b/ext/reflection/tests/ReflectionClass_CannotClone_basic.phpt @@ -1,5 +1,5 @@ --TEST-- -Reflection class can not be cloned +Reflection class cannot be cloned --CREDITS-- Stefan Koopmanschap TestFest PHP|Tek diff --git a/ext/simplexml/tests/bug26976.phpt b/ext/simplexml/tests/bug26976.phpt index c539e7350f016..7c8dcd4143de4 100644 --- a/ext/simplexml/tests/bug26976.phpt +++ b/ext/simplexml/tests/bug26976.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #26976 (Can not access array elements using array indices) +Bug #26976 (Cannot access array elements using array indices) --EXTENSIONS-- simplexml --FILE-- diff --git a/ext/sockets/tests/mcast_ipv6_send.phpt b/ext/sockets/tests/mcast_ipv6_send.phpt index cfaeb276211c2..eb99bccf5d8fa 100644 --- a/ext/sockets/tests/mcast_ipv6_send.phpt +++ b/ext/sockets/tests/mcast_ipv6_send.phpt @@ -9,10 +9,11 @@ if (getenv('CI_NO_IPV6') || !defined('IPPROTO_IPV6')) { die('skip IPv6 not available.'); } $level = IPPROTO_IPV6; -$s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP) or die("skip Can not create socket"); +$s = socket_create(AF_INET6, SOCK_DGRAM, SOL_UDP) or die("skip Cannot create socket"); if (socket_set_option($s, $level, IPV6_MULTICAST_IF, 1) === false) { die("skip interface 1 either doesn't exist or has no ipv6 address"); } +?> --FILE-- causes infinite loop! */ + /* parent entry cannot be same as current section -> causes infinite loop! */ if (ctx->current_section_name != NULL && zend_string_equals_ci(ctx->current_section_name, Z_STR_P(arg2)) ) { diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c index b033b256285ec..5d72e021c12c6 100644 --- a/ext/standard/hrtime.c +++ b/ext/standard/hrtime.c @@ -159,7 +159,7 @@ static zend_always_inline php_hrtime_t _timer_current(void) from an arbitrary point in time. If an optional boolean argument is passed, returns an integer on 64-bit platforms or float on 32-bit containing the current high-resolution time in nanoseconds. The - delivered timestamp is monotonic and can not be adjusted. */ + delivered timestamp is monotonic and cannot be adjusted. */ PHP_FUNCTION(hrtime) { #if HRTIME_AVAILABLE diff --git a/ext/standard/string.c b/ext/standard/string.c index e6a4c69a759ce..4608d954d4bd2 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1190,7 +1190,7 @@ PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return } } ZEND_HASH_FOREACH_END(); - /* numelems can not be 0, we checked above */ + /* numelems cannot be 0, we checked above */ str = zend_string_safe_alloc(numelems - 1, ZSTR_LEN(glue), len, 0); cptr = ZSTR_VAL(str) + ZSTR_LEN(str); *cptr = 0; diff --git a/ext/standard/tests/array/array_filter_object.phpt b/ext/standard/tests/array/array_filter_object.phpt index 0c2b175e25e0f..90e3b294d2028 100644 --- a/ext/standard/tests/array/array_filter_object.phpt +++ b/ext/standard/tests/array/array_filter_object.phpt @@ -47,7 +47,7 @@ class FinalClass { private $var4; final function finalMethod() { - echo 'This can not be overloaded'; + echo 'This cannot be overloaded'; } } diff --git a/ext/standard/tests/filters/bug22538.phpt b/ext/standard/tests/filters/bug22538.phpt index 920dd55c791bf..c3a8ea7b27c3b 100644 --- a/ext/standard/tests/filters/bug22538.phpt +++ b/ext/standard/tests/filters/bug22538.phpt @@ -15,7 +15,7 @@ do { $path2 = sprintf("%s/%s%db", __DIR__, uniqid(), time()); } while ($path1 == $path2); -$fp = fopen($path1, "w") or die("Can not open $path1\n"); +$fp = fopen($path1, "w") or die("Cannot open $path1\n"); $str = "abcdefghijklmnopqrstuvwxyz\n"; $str_len = strlen($str); $cnt = $size; @@ -24,8 +24,8 @@ while (($cnt -= $str_len) > 0) { } $cnt = $size - ($str_len + $cnt); fclose($fp); -$fin = fopen($path1, "r") or die("Can not open $path1\n"); -$fout = fopen($path2, "w") or die("Can not open $path2\n"); +$fin = fopen($path1, "r") or die("Cannot open $path1\n"); +$fout = fopen($path2, "w") or die("Cannot open $path2\n"); stream_filter_append($fout, "string.rot13"); my_stream_copy_to_stream($fin, $fout); fclose($fout); diff --git a/ext/xmlreader/tests/014.phpt b/ext/xmlreader/tests/014.phpt index b173f8e67c3fc..58bf26bab51ac 100644 --- a/ext/xmlreader/tests/014.phpt +++ b/ext/xmlreader/tests/014.phpt @@ -1,5 +1,5 @@ --TEST-- -XMLReader: libxml2 XML Reader, read-only element values can not be modified +XMLReader: libxml2 XML Reader, read-only element values cannot be modified --CREDITS-- Mark Baker mark@lange.demon.co.uk at the PHPNW2017 Conference for PHP Testfest 2017 --EXTENSIONS-- diff --git a/main/network.c b/main/network.c index 1ad7e370cca63..47082ba3bb125 100644 --- a/main/network.c +++ b/main/network.c @@ -836,7 +836,7 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short ((struct sockaddr_in *)sa)->sin_port = htons(port); socklen = sizeof(struct sockaddr_in); if (bindto && strchr(bindto, ':')) { - /* IPV4 sock can not bind to IPV6 address */ + /* IPV4 sock cannot bind to IPV6 address */ bindto = NULL; } break; diff --git a/tests/classes/interface_constant_inheritance_006.phpt b/tests/classes/interface_constant_inheritance_006.phpt index dabec2cc6ddf6..caafec20f0d12 100644 --- a/tests/classes/interface_constant_inheritance_006.phpt +++ b/tests/classes/interface_constant_inheritance_006.phpt @@ -1,5 +1,5 @@ --TEST-- -Ensure a interface can not have protected constants +Ensure an interface cannot have protected constants --FILE-- Date: Sat, 2 Oct 2021 17:41:35 +0100 Subject: [PATCH 0149/1346] Fix 'can not' in error messages --- .../union_types/redundant_types/nullable_null.phpt | 2 +- .../type_declarations/union_types/standalone_false.phpt | 2 +- .../type_declarations/union_types/standalone_null.phpt | 2 +- .../union_types/standalone_nullable_false.phpt | 2 +- Zend/zend_compile.c | 4 ++-- ext/opcache/ZendAccelerator.c | 2 +- ext/snmp/snmp.c | 2 +- ext/snmp/tests/snmp-object-errno-errstr.phpt | 4 ++-- ext/snmp/tests/snmp-object.phpt | 4 ++-- ext/standard/filestat.c | 8 ++++---- sapi/phpdbg/phpdbg.c | 2 +- sapi/phpdbg/tests/phpdbg_oplog_002.phpt | 2 +- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt b/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt index 5597794c86719..0e0e915bdd223 100644 --- a/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt +++ b/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt @@ -8,4 +8,4 @@ function test(): ?null { ?> --EXPECTF-- -Fatal error: Null can not be used as a standalone type in %s on line %d +Fatal error: Null cannot be used as a standalone type in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/standalone_false.phpt b/Zend/tests/type_declarations/union_types/standalone_false.phpt index 3932f929e511c..76d8c9b7a1ede 100644 --- a/Zend/tests/type_declarations/union_types/standalone_false.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_false.phpt @@ -7,4 +7,4 @@ function test(): false {} ?> --EXPECTF-- -Fatal error: False can not be used as a standalone type in %s on line %d +Fatal error: False cannot be used as a standalone type in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/standalone_null.phpt b/Zend/tests/type_declarations/union_types/standalone_null.phpt index 7a25f9cd05f58..d66f27c117a75 100644 --- a/Zend/tests/type_declarations/union_types/standalone_null.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_null.phpt @@ -7,4 +7,4 @@ function test(): null {} ?> --EXPECTF-- -Fatal error: Null can not be used as a standalone type in %s on line %d +Fatal error: Null cannot be used as a standalone type in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt b/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt index 1e680249b0cd6..aa1bf34db1eb9 100644 --- a/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt @@ -7,4 +7,4 @@ function test(): ?false {} ?> --EXPECTF-- -Fatal error: False can not be used as a standalone type in %s on line %d +Fatal error: False cannot be used as a standalone type in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 395e0045253de..33588ed349999 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6328,9 +6328,9 @@ static zend_type zend_compile_typename( if ((type_mask & (MAY_BE_NULL|MAY_BE_FALSE)) && !ZEND_TYPE_IS_COMPLEX(type) && !(type_mask & ~(MAY_BE_NULL|MAY_BE_FALSE))) { if (type_mask == MAY_BE_NULL) { - zend_error_noreturn(E_COMPILE_ERROR, "Null can not be used as a standalone type"); + zend_error_noreturn(E_COMPILE_ERROR, "Null cannot be used as a standalone type"); } else { - zend_error_noreturn(E_COMPILE_ERROR, "False can not be used as a standalone type"); + zend_error_noreturn(E_COMPILE_ERROR, "False cannot be used as a standalone type"); } } diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 11158cead5698..a2cc930b2ff9c 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3214,7 +3214,7 @@ static zend_result accel_post_startup(void) break; case FAILED_REATTACHED: accel_startup_ok = 0; - zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - can not reattach to exiting shared memory."); + zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - cannot reattach to exiting shared memory."); return SUCCESS; break; #if ENABLE_FILE_CACHE_FALLBACK diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index f0917501751f5..ccce7bf1da610 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -432,7 +432,7 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st, } if ((st & SNMP_CMD_SET) && objid_query->count > objid_query->step) { - php_snmp_error(getThis(), PHP_SNMP_ERRNO_MULTIPLE_SET_QUERIES, "Can not fit all OIDs for SET query into one packet, using multiple queries"); + php_snmp_error(getThis(), PHP_SNMP_ERRNO_MULTIPLE_SET_QUERIES, "Cannot fit all OIDs for SET query into one packet, using multiple queries"); } while (keepwalking) { diff --git a/ext/snmp/tests/snmp-object-errno-errstr.phpt b/ext/snmp/tests/snmp-object-errno-errstr.phpt index 831a9f3319dbb..8304c6cb9f921 100644 --- a/ext/snmp/tests/snmp-object-errno-errstr.phpt +++ b/ext/snmp/tests/snmp-object-errno-errstr.phpt @@ -138,12 +138,12 @@ string(129) "Could not add variable: OID='.iso.org.dod.internet.mgmt.mib-2.syste SNMP::ERRNO_MULTIPLE_SET_QUERIES bool(true) bool(true) -string(74) "Can not fit all OIDs for SET query into one packet, using multiple queries" +string(73) "Cannot fit all OIDs for SET query into one packet, using multiple queries" bool(true) bool(true) bool(true) bool(true) -string(74) "Can not fit all OIDs for SET query into one packet, using multiple queries" +string(73) "Cannot fit all OIDs for SET query into one packet, using multiple queries" bool(true) bool(true) bool(true) diff --git a/ext/snmp/tests/snmp-object.phpt b/ext/snmp/tests/snmp-object.phpt index 0bf4ed49cbb53..13461675cc806 100644 --- a/ext/snmp/tests/snmp-object.phpt +++ b/ext/snmp/tests/snmp-object.phpt @@ -232,12 +232,12 @@ bool(true) bool(true) Multiple OID with max_oids = 1 -Warning: SNMP::set(): Can not fit all OIDs for SET query into one packet, using multiple queries in %s on line %d +Warning: SNMP::set(): Cannot fit all OIDs for SET query into one packet, using multiple queries in %s on line %d bool(true) bool(true) bool(true) -Warning: SNMP::set(): Can not fit all OIDs for SET query into one packet, using multiple queries in %s on line %d +Warning: SNMP::set(): Cannot fit all OIDs for SET query into one packet, using multiple queries in %s on line %d bool(true) bool(true) bool(true) diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 0d3114191964c..a6c867c949a54 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -365,7 +365,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ } else { #if !defined(WINDOWS) /* On Windows, we expect regular chgrp to fail silently by default */ - php_error_docref(NULL, E_WARNING, "Can not call chgrp() for a non-standard stream"); + php_error_docref(NULL, E_WARNING, "Cannot call chgrp() for a non-standard stream"); #endif RETURN_FALSE; } @@ -491,7 +491,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ } else { #if !defined(WINDOWS) /* On Windows, we expect regular chown to fail silently by default */ - php_error_docref(NULL, E_WARNING, "Can not call chown() for a non-standard stream"); + php_error_docref(NULL, E_WARNING, "Cannot call chown() for a non-standard stream"); #endif RETURN_FALSE; } @@ -574,7 +574,7 @@ PHP_FUNCTION(chmod) RETURN_FALSE; } } else { - php_error_docref(NULL, E_WARNING, "Can not call chmod() for a non-standard stream"); + php_error_docref(NULL, E_WARNING, "Cannot call chmod() for a non-standard stream"); RETURN_FALSE; } } @@ -643,7 +643,7 @@ PHP_FUNCTION(touch) } else { php_stream *stream; if(!filetime_is_null || !fileatime_is_null) { - php_error_docref(NULL, E_WARNING, "Can not call touch() for a non-standard stream"); + php_error_docref(NULL, E_WARNING, "Cannot call touch() for a non-standard stream"); RETURN_FALSE; } stream = php_stream_open_wrapper_ex(filename, "c", REPORT_ERRORS, NULL, NULL); diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index 193a89bfa687a..ed56aa68f2546 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -598,7 +598,7 @@ PHP_FUNCTION(phpdbg_end_oplog) } if (!PHPDBG_G(oplog_list)) { - zend_error(E_WARNING, "Can not end an oplog without starting it"); + zend_error(E_WARNING, "Cannot end an oplog without starting it"); return; } diff --git a/sapi/phpdbg/tests/phpdbg_oplog_002.phpt b/sapi/phpdbg/tests/phpdbg_oplog_002.phpt index b9ba905caacc6..1318328cec13e 100644 --- a/sapi/phpdbg/tests/phpdbg_oplog_002.phpt +++ b/sapi/phpdbg/tests/phpdbg_oplog_002.phpt @@ -6,7 +6,7 @@ q --EXPECTF-- [Successful compilation of %s] prompt> -Warning: Can not end an oplog without starting it in %s on line 3 +Warning: Cannot end an oplog without starting it in %s on line 3 NULL [Script ended normally] prompt> From 46f182eef83d5c12f6ea817f6f765bbe9ee2bd19 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Tue, 5 Oct 2021 10:34:42 +0100 Subject: [PATCH 0150/1346] Typo --- Zend/tests/coalesce_assign_optimization.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/coalesce_assign_optimization.phpt b/Zend/tests/coalesce_assign_optimization.phpt index ff076b03e0a86..ef1c1880b2e7f 100644 --- a/Zend/tests/coalesce_assign_optimization.phpt +++ b/Zend/tests/coalesce_assign_optimization.phpt @@ -1,5 +1,5 @@ --TEST-- -Live range construction should not break if colesce assign branch is optimized away +Live range construction should not break if coalesce assign branch is optimized away --FILE-- Date: Wed, 6 Oct 2021 19:14:20 +0200 Subject: [PATCH 0151/1346] Reduce max input size in parser fuzzer Still seeing stack overflows for $$$$$x style input, let's reduce the input size limit further... --- sapi/fuzzer/fuzzer-parser.c | 2 +- sapi/fuzzer/generate_parser_corpus.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sapi/fuzzer/fuzzer-parser.c b/sapi/fuzzer/fuzzer-parser.c index 427720a1dcad9..28030d95d9a36 100644 --- a/sapi/fuzzer/fuzzer-parser.c +++ b/sapi/fuzzer/fuzzer-parser.c @@ -26,7 +26,7 @@ #include "fuzzer-sapi.h" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { - if (Size > 7 * 1024) { + if (Size > 6 * 1024) { /* Large inputs have a large impact on fuzzer performance and may cause stack overflows, * but are unlikely to be necessary to reach new codepaths. */ return 0; diff --git a/sapi/fuzzer/generate_parser_corpus.php b/sapi/fuzzer/generate_parser_corpus.php index 308c4fdee3069..036ca42e37033 100644 --- a/sapi/fuzzer/generate_parser_corpus.php +++ b/sapi/fuzzer/generate_parser_corpus.php @@ -9,7 +9,7 @@ $corpusDir = __DIR__ . '/corpus/parser'; @mkdir($corpusDir); -$maxLen = 7 * 1024; +$maxLen = 6 * 1024; foreach ($it as $file) { if (!preg_match('/\.phpt$/', $file)) continue; $code = file_get_contents($file); From b245d84ac2c8fd34b2c7254920a2b48bf2b99b6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Thu, 7 Oct 2021 10:07:48 +0200 Subject: [PATCH 0152/1346] Make it clear that pg_last_notice cannot return false (#7564) --- ext/pgsql/pgsql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 4b89beee11e0a..82c1af88aa16c 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -1536,7 +1536,7 @@ PHP_FUNCTION(pg_last_notice) zend_argument_value_error(2, "must be one of PGSQL_NOTICE_LAST, PGSQL_NOTICE_ALL, or PGSQL_NOTICE_CLEAR"); RETURN_THROWS(); } - RETURN_FALSE; + ZEND_UNREACHABLE(); } static inline bool is_valid_oid_string(zend_string *oid, Oid *return_oid) From c8764870aebc2c1ed8b79f1db7d096edef9b7891 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 8 Oct 2021 12:54:55 +0100 Subject: [PATCH 0153/1346] Updated to version 2021.3 (2021c) --- ext/date/lib/timezonedb.h | 6141 +++++++++++++++++++------------------ 1 file changed, 3173 insertions(+), 2968 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 89bf64b6cb950..124e480ccaa0b 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -4,605 +4,606 @@ #endif #ifdef TIMELIB_SUPPORT_SLIM_FILE -const timelib_tzdb_index_entry timezonedb_idx_builtin[594] = { +const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Africa/Abidjan" , 0x000000 }, { "Africa/Accra" , 0x00008E }, - { "Africa/Addis_Ababa" , 0x000356 }, - { "Africa/Algiers" , 0x000421 }, - { "Africa/Asmara" , 0x000603 }, - { "Africa/Asmera" , 0x0006CE }, - { "Africa/Bamako" , 0x000799 }, - { "Africa/Bangui" , 0x000827 }, - { "Africa/Banjul" , 0x0008E7 }, - { "Africa/Bissau" , 0x000975 }, - { "Africa/Blantyre" , 0x000A16 }, - { "Africa/Brazzaville" , 0x000AA5 }, - { "Africa/Bujumbura" , 0x000B65 }, - { "Africa/Cairo" , 0x000BF4 }, - { "Africa/Casablanca" , 0x0010FC }, - { "Africa/Ceuta" , 0x001887 }, - { "Africa/Conakry" , 0x001AD3 }, - { "Africa/Dakar" , 0x001B61 }, - { "Africa/Dar_es_Salaam" , 0x001BEF }, - { "Africa/Djibouti" , 0x001CBA }, - { "Africa/Douala" , 0x001D85 }, - { "Africa/El_Aaiun" , 0x001E45 }, - { "Africa/Freetown" , 0x002577 }, - { "Africa/Gaborone" , 0x002605 }, - { "Africa/Harare" , 0x002694 }, - { "Africa/Johannesburg" , 0x002723 }, - { "Africa/Juba" , 0x0027ED }, - { "Africa/Kampala" , 0x0029C3 }, - { "Africa/Khartoum" , 0x002A8E }, - { "Africa/Kigali" , 0x002C64 }, - { "Africa/Kinshasa" , 0x002CF3 }, - { "Africa/Lagos" , 0x002DCC }, - { "Africa/Libreville" , 0x002E8C }, - { "Africa/Lome" , 0x002F4C }, - { "Africa/Luanda" , 0x002FDA }, - { "Africa/Lubumbashi" , 0x00309A }, - { "Africa/Lusaka" , 0x003142 }, - { "Africa/Malabo" , 0x0031D1 }, - { "Africa/Maputo" , 0x003291 }, - { "Africa/Maseru" , 0x003320 }, - { "Africa/Mbabane" , 0x0033EA }, - { "Africa/Mogadishu" , 0x0034B4 }, - { "Africa/Monrovia" , 0x00357F }, - { "Africa/Nairobi" , 0x00362F }, - { "Africa/Ndjamena" , 0x0036FA }, - { "Africa/Niamey" , 0x0037A6 }, - { "Africa/Nouakchott" , 0x003866 }, - { "Africa/Ouagadougou" , 0x0038F4 }, - { "Africa/Porto-Novo" , 0x003982 }, - { "Africa/Sao_Tome" , 0x003A42 }, - { "Africa/Timbuktu" , 0x003AFB }, - { "Africa/Tripoli" , 0x003B89 }, - { "Africa/Tunis" , 0x003D44 }, - { "Africa/Windhoek" , 0x003F11 }, - { "America/Adak" , 0x00419B }, - { "America/Anchorage" , 0x004580 }, - { "America/Anguilla" , 0x004970 }, - { "America/Antigua" , 0x0049FE }, - { "America/Araguaina" , 0x004A8C }, - { "America/Argentina/Buenos_Aires" , 0x004CF1 }, - { "America/Argentina/Catamarca" , 0x004FD6 }, - { "America/Argentina/ComodRivadavia" , 0x0052C1 }, - { "America/Argentina/Cordoba" , 0x005591 }, - { "America/Argentina/Jujuy" , 0x005897 }, - { "America/Argentina/La_Rioja" , 0x005B5F }, - { "America/Argentina/Mendoza" , 0x005E45 }, - { "America/Argentina/Rio_Gallegos" , 0x006121 }, - { "America/Argentina/Salta" , 0x006400 }, - { "America/Argentina/San_Juan" , 0x0066D4 }, - { "America/Argentina/San_Luis" , 0x0069BA }, - { "America/Argentina/Tucuman" , 0x006CA0 }, - { "America/Argentina/Ushuaia" , 0x006F8E }, - { "America/Aruba" , 0x007273 }, - { "America/Asuncion" , 0x007316 }, - { "America/Atikokan" , 0x007696 }, - { "America/Atka" , 0x0077A3 }, - { "America/Bahia" , 0x007B78 }, - { "America/Bahia_Banderas" , 0x007E33 }, - { "America/Barbados" , 0x008071 }, - { "America/Belem" , 0x008164 }, - { "America/Belize" , 0x00830C }, - { "America/Blanc-Sablon" , 0x00872D }, - { "America/Boa_Vista" , 0x008822 }, - { "America/Bogota" , 0x0089E3 }, - { "America/Boise" , 0x008AA2 }, - { "America/Buenos_Aires" , 0x008EB5 }, - { "America/Cambridge_Bay" , 0x009185 }, - { "America/Campo_Grande" , 0x0094A5 }, - { "America/Cancun" , 0x00987B }, - { "America/Caracas" , 0x009ABC }, - { "America/Catamarca" , 0x009B86 }, - { "America/Cayenne" , 0x009E56 }, - { "America/Cayman" , 0x009EF9 }, - { "America/Chicago" , 0x009F9A }, - { "America/Chihuahua" , 0x00A694 }, - { "America/Coral_Harbour" , 0x00A81A }, - { "America/Cordoba" , 0x00A906 }, - { "America/Costa_Rica" , 0x00ABD6 }, - { "America/Creston" , 0x00ACCA }, - { "America/Cuiaba" , 0x00AD86 }, - { "America/Curacao" , 0x00B143 }, - { "America/Danmarkshavn" , 0x00B1E6 }, - { "America/Dawson" , 0x00B3CB }, - { "America/Dawson_Creek" , 0x00B7EE }, - { "America/Denver" , 0x00BAC5 }, - { "America/Detroit" , 0x00BEF8 }, - { "America/Dominica" , 0x00C2A0 }, - { "America/Edmonton" , 0x00C32E }, - { "America/Eirunepe" , 0x00C721 }, - { "America/El_Salvador" , 0x00C8F0 }, - { "America/Ensenada" , 0x00C9AC }, - { "America/Fort_Nelson" , 0x00CDB9 }, - { "America/Fort_Wayne" , 0x00D381 }, - { "America/Fortaleza" , 0x00D5A0 }, - { "America/Glace_Bay" , 0x00D7B6 }, - { "America/Godthab" , 0x00DB4D }, - { "America/Goose_Bay" , 0x00DD2A }, - { "America/Grand_Turk" , 0x00E382 }, - { "America/Grenada" , 0x00E6E3 }, - { "America/Guadeloupe" , 0x00E771 }, - { "America/Guatemala" , 0x00E7FF }, - { "America/Guayaquil" , 0x00E8DF }, - { "America/Guyana" , 0x00E9B0 }, - { "America/Halifax" , 0x00EA68 }, - { "America/Havana" , 0x00F11A }, - { "America/Hermosillo" , 0x00F583 }, - { "America/Indiana/Indianapolis" , 0x00F6CC }, - { "America/Indiana/Knox" , 0x00F904 }, - { "America/Indiana/Marengo" , 0x00FD1D }, - { "America/Indiana/Petersburg" , 0x00FF77 }, - { "America/Indiana/Tell_City" , 0x010241 }, - { "America/Indiana/Vevay" , 0x01046B }, - { "America/Indiana/Vincennes" , 0x010602 }, - { "America/Indiana/Winamac" , 0x010858 }, - { "America/Indianapolis" , 0x010ADE }, - { "America/Inuvik" , 0x010CFD }, - { "America/Iqaluit" , 0x010FDA }, - { "America/Jamaica" , 0x0112E8 }, - { "America/Jujuy" , 0x011447 }, - { "America/Juneau" , 0x011705 }, - { "America/Kentucky/Louisville" , 0x011AEB }, - { "America/Kentucky/Monticello" , 0x011FEF }, - { "America/Knox_IN" , 0x0123DB }, - { "America/Kralendijk" , 0x0127DF }, - { "America/La_Paz" , 0x012882 }, - { "America/Lima" , 0x012938 }, - { "America/Los_Angeles" , 0x012A5F }, - { "America/Louisville" , 0x012F80 }, - { "America/Lower_Princes" , 0x013466 }, - { "America/Maceio" , 0x013509 }, - { "America/Managua" , 0x01371B }, - { "America/Manaus" , 0x01384E }, - { "America/Marigot" , 0x013A05 }, - { "America/Martinique" , 0x013A93 }, - { "America/Matamoros" , 0x013B51 }, - { "America/Mazatlan" , 0x013D50 }, - { "America/Mendoza" , 0x013F00 }, - { "America/Menominee" , 0x0141D0 }, - { "America/Merida" , 0x014590 }, - { "America/Metlakatla" , 0x0146EB }, - { "America/Mexico_City" , 0x014961 }, - { "America/Miquelon" , 0x014B15 }, - { "America/Moncton" , 0x014D47 }, - { "America/Monterrey" , 0x015340 }, - { "America/Montevideo" , 0x0154B6 }, - { "America/Montreal" , 0x01588B }, - { "America/Montserrat" , 0x015F4C }, - { "America/Nassau" , 0x015FDA }, - { "America/New_York" , 0x0163D4 }, - { "America/Nipigon" , 0x016AC4 }, - { "America/Nome" , 0x016E34 }, - { "America/Noronha" , 0x01721C }, - { "America/North_Dakota/Beulah" , 0x01741C }, - { "America/North_Dakota/Center" , 0x017850 }, - { "America/North_Dakota/New_Salem" , 0x017C4F }, - { "America/Nuuk" , 0x018054 }, - { "America/Ojinaga" , 0x018247 }, - { "America/Panama" , 0x01845F }, - { "America/Pangnirtung" , 0x018500 }, - { "America/Paramaribo" , 0x018827 }, - { "America/Phoenix" , 0x0188EE }, - { "America/Port-au-Prince" , 0x018A07 }, - { "America/Port_of_Spain" , 0x018C48 }, - { "America/Porto_Acre" , 0x018CD6 }, - { "America/Porto_Velho" , 0x018E84 }, - { "America/Puerto_Rico" , 0x019022 }, - { "America/Punta_Arenas" , 0x0190DF }, - { "America/Rainy_River" , 0x0195B8 }, - { "America/Rankin_Inlet" , 0x019929 }, - { "America/Recife" , 0x019BFF }, - { "America/Regina" , 0x019DF9 }, - { "America/Resolute" , 0x01A098 }, - { "America/Rio_Branco" , 0x01A36F }, - { "America/Rosario" , 0x01A521 }, - { "America/Santa_Isabel" , 0x01A7F1 }, - { "America/Santarem" , 0x01ABFE }, - { "America/Santiago" , 0x01ADAE }, - { "America/Santo_Domingo" , 0x01B2CE }, - { "America/Sao_Paulo" , 0x01B417 }, - { "America/Scoresbysund" , 0x01B811 }, - { "America/Shiprock" , 0x01BA19 }, - { "America/Sitka" , 0x01BE37 }, - { "America/St_Barthelemy" , 0x01C212 }, - { "America/St_Johns" , 0x01C2A0 }, - { "America/St_Kitts" , 0x01CA24 }, - { "America/St_Lucia" , 0x01CAB2 }, - { "America/St_Thomas" , 0x01CB40 }, - { "America/St_Vincent" , 0x01CBCE }, - { "America/Swift_Current" , 0x01CC5C }, - { "America/Tegucigalpa" , 0x01CDEA }, - { "America/Thule" , 0x01CEB8 }, - { "America/Thunder_Bay" , 0x01D099 }, - { "America/Tijuana" , 0x01D430 }, - { "America/Toronto" , 0x01D85E }, - { "America/Tortola" , 0x01DF3C }, - { "America/Vancouver" , 0x01DFCA }, - { "America/Virgin" , 0x01E521 }, - { "America/Whitehorse" , 0x01E5AF }, - { "America/Winnipeg" , 0x01E9D2 }, - { "America/Yakutat" , 0x01EF09 }, - { "America/Yellowknife" , 0x01F2D7 }, - { "Antarctica/Casey" , 0x01F5D3 }, - { "Antarctica/Davis" , 0x01F6D7 }, - { "Antarctica/DumontDUrville" , 0x01F7AD }, - { "Antarctica/Macquarie" , 0x01F861 }, - { "Antarctica/Mawson" , 0x01FC4D }, - { "Antarctica/McMurdo" , 0x01FCF7 }, - { "Antarctica/Palmer" , 0x02013C }, - { "Antarctica/Rothera" , 0x0204C5 }, - { "Antarctica/South_Pole" , 0x02055C }, - { "Antarctica/Syowa" , 0x02097B }, - { "Antarctica/Troll" , 0x020A11 }, - { "Antarctica/Vostok" , 0x020AD3 }, - { "Arctic/Longyearbyen" , 0x020B6A }, - { "Asia/Aden" , 0x020E1A }, - { "Asia/Almaty" , 0x020EAB }, - { "Asia/Amman" , 0x02112F }, - { "Asia/Anadyr" , 0x02144E }, - { "Asia/Aqtau" , 0x021754 }, - { "Asia/Aqtobe" , 0x0219D3 }, - { "Asia/Ashgabat" , 0x021C53 }, - { "Asia/Ashkhabad" , 0x021DD6 }, - { "Asia/Atyrau" , 0x021F59 }, - { "Asia/Baghdad" , 0x0221E2 }, - { "Asia/Bahrain" , 0x022464 }, - { "Asia/Baku" , 0x022508 }, - { "Asia/Bangkok" , 0x0227FC }, - { "Asia/Barnaul" , 0x0228A0 }, - { "Asia/Beirut" , 0x022BAB }, - { "Asia/Bishkek" , 0x022E93 }, - { "Asia/Brunei" , 0x023109 }, - { "Asia/Calcutta" , 0x0231AF }, - { "Asia/Chita" , 0x023297 }, - { "Asia/Choibalsan" , 0x0235A5 }, - { "Asia/Chongqing" , 0x02382E }, - { "Asia/Chungking" , 0x0239C3 }, - { "Asia/Colombo" , 0x023B58 }, - { "Asia/Dacca" , 0x023C5B }, - { "Asia/Damascus" , 0x023D4E }, - { "Asia/Dhaka" , 0x024171 }, - { "Asia/Dili" , 0x024264 }, - { "Asia/Dubai" , 0x02431A }, - { "Asia/Dushanbe" , 0x0243AB }, - { "Asia/Famagusta" , 0x024525 }, - { "Asia/Gaza" , 0x0248EC }, - { "Asia/Harbin" , 0x024DBF }, - { "Asia/Hebron" , 0x024F54 }, - { "Asia/Ho_Chi_Minh" , 0x025438 }, - { "Asia/Hong_Kong" , 0x025530 }, - { "Asia/Hovd" , 0x025843 }, - { "Asia/Irkutsk" , 0x025ACC }, - { "Asia/Istanbul" , 0x025DEA }, - { "Asia/Jakarta" , 0x0262A6 }, - { "Asia/Jayapura" , 0x0263B7 }, - { "Asia/Jerusalem" , 0x0264A4 }, - { "Asia/Kabul" , 0x0268E2 }, - { "Asia/Kamchatka" , 0x02698D }, - { "Asia/Karachi" , 0x026C82 }, - { "Asia/Kashgar" , 0x026D98 }, - { "Asia/Kathmandu" , 0x026E29 }, - { "Asia/Katmandu" , 0x026ED6 }, - { "Asia/Khandyga" , 0x026F83 }, - { "Asia/Kolkata" , 0x0272B4 }, - { "Asia/Krasnoyarsk" , 0x02739C }, - { "Asia/Kuala_Lumpur" , 0x0276A6 }, - { "Asia/Kuching" , 0x0277C6 }, - { "Asia/Kuwait" , 0x027920 }, - { "Asia/Macao" , 0x0279B1 }, - { "Asia/Macau" , 0x027CD4 }, - { "Asia/Magadan" , 0x027FF7 }, - { "Asia/Makassar" , 0x028302 }, - { "Asia/Manila" , 0x028415 }, - { "Asia/Muscat" , 0x02850F }, - { "Asia/Nicosia" , 0x0285A0 }, - { "Asia/Novokuznetsk" , 0x028814 }, - { "Asia/Novosibirsk" , 0x028B07 }, - { "Asia/Omsk" , 0x028E18 }, - { "Asia/Oral" , 0x029116 }, - { "Asia/Phnom_Penh" , 0x0293A2 }, - { "Asia/Pontianak" , 0x029446 }, - { "Asia/Pyongyang" , 0x02955F }, - { "Asia/Qatar" , 0x029622 }, - { "Asia/Qostanay" , 0x0296C6 }, - { "Asia/Qyzylorda" , 0x029953 }, - { "Asia/Rangoon" , 0x029BEC }, - { "Asia/Riyadh" , 0x029CB3 }, - { "Asia/Saigon" , 0x029D44 }, - { "Asia/Sakhalin" , 0x029E3C }, - { "Asia/Samarkand" , 0x02A153 }, - { "Asia/Seoul" , 0x02A2DE }, - { "Asia/Shanghai" , 0x02A489 }, - { "Asia/Singapore" , 0x02A62A }, - { "Asia/Srednekolymsk" , 0x02A736 }, - { "Asia/Taipei" , 0x02AA4A }, - { "Asia/Tashkent" , 0x02AC55 }, - { "Asia/Tbilisi" , 0x02ADE0 }, - { "Asia/Tehran" , 0x02B061 }, - { "Asia/Tel_Aviv" , 0x02B841 }, - { "Asia/Thimbu" , 0x02BC7F }, - { "Asia/Thimphu" , 0x02BD25 }, - { "Asia/Tokyo" , 0x02BDCB }, - { "Asia/Tomsk" , 0x02BEAC }, - { "Asia/Ujung_Pandang" , 0x02C1B7 }, - { "Asia/Ulaanbaatar" , 0x02C281 }, - { "Asia/Ulan_Bator" , 0x02C4F4 }, - { "Asia/Urumqi" , 0x02C752 }, - { "Asia/Ust-Nera" , 0x02C7F0 }, - { "Asia/Vientiane" , 0x02CB13 }, - { "Asia/Vladivostok" , 0x02CBB7 }, - { "Asia/Yakutsk" , 0x02CEBC }, - { "Asia/Yangon" , 0x02D1C0 }, - { "Asia/Yekaterinburg" , 0x02D287 }, - { "Asia/Yerevan" , 0x02D599 }, - { "Atlantic/Azores" , 0x02D869 }, - { "Atlantic/Bermuda" , 0x02DE16 }, - { "Atlantic/Canary" , 0x02E222 }, - { "Atlantic/Cape_Verde" , 0x02E41A }, - { "Atlantic/Faeroe" , 0x02E4D5 }, - { "Atlantic/Faroe" , 0x02E69A }, - { "Atlantic/Jan_Mayen" , 0x02E85F }, - { "Atlantic/Madeira" , 0x02EB0F }, - { "Atlantic/Reykjavik" , 0x02F0C5 }, - { "Atlantic/South_Georgia" , 0x02F3C2 }, - { "Atlantic/St_Helena" , 0x02F452 }, - { "Atlantic/Stanley" , 0x02F4E0 }, - { "Australia/ACT" , 0x02F801 }, - { "Australia/Adelaide" , 0x02FB95 }, - { "Australia/Brisbane" , 0x02FF49 }, - { "Australia/Broken_Hill" , 0x03008D }, - { "Australia/Canberra" , 0x030462 }, - { "Australia/Currie" , 0x0307F6 }, - { "Australia/Darwin" , 0x030BED }, - { "Australia/Eucla" , 0x030CF5 }, - { "Australia/Hobart" , 0x030E54 }, - { "Australia/LHI" , 0x031253 }, - { "Australia/Lindeman" , 0x031513 }, - { "Australia/Lord_Howe" , 0x031683 }, - { "Australia/Melbourne" , 0x031953 }, - { "Australia/North" , 0x031CEF }, - { "Australia/NSW" , 0x031DE5 }, - { "Australia/Perth" , 0x032179 }, - { "Australia/Queensland" , 0x0322D5 }, - { "Australia/South" , 0x032402 }, - { "Australia/Sydney" , 0x0327A7 }, - { "Australia/Tasmania" , 0x032B57 }, - { "Australia/Victoria" , 0x032F4E }, - { "Australia/West" , 0x0332E2 }, - { "Australia/Yancowinna" , 0x033420 }, - { "Brazil/Acre" , 0x0337D9 }, - { "Brazil/DeNoronha" , 0x033987 }, - { "Brazil/East" , 0x033B77 }, - { "Brazil/West" , 0x033F3B }, - { "Canada/Atlantic" , 0x0340E3 }, - { "Canada/Central" , 0x034777 }, - { "Canada/Eastern" , 0x034C91 }, - { "Canada/Mountain" , 0x035352 }, - { "Canada/Newfoundland" , 0x035728 }, - { "Canada/Pacific" , 0x035E8A }, - { "Canada/Saskatchewan" , 0x0363C8 }, - { "Canada/Yukon" , 0x036652 }, - { "CET" , 0x036A63 }, - { "Chile/Continental" , 0x036CDC }, - { "Chile/EasterIsland" , 0x0371EA }, - { "CST6CDT" , 0x037644 }, - { "Cuba" , 0x037A07 }, - { "EET" , 0x037E70 }, - { "Egypt" , 0x03806D }, - { "Eire" , 0x038575 }, - { "EST" , 0x038B59 }, - { "EST5EDT" , 0x038BD4 }, - { "Etc/GMT" , 0x038F97 }, - { "Etc/GMT+0" , 0x039012 }, - { "Etc/GMT+1" , 0x03908D }, - { "Etc/GMT+10" , 0x03910A }, - { "Etc/GMT+11" , 0x039188 }, - { "Etc/GMT+12" , 0x039206 }, - { "Etc/GMT+2" , 0x039284 }, - { "Etc/GMT+3" , 0x039301 }, - { "Etc/GMT+4" , 0x03937E }, - { "Etc/GMT+5" , 0x0393FB }, - { "Etc/GMT+6" , 0x039478 }, - { "Etc/GMT+7" , 0x0394F5 }, - { "Etc/GMT+8" , 0x039572 }, - { "Etc/GMT+9" , 0x0395EF }, - { "Etc/GMT-0" , 0x03966C }, - { "Etc/GMT-1" , 0x0396E7 }, - { "Etc/GMT-10" , 0x039765 }, - { "Etc/GMT-11" , 0x0397E4 }, - { "Etc/GMT-12" , 0x039863 }, - { "Etc/GMT-13" , 0x0398E2 }, - { "Etc/GMT-14" , 0x039961 }, - { "Etc/GMT-2" , 0x0399E0 }, - { "Etc/GMT-3" , 0x039A5E }, - { "Etc/GMT-4" , 0x039ADC }, - { "Etc/GMT-5" , 0x039B5A }, - { "Etc/GMT-6" , 0x039BD8 }, - { "Etc/GMT-7" , 0x039C56 }, - { "Etc/GMT-8" , 0x039CD4 }, - { "Etc/GMT-9" , 0x039D52 }, - { "Etc/GMT0" , 0x039DD0 }, - { "Etc/Greenwich" , 0x039E4B }, - { "Etc/UCT" , 0x039EC6 }, - { "Etc/Universal" , 0x039F41 }, - { "Etc/UTC" , 0x039FBC }, - { "Etc/Zulu" , 0x03A037 }, - { "Europe/Amsterdam" , 0x03A0B2 }, - { "Europe/Andorra" , 0x03A4ED }, - { "Europe/Astrakhan" , 0x03A67E }, - { "Europe/Athens" , 0x03A972 }, - { "Europe/Belfast" , 0x03AC28 }, - { "Europe/Belgrade" , 0x03B273 }, - { "Europe/Berlin" , 0x03B45D }, - { "Europe/Bratislava" , 0x03B73E }, - { "Europe/Brussels" , 0x03BA1D }, - { "Europe/Bucharest" , 0x03BE78 }, - { "Europe/Budapest" , 0x03C119 }, - { "Europe/Busingen" , 0x03C423 }, - { "Europe/Chisinau" , 0x03C628 }, - { "Europe/Copenhagen" , 0x03C927 }, - { "Europe/Dublin" , 0x03CBA2 }, - { "Europe/Gibraltar" , 0x03D186 }, - { "Europe/Guernsey" , 0x03D656 }, - { "Europe/Helsinki" , 0x03DCA1 }, - { "Europe/Isle_of_Man" , 0x03DE8E }, - { "Europe/Istanbul" , 0x03E4D9 }, - { "Europe/Jersey" , 0x03E995 }, - { "Europe/Kaliningrad" , 0x03EFE0 }, - { "Europe/Kiev" , 0x03F388 }, - { "Europe/Kirov" , 0x03F5CD }, - { "Europe/Lisbon" , 0x03F8B4 }, - { "Europe/Ljubljana" , 0x03FE6F }, - { "Europe/London" , 0x040059 }, - { "Europe/Luxembourg" , 0x0406A4 }, - { "Europe/Madrid" , 0x040AEF }, - { "Europe/Malta" , 0x040E8C }, - { "Europe/Mariehamn" , 0x041238 }, - { "Europe/Minsk" , 0x041425 }, - { "Europe/Monaco" , 0x041759 }, - { "Europe/Moscow" , 0x041BBF }, - { "Europe/Nicosia" , 0x041F6B }, - { "Europe/Oslo" , 0x0421CC }, - { "Europe/Paris" , 0x04247C }, - { "Europe/Podgorica" , 0x0428D9 }, - { "Europe/Prague" , 0x042AC3 }, - { "Europe/Riga" , 0x042DA2 }, - { "Europe/Rome" , 0x043064 }, - { "Europe/Samara" , 0x043423 }, - { "Europe/San_Marino" , 0x043724 }, - { "Europe/Sarajevo" , 0x043AE3 }, - { "Europe/Saratov" , 0x043CCD }, - { "Europe/Simferopol" , 0x043FBF }, - { "Europe/Skopje" , 0x044332 }, - { "Europe/Sofia" , 0x04451C }, - { "Europe/Stockholm" , 0x044778 }, - { "Europe/Tallinn" , 0x044975 }, - { "Europe/Tirane" , 0x044C24 }, - { "Europe/Tiraspol" , 0x044E8C }, - { "Europe/Ulyanovsk" , 0x04518B }, - { "Europe/Uzhgorod" , 0x0454A1 }, - { "Europe/Vaduz" , 0x0456CD }, - { "Europe/Vatican" , 0x0458CA }, - { "Europe/Vienna" , 0x045C89 }, - { "Europe/Vilnius" , 0x045F27 }, - { "Europe/Volgograd" , 0x0461D7 }, - { "Europe/Warsaw" , 0x0464D4 }, - { "Europe/Zagreb" , 0x04687B }, - { "Europe/Zaporozhye" , 0x046A65 }, - { "Europe/Zurich" , 0x046CBC }, - { "Factory" , 0x046EB9 }, - { "GB" , 0x046F36 }, - { "GB-Eire" , 0x047581 }, - { "GMT" , 0x047BCC }, - { "GMT+0" , 0x047C47 }, - { "GMT-0" , 0x047CC2 }, - { "GMT0" , 0x047D3D }, - { "Greenwich" , 0x047DB8 }, - { "Hongkong" , 0x047E33 }, - { "HST" , 0x048146 }, - { "Iceland" , 0x0481C2 }, - { "Indian/Antananarivo" , 0x0484BF }, - { "Indian/Chagos" , 0x04858A }, - { "Indian/Christmas" , 0x04862E }, - { "Indian/Cocos" , 0x0486BF }, - { "Indian/Comoro" , 0x048757 }, - { "Indian/Kerguelen" , 0x048822 }, - { "Indian/Mahe" , 0x0488B3 }, - { "Indian/Maldives" , 0x048944 }, - { "Indian/Mauritius" , 0x0489E8 }, - { "Indian/Mayotte" , 0x048AA7 }, - { "Indian/Reunion" , 0x048B72 }, - { "Iran" , 0x048C03 }, - { "Israel" , 0x0493E3 }, - { "Jamaica" , 0x049821 }, - { "Japan" , 0x049980 }, - { "Kwajalein" , 0x049A61 }, - { "Libya" , 0x049B48 }, - { "MET" , 0x049D03 }, - { "Mexico/BajaNorte" , 0x049F7C }, - { "Mexico/BajaSur" , 0x04A389 }, - { "Mexico/General" , 0x04A504 }, - { "MST" , 0x04A6AC }, - { "MST7MDT" , 0x04A727 }, - { "Navajo" , 0x04AAEA }, - { "NZ" , 0x04AF08 }, - { "NZ-CHAT" , 0x04B327 }, - { "Pacific/Apia" , 0x04B65B }, - { "Pacific/Auckland" , 0x04B773 }, - { "Pacific/Bougainville" , 0x04BBAA }, - { "Pacific/Chatham" , 0x04BC8B }, - { "Pacific/Chuuk" , 0x04BFCE }, - { "Pacific/Easter" , 0x04C0AC }, - { "Pacific/Efate" , 0x04C513 }, - { "Pacific/Enderbury" , 0x04C675 }, - { "Pacific/Fakaofo" , 0x04C73C }, - { "Pacific/Fiji" , 0x04C7E1 }, - { "Pacific/Funafuti" , 0x04C990 }, - { "Pacific/Galapagos" , 0x04CA22 }, - { "Pacific/Gambier" , 0x04CAEE }, - { "Pacific/Guadalcanal" , 0x04CB8D }, - { "Pacific/Guam" , 0x04CC1F }, - { "Pacific/Honolulu" , 0x04CD89 }, - { "Pacific/Johnston" , 0x04CE78 }, - { "Pacific/Kiritimati" , 0x04CF61 }, - { "Pacific/Kosrae" , 0x04D027 }, - { "Pacific/Kwajalein" , 0x04D12B }, - { "Pacific/Majuro" , 0x04D21B }, - { "Pacific/Marquesas" , 0x04D31E }, - { "Pacific/Midway" , 0x04D3C6 }, - { "Pacific/Nauru" , 0x04D472 }, - { "Pacific/Niue" , 0x04D535 }, - { "Pacific/Norfolk" , 0x04D5F0 }, - { "Pacific/Noumea" , 0x04D6F3 }, - { "Pacific/Pago_Pago" , 0x04D7C5 }, - { "Pacific/Palau" , 0x04D863 }, - { "Pacific/Pitcairn" , 0x04D903 }, - { "Pacific/Pohnpei" , 0x04D9A8 }, - { "Pacific/Ponape" , 0x04DA98 }, - { "Pacific/Port_Moresby" , 0x04DB7A }, - { "Pacific/Rarotonga" , 0x04DC3D }, - { "Pacific/Saipan" , 0x04DDD0 }, - { "Pacific/Samoa" , 0x04DF3A }, - { "Pacific/Tahiti" , 0x04DFD8 }, - { "Pacific/Tarawa" , 0x04E078 }, - { "Pacific/Tongatapu" , 0x04E119 }, - { "Pacific/Truk" , 0x04E212 }, - { "Pacific/Wake" , 0x04E2E1 }, - { "Pacific/Wallis" , 0x04E37E }, - { "Pacific/Yap" , 0x04E410 }, - { "Poland" , 0x04E4DF }, - { "Portugal" , 0x04E886 }, - { "PRC" , 0x04EE2E }, - { "PST8PDT" , 0x04EFC3 }, - { "ROC" , 0x04F386 }, - { "ROK" , 0x04F591 }, - { "Singapore" , 0x04F73C }, - { "Turkey" , 0x04F848 }, - { "UCT" , 0x04FD04 }, - { "Universal" , 0x04FD7F }, - { "US/Alaska" , 0x04FDFA }, - { "US/Aleutian" , 0x0501D7 }, - { "US/Arizona" , 0x0505AC }, - { "US/Central" , 0x0506A8 }, - { "US/East-Indiana" , 0x050D8E }, - { "US/Eastern" , 0x050FAD }, - { "US/Hawaii" , 0x051689 }, - { "US/Indiana-Starke" , 0x051772 }, - { "US/Michigan" , 0x051B76 }, - { "US/Mountain" , 0x051F05 }, - { "US/Pacific" , 0x052323 }, - { "US/Samoa" , 0x05283D }, - { "UTC" , 0x0528DB }, - { "W-SU" , 0x052956 }, - { "WET" , 0x052CEE }, - { "Zulu" , 0x052EE8 }, + { "Africa/Addis_Ababa" , 0x00011C }, + { "Africa/Algiers" , 0x0001E7 }, + { "Africa/Asmara" , 0x0003C9 }, + { "Africa/Asmera" , 0x000494 }, + { "Africa/Bamako" , 0x00055F }, + { "Africa/Bangui" , 0x0005ED }, + { "Africa/Banjul" , 0x0006AD }, + { "Africa/Bissau" , 0x00073B }, + { "Africa/Blantyre" , 0x0007DC }, + { "Africa/Brazzaville" , 0x00086B }, + { "Africa/Bujumbura" , 0x00092B }, + { "Africa/Cairo" , 0x0009BA }, + { "Africa/Casablanca" , 0x000EC2 }, + { "Africa/Ceuta" , 0x00164D }, + { "Africa/Conakry" , 0x001899 }, + { "Africa/Dakar" , 0x001927 }, + { "Africa/Dar_es_Salaam" , 0x0019B5 }, + { "Africa/Djibouti" , 0x001A80 }, + { "Africa/Douala" , 0x001B4B }, + { "Africa/El_Aaiun" , 0x001C0B }, + { "Africa/Freetown" , 0x00233D }, + { "Africa/Gaborone" , 0x0023CB }, + { "Africa/Harare" , 0x00245A }, + { "Africa/Johannesburg" , 0x0024E9 }, + { "Africa/Juba" , 0x0025B3 }, + { "Africa/Kampala" , 0x002789 }, + { "Africa/Khartoum" , 0x002854 }, + { "Africa/Kigali" , 0x002A2A }, + { "Africa/Kinshasa" , 0x002AB9 }, + { "Africa/Lagos" , 0x002B92 }, + { "Africa/Libreville" , 0x002C52 }, + { "Africa/Lome" , 0x002D12 }, + { "Africa/Luanda" , 0x002DA0 }, + { "Africa/Lubumbashi" , 0x002E60 }, + { "Africa/Lusaka" , 0x002F08 }, + { "Africa/Malabo" , 0x002F97 }, + { "Africa/Maputo" , 0x003057 }, + { "Africa/Maseru" , 0x0030E6 }, + { "Africa/Mbabane" , 0x0031B0 }, + { "Africa/Mogadishu" , 0x00327A }, + { "Africa/Monrovia" , 0x003345 }, + { "Africa/Nairobi" , 0x0033F5 }, + { "Africa/Ndjamena" , 0x0034C0 }, + { "Africa/Niamey" , 0x00356C }, + { "Africa/Nouakchott" , 0x00362C }, + { "Africa/Ouagadougou" , 0x0036BA }, + { "Africa/Porto-Novo" , 0x003748 }, + { "Africa/Sao_Tome" , 0x003808 }, + { "Africa/Timbuktu" , 0x0038C1 }, + { "Africa/Tripoli" , 0x00394F }, + { "Africa/Tunis" , 0x003B0A }, + { "Africa/Windhoek" , 0x003CD7 }, + { "America/Adak" , 0x003F61 }, + { "America/Anchorage" , 0x004346 }, + { "America/Anguilla" , 0x004736 }, + { "America/Antigua" , 0x0047F3 }, + { "America/Araguaina" , 0x0048B0 }, + { "America/Argentina/Buenos_Aires" , 0x004B15 }, + { "America/Argentina/Catamarca" , 0x004DFA }, + { "America/Argentina/ComodRivadavia" , 0x0050E5 }, + { "America/Argentina/Cordoba" , 0x0053B5 }, + { "America/Argentina/Jujuy" , 0x0056BB }, + { "America/Argentina/La_Rioja" , 0x005983 }, + { "America/Argentina/Mendoza" , 0x005C69 }, + { "America/Argentina/Rio_Gallegos" , 0x005F45 }, + { "America/Argentina/Salta" , 0x006224 }, + { "America/Argentina/San_Juan" , 0x0064F8 }, + { "America/Argentina/San_Luis" , 0x0067DE }, + { "America/Argentina/Tucuman" , 0x006AC4 }, + { "America/Argentina/Ushuaia" , 0x006DB2 }, + { "America/Aruba" , 0x007097 }, + { "America/Asuncion" , 0x007154 }, + { "America/Atikokan" , 0x0074D4 }, + { "America/Atka" , 0x007596 }, + { "America/Bahia" , 0x00796B }, + { "America/Bahia_Banderas" , 0x007C26 }, + { "America/Barbados" , 0x007E64 }, + { "America/Belem" , 0x007F86 }, + { "America/Belize" , 0x00812E }, + { "America/Blanc-Sablon" , 0x00854F }, + { "America/Boa_Vista" , 0x008628 }, + { "America/Bogota" , 0x0087E9 }, + { "America/Boise" , 0x0088A8 }, + { "America/Buenos_Aires" , 0x008CBB }, + { "America/Cambridge_Bay" , 0x008F8B }, + { "America/Campo_Grande" , 0x0092AB }, + { "America/Cancun" , 0x009681 }, + { "America/Caracas" , 0x0098C2 }, + { "America/Catamarca" , 0x00998C }, + { "America/Cayenne" , 0x009C5C }, + { "America/Cayman" , 0x009CFF }, + { "America/Chicago" , 0x009DA0 }, + { "America/Chihuahua" , 0x00A49A }, + { "America/Coral_Harbour" , 0x00A620 }, + { "America/Cordoba" , 0x00A6C1 }, + { "America/Costa_Rica" , 0x00A991 }, + { "America/Creston" , 0x00AA85 }, + { "America/Cuiaba" , 0x00AB93 }, + { "America/Curacao" , 0x00AF50 }, + { "America/Danmarkshavn" , 0x00B00D }, + { "America/Dawson" , 0x00B1F2 }, + { "America/Dawson_Creek" , 0x00B615 }, + { "America/Denver" , 0x00B8EC }, + { "America/Detroit" , 0x00BD1F }, + { "America/Dominica" , 0x00C0C7 }, + { "America/Edmonton" , 0x00C184 }, + { "America/Eirunepe" , 0x00C577 }, + { "America/El_Salvador" , 0x00C746 }, + { "America/Ensenada" , 0x00C802 }, + { "America/Fort_Nelson" , 0x00CC0F }, + { "America/Fort_Wayne" , 0x00D1D7 }, + { "America/Fortaleza" , 0x00D3F6 }, + { "America/Glace_Bay" , 0x00D60C }, + { "America/Godthab" , 0x00D9A3 }, + { "America/Goose_Bay" , 0x00DB80 }, + { "America/Grand_Turk" , 0x00E1D8 }, + { "America/Grenada" , 0x00E539 }, + { "America/Guadeloupe" , 0x00E5F6 }, + { "America/Guatemala" , 0x00E6B3 }, + { "America/Guayaquil" , 0x00E793 }, + { "America/Guyana" , 0x00E864 }, + { "America/Halifax" , 0x00E925 }, + { "America/Havana" , 0x00EFD7 }, + { "America/Hermosillo" , 0x00F440 }, + { "America/Indiana/Indianapolis" , 0x00F589 }, + { "America/Indiana/Knox" , 0x00F7C1 }, + { "America/Indiana/Marengo" , 0x00FBDA }, + { "America/Indiana/Petersburg" , 0x00FE34 }, + { "America/Indiana/Tell_City" , 0x0100FE }, + { "America/Indiana/Vevay" , 0x010328 }, + { "America/Indiana/Vincennes" , 0x0104BF }, + { "America/Indiana/Winamac" , 0x010715 }, + { "America/Indianapolis" , 0x01099B }, + { "America/Inuvik" , 0x010BBA }, + { "America/Iqaluit" , 0x010E97 }, + { "America/Jamaica" , 0x0111A5 }, + { "America/Jujuy" , 0x011304 }, + { "America/Juneau" , 0x0115C2 }, + { "America/Kentucky/Louisville" , 0x0119A8 }, + { "America/Kentucky/Monticello" , 0x011EAC }, + { "America/Knox_IN" , 0x012298 }, + { "America/Kralendijk" , 0x01269C }, + { "America/La_Paz" , 0x012759 }, + { "America/Lima" , 0x01280F }, + { "America/Los_Angeles" , 0x012936 }, + { "America/Louisville" , 0x012E57 }, + { "America/Lower_Princes" , 0x01333D }, + { "America/Maceio" , 0x0133FA }, + { "America/Managua" , 0x01360C }, + { "America/Manaus" , 0x01373F }, + { "America/Marigot" , 0x0138F6 }, + { "America/Martinique" , 0x0139B3 }, + { "America/Matamoros" , 0x013A71 }, + { "America/Mazatlan" , 0x013C70 }, + { "America/Mendoza" , 0x013E20 }, + { "America/Menominee" , 0x0140F0 }, + { "America/Merida" , 0x0144B0 }, + { "America/Metlakatla" , 0x01460B }, + { "America/Mexico_City" , 0x014881 }, + { "America/Miquelon" , 0x014A35 }, + { "America/Moncton" , 0x014C67 }, + { "America/Monterrey" , 0x015260 }, + { "America/Montevideo" , 0x0153D6 }, + { "America/Montreal" , 0x0157AB }, + { "America/Montserrat" , 0x015E6C }, + { "America/Nassau" , 0x015F29 }, + { "America/New_York" , 0x0165EA }, + { "America/Nipigon" , 0x016CDA }, + { "America/Nome" , 0x01704A }, + { "America/Noronha" , 0x017432 }, + { "America/North_Dakota/Beulah" , 0x017632 }, + { "America/North_Dakota/Center" , 0x017A66 }, + { "America/North_Dakota/New_Salem" , 0x017E65 }, + { "America/Nuuk" , 0x01826A }, + { "America/Ojinaga" , 0x01845D }, + { "America/Panama" , 0x018675 }, + { "America/Pangnirtung" , 0x018716 }, + { "America/Paramaribo" , 0x018A3D }, + { "America/Phoenix" , 0x018B04 }, + { "America/Port-au-Prince" , 0x018C1D }, + { "America/Port_of_Spain" , 0x018E5E }, + { "America/Porto_Acre" , 0x018F1B }, + { "America/Porto_Velho" , 0x0190C9 }, + { "America/Puerto_Rico" , 0x019267 }, + { "America/Punta_Arenas" , 0x019324 }, + { "America/Rainy_River" , 0x0197FD }, + { "America/Rankin_Inlet" , 0x019B6E }, + { "America/Recife" , 0x019E44 }, + { "America/Regina" , 0x01A03E }, + { "America/Resolute" , 0x01A2DD }, + { "America/Rio_Branco" , 0x01A5B4 }, + { "America/Rosario" , 0x01A766 }, + { "America/Santa_Isabel" , 0x01AA36 }, + { "America/Santarem" , 0x01AE43 }, + { "America/Santiago" , 0x01AFF3 }, + { "America/Santo_Domingo" , 0x01B513 }, + { "America/Sao_Paulo" , 0x01B65C }, + { "America/Scoresbysund" , 0x01BA56 }, + { "America/Shiprock" , 0x01BC5E }, + { "America/Sitka" , 0x01C07C }, + { "America/St_Barthelemy" , 0x01C457 }, + { "America/St_Johns" , 0x01C514 }, + { "America/St_Kitts" , 0x01CC98 }, + { "America/St_Lucia" , 0x01CD55 }, + { "America/St_Thomas" , 0x01CE12 }, + { "America/St_Vincent" , 0x01CECF }, + { "America/Swift_Current" , 0x01CF8C }, + { "America/Tegucigalpa" , 0x01D11A }, + { "America/Thule" , 0x01D1E8 }, + { "America/Thunder_Bay" , 0x01D3C9 }, + { "America/Tijuana" , 0x01D760 }, + { "America/Toronto" , 0x01DB8E }, + { "America/Tortola" , 0x01E26C }, + { "America/Vancouver" , 0x01E329 }, + { "America/Virgin" , 0x01E880 }, + { "America/Whitehorse" , 0x01E93D }, + { "America/Winnipeg" , 0x01ED60 }, + { "America/Yakutat" , 0x01F297 }, + { "America/Yellowknife" , 0x01F665 }, + { "Antarctica/Casey" , 0x01F961 }, + { "Antarctica/Davis" , 0x01FA65 }, + { "Antarctica/DumontDUrville" , 0x01FB3B }, + { "Antarctica/Macquarie" , 0x01FBF1 }, + { "Antarctica/Mawson" , 0x01FFDD }, + { "Antarctica/McMurdo" , 0x020087 }, + { "Antarctica/Palmer" , 0x0204CC }, + { "Antarctica/Rothera" , 0x020855 }, + { "Antarctica/South_Pole" , 0x0208EC }, + { "Antarctica/Syowa" , 0x020D0B }, + { "Antarctica/Troll" , 0x020DA1 }, + { "Antarctica/Vostok" , 0x020E63 }, + { "Arctic/Longyearbyen" , 0x020EFA }, + { "Asia/Aden" , 0x0211AA }, + { "Asia/Almaty" , 0x02123B }, + { "Asia/Amman" , 0x0214BF }, + { "Asia/Anadyr" , 0x021865 }, + { "Asia/Aqtau" , 0x021B6B }, + { "Asia/Aqtobe" , 0x021DEA }, + { "Asia/Ashgabat" , 0x02206A }, + { "Asia/Ashkhabad" , 0x0221ED }, + { "Asia/Atyrau" , 0x022370 }, + { "Asia/Baghdad" , 0x0225F9 }, + { "Asia/Bahrain" , 0x02287B }, + { "Asia/Baku" , 0x02291F }, + { "Asia/Bangkok" , 0x022C13 }, + { "Asia/Barnaul" , 0x022CB7 }, + { "Asia/Beirut" , 0x022FC2 }, + { "Asia/Bishkek" , 0x0232AA }, + { "Asia/Brunei" , 0x023520 }, + { "Asia/Calcutta" , 0x0235C6 }, + { "Asia/Chita" , 0x0236AE }, + { "Asia/Choibalsan" , 0x0239BC }, + { "Asia/Chongqing" , 0x023C45 }, + { "Asia/Chungking" , 0x023DDA }, + { "Asia/Colombo" , 0x023F6F }, + { "Asia/Dacca" , 0x024072 }, + { "Asia/Damascus" , 0x024165 }, + { "Asia/Dhaka" , 0x024588 }, + { "Asia/Dili" , 0x02467B }, + { "Asia/Dubai" , 0x024731 }, + { "Asia/Dushanbe" , 0x0247C2 }, + { "Asia/Famagusta" , 0x02493C }, + { "Asia/Gaza" , 0x024D03 }, + { "Asia/Harbin" , 0x0251D6 }, + { "Asia/Hebron" , 0x02536B }, + { "Asia/Ho_Chi_Minh" , 0x02584F }, + { "Asia/Hong_Kong" , 0x025947 }, + { "Asia/Hovd" , 0x025C5A }, + { "Asia/Irkutsk" , 0x025EE3 }, + { "Asia/Istanbul" , 0x026201 }, + { "Asia/Jakarta" , 0x0266BD }, + { "Asia/Jayapura" , 0x0267CE }, + { "Asia/Jerusalem" , 0x0268BB }, + { "Asia/Kabul" , 0x026CF9 }, + { "Asia/Kamchatka" , 0x026DA4 }, + { "Asia/Karachi" , 0x027099 }, + { "Asia/Kashgar" , 0x0271AF }, + { "Asia/Kathmandu" , 0x027240 }, + { "Asia/Katmandu" , 0x0272ED }, + { "Asia/Khandyga" , 0x02739A }, + { "Asia/Kolkata" , 0x0276CB }, + { "Asia/Krasnoyarsk" , 0x0277B3 }, + { "Asia/Kuala_Lumpur" , 0x027ABD }, + { "Asia/Kuching" , 0x027BDD }, + { "Asia/Kuwait" , 0x027D37 }, + { "Asia/Macao" , 0x027DC8 }, + { "Asia/Macau" , 0x0280EB }, + { "Asia/Magadan" , 0x02840E }, + { "Asia/Makassar" , 0x028719 }, + { "Asia/Manila" , 0x02882C }, + { "Asia/Muscat" , 0x028926 }, + { "Asia/Nicosia" , 0x0289B7 }, + { "Asia/Novokuznetsk" , 0x028C2B }, + { "Asia/Novosibirsk" , 0x028F1E }, + { "Asia/Omsk" , 0x02922F }, + { "Asia/Oral" , 0x02952D }, + { "Asia/Phnom_Penh" , 0x0297B9 }, + { "Asia/Pontianak" , 0x02985D }, + { "Asia/Pyongyang" , 0x029976 }, + { "Asia/Qatar" , 0x029A39 }, + { "Asia/Qostanay" , 0x029ADD }, + { "Asia/Qyzylorda" , 0x029D6A }, + { "Asia/Rangoon" , 0x02A003 }, + { "Asia/Riyadh" , 0x02A0CA }, + { "Asia/Saigon" , 0x02A15B }, + { "Asia/Sakhalin" , 0x02A253 }, + { "Asia/Samarkand" , 0x02A56A }, + { "Asia/Seoul" , 0x02A6F5 }, + { "Asia/Shanghai" , 0x02A8A0 }, + { "Asia/Singapore" , 0x02AA41 }, + { "Asia/Srednekolymsk" , 0x02AB4D }, + { "Asia/Taipei" , 0x02AE61 }, + { "Asia/Tashkent" , 0x02B06C }, + { "Asia/Tbilisi" , 0x02B1F7 }, + { "Asia/Tehran" , 0x02B478 }, + { "Asia/Tel_Aviv" , 0x02BC58 }, + { "Asia/Thimbu" , 0x02C096 }, + { "Asia/Thimphu" , 0x02C13C }, + { "Asia/Tokyo" , 0x02C1E2 }, + { "Asia/Tomsk" , 0x02C2C3 }, + { "Asia/Ujung_Pandang" , 0x02C5CE }, + { "Asia/Ulaanbaatar" , 0x02C698 }, + { "Asia/Ulan_Bator" , 0x02C90B }, + { "Asia/Urumqi" , 0x02CB69 }, + { "Asia/Ust-Nera" , 0x02CC07 }, + { "Asia/Vientiane" , 0x02CF2A }, + { "Asia/Vladivostok" , 0x02CFCE }, + { "Asia/Yakutsk" , 0x02D2D3 }, + { "Asia/Yangon" , 0x02D5D7 }, + { "Asia/Yekaterinburg" , 0x02D69E }, + { "Asia/Yerevan" , 0x02D9B0 }, + { "Atlantic/Azores" , 0x02DC80 }, + { "Atlantic/Bermuda" , 0x02E23F }, + { "Atlantic/Canary" , 0x02E64B }, + { "Atlantic/Cape_Verde" , 0x02E843 }, + { "Atlantic/Faeroe" , 0x02E8FE }, + { "Atlantic/Faroe" , 0x02EAC3 }, + { "Atlantic/Jan_Mayen" , 0x02EC88 }, + { "Atlantic/Madeira" , 0x02EF38 }, + { "Atlantic/Reykjavik" , 0x02F500 }, + { "Atlantic/South_Georgia" , 0x02F7FD }, + { "Atlantic/St_Helena" , 0x02F88D }, + { "Atlantic/Stanley" , 0x02F91B }, + { "Australia/ACT" , 0x02FC3C }, + { "Australia/Adelaide" , 0x02FFD0 }, + { "Australia/Brisbane" , 0x030384 }, + { "Australia/Broken_Hill" , 0x0304C8 }, + { "Australia/Canberra" , 0x03089D }, + { "Australia/Currie" , 0x030C31 }, + { "Australia/Darwin" , 0x031028 }, + { "Australia/Eucla" , 0x031130 }, + { "Australia/Hobart" , 0x03128F }, + { "Australia/LHI" , 0x03168E }, + { "Australia/Lindeman" , 0x03194E }, + { "Australia/Lord_Howe" , 0x031ABE }, + { "Australia/Melbourne" , 0x031D8E }, + { "Australia/North" , 0x03212A }, + { "Australia/NSW" , 0x032220 }, + { "Australia/Perth" , 0x0325B4 }, + { "Australia/Queensland" , 0x032710 }, + { "Australia/South" , 0x03283D }, + { "Australia/Sydney" , 0x032BE2 }, + { "Australia/Tasmania" , 0x032F92 }, + { "Australia/Victoria" , 0x033389 }, + { "Australia/West" , 0x03371D }, + { "Australia/Yancowinna" , 0x03385B }, + { "Brazil/Acre" , 0x033C14 }, + { "Brazil/DeNoronha" , 0x033DC2 }, + { "Brazil/East" , 0x033FB2 }, + { "Brazil/West" , 0x034376 }, + { "Canada/Atlantic" , 0x03451E }, + { "Canada/Central" , 0x034BB2 }, + { "Canada/Eastern" , 0x0350CC }, + { "Canada/Mountain" , 0x03578D }, + { "Canada/Newfoundland" , 0x035B63 }, + { "Canada/Pacific" , 0x0362C5 }, + { "Canada/Saskatchewan" , 0x036803 }, + { "Canada/Yukon" , 0x036A8D }, + { "CET" , 0x036E9E }, + { "Chile/Continental" , 0x037117 }, + { "Chile/EasterIsland" , 0x037625 }, + { "CST6CDT" , 0x037A7F }, + { "Cuba" , 0x037E42 }, + { "EET" , 0x0382AB }, + { "Egypt" , 0x0384A8 }, + { "Eire" , 0x0389B0 }, + { "EST" , 0x038F94 }, + { "EST5EDT" , 0x03900F }, + { "Etc/GMT" , 0x0393D2 }, + { "Etc/GMT+0" , 0x03944D }, + { "Etc/GMT+1" , 0x0394C8 }, + { "Etc/GMT+10" , 0x039545 }, + { "Etc/GMT+11" , 0x0395C3 }, + { "Etc/GMT+12" , 0x039641 }, + { "Etc/GMT+2" , 0x0396BF }, + { "Etc/GMT+3" , 0x03973C }, + { "Etc/GMT+4" , 0x0397B9 }, + { "Etc/GMT+5" , 0x039836 }, + { "Etc/GMT+6" , 0x0398B3 }, + { "Etc/GMT+7" , 0x039930 }, + { "Etc/GMT+8" , 0x0399AD }, + { "Etc/GMT+9" , 0x039A2A }, + { "Etc/GMT-0" , 0x039AA7 }, + { "Etc/GMT-1" , 0x039B22 }, + { "Etc/GMT-10" , 0x039BA0 }, + { "Etc/GMT-11" , 0x039C1F }, + { "Etc/GMT-12" , 0x039C9E }, + { "Etc/GMT-13" , 0x039D1D }, + { "Etc/GMT-14" , 0x039D9C }, + { "Etc/GMT-2" , 0x039E1B }, + { "Etc/GMT-3" , 0x039E99 }, + { "Etc/GMT-4" , 0x039F17 }, + { "Etc/GMT-5" , 0x039F95 }, + { "Etc/GMT-6" , 0x03A013 }, + { "Etc/GMT-7" , 0x03A091 }, + { "Etc/GMT-8" , 0x03A10F }, + { "Etc/GMT-9" , 0x03A18D }, + { "Etc/GMT0" , 0x03A20B }, + { "Etc/Greenwich" , 0x03A286 }, + { "Etc/UCT" , 0x03A301 }, + { "Etc/Universal" , 0x03A37C }, + { "Etc/UTC" , 0x03A3F7 }, + { "Etc/Zulu" , 0x03A472 }, + { "Europe/Amsterdam" , 0x03A4ED }, + { "Europe/Andorra" , 0x03A928 }, + { "Europe/Astrakhan" , 0x03AAB9 }, + { "Europe/Athens" , 0x03ADAD }, + { "Europe/Belfast" , 0x03B063 }, + { "Europe/Belgrade" , 0x03B6AE }, + { "Europe/Berlin" , 0x03B898 }, + { "Europe/Bratislava" , 0x03BB79 }, + { "Europe/Brussels" , 0x03BE58 }, + { "Europe/Bucharest" , 0x03C2B3 }, + { "Europe/Budapest" , 0x03C554 }, + { "Europe/Busingen" , 0x03C85E }, + { "Europe/Chisinau" , 0x03CA63 }, + { "Europe/Copenhagen" , 0x03CD62 }, + { "Europe/Dublin" , 0x03CFDD }, + { "Europe/Gibraltar" , 0x03D5C1 }, + { "Europe/Guernsey" , 0x03DA91 }, + { "Europe/Helsinki" , 0x03E0DC }, + { "Europe/Isle_of_Man" , 0x03E2C9 }, + { "Europe/Istanbul" , 0x03E914 }, + { "Europe/Jersey" , 0x03EDD0 }, + { "Europe/Kaliningrad" , 0x03F41B }, + { "Europe/Kiev" , 0x03F7C3 }, + { "Europe/Kirov" , 0x03FA08 }, + { "Europe/Lisbon" , 0x03FCEF }, + { "Europe/Ljubljana" , 0x0402BC }, + { "Europe/London" , 0x0404A6 }, + { "Europe/Luxembourg" , 0x040AF1 }, + { "Europe/Madrid" , 0x040F3C }, + { "Europe/Malta" , 0x0412D9 }, + { "Europe/Mariehamn" , 0x041685 }, + { "Europe/Minsk" , 0x041872 }, + { "Europe/Monaco" , 0x041BA6 }, + { "Europe/Moscow" , 0x04200C }, + { "Europe/Nicosia" , 0x0423B8 }, + { "Europe/Oslo" , 0x042619 }, + { "Europe/Paris" , 0x0428C9 }, + { "Europe/Podgorica" , 0x042D26 }, + { "Europe/Prague" , 0x042F10 }, + { "Europe/Riga" , 0x0431EF }, + { "Europe/Rome" , 0x0434B1 }, + { "Europe/Samara" , 0x043870 }, + { "Europe/San_Marino" , 0x043B71 }, + { "Europe/Sarajevo" , 0x043F30 }, + { "Europe/Saratov" , 0x04411A }, + { "Europe/Simferopol" , 0x04440C }, + { "Europe/Skopje" , 0x04477F }, + { "Europe/Sofia" , 0x044969 }, + { "Europe/Stockholm" , 0x044BC5 }, + { "Europe/Tallinn" , 0x044DC2 }, + { "Europe/Tirane" , 0x045071 }, + { "Europe/Tiraspol" , 0x0452D9 }, + { "Europe/Ulyanovsk" , 0x0455D8 }, + { "Europe/Uzhgorod" , 0x0458EE }, + { "Europe/Vaduz" , 0x045B1A }, + { "Europe/Vatican" , 0x045D17 }, + { "Europe/Vienna" , 0x0460D6 }, + { "Europe/Vilnius" , 0x046374 }, + { "Europe/Volgograd" , 0x046624 }, + { "Europe/Warsaw" , 0x046921 }, + { "Europe/Zagreb" , 0x046CC8 }, + { "Europe/Zaporozhye" , 0x046EB2 }, + { "Europe/Zurich" , 0x047109 }, + { "Factory" , 0x047306 }, + { "GB" , 0x047383 }, + { "GB-Eire" , 0x0479CE }, + { "GMT" , 0x048019 }, + { "GMT+0" , 0x048094 }, + { "GMT-0" , 0x04810F }, + { "GMT0" , 0x04818A }, + { "Greenwich" , 0x048205 }, + { "Hongkong" , 0x048280 }, + { "HST" , 0x048593 }, + { "Iceland" , 0x04860F }, + { "Indian/Antananarivo" , 0x04890C }, + { "Indian/Chagos" , 0x0489D7 }, + { "Indian/Christmas" , 0x048A7B }, + { "Indian/Cocos" , 0x048B0C }, + { "Indian/Comoro" , 0x048BA4 }, + { "Indian/Kerguelen" , 0x048C6F }, + { "Indian/Mahe" , 0x048D00 }, + { "Indian/Maldives" , 0x048D91 }, + { "Indian/Mauritius" , 0x048E35 }, + { "Indian/Mayotte" , 0x048EF4 }, + { "Indian/Reunion" , 0x048FBF }, + { "Iran" , 0x049050 }, + { "Israel" , 0x049830 }, + { "Jamaica" , 0x049C6E }, + { "Japan" , 0x049DCD }, + { "Kwajalein" , 0x049EAE }, + { "Libya" , 0x049F95 }, + { "MET" , 0x04A150 }, + { "Mexico/BajaNorte" , 0x04A3C9 }, + { "Mexico/BajaSur" , 0x04A7D6 }, + { "Mexico/General" , 0x04A951 }, + { "MST" , 0x04AAF9 }, + { "MST7MDT" , 0x04AB74 }, + { "Navajo" , 0x04AF37 }, + { "NZ" , 0x04B355 }, + { "NZ-CHAT" , 0x04B774 }, + { "Pacific/Apia" , 0x04BAA8 }, + { "Pacific/Auckland" , 0x04BC4B }, + { "Pacific/Bougainville" , 0x04C082 }, + { "Pacific/Chatham" , 0x04C163 }, + { "Pacific/Chuuk" , 0x04C4A6 }, + { "Pacific/Easter" , 0x04C584 }, + { "Pacific/Efate" , 0x04C9EB }, + { "Pacific/Enderbury" , 0x04CB4D }, + { "Pacific/Fakaofo" , 0x04CC05 }, + { "Pacific/Fiji" , 0x04CCAA }, + { "Pacific/Funafuti" , 0x04CE59 }, + { "Pacific/Galapagos" , 0x04CEEB }, + { "Pacific/Gambier" , 0x04CFB7 }, + { "Pacific/Guadalcanal" , 0x04D056 }, + { "Pacific/Guam" , 0x04D0E8 }, + { "Pacific/Honolulu" , 0x04D252 }, + { "Pacific/Johnston" , 0x04D341 }, + { "Pacific/Kanton" , 0x04D42A }, + { "Pacific/Kiritimati" , 0x04D4F1 }, + { "Pacific/Kosrae" , 0x04D5B7 }, + { "Pacific/Kwajalein" , 0x04D6BB }, + { "Pacific/Majuro" , 0x04D7AB }, + { "Pacific/Marquesas" , 0x04D8AE }, + { "Pacific/Midway" , 0x04D956 }, + { "Pacific/Nauru" , 0x04DA02 }, + { "Pacific/Niue" , 0x04DAC5 }, + { "Pacific/Norfolk" , 0x04DB6B }, + { "Pacific/Noumea" , 0x04DC6E }, + { "Pacific/Pago_Pago" , 0x04DD40 }, + { "Pacific/Palau" , 0x04DDDE }, + { "Pacific/Pitcairn" , 0x04DE7E }, + { "Pacific/Pohnpei" , 0x04DF23 }, + { "Pacific/Ponape" , 0x04E013 }, + { "Pacific/Port_Moresby" , 0x04E0F5 }, + { "Pacific/Rarotonga" , 0x04E1B8 }, + { "Pacific/Saipan" , 0x04E35A }, + { "Pacific/Samoa" , 0x04E4C4 }, + { "Pacific/Tahiti" , 0x04E562 }, + { "Pacific/Tarawa" , 0x04E602 }, + { "Pacific/Tongatapu" , 0x04E6A3 }, + { "Pacific/Truk" , 0x04E79C }, + { "Pacific/Wake" , 0x04E86B }, + { "Pacific/Wallis" , 0x04E908 }, + { "Pacific/Yap" , 0x04E99A }, + { "Poland" , 0x04EA69 }, + { "Portugal" , 0x04EE10 }, + { "PRC" , 0x04F3CA }, + { "PST8PDT" , 0x04F55F }, + { "ROC" , 0x04F922 }, + { "ROK" , 0x04FB2D }, + { "Singapore" , 0x04FCD8 }, + { "Turkey" , 0x04FDE4 }, + { "UCT" , 0x0502A0 }, + { "Universal" , 0x05031B }, + { "US/Alaska" , 0x050396 }, + { "US/Aleutian" , 0x050773 }, + { "US/Arizona" , 0x050B48 }, + { "US/Central" , 0x050C44 }, + { "US/East-Indiana" , 0x05132A }, + { "US/Eastern" , 0x051549 }, + { "US/Hawaii" , 0x051C25 }, + { "US/Indiana-Starke" , 0x051D0E }, + { "US/Michigan" , 0x052112 }, + { "US/Mountain" , 0x0524A1 }, + { "US/Pacific" , 0x0528BF }, + { "US/Samoa" , 0x052DD9 }, + { "UTC" , 0x052E77 }, + { "W-SU" , 0x052EF2 }, + { "WET" , 0x05328A }, + { "Zulu" , 0x053484 }, }; -const unsigned char timelib_timezone_db_data_builtin[339811] = { +const unsigned char timelib_timezone_db_data_builtin[341247] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -621,46 +622,10 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x9A, 0x1D, 0x94, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xC0, 0xB4, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0xE4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x34, 0x97, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xA3, 0xD5, 0x69, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x15, 0xCB, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0x9D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0xF6, 0xFE, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xA7, 0x97, 0xD0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xD8, 0x32, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x04, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xBA, 0xB7, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xAB, 0x5B, 0x89, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0x9B, 0xEA, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xAD, 0x3C, 0xBC, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x7D, 0x1E, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xAF, 0x1D, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x51, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xB0, 0xFF, 0x23, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x40, 0xD6, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xB2, 0xE1, 0xA8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x0A, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xB4, 0xC2, 0xDC, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x3D, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xB6, 0xA4, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x71, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xB8, 0x85, 0x43, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC6, 0xF6, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0xC8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xA8, 0x29, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xBC, 0x48, 0xFB, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0x89, 0x5D, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xBE, 0x2A, 0x2F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x6A, 0x90, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC0, 0x0B, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x4D, 0x15, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0xE7, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x2E, 0x49, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xC3, 0xCF, 0x1B, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x0F, 0x7C, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC5, 0xB0, 0x4E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0xF0, 0xB0, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xC7, 0x91, 0x82, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x31, 0x0C, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC9, 0x74, 0x07, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x12, 0x40, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x55, 0x3A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x87, 0x3C, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0xE1, 0xD3, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xA1, 0xDB, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xDC, 0x42, 0xAB, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x83, 0x0E, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDE, 0x23, 0xDE, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x65, 0x93, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE0, 0x06, 0x63, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x46, 0xC7, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xE1, 0xE7, 0x97, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x27, 0xFA, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE3, 0xC8, 0xCA, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x09, 0x2E, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xE5, 0xA9, 0xFE, 0x18, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x04, 0xB0, 0x01, 0x04, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x07, 0x08, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x08, -0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x32, 0x30, 0x00, 0x47, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x30, 0x33, 0x30, 0x00, 0x0A, 0x47, 0x4D, 0x54, 0x30, 0x0A, 0x00, 0x91, 0xCC, 0x38, -0x01, 0x12, 0x53, 0xDD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, +0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x92, 0x48, 0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, 0x4D, 0x54, +0x30, 0x0A, 0x00, 0x91, 0xCC, 0x38, 0x01, 0x12, 0x53, 0xDD, 0x00, 0x00, 0x00, 0x00, /* Africa/Addis_Ababa */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1922,10 +1887,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA5, 0x19, 0xA0, 0x00, 0xB2, 0x6D, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA5, 0x19, 0xA0, 0x00, 0xB2, 0x6D, 0x15, 0x00, 0x00, 0x00, 0x00, /* America/Antigua */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1933,10 +1901,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA3, 0x58, 0x68, 0x00, 0xB4, 0x5B, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA3, 0x58, 0x68, 0x00, 0xB4, 0x5B, 0xE0, 0x00, 0x00, 0x00, 0x00, /* America/Araguaina */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2618,12 +2589,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x01, -0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9C, 0x67, 0x10, 0x00, 0xA7, 0xE5, 0xC5, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9C, 0x67, 0x10, 0x00, 0xA7, 0xE5, 0xC5, 0x00, 0x00, 0x00, 0x00, /* America/Asuncion */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2690,18 +2662,14 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x84, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x57, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0xFF, 0xFF, -0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, -0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x57, -0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, -0x00, 0xD3, 0xBA, 0x95, 0x00, 0x86, 0xDA, 0xC9, 0x00, 0x00, 0x00, 0x21, 0x45, 0x53, 0x54, 0x20, -0x2D, 0x20, 0x4F, 0x4E, 0x20, 0x28, 0x41, 0x74, 0x69, 0x6B, 0x6F, 0x6B, 0x61, 0x6E, 0x29, 0x3B, -0x20, 0x4E, 0x55, 0x20, 0x28, 0x43, 0x6F, 0x72, 0x61, 0x6C, 0x20, 0x48, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xF4, 0x61, 0xE8, 0x01, +0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, 0x00, 0x04, 0xFF, 0xFF, 0xB9, +0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x0A, +0x45, 0x53, 0x54, 0x35, 0x0A, 0x00, 0xD3, 0xBA, 0x95, 0x00, 0x86, 0xDA, 0xC9, 0x00, 0x00, 0x00, +0x21, 0x45, 0x53, 0x54, 0x20, 0x2D, 0x20, 0x4F, 0x4E, 0x20, 0x28, 0x41, 0x74, 0x69, 0x6B, 0x6F, +0x6B, 0x61, 0x6E, 0x29, 0x3B, 0x20, 0x4E, 0x55, 0x20, 0x28, 0x43, 0x6F, 0x72, 0x61, 0x6C, 0x20, +0x48, 0x29, /* America/Atka */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2857,17 +2825,20 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x24, 0xE5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x85, 0x63, 0xE5, 0x00, -0x00, 0x00, 0x00, 0x0E, 0x00, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x94, 0x8C, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x0F, 0x97, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x6E, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x11, 0x76, 0xE2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x50, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x13, 0x5F, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x30, 0x3E, 0x50, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xC8, 0x1B, 0x00, 0x00, 0xFF, -0xFF, 0xC8, 0x1B, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, -0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9D, 0x51, 0x70, 0x00, 0xB7, 0xB0, 0xBD, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, +0xFF, 0xFF, 0xFF, 0x92, 0x40, 0xA9, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xE3, 0xCB, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCC, 0x94, 0x82, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xD6, 0x22, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCE, 0x7C, 0x4D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x9B, 0xA6, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD0, 0x65, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xF2, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x0E, 0x94, 0x8C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x97, 0x00, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x10, 0x74, 0x6E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x76, 0xE2, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x12, 0x54, 0x50, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x5F, 0xFF, 0x60, 0x00, +0x00, 0x00, 0x00, 0x14, 0x30, 0x3E, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC8, 0x1B, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xCE, 0xC8, 0x01, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x41, 0x44, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9D, 0x51, 0x70, 0x00, 0xB7, 0xB0, 0xBD, 0x00, 0x00, +0x00, 0x00, /* America/Belem */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2973,17 +2944,15 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x39, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x85, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xDD, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xE2, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x02, -0x01, 0x02, 0x03, 0x04, 0x02, 0xFF, 0xFF, 0xCA, 0x74, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, -0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, -0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x41, -0x57, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xD7, 0xC8, -0xE2, 0x00, 0xBB, 0x81, 0x4D, 0x00, 0x00, 0x00, 0x1C, 0x41, 0x53, 0x54, 0x20, 0x2D, 0x20, 0x51, -0x43, 0x20, 0x28, 0x4C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x4E, 0x6F, 0x72, 0x74, 0x68, 0x20, 0x53, -0x68, 0x6F, 0x72, 0x65, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xD7, 0xC8, 0xE2, 0x00, 0xBB, 0x81, 0x4D, 0x00, 0x00, 0x00, 0x1C, 0x41, 0x53, 0x54, +0x20, 0x2D, 0x20, 0x51, 0x43, 0x20, 0x28, 0x4C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x4E, 0x6F, 0x72, +0x74, 0x68, 0x20, 0x53, 0x68, 0x6F, 0x72, 0x65, 0x29, /* America/Boa_Vista */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3538,16 +3507,12 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x84, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x57, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0xFF, 0xFF, -0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, -0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x57, -0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xF4, 0x61, 0xE8, 0x01, +0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, 0x00, 0x04, 0xFF, 0xFF, 0xB9, +0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x0A, +0x45, 0x53, 0x54, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, /* America/Cordoba */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3621,13 +3586,18 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x70, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD6, 0x4B, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0x9E, 0xF9, 0x3B, 0x00, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0x92, 0xC4, 0x00, 0x00, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, 0x00, 0xD4, -0x3F, 0xF0, 0x00, 0x60, 0xDE, 0x2D, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x54, 0x20, 0x2D, 0x20, -0x42, 0x43, 0x20, 0x28, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x6E, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x5E, 0x04, 0x0C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xA6, 0x3A, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0xBB, 0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x86, 0x1C, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xE9, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x89, 0x0C, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xCF, 0x17, 0xDF, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x8F, 0xE5, 0xAC, 0xFF, +0xFF, 0xFF, 0xFF, 0xD0, 0x81, 0x1A, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x75, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x58, 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0xFF, 0xFF, 0x96, 0xEE, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x04, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x44, +0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, +0x00, 0xD4, 0x3F, 0xF0, 0x00, 0x60, 0xDE, 0x2D, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x54, 0x20, +0x2D, 0x20, 0x42, 0x43, 0x20, 0x28, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x6E, 0x29, /* America/Cuiaba */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3697,12 +3667,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x01, -0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xEB, 0x5D, 0x00, 0xA9, 0x5F, 0x60, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9B, 0xEB, 0x5D, 0x00, 0xA9, 0x5F, 0x60, 0x00, 0x00, 0x00, 0x00, /* America/Danmarkshavn */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3991,10 +3962,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA0, 0xAC, 0xD0, 0x00, 0xB4, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA0, 0xAC, 0xD0, 0x00, 0xB4, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, /* America/Edmonton */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4600,10 +4574,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0x9B, 0xB7, 0x48, 0x00, 0xB4, 0x6F, 0x68, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9B, 0xB7, 0x48, 0x00, 0xB4, 0x6F, 0x68, 0x00, 0x00, 0x00, 0x00, /* America/Guadeloupe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4611,10 +4588,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA2, 0x19, 0x65, 0x00, 0xB4, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA2, 0x19, 0x65, 0x00, 0xB4, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, /* America/Guatemala */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -4655,13 +4635,14 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, -0xFF, 0xFF, 0xFF, 0x98, 0xD9, 0x79, 0x88, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x7D, 0xB4, 0x3C, 0x00, -0x00, 0x00, 0x00, 0x27, 0x7F, 0xFB, 0x30, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0xC9, 0x78, 0x00, 0x00, -0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0A, 0xFF, 0xFF, 0xC7, 0xC0, -0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x93, 0xB4, 0x80, -0x00, 0xB9, 0xE7, 0x25, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, +0xFF, 0xFF, 0xFF, 0x92, 0x1D, 0x0F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xD9, 0x7B, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0A, 0x7F, 0x05, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x40, 0xC0, 0x01, +0x02, 0x03, 0x01, 0xFF, 0xFF, 0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xCB, 0x44, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, +0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x93, 0xB4, 0x80, 0x00, 0xB9, 0xE7, 0x25, 0x00, 0x00, 0x00, +0x00, /* America/Halifax */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5701,12 +5682,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x01, -0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, 0x79, 0xED, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, 0x79, 0xED, 0x00, 0x00, 0x00, 0x00, /* America/La_Paz */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5915,12 +5897,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x01, -0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, 0x74, 0xAD, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, 0x74, 0xAD, 0x00, 0x00, 0x00, 0x00, /* America/Maceio */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6016,10 +5999,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, /* America/Martinique */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6649,10 +6635,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA2, 0xD6, 0x32, 0x00, 0xB3, 0xB9, 0x1D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA2, 0xD6, 0x32, 0x00, 0xB3, 0xB9, 0x1D, 0x00, 0x00, 0x00, 0x00, /* America/Nassau */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6660,65 +6649,110 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x42, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF4, 0xEF, 0x50, 0xFF, -0xFF, 0xFF, 0xFF, 0xD0, 0xFA, 0x47, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x23, 0x34, 0x50, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x78, 0x9A, 0xC0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, -0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, -0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, -0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, -0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, -0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, -0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, -0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, -0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, -0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, -0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, -0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0xFF, 0xFF, 0xB7, 0x76, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, -0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, -0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x50, -0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, -0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xAF, -0x9A, 0x6D, 0x00, 0x9C, 0xA1, 0xA8, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, 0xC8, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, +0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, +0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, +0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, +0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, +0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, +0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, +0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB5, 0x94, 0x00, +0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, +0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x0A, 0x45, 0x53, +0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, +0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xAF, 0x9A, 0x6D, 0x00, 0x9C, 0xA1, 0xA8, 0x00, 0x00, 0x00, +0x00, /* America/New_York */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7411,10 +7445,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0x99, 0x94, 0x68, 0x00, 0xB4, 0xCA, 0x8D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x99, 0x94, 0x68, 0x00, 0xB4, 0xCA, 0x8D, 0x00, 0x00, 0x00, 0x00, /* America/Porto_Acre */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8321,10 +8358,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, /* America/St_Johns */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8455,10 +8495,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA3, 0xBA, 0x10, 0x00, 0xB2, 0xF5, 0xCD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA3, 0xBA, 0x10, 0x00, 0xB2, 0xF5, 0xCD, 0x00, 0x00, 0x00, 0x00, /* America/St_Lucia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8466,10 +8509,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0x9E, 0xB7, 0x82, 0x00, 0xB5, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9E, 0xB7, 0x82, 0x00, 0xB5, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, /* America/St_Thomas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8477,10 +8523,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA5, 0x54, 0x38, 0x00, 0xAF, 0x93, 0xEA, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA5, 0x54, 0x38, 0x00, 0xAF, 0x93, 0xEA, 0x00, 0x00, 0x00, 0x00, /* America/St_Vincent */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8488,10 +8537,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0x9D, 0x64, 0xF8, 0x00, 0xB5, 0x39, 0x3A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9D, 0x64, 0xF8, 0x00, 0xB5, 0x39, 0x3A, 0x00, 0x00, 0x00, 0x00, /* America/Swift_Current */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8815,10 +8867,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA5, 0x7B, 0x48, 0x00, 0xB0, 0x0F, 0x9D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA5, 0x7B, 0x48, 0x00, 0xB0, 0x0F, 0x9D, 0x00, 0x00, 0x00, 0x00, /* America/Vancouver */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8914,10 +8969,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* America/Whitehorse */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9228,13 +9286,13 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0xD4, 0xBC, 0x76, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x34, 0x60, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0x3C, 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, -0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x23, 0x9A, 0x95, 0x01, 0xE8, 0x4E, 0x82, -0x00, 0x00, 0x00, 0x10, 0x44, 0x75, 0x6D, 0x6F, 0x6E, 0x74, 0x2D, 0x64, 0x27, 0x55, 0x72, 0x76, -0x69, 0x6C, 0x6C, 0x65, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, +0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, 0x90, 0x01, +0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x23, 0x9A, 0x95, 0x01, 0xE8, +0x4E, 0x82, 0x00, 0x00, 0x00, 0x10, 0x44, 0x75, 0x6D, 0x6F, 0x6E, 0x74, 0x2D, 0x64, 0x27, 0x55, +0x72, 0x76, 0x69, 0x6C, 0x6C, 0x65, /* Antarctica/Macquarie */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9531,8 +9589,8 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0xB1, 0x58, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, +0xFF, 0xFF, 0xFF, 0xD5, 0x1B, 0x36, 0xB4, 0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x20, 0x08, 0xBC, 0x01, 0x4F, 0x11, 0x58, 0x00, 0x00, 0x00, 0x05, 0x53, 0x79, 0x6F, 0x77, 0x61, @@ -9670,7 +9728,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0xA3, 0xD6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x72, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0xAB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0xED, 0xDE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x6A, 0xE0, 0x00, @@ -9705,16 +9763,25 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x4A, 0xEA, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAB, 0xDC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xC9, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x94, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA9, 0xD4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x74, 0xDB, 0x60, 0x00, -0x00, 0x00, 0x00, 0x52, 0xB3, 0x5E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x53, 0x34, 0x9F, 0x60, 0x02, +0x00, 0x00, 0x00, 0x52, 0xB3, 0x5E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x53, 0x34, 0x9F, 0x60, 0x00, +0x00, 0x00, 0x00, 0x54, 0x52, 0xB4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x14, 0x81, 0x60, 0x00, +0x00, 0x00, 0x00, 0x56, 0x32, 0x96, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFD, 0x9D, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x58, 0x12, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDD, 0x7F, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF2, 0x5A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBD, 0x61, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD2, 0x3C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB2, 0x1E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7D, 0x25, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x9B, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5D, 0x07, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x45, 0x45, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, -0x33, 0x2E, 0x35, 0x2E, 0x34, 0x2F, 0x32, 0x34, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, -0x2F, 0x31, 0x0A, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, 0x7C, 0xF5, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x21, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x4C, 0x4D, +0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, +0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x32, 0x2E, 0x35, 0x2E, 0x34, 0x2F, 0x32, 0x34, 0x2C, +0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, +0x7C, 0xF5, 0x00, 0x00, 0x00, 0x00, /* Asia/Anadyr */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -13109,7 +13176,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x1B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0xAA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x89, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xE3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9D, 0x09, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x9F, 0x90, 0xFF, @@ -13144,6 +13211,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xED, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xDE, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xCF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xC0, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0xA2, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x93, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x84, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0xA0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x91, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x82, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x73, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x64, 0xC0, 0xFF, @@ -13185,16 +13253,16 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x04, 0x02, 0x03, 0x02, 0x04, 0x02, 0x03, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x03, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, 0x00, 0xFF, -0xFF, 0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, -0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, -0x00, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, -0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x31, -0x3E, 0x31, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x30, -0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xC2, 0xE7, 0xD5, 0x00, -0xEB, 0x7E, 0x75, 0x00, 0x00, 0x00, 0x06, 0x41, 0x7A, 0x6F, 0x72, 0x65, 0x73, +0x04, 0x05, 0x04, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, +0x00, 0xFF, 0xFF, 0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, +0xE0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x0A, 0x3C, 0x2D, +0x30, 0x31, 0x3E, 0x31, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, +0x2F, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xC2, 0xE7, +0xD5, 0x00, 0xEB, 0x7E, 0x75, 0x00, 0x00, 0x00, 0x06, 0x41, 0x7A, 0x6F, 0x72, 0x65, 0x73, /* Atlantic/Bermuda */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -13425,7 +13493,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1D, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x13, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x9C, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x7B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xD5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xFB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x91, 0x80, 0xFF, @@ -13460,6 +13528,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xDF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xD0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xC1, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xB2, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0xA3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x94, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x85, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x76, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x92, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x83, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x74, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x65, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x56, 0xB0, 0xFF, @@ -13501,17 +13570,17 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x04, 0x02, 0x03, 0x02, 0x04, 0x02, 0x03, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x03, 0x02, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x00, 0xFF, -0xFF, 0xF0, 0x28, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, -0x0C, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x10, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x14, 0x00, 0x00, 0x00, -0x00, 0x00, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x2D, -0x30, 0x31, 0x00, 0x2B, 0x30, 0x31, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, -0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, -0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xBB, 0x1F, 0xA5, 0x00, -0xF8, 0xDE, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x4D, 0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x20, 0x49, -0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0xFF, 0xFF, 0xF0, 0x28, 0x00, +0x00, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, +0xF0, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x10, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x14, 0x00, +0x00, 0x00, 0x00, 0x00, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, +0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x31, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, +0x54, 0x00, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, +0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xBB, 0x1F, +0xA5, 0x00, 0xF8, 0xDE, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x4D, 0x61, 0x64, 0x65, 0x69, 0x72, 0x61, +0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* Atlantic/Reykjavik */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -18004,7 +18073,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x0C, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x8E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x6D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xED, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x83, 0x70, 0xFF, @@ -18039,6 +18108,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xC2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x86, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x77, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x68, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x84, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x66, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x48, 0xA0, 0xFF, @@ -18080,17 +18150,17 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x01, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, -0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, -0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, -0x00, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, -0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xC4, 0x67, 0xF2, -0x01, 0x04, 0xB8, 0xCA, 0x00, 0x00, 0x00, 0x13, 0x50, 0x6F, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6C, -0x20, 0x28, 0x6D, 0x61, 0x69, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x29, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x01, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, +0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, +0x35, 0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xC4, +0x67, 0xF2, 0x01, 0x04, 0xB8, 0xCA, 0x00, 0x00, 0x00, 0x13, 0x50, 0x6F, 0x72, 0x74, 0x75, 0x67, +0x61, 0x6C, 0x20, 0x28, 0x6D, 0x61, 0x69, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x29, /* Europe/Ljubljana */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21223,19 +21293,28 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x6E, 0x3D, 0xC9, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x05, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x62, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x9F, 0x27, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, 0xE2, 0x60, 0x00, -0x00, 0x00, 0x00, 0x4E, 0xFD, 0x8B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x01, -0x02, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, -0x00, 0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, -0xFF, 0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, -0x16, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, -0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, -0x3E, 0x2D, 0x31, 0x33, 0x3C, 0x2B, 0x31, 0x34, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x35, 0x2E, 0x30, -0x2F, 0x33, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0x74, 0x38, 0x9A, -0x00, 0x0C, 0x9D, 0x2A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xFD, 0x8B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, +0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, +0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, +0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, +0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, +0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x01, +0x02, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, +0xFF, 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, +0x0A, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, +0xE0, 0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, +0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, +0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x74, 0x38, 0x9A, 0x00, 0x0C, 0x9D, 0x2A, 0x00, +0x00, 0x00, 0x00, /* Pacific/Auckland */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21494,19 +21573,18 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, /* Pacific/Enderbury */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x55, 0x64, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x04, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0x5F, 0x9C, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x04, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, -0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x84, 0x8C, 0x4A, -0x00, 0x0D, 0x9B, 0x12, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x68, 0x6F, 0x65, 0x6E, 0x69, 0x78, 0x20, -0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, +0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Fakaofo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21660,6 +21738,21 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x54, 0x00, 0x48, 0x50, 0x54, 0x00, 0x0A, 0x48, 0x53, 0x54, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* Pacific/Kanton */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x04, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, +0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, +0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x85, 0x15, 0x02, +0x00, 0x0C, 0xA3, 0xAD, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x68, 0x6F, 0x65, 0x6E, 0x69, 0x78, 0x20, +0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, + /* Pacific/Kiritimati */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21778,13 +21871,12 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x54, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x43, 0x35, 0x60, 0x00, -0x00, 0x00, 0x00, 0x10, 0x74, 0xCA, 0x38, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, -0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x0A, 0xFF, 0xFF, 0x65, 0x50, -0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x33, -0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x31, 0x3E, 0x31, 0x31, 0x0A, 0x00, -0x6C, 0x4F, 0xDD, 0x00, 0x0F, 0x62, 0xCD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x6A, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xA6, 0xB8, 0x60, 0x01, +0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0x65, +0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, 0x31, +0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x31, 0x3E, 0x31, 0x31, 0x0A, 0x00, 0x6C, 0x4F, 0xDD, 0x00, 0x0F, +0x62, 0xCD, 0x00, 0x00, 0x00, 0x00, /* Pacific/Norfolk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21915,27 +22007,28 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x4A, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x10, 0xAC, 0x1B, 0x28, 0x00, -0x00, 0x00, 0x00, 0x11, 0x3F, 0xB5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x81, 0x20, 0x00, -0x00, 0x00, 0x00, 0x13, 0x1F, 0x97, 0x18, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x63, 0x20, 0x00, -0x00, 0x00, 0x00, 0x14, 0xFF, 0x79, 0x18, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x45, 0x20, 0x00, -0x00, 0x00, 0x00, 0x16, 0xE8, 0x95, 0x98, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x61, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x18, 0xC8, 0x77, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x43, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xA8, 0x59, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x25, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x88, 0x3B, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC2, 0x07, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x68, 0x1D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xE9, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x20, 0x47, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xCB, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x22, 0x31, 0x1C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xE8, 0x20, 0x00, -0x00, 0x00, 0x00, 0x24, 0x10, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xCA, 0x20, 0x00, -0x00, 0x00, 0x00, 0x25, 0xF0, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0xAC, 0x20, 0x00, -0x00, 0x00, 0x00, 0x27, 0xD0, 0xC2, 0x18, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x04, 0xFF, 0xFF, -0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, -0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x0A, 0x3C, -0x2D, 0x31, 0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x68, 0xED, 0xFA, 0x00, 0x1E, 0xDF, 0xA5, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x7C, 0x4C, 0xDC, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x60, 0xC8, 0x00, +0x00, 0x00, 0x00, 0x10, 0xAC, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3F, 0xB5, 0x18, 0x00, +0x00, 0x00, 0x00, 0x12, 0x79, 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1F, 0x97, 0x18, 0x00, +0x00, 0x00, 0x00, 0x14, 0x59, 0x63, 0x20, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0x79, 0x18, 0x00, +0x00, 0x00, 0x00, 0x16, 0x39, 0x45, 0x20, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE8, 0x95, 0x98, 0x00, +0x00, 0x00, 0x00, 0x18, 0x22, 0x61, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC8, 0x77, 0x98, 0x00, +0x00, 0x00, 0x00, 0x1A, 0x02, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x59, 0x98, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xE2, 0x25, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x88, 0x3B, 0x98, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC2, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x68, 0x1D, 0x98, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA1, 0xE9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x47, 0xFF, 0x98, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0xCB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x31, 0x1C, 0x18, 0x00, +0x00, 0x00, 0x00, 0x23, 0x6A, 0xE8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0xFE, 0x18, 0x00, +0x00, 0x00, 0x00, 0x25, 0x4A, 0xCA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0xE0, 0x18, 0x00, +0x00, 0x00, 0x00, 0x27, 0x2A, 0xAC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0xC2, 0x18, 0x01, +0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x00, 0x00, 0xBB, 0xB8, 0x00, +0x00, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x04, 0xFF, 0xFF, 0x73, +0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, +0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x0A, 0x3C, 0x2D, +0x31, 0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x68, 0xED, 0xFA, 0x00, 0x1E, 0xDF, 0xA5, 0x00, 0x00, +0x00, 0x00, /* Pacific/Saipan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -22007,16 +22100,16 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, -0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x07, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x73, 0x42, 0x90, 0x00, +0xFF, 0xFF, 0xFF, 0xD2, 0x45, 0x9C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x11, 0xE0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFB, 0x47, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x7D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x04, 0x08, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x72, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xE3, 0xEA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x52, 0x9A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1D, 0xD7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7A, 0x20, 0xD0, 0x01, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, 0x00, 0xAD, 0x48, 0x00, 0x00, 0x00, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, 0x00, 0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x32, 0x30, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, -0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x69, 0x08, -0x05, 0x00, 0x07, 0x60, 0x05, 0x00, 0x00, 0x00, 0x00, +0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x69, 0x15, +0x0A, 0x00, 0x07, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Truk */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -22139,7 +22232,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x0C, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x8E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x6D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xED, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x83, 0x70, 0xFF, @@ -22174,6 +22267,7 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xC2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x86, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x77, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x68, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x84, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x66, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x48, 0xA0, 0xFF, @@ -22215,16 +22309,16 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x01, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, -0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, -0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, -0x00, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, -0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x01, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, +0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, +0x35, 0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* PRC */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -23327,605 +23421,606 @@ const unsigned char timelib_timezone_db_data_builtin[339811] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; #else -const timelib_tzdb_index_entry timezonedb_idx_builtin[594] = { +const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Africa/Abidjan" , 0x000000 }, { "Africa/Accra" , 0x0000A0 }, - { "Africa/Addis_Ababa" , 0x0004D0 }, - { "Africa/Algiers" , 0x0005E5 }, - { "Africa/Asmara" , 0x0008D0 }, - { "Africa/Asmera" , 0x0009E5 }, - { "Africa/Bamako" , 0x000AFA }, - { "Africa/Bangui" , 0x000B9A }, - { "Africa/Banjul" , 0x000C91 }, - { "Africa/Bissau" , 0x000D31 }, - { "Africa/Blantyre" , 0x000DFF }, - { "Africa/Brazzaville" , 0x000EA0 }, - { "Africa/Bujumbura" , 0x000F97 }, - { "Africa/Cairo" , 0x001038 }, - { "Africa/Casablanca" , 0x0017E7 }, - { "Africa/Ceuta" , 0x002170 }, - { "Africa/Conakry" , 0x00297E }, - { "Africa/Dakar" , 0x002A1E }, - { "Africa/Dar_es_Salaam" , 0x002ABE }, - { "Africa/Djibouti" , 0x002BD3 }, - { "Africa/Douala" , 0x002CE8 }, - { "Africa/El_Aaiun" , 0x002DDF }, - { "Africa/Freetown" , 0x0036E2 }, - { "Africa/Gaborone" , 0x003782 }, - { "Africa/Harare" , 0x003823 }, - { "Africa/Johannesburg" , 0x0038C4 }, - { "Africa/Juba" , 0x0039C6 }, - { "Africa/Kampala" , 0x003C79 }, - { "Africa/Khartoum" , 0x003D8E }, - { "Africa/Kigali" , 0x004041 }, - { "Africa/Kinshasa" , 0x0040E2 }, - { "Africa/Lagos" , 0x0041F2 }, - { "Africa/Libreville" , 0x0042E9 }, - { "Africa/Lome" , 0x0043E0 }, - { "Africa/Luanda" , 0x004480 }, - { "Africa/Lubumbashi" , 0x004577 }, - { "Africa/Lusaka" , 0x004631 }, - { "Africa/Malabo" , 0x0046D2 }, - { "Africa/Maputo" , 0x0047C9 }, - { "Africa/Maseru" , 0x00486A }, - { "Africa/Mbabane" , 0x00496C }, - { "Africa/Mogadishu" , 0x004A6E }, - { "Africa/Monrovia" , 0x004B83 }, - { "Africa/Nairobi" , 0x004C5F }, - { "Africa/Ndjamena" , 0x004D74 }, - { "Africa/Niamey" , 0x004E47 }, - { "Africa/Nouakchott" , 0x004F3E }, - { "Africa/Ouagadougou" , 0x004FDE }, - { "Africa/Porto-Novo" , 0x00507E }, - { "Africa/Sao_Tome" , 0x005175 }, - { "Africa/Timbuktu" , 0x00527F }, - { "Africa/Tripoli" , 0x00531F }, - { "Africa/Tunis" , 0x00559C }, - { "Africa/Windhoek" , 0x005859 }, - { "America/Adak" , 0x005C20 }, - { "America/Anchorage" , 0x006570 }, - { "America/Anguilla" , 0x006ED2 }, - { "America/Antigua" , 0x006F72 }, - { "America/Araguaina" , 0x007012 }, - { "America/Argentina/Buenos_Aires" , 0x00739B }, - { "America/Argentina/Catamarca" , 0x0077F0 }, - { "America/Argentina/ComodRivadavia" , 0x007C4B }, - { "America/Argentina/Cordoba" , 0x00808B }, - { "America/Argentina/Jujuy" , 0x008501 }, - { "America/Argentina/La_Rioja" , 0x00892F }, - { "America/Argentina/Mendoza" , 0x008D8A }, - { "America/Argentina/Rio_Gallegos" , 0x0091D6 }, - { "America/Argentina/Salta" , 0x009625 }, - { "America/Argentina/San_Juan" , 0x009A5F }, - { "America/Argentina/San_Luis" , 0x009EBA }, - { "America/Argentina/Tucuman" , 0x00A321 }, - { "America/Argentina/Ushuaia" , 0x00A789 }, - { "America/Aruba" , 0x00ABDE }, - { "America/Asuncion" , 0x00ACA4 }, - { "America/Atikokan" , 0x00B4AC }, - { "America/Atka" , 0x00B629 }, - { "America/Bahia" , 0x00BF69 }, - { "America/Bahia_Banderas" , 0x00C37A }, - { "America/Barbados" , 0x00C9B0 }, - { "America/Belem" , 0x00CAF6 }, - { "America/Belize" , 0x00CD54 }, - { "America/Blanc-Sablon" , 0x00D3AE }, - { "America/Boa_Vista" , 0x00D500 }, - { "America/Bogota" , 0x00D78B }, - { "America/Boise" , 0x00D88D }, - { "America/Buenos_Aires" , 0x00E213 }, - { "America/Cambridge_Bay" , 0x00E653 }, - { "America/Campo_Grande" , 0x00EE97 }, - { "America/Cancun" , 0x00F459 }, - { "America/Caracas" , 0x00F797 }, - { "America/Catamarca" , 0x00F8AB }, - { "America/Cayenne" , 0x00FCEB }, - { "America/Cayman" , 0x00FDBD }, - { "America/Chicago" , 0x00FE7F }, - { "America/Chihuahua" , 0x010C97 }, - { "America/Coral_Harbour" , 0x011295 }, - { "America/Cordoba" , 0x0113F1 }, - { "America/Costa_Rica" , 0x011831 }, - { "America/Creston" , 0x011979 }, - { "America/Cuiaba" , 0x011A67 }, - { "America/Curacao" , 0x012006 }, - { "America/Danmarkshavn" , 0x0120CC }, - { "America/Dawson" , 0x0123AC }, - { "America/Dawson_Creek" , 0x012A18 }, - { "America/Denver" , 0x012E5E }, - { "America/Detroit" , 0x01380B }, - { "America/Dominica" , 0x0140E6 }, - { "America/Edmonton" , 0x014186 }, - { "America/Eirunepe" , 0x014ACB }, - { "America/El_Salvador" , 0x014D76 }, - { "America/Ensenada" , 0x014E62 }, - { "America/Fort_Nelson" , 0x015794 }, - { "America/Fort_Wayne" , 0x016074 }, - { "America/Fortaleza" , 0x016702 }, - { "America/Glace_Bay" , 0x016A00 }, - { "America/Godthab" , 0x0172B7 }, - { "America/Goose_Bay" , 0x017A19 }, - { "America/Grand_Turk" , 0x0186CF }, - { "America/Grenada" , 0x018E05 }, - { "America/Guadeloupe" , 0x018EA5 }, - { "America/Guatemala" , 0x018F45 }, - { "America/Guayaquil" , 0x019069 }, - { "America/Guyana" , 0x01917D }, - { "America/Halifax" , 0x019275 }, - { "America/Havana" , 0x019FFF }, - { "America/Hermosillo" , 0x01A97B }, - { "America/Indiana/Indianapolis" , 0x01AB46 }, - { "America/Indiana/Knox" , 0x01B1ED }, - { "America/Indiana/Marengo" , 0x01BB8A }, - { "America/Indiana/Petersburg" , 0x01C267 }, - { "America/Indiana/Tell_City" , 0x01C9F6 }, - { "America/Indiana/Vevay" , 0x01D0AA }, - { "America/Indiana/Vincennes" , 0x01D656 }, - { "America/Indiana/Winamac" , 0x01DD1C }, - { "America/Indianapolis" , 0x01E430 }, - { "America/Inuvik" , 0x01EABE }, - { "America/Iqaluit" , 0x01F244 }, - { "America/Jamaica" , 0x01FA5E }, - { "America/Jujuy" , 0x01FC4C }, - { "America/Juneau" , 0x020070 }, - { "America/Kentucky/Louisville" , 0x0209C1 }, - { "America/Kentucky/Monticello" , 0x0214BF }, - { "America/Knox_IN" , 0x021E0F }, - { "America/Kralendijk" , 0x022797 }, - { "America/La_Paz" , 0x02285D }, - { "America/Lima" , 0x022951 }, - { "America/Los_Angeles" , 0x022AF3 }, - { "America/Louisville" , 0x02361A }, - { "America/Lower_Princes" , 0x0240FA }, - { "America/Maceio" , 0x0241C0 }, - { "America/Managua" , 0x0244C4 }, - { "America/Manaus" , 0x02467E }, - { "America/Marigot" , 0x0248F5 }, - { "America/Martinique" , 0x024995 }, - { "America/Matamoros" , 0x024A89 }, - { "America/Mazatlan" , 0x025041 }, - { "America/Mendoza" , 0x025678 }, - { "America/Menominee" , 0x025AB8 }, - { "America/Merida" , 0x0263C5 }, - { "America/Metlakatla" , 0x02697F }, - { "America/Mexico_City" , 0x026F31 }, - { "America/Miquelon" , 0x027579 }, - { "America/Moncton" , 0x027C07 }, - { "America/Monterrey" , 0x02887D }, - { "America/Montevideo" , 0x028E3C }, - { "America/Montreal" , 0x02942E }, - { "America/Montserrat" , 0x02A1E0 }, - { "America/Nassau" , 0x02A280 }, - { "America/New_York" , 0x02ABE0 }, - { "America/Nipigon" , 0x02B9D0 }, - { "America/Nome" , 0x02C247 }, - { "America/Noronha" , 0x02CB9F }, - { "America/North_Dakota/Beulah" , 0x02CE87 }, - { "America/North_Dakota/Center" , 0x02D7F4 }, - { "America/North_Dakota/New_Salem" , 0x02E161 }, - { "America/Nuuk" , 0x02EAD4 }, - { "America/Ojinaga" , 0x02F24C }, - { "America/Panama" , 0x02F84C }, - { "America/Pangnirtung" , 0x02F90E }, - { "America/Paramaribo" , 0x030162 }, - { "America/Phoenix" , 0x030274 }, - { "America/Port-au-Prince" , 0x0303E5 }, - { "America/Port_of_Spain" , 0x03098B }, - { "America/Porto_Acre" , 0x030A2B }, - { "America/Porto_Velho" , 0x030CAB }, - { "America/Puerto_Rico" , 0x030EFF }, - { "America/Punta_Arenas" , 0x031001 }, - { "America/Rainy_River" , 0x03178F }, - { "America/Rankin_Inlet" , 0x032007 }, - { "America/Recife" , 0x03278D }, - { "America/Regina" , 0x032A6F }, - { "America/Resolute" , 0x032E64 }, - { "America/Rio_Branco" , 0x0335EB }, - { "America/Rosario" , 0x03386F }, - { "America/Santa_Isabel" , 0x033CAF }, - { "America/Santarem" , 0x0345E1 }, - { "America/Santiago" , 0x034852 }, - { "America/Santo_Domingo" , 0x035251 }, - { "America/Sao_Paulo" , 0x035427 }, - { "America/Scoresbysund" , 0x035A0D }, - { "America/Shiprock" , 0x0361B2 }, - { "America/Sitka" , 0x036B4A }, - { "America/St_Barthelemy" , 0x037482 }, - { "America/St_Johns" , 0x037522 }, - { "America/St_Kitts" , 0x038397 }, - { "America/St_Lucia" , 0x038437 }, - { "America/St_Thomas" , 0x0384D7 }, - { "America/St_Vincent" , 0x038577 }, - { "America/Swift_Current" , 0x038617 }, - { "America/Tegucigalpa" , 0x038865 }, - { "America/Thule" , 0x03896D }, - { "America/Thunder_Bay" , 0x038F65 }, - { "America/Tijuana" , 0x039825 }, - { "America/Toronto" , 0x03A178 }, - { "America/Tortola" , 0x03AF47 }, - { "America/Vancouver" , 0x03AFE7 }, - { "America/Virgin" , 0x03BB58 }, - { "America/Whitehorse" , 0x03BBF8 }, - { "America/Winnipeg" , 0x03C264 }, - { "America/Yakutat" , 0x03CDC1 }, - { "America/Yellowknife" , 0x03D6DE }, - { "Antarctica/Casey" , 0x03DEAF }, - { "Antarctica/Davis" , 0x03E040 }, - { "Antarctica/DumontDUrville" , 0x03E17A }, - { "Antarctica/Macquarie" , 0x03E258 }, - { "Antarctica/Mawson" , 0x03EB48 }, - { "Antarctica/McMurdo" , 0x03EC21 }, - { "Antarctica/Palmer" , 0x03F5D8 }, - { "Antarctica/Rothera" , 0x03FB74 }, - { "Antarctica/South_Pole" , 0x03FC2B }, - { "Antarctica/Syowa" , 0x0405BC }, - { "Antarctica/Troll" , 0x040672 }, - { "Antarctica/Vostok" , 0x040B0D }, - { "Arctic/Longyearbyen" , 0x040BC4 }, - { "Asia/Aden" , 0x041484 }, - { "Asia/Almaty" , 0x041535 }, - { "Asia/Amman" , 0x04193D }, - { "Asia/Anadyr" , 0x042086 }, - { "Asia/Aqtau" , 0x042549 }, - { "Asia/Aqtobe" , 0x042941 }, - { "Asia/Ashgabat" , 0x042D4D }, - { "Asia/Ashkhabad" , 0x042FC4 }, - { "Asia/Atyrau" , 0x04323B }, - { "Asia/Baghdad" , 0x04363B }, - { "Asia/Bahrain" , 0x043A1E }, - { "Asia/Baku" , 0x043AF1 }, - { "Asia/Bangkok" , 0x043FC8 }, - { "Asia/Barnaul" , 0x04409B }, - { "Asia/Beirut" , 0x04457A }, - { "Asia/Bishkek" , 0x044DF0 }, - { "Asia/Brunei" , 0x0451D3 }, - { "Asia/Calcutta" , 0x0452AA }, - { "Asia/Chita" , 0x0453D3 }, - { "Asia/Choibalsan" , 0x0458B8 }, - { "Asia/Chongqing" , 0x045C8B }, - { "Asia/Chungking" , 0x045EC8 }, - { "Asia/Colombo" , 0x046105 }, - { "Asia/Dacca" , 0x046285 }, - { "Asia/Damascus" , 0x0463E2 }, - { "Asia/Dhaka" , 0x046CE4 }, - { "Asia/Dili" , 0x046E41 }, - { "Asia/Dubai" , 0x046F30 }, - { "Asia/Dushanbe" , 0x046FE1 }, - { "Asia/Famagusta" , 0x04723C }, - { "Asia/Gaza" , 0x047A43 }, - { "Asia/Harbin" , 0x0483CF }, - { "Asia/Hebron" , 0x04860C }, - { "Asia/Ho_Chi_Minh" , 0x048FB3 }, - { "Asia/Hong_Kong" , 0x04911E }, - { "Asia/Hovd" , 0x0495DD }, - { "Asia/Irkutsk" , 0x04998F }, - { "Asia/Istanbul" , 0x049E90 }, - { "Asia/Jakarta" , 0x04A637 }, - { "Asia/Jayapura" , 0x04A7B3 }, - { "Asia/Jerusalem" , 0x04A8D2 }, - { "Asia/Kabul" , 0x04B232 }, - { "Asia/Kamchatka" , 0x04B30E }, - { "Asia/Karachi" , 0x04B7BA }, - { "Asia/Kashgar" , 0x04B941 }, - { "Asia/Kathmandu" , 0x04B9F2 }, - { "Asia/Katmandu" , 0x04BAD2 }, - { "Asia/Khandyga" , 0x04BBB2 }, - { "Asia/Kolkata" , 0x04C0D3 }, - { "Asia/Krasnoyarsk" , 0x04C1FC }, - { "Asia/Kuala_Lumpur" , 0x04C6D8 }, - { "Asia/Kuching" , 0x04C877 }, - { "Asia/Kuwait" , 0x04CA74 }, - { "Asia/Macao" , 0x04CB25 }, - { "Asia/Macau" , 0x04CFFC }, - { "Asia/Magadan" , 0x04D4D3 }, - { "Asia/Makassar" , 0x04D9B5 }, - { "Asia/Manila" , 0x04DB08 }, - { "Asia/Muscat" , 0x04DC5C }, - { "Asia/Nicosia" , 0x04DD0D }, - { "Asia/Novokuznetsk" , 0x04E4FE }, - { "Asia/Novosibirsk" , 0x04E9A8 }, - { "Asia/Omsk" , 0x04EE8D }, - { "Asia/Oral" , 0x04F35D }, - { "Asia/Phnom_Penh" , 0x04F765 }, - { "Asia/Pontianak" , 0x04F838 }, - { "Asia/Pyongyang" , 0x04F9BB }, - { "Asia/Qatar" , 0x04FAB4 }, - { "Asia/Qostanay" , 0x04FB87 }, - { "Asia/Qyzylorda" , 0x04FFA0 }, - { "Asia/Rangoon" , 0x0503CA }, - { "Asia/Riyadh" , 0x0504E2 }, - { "Asia/Saigon" , 0x050593 }, - { "Asia/Sakhalin" , 0x0506FE }, - { "Asia/Samarkand" , 0x050BD4 }, - { "Asia/Seoul" , 0x050E32 }, - { "Asia/Shanghai" , 0x0510A7 }, - { "Asia/Singapore" , 0x0512F0 }, - { "Asia/Srednekolymsk" , 0x05147B }, - { "Asia/Taipei" , 0x051961 }, - { "Asia/Tashkent" , 0x051C66 }, - { "Asia/Tbilisi" , 0x051ED2 }, - { "Asia/Tehran" , 0x0522E9 }, - { "Asia/Tel_Aviv" , 0x052D0B }, - { "Asia/Thimbu" , 0x05366B }, - { "Asia/Thimphu" , 0x053742 }, - { "Asia/Tokyo" , 0x053819 }, - { "Asia/Tomsk" , 0x05395A }, - { "Asia/Ujung_Pandang" , 0x053E39 }, - { "Asia/Ulaanbaatar" , 0x053F43 }, - { "Asia/Ulan_Bator" , 0x0542DF }, - { "Asia/Urumqi" , 0x054666 }, - { "Asia/Ust-Nera" , 0x054724 }, - { "Asia/Vientiane" , 0x054C28 }, - { "Asia/Vladivostok" , 0x054CFB }, - { "Asia/Yakutsk" , 0x0551D2 }, - { "Asia/Yangon" , 0x0556A8 }, - { "Asia/Yekaterinburg" , 0x0557C0 }, - { "Asia/Yerevan" , 0x055CB5 }, - { "Atlantic/Azores" , 0x056140 }, - { "Atlantic/Bermuda" , 0x056EEE }, - { "Atlantic/Canary" , 0x057856 }, - { "Atlantic/Cape_Verde" , 0x057FD9 }, - { "Atlantic/Faeroe" , 0x0580F3 }, - { "Atlantic/Faroe" , 0x058816 }, - { "Atlantic/Jan_Mayen" , 0x058F39 }, - { "Atlantic/Madeira" , 0x0597F9 }, - { "Atlantic/Reykjavik" , 0x05A5A7 }, - { "Atlantic/South_Georgia" , 0x05AA3D }, - { "Atlantic/St_Helena" , 0x05AAED }, - { "Atlantic/Stanley" , 0x05AB8D }, - { "Australia/ACT" , 0x05B057 }, - { "Australia/Adelaide" , 0x05B8F1 }, - { "Australia/Brisbane" , 0x05C1AC }, - { "Australia/Broken_Hill" , 0x05C372 }, - { "Australia/Canberra" , 0x05CC4F }, - { "Australia/Currie" , 0x05D4E9 }, - { "Australia/Darwin" , 0x05DE2B }, - { "Australia/Eucla" , 0x05DF8E }, - { "Australia/Hobart" , 0x05E189 }, - { "Australia/LHI" , 0x05EAD3 }, - { "Australia/Lindeman" , 0x05F223 }, - { "Australia/Lord_Howe" , 0x05F429 }, - { "Australia/Melbourne" , 0x05FB89 }, - { "Australia/North" , 0x06042B }, - { "Australia/NSW" , 0x06057C }, - { "Australia/Perth" , 0x060E16 }, - { "Australia/Queensland" , 0x060FFE }, - { "Australia/South" , 0x0611AD }, - { "Australia/Sydney" , 0x061A59 }, - { "Australia/Tasmania" , 0x06230F }, - { "Australia/Victoria" , 0x062C51 }, - { "Australia/West" , 0x0634EB }, - { "Australia/Yancowinna" , 0x0636B5 }, - { "Brazil/Acre" , 0x063F76 }, - { "Brazil/DeNoronha" , 0x0641F6 }, - { "Brazil/East" , 0x0644CE }, - { "Brazil/West" , 0x064A7E }, - { "Canada/Atlantic" , 0x064CE6 }, - { "Canada/Central" , 0x065A52 }, - { "Canada/Eastern" , 0x066592 }, - { "Canada/Mountain" , 0x067344 }, - { "Canada/Newfoundland" , 0x067C6C }, - { "Canada/Pacific" , 0x068ABF }, - { "Canada/Saskatchewan" , 0x069617 }, - { "Canada/Yukon" , 0x0699F7 }, - { "CET" , 0x06A051 }, - { "Chile/Continental" , 0x06A88B }, - { "Chile/EasterIsland" , 0x06B278 }, - { "CST6CDT" , 0x06BB3D }, - { "Cuba" , 0x06C44F }, - { "EET" , 0x06CDCB }, - { "Egypt" , 0x06D54B }, - { "Eire" , 0x06DCFA }, - { "EST" , 0x06EAAA }, - { "EST5EDT" , 0x06EB28 }, - { "Etc/GMT" , 0x06F43A }, - { "Etc/GMT+0" , 0x06F4B8 }, - { "Etc/GMT+1" , 0x06F536 }, - { "Etc/GMT+10" , 0x06F5B6 }, - { "Etc/GMT+11" , 0x06F637 }, - { "Etc/GMT+12" , 0x06F6B8 }, - { "Etc/GMT+2" , 0x06F739 }, - { "Etc/GMT+3" , 0x06F7B9 }, - { "Etc/GMT+4" , 0x06F839 }, - { "Etc/GMT+5" , 0x06F8B9 }, - { "Etc/GMT+6" , 0x06F939 }, - { "Etc/GMT+7" , 0x06F9B9 }, - { "Etc/GMT+8" , 0x06FA39 }, - { "Etc/GMT+9" , 0x06FAB9 }, - { "Etc/GMT-0" , 0x06FB39 }, - { "Etc/GMT-1" , 0x06FBB7 }, - { "Etc/GMT-10" , 0x06FC38 }, - { "Etc/GMT-11" , 0x06FCBA }, - { "Etc/GMT-12" , 0x06FD3C }, - { "Etc/GMT-13" , 0x06FDBE }, - { "Etc/GMT-14" , 0x06FE40 }, - { "Etc/GMT-2" , 0x06FEC2 }, - { "Etc/GMT-3" , 0x06FF43 }, - { "Etc/GMT-4" , 0x06FFC4 }, - { "Etc/GMT-5" , 0x070045 }, - { "Etc/GMT-6" , 0x0700C6 }, - { "Etc/GMT-7" , 0x070147 }, - { "Etc/GMT-8" , 0x0701C8 }, - { "Etc/GMT-9" , 0x070249 }, - { "Etc/GMT0" , 0x0702CA }, - { "Etc/Greenwich" , 0x070348 }, - { "Etc/UCT" , 0x0703C6 }, - { "Etc/Universal" , 0x070444 }, - { "Etc/UTC" , 0x0704C2 }, - { "Etc/Zulu" , 0x070540 }, - { "Europe/Amsterdam" , 0x0705BE }, - { "Europe/Andorra" , 0x071128 }, - { "Europe/Astrakhan" , 0x071802 }, - { "Europe/Athens" , 0x071CAD }, - { "Europe/Belfast" , 0x07258F }, - { "Europe/Belgrade" , 0x0733DB }, - { "Europe/Berlin" , 0x073B67 }, - { "Europe/Bratislava" , 0x074481 }, - { "Europe/Brussels" , 0x074D8A }, - { "Europe/Bucharest" , 0x07590B }, - { "Europe/Budapest" , 0x07619F }, - { "Europe/Busingen" , 0x076AEB }, - { "Europe/Chisinau" , 0x077274 }, - { "Europe/Copenhagen" , 0x077BD6 }, - { "Europe/Dublin" , 0x07843B }, - { "Europe/Gibraltar" , 0x0791EB }, - { "Europe/Guernsey" , 0x079DE3 }, - { "Europe/Helsinki" , 0x07AC2F }, - { "Europe/Isle_of_Man" , 0x07B3A7 }, - { "Europe/Istanbul" , 0x07C1F3 }, - { "Europe/Jersey" , 0x07C99A }, - { "Europe/Kaliningrad" , 0x07D7E6 }, - { "Europe/Kiev" , 0x07DDDB }, - { "Europe/Kirov" , 0x07E623 }, - { "Europe/Lisbon" , 0x07EABE }, - { "Europe/Ljubljana" , 0x07F86A }, - { "Europe/London" , 0x07FFF6 }, - { "Europe/Luxembourg" , 0x080E42 }, - { "Europe/Madrid" , 0x0819D0 }, - { "Europe/Malta" , 0x082422 }, - { "Europe/Mariehamn" , 0x082E6A }, - { "Europe/Minsk" , 0x0835E2 }, - { "Europe/Monaco" , 0x083B17 }, - { "Europe/Moscow" , 0x0846A3 }, - { "Europe/Nicosia" , 0x084CC2 }, - { "Europe/Oslo" , 0x0854A0 }, - { "Europe/Paris" , 0x085D60 }, - { "Europe/Podgorica" , 0x0868FE }, - { "Europe/Prague" , 0x08708A }, - { "Europe/Riga" , 0x087993 }, - { "Europe/Rome" , 0x088235 }, - { "Europe/Samara" , 0x088C92 }, - { "Europe/San_Marino" , 0x089176 }, - { "Europe/Sarajevo" , 0x089BD3 }, - { "Europe/Saratov" , 0x08A35F }, - { "Europe/Simferopol" , 0x08A81A }, - { "Europe/Skopje" , 0x08ADD9 }, - { "Europe/Sofia" , 0x08B565 }, - { "Europe/Stockholm" , 0x08BD8E }, - { "Europe/Tallinn" , 0x08C50F }, - { "Europe/Tirane" , 0x08CD7F }, - { "Europe/Tiraspol" , 0x08D5AF }, - { "Europe/Ulyanovsk" , 0x08DF11 }, - { "Europe/Uzhgorod" , 0x08E422 }, - { "Europe/Vaduz" , 0x08EC3E }, - { "Europe/Vatican" , 0x08F3BF }, - { "Europe/Vienna" , 0x08FE1C }, - { "Europe/Vilnius" , 0x0906C0 }, - { "Europe/Volgograd" , 0x090F3E }, - { "Europe/Warsaw" , 0x0913E9 }, - { "Europe/Zagreb" , 0x091E53 }, - { "Europe/Zaporozhye" , 0x0925DF }, - { "Europe/Zurich" , 0x092E40 }, - { "Factory" , 0x0935C1 }, - { "GB" , 0x093641 }, - { "GB-Eire" , 0x09448D }, - { "GMT" , 0x0952D9 }, - { "GMT+0" , 0x095357 }, - { "GMT-0" , 0x0953D5 }, - { "GMT0" , 0x095453 }, - { "Greenwich" , 0x0954D1 }, - { "Hongkong" , 0x09554F }, - { "HST" , 0x095A0E }, - { "Iceland" , 0x095A8D }, - { "Indian/Antananarivo" , 0x095F23 }, - { "Indian/Chagos" , 0x096038 }, - { "Indian/Christmas" , 0x09610B }, - { "Indian/Cocos" , 0x0961BC }, - { "Indian/Comoro" , 0x096276 }, - { "Indian/Kerguelen" , 0x09638B }, - { "Indian/Mahe" , 0x09643C }, - { "Indian/Maldives" , 0x0964ED }, - { "Indian/Mauritius" , 0x0965C0 }, - { "Indian/Mayotte" , 0x0966BD }, - { "Indian/Reunion" , 0x0967D2 }, - { "Iran" , 0x096883 }, - { "Israel" , 0x0972A5 }, - { "Jamaica" , 0x097C05 }, - { "Japan" , 0x097DF3 }, - { "Kwajalein" , 0x097F34 }, - { "Libya" , 0x09807C }, - { "MET" , 0x0982F9 }, - { "Mexico/BajaNorte" , 0x098B33 }, - { "Mexico/BajaSur" , 0x099465 }, - { "Mexico/General" , 0x099A67 }, - { "MST" , 0x09A0A3 }, - { "MST7MDT" , 0x09A121 }, - { "Navajo" , 0x09AA33 }, - { "NZ" , 0x09B3CB }, - { "NZ-CHAT" , 0x09BD5C }, - { "Pacific/Apia" , 0x09C57C }, - { "Pacific/Auckland" , 0x09C9D1 }, - { "Pacific/Bougainville" , 0x09D37A }, - { "Pacific/Chatham" , 0x09D49E }, - { "Pacific/Chuuk" , 0x09DCCD }, - { "Pacific/Easter" , 0x09DDF5 }, - { "Pacific/Efate" , 0x09E6C7 }, - { "Pacific/Enderbury" , 0x09E8ED }, - { "Pacific/Fakaofo" , 0x09E9F2 }, - { "Pacific/Fiji" , 0x09EAC6 }, - { "Pacific/Funafuti" , 0x09EF07 }, - { "Pacific/Galapagos" , 0x09EFB9 }, - { "Pacific/Gambier" , 0x09F0C4 }, - { "Pacific/Guadalcanal" , 0x09F183 }, - { "Pacific/Guam" , 0x09F235 }, - { "Pacific/Honolulu" , 0x09F42F }, - { "Pacific/Johnston" , 0x09F58A }, - { "Pacific/Kiritimati" , 0x09F6DF }, - { "Pacific/Kosrae" , 0x09F7E5 }, - { "Pacific/Kwajalein" , 0x09F956 }, - { "Pacific/Majuro" , 0x09FAA7 }, - { "Pacific/Marquesas" , 0x09FC06 }, - { "Pacific/Midway" , 0x09FCD0 }, - { "Pacific/Nauru" , 0x09FD99 }, - { "Pacific/Niue" , 0x09FEA1 }, - { "Pacific/Norfolk" , 0x09FF9E }, - { "Pacific/Noumea" , 0x0A031A }, - { "Pacific/Pago_Pago" , 0x0A0456 }, - { "Pacific/Palau" , 0x0A0511 }, - { "Pacific/Pitcairn" , 0x0A05D1 }, - { "Pacific/Pohnpei" , 0x0A06A7 }, - { "Pacific/Ponape" , 0x0A07F0 }, - { "Pacific/Port_Moresby" , 0x0A092B }, - { "Pacific/Rarotonga" , 0x0A0A0E }, - { "Pacific/Saipan" , 0x0A0C5B }, - { "Pacific/Samoa" , 0x0A0E55 }, - { "Pacific/Tahiti" , 0x0A0F10 }, - { "Pacific/Tarawa" , 0x0A0FD0 }, - { "Pacific/Tongatapu" , 0x0A1091 }, - { "Pacific/Truk" , 0x0A1211 }, - { "Pacific/Wake" , 0x0A132A }, - { "Pacific/Wallis" , 0x0A13E7 }, - { "Pacific/Yap" , 0x0A1499 }, - { "Poland" , 0x0A15B2 }, - { "Portugal" , 0x0A201C }, - { "PRC" , 0x0A2DB5 }, - { "PST8PDT" , 0x0A2FF2 }, - { "ROC" , 0x0A3904 }, - { "ROK" , 0x0A3C09 }, - { "Singapore" , 0x0A3E7E }, - { "Turkey" , 0x0A4009 }, - { "UCT" , 0x0A47B0 }, - { "Universal" , 0x0A482E }, - { "US/Alaska" , 0x0A48AC }, - { "US/Aleutian" , 0x0A51FB }, - { "US/Arizona" , 0x0A5B3B }, - { "US/Central" , 0x0A5C8F }, - { "US/East-Indiana" , 0x0A6A93 }, - { "US/Eastern" , 0x0A7121 }, - { "US/Hawaii" , 0x0A7EFD }, - { "US/Indiana-Starke" , 0x0A8052 }, - { "US/Michigan" , 0x0A89DA }, - { "US/Mountain" , 0x0A929C }, - { "US/Pacific" , 0x0A9C34 }, - { "US/Samoa" , 0x0AA754 }, - { "UTC" , 0x0AA80F }, - { "W-SU" , 0x0AA88D }, - { "WET" , 0x0AAE98 }, - { "Zulu" , 0x0AB615 }, + { "Africa/Addis_Ababa" , 0x000140 }, + { "Africa/Algiers" , 0x000255 }, + { "Africa/Asmara" , 0x000540 }, + { "Africa/Asmera" , 0x000655 }, + { "Africa/Bamako" , 0x00076A }, + { "Africa/Bangui" , 0x00080A }, + { "Africa/Banjul" , 0x000901 }, + { "Africa/Bissau" , 0x0009A1 }, + { "Africa/Blantyre" , 0x000A6F }, + { "Africa/Brazzaville" , 0x000B10 }, + { "Africa/Bujumbura" , 0x000C07 }, + { "Africa/Cairo" , 0x000CA8 }, + { "Africa/Casablanca" , 0x001457 }, + { "Africa/Ceuta" , 0x001DE0 }, + { "Africa/Conakry" , 0x0025EE }, + { "Africa/Dakar" , 0x00268E }, + { "Africa/Dar_es_Salaam" , 0x00272E }, + { "Africa/Djibouti" , 0x002843 }, + { "Africa/Douala" , 0x002958 }, + { "Africa/El_Aaiun" , 0x002A4F }, + { "Africa/Freetown" , 0x003352 }, + { "Africa/Gaborone" , 0x0033F2 }, + { "Africa/Harare" , 0x003493 }, + { "Africa/Johannesburg" , 0x003534 }, + { "Africa/Juba" , 0x003636 }, + { "Africa/Kampala" , 0x0038E9 }, + { "Africa/Khartoum" , 0x0039FE }, + { "Africa/Kigali" , 0x003CB1 }, + { "Africa/Kinshasa" , 0x003D52 }, + { "Africa/Lagos" , 0x003E62 }, + { "Africa/Libreville" , 0x003F59 }, + { "Africa/Lome" , 0x004050 }, + { "Africa/Luanda" , 0x0040F0 }, + { "Africa/Lubumbashi" , 0x0041E7 }, + { "Africa/Lusaka" , 0x0042A1 }, + { "Africa/Malabo" , 0x004342 }, + { "Africa/Maputo" , 0x004439 }, + { "Africa/Maseru" , 0x0044DA }, + { "Africa/Mbabane" , 0x0045DC }, + { "Africa/Mogadishu" , 0x0046DE }, + { "Africa/Monrovia" , 0x0047F3 }, + { "Africa/Nairobi" , 0x0048CF }, + { "Africa/Ndjamena" , 0x0049E4 }, + { "Africa/Niamey" , 0x004AB7 }, + { "Africa/Nouakchott" , 0x004BAE }, + { "Africa/Ouagadougou" , 0x004C4E }, + { "Africa/Porto-Novo" , 0x004CEE }, + { "Africa/Sao_Tome" , 0x004DE5 }, + { "Africa/Timbuktu" , 0x004EEF }, + { "Africa/Tripoli" , 0x004F8F }, + { "Africa/Tunis" , 0x00520C }, + { "Africa/Windhoek" , 0x0054C9 }, + { "America/Adak" , 0x005890 }, + { "America/Anchorage" , 0x0061E0 }, + { "America/Anguilla" , 0x006B42 }, + { "America/Antigua" , 0x006C44 }, + { "America/Araguaina" , 0x006D46 }, + { "America/Argentina/Buenos_Aires" , 0x0070CF }, + { "America/Argentina/Catamarca" , 0x007524 }, + { "America/Argentina/ComodRivadavia" , 0x00797F }, + { "America/Argentina/Cordoba" , 0x007DBF }, + { "America/Argentina/Jujuy" , 0x008235 }, + { "America/Argentina/La_Rioja" , 0x008663 }, + { "America/Argentina/Mendoza" , 0x008ABE }, + { "America/Argentina/Rio_Gallegos" , 0x008F0A }, + { "America/Argentina/Salta" , 0x009359 }, + { "America/Argentina/San_Juan" , 0x009793 }, + { "America/Argentina/San_Luis" , 0x009BEE }, + { "America/Argentina/Tucuman" , 0x00A055 }, + { "America/Argentina/Ushuaia" , 0x00A4BD }, + { "America/Aruba" , 0x00A912 }, + { "America/Asuncion" , 0x00AA14 }, + { "America/Atikokan" , 0x00B21C }, + { "America/Atka" , 0x00B2FF }, + { "America/Bahia" , 0x00BC3F }, + { "America/Bahia_Banderas" , 0x00C050 }, + { "America/Barbados" , 0x00C686 }, + { "America/Belem" , 0x00C846 }, + { "America/Belize" , 0x00CAA4 }, + { "America/Blanc-Sablon" , 0x00D0FE }, + { "America/Boa_Vista" , 0x00D21C }, + { "America/Bogota" , 0x00D4A7 }, + { "America/Boise" , 0x00D5A9 }, + { "America/Buenos_Aires" , 0x00DF2F }, + { "America/Cambridge_Bay" , 0x00E36F }, + { "America/Campo_Grande" , 0x00EBB3 }, + { "America/Cancun" , 0x00F175 }, + { "America/Caracas" , 0x00F4B3 }, + { "America/Catamarca" , 0x00F5C7 }, + { "America/Cayenne" , 0x00FA07 }, + { "America/Cayman" , 0x00FAD9 }, + { "America/Chicago" , 0x00FB9B }, + { "America/Chihuahua" , 0x0109B3 }, + { "America/Coral_Harbour" , 0x010FB1 }, + { "America/Cordoba" , 0x011073 }, + { "America/Costa_Rica" , 0x0114B3 }, + { "America/Creston" , 0x0115FB }, + { "America/Cuiaba" , 0x011761 }, + { "America/Curacao" , 0x011D00 }, + { "America/Danmarkshavn" , 0x011E02 }, + { "America/Dawson" , 0x0120E2 }, + { "America/Dawson_Creek" , 0x01274E }, + { "America/Denver" , 0x012B94 }, + { "America/Detroit" , 0x013541 }, + { "America/Dominica" , 0x013E1C }, + { "America/Edmonton" , 0x013F1E }, + { "America/Eirunepe" , 0x014863 }, + { "America/El_Salvador" , 0x014B0E }, + { "America/Ensenada" , 0x014BFA }, + { "America/Fort_Nelson" , 0x01552C }, + { "America/Fort_Wayne" , 0x015E0C }, + { "America/Fortaleza" , 0x01649A }, + { "America/Glace_Bay" , 0x016798 }, + { "America/Godthab" , 0x01704F }, + { "America/Goose_Bay" , 0x0177B1 }, + { "America/Grand_Turk" , 0x018467 }, + { "America/Grenada" , 0x018B9D }, + { "America/Guadeloupe" , 0x018C9F }, + { "America/Guatemala" , 0x018DA1 }, + { "America/Guayaquil" , 0x018EC5 }, + { "America/Guyana" , 0x018FD9 }, + { "America/Halifax" , 0x0190EB }, + { "America/Havana" , 0x019E75 }, + { "America/Hermosillo" , 0x01A7F1 }, + { "America/Indiana/Indianapolis" , 0x01A9BC }, + { "America/Indiana/Knox" , 0x01B063 }, + { "America/Indiana/Marengo" , 0x01BA00 }, + { "America/Indiana/Petersburg" , 0x01C0DD }, + { "America/Indiana/Tell_City" , 0x01C86C }, + { "America/Indiana/Vevay" , 0x01CF20 }, + { "America/Indiana/Vincennes" , 0x01D4CC }, + { "America/Indiana/Winamac" , 0x01DB92 }, + { "America/Indianapolis" , 0x01E2A6 }, + { "America/Inuvik" , 0x01E934 }, + { "America/Iqaluit" , 0x01F0BA }, + { "America/Jamaica" , 0x01F8D4 }, + { "America/Jujuy" , 0x01FAC2 }, + { "America/Juneau" , 0x01FEE6 }, + { "America/Kentucky/Louisville" , 0x020837 }, + { "America/Kentucky/Monticello" , 0x021335 }, + { "America/Knox_IN" , 0x021C85 }, + { "America/Kralendijk" , 0x02260D }, + { "America/La_Paz" , 0x02270F }, + { "America/Lima" , 0x022803 }, + { "America/Los_Angeles" , 0x0229A5 }, + { "America/Louisville" , 0x0234CC }, + { "America/Lower_Princes" , 0x023FAC }, + { "America/Maceio" , 0x0240AE }, + { "America/Managua" , 0x0243B2 }, + { "America/Manaus" , 0x02456C }, + { "America/Marigot" , 0x0247E3 }, + { "America/Martinique" , 0x0248E5 }, + { "America/Matamoros" , 0x0249D9 }, + { "America/Mazatlan" , 0x024F91 }, + { "America/Mendoza" , 0x0255C8 }, + { "America/Menominee" , 0x025A08 }, + { "America/Merida" , 0x026315 }, + { "America/Metlakatla" , 0x0268CF }, + { "America/Mexico_City" , 0x026E81 }, + { "America/Miquelon" , 0x0274C9 }, + { "America/Moncton" , 0x027B57 }, + { "America/Monterrey" , 0x0287CD }, + { "America/Montevideo" , 0x028D8C }, + { "America/Montreal" , 0x02937E }, + { "America/Montserrat" , 0x02A130 }, + { "America/Nassau" , 0x02A232 }, + { "America/New_York" , 0x02AFE4 }, + { "America/Nipigon" , 0x02BDD4 }, + { "America/Nome" , 0x02C64B }, + { "America/Noronha" , 0x02CFA3 }, + { "America/North_Dakota/Beulah" , 0x02D28B }, + { "America/North_Dakota/Center" , 0x02DBF8 }, + { "America/North_Dakota/New_Salem" , 0x02E565 }, + { "America/Nuuk" , 0x02EED8 }, + { "America/Ojinaga" , 0x02F650 }, + { "America/Panama" , 0x02FC50 }, + { "America/Pangnirtung" , 0x02FD12 }, + { "America/Paramaribo" , 0x030566 }, + { "America/Phoenix" , 0x030678 }, + { "America/Port-au-Prince" , 0x0307E9 }, + { "America/Port_of_Spain" , 0x030D8F }, + { "America/Porto_Acre" , 0x030E91 }, + { "America/Porto_Velho" , 0x031111 }, + { "America/Puerto_Rico" , 0x031365 }, + { "America/Punta_Arenas" , 0x031467 }, + { "America/Rainy_River" , 0x031BF5 }, + { "America/Rankin_Inlet" , 0x03246D }, + { "America/Recife" , 0x032BF3 }, + { "America/Regina" , 0x032ED5 }, + { "America/Resolute" , 0x0332CA }, + { "America/Rio_Branco" , 0x033A51 }, + { "America/Rosario" , 0x033CD5 }, + { "America/Santa_Isabel" , 0x034115 }, + { "America/Santarem" , 0x034A47 }, + { "America/Santiago" , 0x034CB8 }, + { "America/Santo_Domingo" , 0x0356B7 }, + { "America/Sao_Paulo" , 0x03588D }, + { "America/Scoresbysund" , 0x035E73 }, + { "America/Shiprock" , 0x036618 }, + { "America/Sitka" , 0x036FB0 }, + { "America/St_Barthelemy" , 0x0378E8 }, + { "America/St_Johns" , 0x0379EA }, + { "America/St_Kitts" , 0x03885F }, + { "America/St_Lucia" , 0x038961 }, + { "America/St_Thomas" , 0x038A63 }, + { "America/St_Vincent" , 0x038B65 }, + { "America/Swift_Current" , 0x038C67 }, + { "America/Tegucigalpa" , 0x038EB5 }, + { "America/Thule" , 0x038FBD }, + { "America/Thunder_Bay" , 0x0395B5 }, + { "America/Tijuana" , 0x039E75 }, + { "America/Toronto" , 0x03A7C8 }, + { "America/Tortola" , 0x03B597 }, + { "America/Vancouver" , 0x03B699 }, + { "America/Virgin" , 0x03C20A }, + { "America/Whitehorse" , 0x03C30C }, + { "America/Winnipeg" , 0x03C978 }, + { "America/Yakutat" , 0x03D4D5 }, + { "America/Yellowknife" , 0x03DDF2 }, + { "Antarctica/Casey" , 0x03E5C3 }, + { "Antarctica/Davis" , 0x03E754 }, + { "Antarctica/DumontDUrville" , 0x03E88E }, + { "Antarctica/Macquarie" , 0x03E964 }, + { "Antarctica/Mawson" , 0x03F254 }, + { "Antarctica/McMurdo" , 0x03F32D }, + { "Antarctica/Palmer" , 0x03FCE4 }, + { "Antarctica/Rothera" , 0x040280 }, + { "Antarctica/South_Pole" , 0x040337 }, + { "Antarctica/Syowa" , 0x040CC8 }, + { "Antarctica/Troll" , 0x040D7E }, + { "Antarctica/Vostok" , 0x041219 }, + { "Arctic/Longyearbyen" , 0x0412D0 }, + { "Asia/Aden" , 0x041B90 }, + { "Asia/Almaty" , 0x041C41 }, + { "Asia/Amman" , 0x042049 }, + { "Asia/Anadyr" , 0x042792 }, + { "Asia/Aqtau" , 0x042C55 }, + { "Asia/Aqtobe" , 0x04304D }, + { "Asia/Ashgabat" , 0x043459 }, + { "Asia/Ashkhabad" , 0x0436D0 }, + { "Asia/Atyrau" , 0x043947 }, + { "Asia/Baghdad" , 0x043D47 }, + { "Asia/Bahrain" , 0x04412A }, + { "Asia/Baku" , 0x0441FD }, + { "Asia/Bangkok" , 0x0446D4 }, + { "Asia/Barnaul" , 0x0447A7 }, + { "Asia/Beirut" , 0x044C86 }, + { "Asia/Bishkek" , 0x0454FC }, + { "Asia/Brunei" , 0x0458DF }, + { "Asia/Calcutta" , 0x0459B6 }, + { "Asia/Chita" , 0x045ADF }, + { "Asia/Choibalsan" , 0x045FC4 }, + { "Asia/Chongqing" , 0x046397 }, + { "Asia/Chungking" , 0x0465D4 }, + { "Asia/Colombo" , 0x046811 }, + { "Asia/Dacca" , 0x046991 }, + { "Asia/Damascus" , 0x046AEE }, + { "Asia/Dhaka" , 0x0473F0 }, + { "Asia/Dili" , 0x04754D }, + { "Asia/Dubai" , 0x04763C }, + { "Asia/Dushanbe" , 0x0476ED }, + { "Asia/Famagusta" , 0x047948 }, + { "Asia/Gaza" , 0x04814F }, + { "Asia/Harbin" , 0x048ADB }, + { "Asia/Hebron" , 0x048D18 }, + { "Asia/Ho_Chi_Minh" , 0x0496BF }, + { "Asia/Hong_Kong" , 0x04982A }, + { "Asia/Hovd" , 0x049CE9 }, + { "Asia/Irkutsk" , 0x04A09B }, + { "Asia/Istanbul" , 0x04A59C }, + { "Asia/Jakarta" , 0x04AD43 }, + { "Asia/Jayapura" , 0x04AEBF }, + { "Asia/Jerusalem" , 0x04AFDE }, + { "Asia/Kabul" , 0x04B93E }, + { "Asia/Kamchatka" , 0x04BA1A }, + { "Asia/Karachi" , 0x04BEC6 }, + { "Asia/Kashgar" , 0x04C04D }, + { "Asia/Kathmandu" , 0x04C0FE }, + { "Asia/Katmandu" , 0x04C1DE }, + { "Asia/Khandyga" , 0x04C2BE }, + { "Asia/Kolkata" , 0x04C7DF }, + { "Asia/Krasnoyarsk" , 0x04C908 }, + { "Asia/Kuala_Lumpur" , 0x04CDE4 }, + { "Asia/Kuching" , 0x04CF83 }, + { "Asia/Kuwait" , 0x04D180 }, + { "Asia/Macao" , 0x04D231 }, + { "Asia/Macau" , 0x04D708 }, + { "Asia/Magadan" , 0x04DBDF }, + { "Asia/Makassar" , 0x04E0C1 }, + { "Asia/Manila" , 0x04E214 }, + { "Asia/Muscat" , 0x04E368 }, + { "Asia/Nicosia" , 0x04E419 }, + { "Asia/Novokuznetsk" , 0x04EC0A }, + { "Asia/Novosibirsk" , 0x04F0B4 }, + { "Asia/Omsk" , 0x04F599 }, + { "Asia/Oral" , 0x04FA69 }, + { "Asia/Phnom_Penh" , 0x04FE71 }, + { "Asia/Pontianak" , 0x04FF44 }, + { "Asia/Pyongyang" , 0x0500C7 }, + { "Asia/Qatar" , 0x0501C0 }, + { "Asia/Qostanay" , 0x050293 }, + { "Asia/Qyzylorda" , 0x0506AC }, + { "Asia/Rangoon" , 0x050AD6 }, + { "Asia/Riyadh" , 0x050BEE }, + { "Asia/Saigon" , 0x050C9F }, + { "Asia/Sakhalin" , 0x050E0A }, + { "Asia/Samarkand" , 0x0512E0 }, + { "Asia/Seoul" , 0x05153E }, + { "Asia/Shanghai" , 0x0517B3 }, + { "Asia/Singapore" , 0x0519FC }, + { "Asia/Srednekolymsk" , 0x051B87 }, + { "Asia/Taipei" , 0x05206D }, + { "Asia/Tashkent" , 0x052372 }, + { "Asia/Tbilisi" , 0x0525DE }, + { "Asia/Tehran" , 0x0529F5 }, + { "Asia/Tel_Aviv" , 0x053417 }, + { "Asia/Thimbu" , 0x053D77 }, + { "Asia/Thimphu" , 0x053E4E }, + { "Asia/Tokyo" , 0x053F25 }, + { "Asia/Tomsk" , 0x054066 }, + { "Asia/Ujung_Pandang" , 0x054545 }, + { "Asia/Ulaanbaatar" , 0x05464F }, + { "Asia/Ulan_Bator" , 0x0549EB }, + { "Asia/Urumqi" , 0x054D72 }, + { "Asia/Ust-Nera" , 0x054E30 }, + { "Asia/Vientiane" , 0x055334 }, + { "Asia/Vladivostok" , 0x055407 }, + { "Asia/Yakutsk" , 0x0558DE }, + { "Asia/Yangon" , 0x055DB4 }, + { "Asia/Yekaterinburg" , 0x055ECC }, + { "Asia/Yerevan" , 0x0563C1 }, + { "Atlantic/Azores" , 0x05684C }, + { "Atlantic/Bermuda" , 0x057616 }, + { "Atlantic/Canary" , 0x057F7E }, + { "Atlantic/Cape_Verde" , 0x058701 }, + { "Atlantic/Faeroe" , 0x05881B }, + { "Atlantic/Faroe" , 0x058F3E }, + { "Atlantic/Jan_Mayen" , 0x059661 }, + { "Atlantic/Madeira" , 0x059F21 }, + { "Atlantic/Reykjavik" , 0x05ACEB }, + { "Atlantic/South_Georgia" , 0x05B181 }, + { "Atlantic/St_Helena" , 0x05B231 }, + { "Atlantic/Stanley" , 0x05B2D1 }, + { "Australia/ACT" , 0x05B79B }, + { "Australia/Adelaide" , 0x05C035 }, + { "Australia/Brisbane" , 0x05C8F0 }, + { "Australia/Broken_Hill" , 0x05CAB6 }, + { "Australia/Canberra" , 0x05D393 }, + { "Australia/Currie" , 0x05DC2D }, + { "Australia/Darwin" , 0x05E56F }, + { "Australia/Eucla" , 0x05E6D2 }, + { "Australia/Hobart" , 0x05E8CD }, + { "Australia/LHI" , 0x05F217 }, + { "Australia/Lindeman" , 0x05F967 }, + { "Australia/Lord_Howe" , 0x05FB6D }, + { "Australia/Melbourne" , 0x0602CD }, + { "Australia/North" , 0x060B6F }, + { "Australia/NSW" , 0x060CC0 }, + { "Australia/Perth" , 0x06155A }, + { "Australia/Queensland" , 0x061742 }, + { "Australia/South" , 0x0618F1 }, + { "Australia/Sydney" , 0x06219D }, + { "Australia/Tasmania" , 0x062A53 }, + { "Australia/Victoria" , 0x063395 }, + { "Australia/West" , 0x063C2F }, + { "Australia/Yancowinna" , 0x063DF9 }, + { "Brazil/Acre" , 0x0646BA }, + { "Brazil/DeNoronha" , 0x06493A }, + { "Brazil/East" , 0x064C12 }, + { "Brazil/West" , 0x0651C2 }, + { "Canada/Atlantic" , 0x06542A }, + { "Canada/Central" , 0x066196 }, + { "Canada/Eastern" , 0x066CD6 }, + { "Canada/Mountain" , 0x067A88 }, + { "Canada/Newfoundland" , 0x0683B0 }, + { "Canada/Pacific" , 0x069203 }, + { "Canada/Saskatchewan" , 0x069D5B }, + { "Canada/Yukon" , 0x06A13B }, + { "CET" , 0x06A795 }, + { "Chile/Continental" , 0x06AFCF }, + { "Chile/EasterIsland" , 0x06B9BC }, + { "CST6CDT" , 0x06C281 }, + { "Cuba" , 0x06CB93 }, + { "EET" , 0x06D50F }, + { "Egypt" , 0x06DC8F }, + { "Eire" , 0x06E43E }, + { "EST" , 0x06F1EE }, + { "EST5EDT" , 0x06F26C }, + { "Etc/GMT" , 0x06FB7E }, + { "Etc/GMT+0" , 0x06FBFC }, + { "Etc/GMT+1" , 0x06FC7A }, + { "Etc/GMT+10" , 0x06FCFA }, + { "Etc/GMT+11" , 0x06FD7B }, + { "Etc/GMT+12" , 0x06FDFC }, + { "Etc/GMT+2" , 0x06FE7D }, + { "Etc/GMT+3" , 0x06FEFD }, + { "Etc/GMT+4" , 0x06FF7D }, + { "Etc/GMT+5" , 0x06FFFD }, + { "Etc/GMT+6" , 0x07007D }, + { "Etc/GMT+7" , 0x0700FD }, + { "Etc/GMT+8" , 0x07017D }, + { "Etc/GMT+9" , 0x0701FD }, + { "Etc/GMT-0" , 0x07027D }, + { "Etc/GMT-1" , 0x0702FB }, + { "Etc/GMT-10" , 0x07037C }, + { "Etc/GMT-11" , 0x0703FE }, + { "Etc/GMT-12" , 0x070480 }, + { "Etc/GMT-13" , 0x070502 }, + { "Etc/GMT-14" , 0x070584 }, + { "Etc/GMT-2" , 0x070606 }, + { "Etc/GMT-3" , 0x070687 }, + { "Etc/GMT-4" , 0x070708 }, + { "Etc/GMT-5" , 0x070789 }, + { "Etc/GMT-6" , 0x07080A }, + { "Etc/GMT-7" , 0x07088B }, + { "Etc/GMT-8" , 0x07090C }, + { "Etc/GMT-9" , 0x07098D }, + { "Etc/GMT0" , 0x070A0E }, + { "Etc/Greenwich" , 0x070A8C }, + { "Etc/UCT" , 0x070B0A }, + { "Etc/Universal" , 0x070B88 }, + { "Etc/UTC" , 0x070C06 }, + { "Etc/Zulu" , 0x070C84 }, + { "Europe/Amsterdam" , 0x070D02 }, + { "Europe/Andorra" , 0x07186C }, + { "Europe/Astrakhan" , 0x071F46 }, + { "Europe/Athens" , 0x0723F1 }, + { "Europe/Belfast" , 0x072CD3 }, + { "Europe/Belgrade" , 0x073B1F }, + { "Europe/Berlin" , 0x0742AB }, + { "Europe/Bratislava" , 0x074BC5 }, + { "Europe/Brussels" , 0x0754CE }, + { "Europe/Bucharest" , 0x07604F }, + { "Europe/Budapest" , 0x0768E3 }, + { "Europe/Busingen" , 0x07722F }, + { "Europe/Chisinau" , 0x0779B8 }, + { "Europe/Copenhagen" , 0x07831A }, + { "Europe/Dublin" , 0x078B7F }, + { "Europe/Gibraltar" , 0x07992F }, + { "Europe/Guernsey" , 0x07A527 }, + { "Europe/Helsinki" , 0x07B373 }, + { "Europe/Isle_of_Man" , 0x07BAEB }, + { "Europe/Istanbul" , 0x07C937 }, + { "Europe/Jersey" , 0x07D0DE }, + { "Europe/Kaliningrad" , 0x07DF2A }, + { "Europe/Kiev" , 0x07E51F }, + { "Europe/Kirov" , 0x07ED67 }, + { "Europe/Lisbon" , 0x07F202 }, + { "Europe/Ljubljana" , 0x07FFCA }, + { "Europe/London" , 0x080756 }, + { "Europe/Luxembourg" , 0x0815A2 }, + { "Europe/Madrid" , 0x082130 }, + { "Europe/Malta" , 0x082B82 }, + { "Europe/Mariehamn" , 0x0835CA }, + { "Europe/Minsk" , 0x083D42 }, + { "Europe/Monaco" , 0x084277 }, + { "Europe/Moscow" , 0x084E03 }, + { "Europe/Nicosia" , 0x085422 }, + { "Europe/Oslo" , 0x085C00 }, + { "Europe/Paris" , 0x0864C0 }, + { "Europe/Podgorica" , 0x08705E }, + { "Europe/Prague" , 0x0877EA }, + { "Europe/Riga" , 0x0880F3 }, + { "Europe/Rome" , 0x088995 }, + { "Europe/Samara" , 0x0893F2 }, + { "Europe/San_Marino" , 0x0898D6 }, + { "Europe/Sarajevo" , 0x08A333 }, + { "Europe/Saratov" , 0x08AABF }, + { "Europe/Simferopol" , 0x08AF7A }, + { "Europe/Skopje" , 0x08B539 }, + { "Europe/Sofia" , 0x08BCC5 }, + { "Europe/Stockholm" , 0x08C4EE }, + { "Europe/Tallinn" , 0x08CC6F }, + { "Europe/Tirane" , 0x08D4DF }, + { "Europe/Tiraspol" , 0x08DD0F }, + { "Europe/Ulyanovsk" , 0x08E671 }, + { "Europe/Uzhgorod" , 0x08EB82 }, + { "Europe/Vaduz" , 0x08F39E }, + { "Europe/Vatican" , 0x08FB1F }, + { "Europe/Vienna" , 0x09057C }, + { "Europe/Vilnius" , 0x090E20 }, + { "Europe/Volgograd" , 0x09169E }, + { "Europe/Warsaw" , 0x091B49 }, + { "Europe/Zagreb" , 0x0925B3 }, + { "Europe/Zaporozhye" , 0x092D3F }, + { "Europe/Zurich" , 0x0935A0 }, + { "Factory" , 0x093D21 }, + { "GB" , 0x093DA1 }, + { "GB-Eire" , 0x094BED }, + { "GMT" , 0x095A39 }, + { "GMT+0" , 0x095AB7 }, + { "GMT-0" , 0x095B35 }, + { "GMT0" , 0x095BB3 }, + { "Greenwich" , 0x095C31 }, + { "Hongkong" , 0x095CAF }, + { "HST" , 0x09616E }, + { "Iceland" , 0x0961ED }, + { "Indian/Antananarivo" , 0x096683 }, + { "Indian/Chagos" , 0x096798 }, + { "Indian/Christmas" , 0x09686B }, + { "Indian/Cocos" , 0x09691C }, + { "Indian/Comoro" , 0x0969D6 }, + { "Indian/Kerguelen" , 0x096AEB }, + { "Indian/Mahe" , 0x096B9C }, + { "Indian/Maldives" , 0x096C4D }, + { "Indian/Mauritius" , 0x096D20 }, + { "Indian/Mayotte" , 0x096E1D }, + { "Indian/Reunion" , 0x096F32 }, + { "Iran" , 0x096FE3 }, + { "Israel" , 0x097A05 }, + { "Jamaica" , 0x098365 }, + { "Japan" , 0x098553 }, + { "Kwajalein" , 0x098694 }, + { "Libya" , 0x0987DC }, + { "MET" , 0x098A59 }, + { "Mexico/BajaNorte" , 0x099293 }, + { "Mexico/BajaSur" , 0x099BC5 }, + { "Mexico/General" , 0x09A1C7 }, + { "MST" , 0x09A803 }, + { "MST7MDT" , 0x09A881 }, + { "Navajo" , 0x09B193 }, + { "NZ" , 0x09BB2B }, + { "NZ-CHAT" , 0x09C4BC }, + { "Pacific/Apia" , 0x09CCDC }, + { "Pacific/Auckland" , 0x09CF4C }, + { "Pacific/Bougainville" , 0x09D8F5 }, + { "Pacific/Chatham" , 0x09DA19 }, + { "Pacific/Chuuk" , 0x09E248 }, + { "Pacific/Easter" , 0x09E370 }, + { "Pacific/Efate" , 0x09EC42 }, + { "Pacific/Enderbury" , 0x09EE68 }, + { "Pacific/Fakaofo" , 0x09EF5E }, + { "Pacific/Fiji" , 0x09F032 }, + { "Pacific/Funafuti" , 0x09F473 }, + { "Pacific/Galapagos" , 0x09F525 }, + { "Pacific/Gambier" , 0x09F630 }, + { "Pacific/Guadalcanal" , 0x09F6EF }, + { "Pacific/Guam" , 0x09F7A1 }, + { "Pacific/Honolulu" , 0x09F99B }, + { "Pacific/Johnston" , 0x09FAF6 }, + { "Pacific/Kanton" , 0x09FC4B }, + { "Pacific/Kiritimati" , 0x09FD50 }, + { "Pacific/Kosrae" , 0x09FE56 }, + { "Pacific/Kwajalein" , 0x09FFC7 }, + { "Pacific/Majuro" , 0x0A0118 }, + { "Pacific/Marquesas" , 0x0A0277 }, + { "Pacific/Midway" , 0x0A0341 }, + { "Pacific/Nauru" , 0x0A040A }, + { "Pacific/Niue" , 0x0A0512 }, + { "Pacific/Norfolk" , 0x0A05E9 }, + { "Pacific/Noumea" , 0x0A0965 }, + { "Pacific/Pago_Pago" , 0x0A0AA1 }, + { "Pacific/Palau" , 0x0A0B5C }, + { "Pacific/Pitcairn" , 0x0A0C1C }, + { "Pacific/Pohnpei" , 0x0A0CF2 }, + { "Pacific/Ponape" , 0x0A0E3B }, + { "Pacific/Port_Moresby" , 0x0A0F76 }, + { "Pacific/Rarotonga" , 0x0A1059 }, + { "Pacific/Saipan" , 0x0A12C0 }, + { "Pacific/Samoa" , 0x0A14BA }, + { "Pacific/Tahiti" , 0x0A1575 }, + { "Pacific/Tarawa" , 0x0A1635 }, + { "Pacific/Tongatapu" , 0x0A16F6 }, + { "Pacific/Truk" , 0x0A1876 }, + { "Pacific/Wake" , 0x0A198F }, + { "Pacific/Wallis" , 0x0A1A4C }, + { "Pacific/Yap" , 0x0A1AFE }, + { "Poland" , 0x0A1C17 }, + { "Portugal" , 0x0A2681 }, + { "PRC" , 0x0A3436 }, + { "PST8PDT" , 0x0A3673 }, + { "ROC" , 0x0A3F85 }, + { "ROK" , 0x0A428A }, + { "Singapore" , 0x0A44FF }, + { "Turkey" , 0x0A468A }, + { "UCT" , 0x0A4E31 }, + { "Universal" , 0x0A4EAF }, + { "US/Alaska" , 0x0A4F2D }, + { "US/Aleutian" , 0x0A587C }, + { "US/Arizona" , 0x0A61BC }, + { "US/Central" , 0x0A6310 }, + { "US/East-Indiana" , 0x0A7114 }, + { "US/Eastern" , 0x0A77A2 }, + { "US/Hawaii" , 0x0A857E }, + { "US/Indiana-Starke" , 0x0A86D3 }, + { "US/Michigan" , 0x0A905B }, + { "US/Mountain" , 0x0A991D }, + { "US/Pacific" , 0x0AA2B5 }, + { "US/Samoa" , 0x0AADD5 }, + { "UTC" , 0x0AAE90 }, + { "W-SU" , 0x0AAF0E }, + { "WET" , 0x0AB519 }, + { "Zulu" , 0x0ABC96 }, }; -const unsigned char timelib_timezone_db_data_builtin[702099] = { +const unsigned char timelib_timezone_db_data_builtin[703764] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -23943,70 +24038,13 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Africa/Accra */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x9A, 0x1D, 0x94, 0x34, -0xA1, 0xC0, 0xB4, 0x80, 0xA1, 0xF2, 0xE4, 0xF0, 0xA3, 0x34, 0x97, 0xA0, 0xA3, 0xD5, 0x69, 0xF0, -0xA5, 0x15, 0xCB, 0x20, 0xA5, 0xB6, 0x9D, 0x70, 0xA6, 0xF6, 0xFE, 0xA0, 0xA7, 0x97, 0xD0, 0xF0, -0xA8, 0xD8, 0x32, 0x20, 0xA9, 0x79, 0x04, 0x70, 0xAA, 0xBA, 0xB7, 0x20, 0xAB, 0x5B, 0x89, 0x70, -0xAC, 0x9B, 0xEA, 0xA0, 0xAD, 0x3C, 0xBC, 0xF0, 0xAE, 0x7D, 0x1E, 0x20, 0xAF, 0x1D, 0xF0, 0x70, -0xB0, 0x5E, 0x51, 0xA0, 0xB0, 0xFF, 0x23, 0xF0, 0xB2, 0x40, 0xD6, 0xA0, 0xB2, 0xE1, 0xA8, 0xF0, -0xB4, 0x22, 0x0A, 0x20, 0xB4, 0xC2, 0xDC, 0x70, 0xB6, 0x03, 0x3D, 0xA0, 0xB6, 0xA4, 0x0F, 0xF0, -0xB7, 0xE4, 0x71, 0x20, 0xB8, 0x85, 0x43, 0x70, 0xB9, 0xC6, 0xF6, 0x20, 0xBA, 0x67, 0xC8, 0x70, -0xBB, 0xA8, 0x29, 0xA0, 0xBC, 0x48, 0xFB, 0xF0, 0xBD, 0x89, 0x5D, 0x20, 0xBE, 0x2A, 0x2F, 0x70, -0xBF, 0x6A, 0x90, 0xA0, 0xC0, 0x0B, 0x62, 0xF0, 0xC1, 0x4D, 0x15, 0xA0, 0xC1, 0xED, 0xE7, 0xF0, -0xC3, 0x2E, 0x49, 0x20, 0xC3, 0xCF, 0x1B, 0x70, 0xC5, 0x0F, 0x7C, 0xA0, 0xC5, 0xB0, 0x4E, 0xF0, -0xC6, 0xF0, 0xB0, 0x20, 0xC7, 0x91, 0x82, 0x70, 0xC8, 0x31, 0x0C, 0xA0, 0xC9, 0x74, 0x07, 0x70, -0xCA, 0x12, 0x40, 0x20, 0xCB, 0x55, 0x3A, 0xF0, 0xCB, 0x87, 0x3C, 0x80, 0xD2, 0xE1, 0xD3, 0x78, -0xDB, 0xA1, 0xDB, 0x20, 0xDC, 0x42, 0xAB, 0x18, 0xDD, 0x83, 0x0E, 0xA0, 0xDE, 0x23, 0xDE, 0x98, -0xDF, 0x65, 0x93, 0xA0, 0xE0, 0x06, 0x63, 0x98, 0xE1, 0x46, 0xC7, 0x20, 0xE1, 0xE7, 0x97, 0x18, -0xE3, 0x27, 0xFA, 0xA0, 0xE3, 0xC8, 0xCA, 0x98, 0xE5, 0x09, 0x2E, 0x20, 0xE5, 0xA9, 0xFE, 0x18, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0xFF, -0xCC, 0x00, 0x00, 0x00, 0x00, 0x04, 0xB0, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, -0x00, 0x07, 0x08, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x08, 0x01, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x32, 0x30, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x2B, -0x30, 0x30, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, -0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x1D, 0x94, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xC0, 0xB4, -0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0xE4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x34, 0x97, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0xD5, 0x69, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x15, 0xCB, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0x9D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0xF6, 0xFE, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x97, 0xD0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xD8, 0x32, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x04, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xBA, 0xB7, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0x5B, 0x89, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0x9B, 0xEA, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x3C, 0xBC, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x7D, 0x1E, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0x1D, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x51, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xFF, 0x23, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x40, 0xD6, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0xE1, 0xA8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x0A, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0xC2, 0xDC, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x3D, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0xA4, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x71, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x85, 0x43, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC6, 0xF6, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0xC8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xA8, 0x29, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x48, 0xFB, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0x89, 0x5D, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x2A, 0x2F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x6A, 0x90, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0B, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x4D, 0x15, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0xE7, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x2E, 0x49, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xCF, 0x1B, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x0F, 0x7C, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xB0, 0x4E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0xF0, 0xB0, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x91, 0x82, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x31, 0x0C, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x74, 0x07, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x12, 0x40, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x55, 0x3A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x87, 0x3C, -0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xE1, 0xD3, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xA1, 0xDB, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x42, 0xAB, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0x83, 0x0E, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x23, 0xDE, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x65, 0x93, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x06, 0x63, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x46, 0xC7, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xE7, 0x97, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x27, 0xFA, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xC8, 0xCA, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x09, 0x2E, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0xA9, 0xFE, 0x18, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x04, 0xB0, -0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x07, 0x08, 0x00, 0x0E, 0x00, 0x00, -0x07, 0x08, 0x01, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, -0x30, 0x32, 0x30, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x33, 0x30, 0x00, 0x0A, 0x47, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0x92, 0x48, +0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x47, 0x4D, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x92, 0x48, 0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, 0x4D, 0x54, 0x30, 0x0A, 0x00, 0x91, 0xCC, 0x38, 0x01, 0x12, 0x53, 0xDD, 0x00, 0x00, 0x00, 0x00, @@ -25854,29 +25892,41 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Anguilla */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA5, 0x19, 0xA0, 0x00, 0xB2, 0x6D, 0x15, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA5, 0x19, 0xA0, 0x00, 0xB2, 0x6D, 0x15, 0x00, 0x00, +0x00, 0x00, /* America/Antigua */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA3, 0x58, 0x68, 0x00, 0xB4, 0x5B, 0xE0, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA3, 0x58, 0x68, 0x00, 0xB4, 0x5B, 0xE0, 0x00, 0x00, +0x00, 0x00, /* America/Araguaina */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26871,18 +26921,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Aruba */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x1E, 0x2E, 0x23, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, -0x30, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, -0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9C, 0x67, 0x10, 0x00, 0xA7, -0xE5, 0xC5, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9C, 0x67, 0x10, 0x00, 0xA7, 0xE5, 0xC5, 0x00, 0x00, +0x00, 0x00, /* America/Asuncion */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27017,29 +27071,20 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Atikokan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, -0x9E, 0xB8, 0xA1, 0x80, 0x9F, 0xBA, 0xF9, 0x70, 0xC8, 0xF8, 0x57, 0x60, 0xCB, 0x88, 0xFE, 0x80, -0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0xFF, -0xFF, 0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, -0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, -0xB0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, -0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x84, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, -0xB8, 0xA1, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, -0xF8, 0x57, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, -0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, -0x04, 0x05, 0xFF, 0xFF, 0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, -0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, -0x00, 0xD3, 0xBA, 0x95, 0x00, 0x86, 0xDA, 0xC9, 0x00, 0x00, 0x00, 0x21, 0x45, 0x53, 0x54, 0x20, -0x2D, 0x20, 0x4F, 0x4E, 0x20, 0x28, 0x41, 0x74, 0x69, 0x6B, 0x6F, 0x6B, 0x61, 0x6E, 0x29, 0x3B, -0x20, 0x4E, 0x55, 0x20, 0x28, 0x43, 0x6F, 0x72, 0x61, 0x6C, 0x20, 0x48, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0x8B, 0xF4, 0x61, 0xE8, 0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, +0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, +0x45, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xF4, 0x61, 0xE8, +0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, +0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, 0x00, 0xD3, 0xBA, 0x95, 0x00, 0x86, 0xDA, 0xC9, 0x00, 0x00, +0x00, 0x21, 0x45, 0x53, 0x54, 0x20, 0x2D, 0x20, 0x4F, 0x4E, 0x20, 0x28, 0x41, 0x74, 0x69, 0x6B, +0x6F, 0x6B, 0x61, 0x6E, 0x29, 0x3B, 0x20, 0x4E, 0x55, 0x20, 0x28, 0x43, 0x6F, 0x72, 0x61, 0x6C, +0x20, 0x48, 0x29, /* America/Atka */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27364,26 +27409,34 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Barbados */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xA9, 0x79, 0x24, 0xE5, -0xB8, 0x85, 0x63, 0xE5, 0x0E, 0x00, 0xF2, 0xE0, 0x0E, 0x94, 0x8C, 0xD0, 0x0F, 0x97, 0x00, 0xE0, -0x10, 0x74, 0x6E, 0xD0, 0x11, 0x76, 0xE2, 0xE0, 0x12, 0x54, 0x50, 0xD0, 0x13, 0x5F, 0xFF, 0x60, -0x14, 0x30, 0x3E, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, -0xC8, 0x1B, 0x00, 0x00, 0xFF, 0xFF, 0xC8, 0x1B, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x41, 0x44, -0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, -0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x24, 0xE5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x85, -0x63, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x94, -0x8C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x97, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, -0x6E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x76, 0xE2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, -0x50, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x5F, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x30, -0x3E, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xC8, 0x1B, -0x00, 0x00, 0xFF, 0xFF, 0xC8, 0x1B, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9D, 0x51, 0x70, 0x00, 0xB7, -0xB0, 0xBD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0x92, 0x40, 0xA9, 0x65, +0xCB, 0xE3, 0xCB, 0xD0, 0xCC, 0x94, 0x82, 0xE0, 0xCD, 0xD6, 0x22, 0xD0, 0xCE, 0x7C, 0x4D, 0xE0, +0xCF, 0x9B, 0xA6, 0xD0, 0xD0, 0x65, 0x6A, 0x60, 0x0E, 0x00, 0xF2, 0xE0, 0x0E, 0x94, 0x8C, 0xD0, +0x0F, 0x97, 0x00, 0xE0, 0x10, 0x74, 0x6E, 0xD0, 0x11, 0x76, 0xE2, 0xE0, 0x12, 0x54, 0x50, 0xD0, +0x13, 0x5F, 0xFF, 0x60, 0x14, 0x30, 0x3E, 0x50, 0x03, 0x01, 0x02, 0x01, 0x02, 0x04, 0x02, 0x05, +0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xC8, 0x1B, 0x00, 0x00, 0xFF, 0xFF, 0xD5, +0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xCE, 0xC8, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x44, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x00, 0x01, 0x01, +0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, +0x06, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x40, 0xA9, 0x65, 0xFF, 0xFF, 0xFF, +0xFF, 0xCB, 0xE3, 0xCB, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x94, 0x82, 0xE0, 0xFF, 0xFF, 0xFF, +0xFF, 0xCD, 0xD6, 0x22, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x7C, 0x4D, 0xE0, 0xFF, 0xFF, 0xFF, +0xFF, 0xCF, 0x9B, 0xA6, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x65, 0x6A, 0x60, 0x00, 0x00, 0x00, +0x00, 0x0E, 0x00, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x94, 0x8C, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x0F, 0x97, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x6E, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x11, 0x76, 0xE2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x50, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x13, 0x5F, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x30, 0x3E, 0x50, 0x03, 0x01, 0x02, +0x01, 0x02, 0x04, 0x02, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xC8, 0x1B, +0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, +0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xCE, 0xC8, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, +0x4C, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, +0x30, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x41, +0x53, 0x54, 0x34, 0x0A, 0x00, 0x9D, 0x51, 0x70, 0x00, 0xB7, 0xB0, 0xBD, 0x00, 0x00, 0x00, 0x00, + /* America/Belem */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27531,27 +27584,23 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Blanc-Sablon */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x9E, 0xB8, 0x85, 0x60, 0x9F, 0xBA, 0xDD, 0x50, 0xCB, 0x88, 0xE2, 0x60, 0xD2, 0x23, 0xF4, 0x70, -0xD2, 0x60, 0xED, 0xD0, 0x02, 0x01, 0x02, 0x03, 0x04, 0x02, 0xFF, 0xFF, 0xCA, 0x74, 0x00, 0x00, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, -0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, -0x41, 0x53, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x39, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, -0x85, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xDD, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, -0xE2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, -0xED, 0xD0, 0x02, 0x01, 0x02, 0x03, 0x04, 0x02, 0xFF, 0xFF, 0xCA, 0x74, 0x00, 0x00, 0xFF, 0xFF, -0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x54, 0x00, 0x41, 0x53, -0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, -0x00, 0x00, 0x00, 0x01, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xD7, 0xC8, 0xE2, 0x00, 0xBB, -0x81, 0x4D, 0x00, 0x00, 0x00, 0x1C, 0x41, 0x53, 0x54, 0x20, 0x2D, 0x20, 0x51, 0x43, 0x20, 0x28, -0x4C, 0x6F, 0x77, 0x65, 0x72, 0x20, 0x4E, 0x6F, 0x72, 0x74, 0x68, 0x20, 0x53, 0x68, 0x6F, 0x72, -0x65, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xD7, 0xC8, 0xE2, 0x00, 0xBB, 0x81, 0x4D, 0x00, 0x00, +0x00, 0x1C, 0x41, 0x53, 0x54, 0x20, 0x2D, 0x20, 0x51, 0x43, 0x20, 0x28, 0x4C, 0x6F, 0x77, 0x65, +0x72, 0x20, 0x4E, 0x6F, 0x72, 0x74, 0x68, 0x20, 0x53, 0x68, 0x6F, 0x72, 0x65, 0x29, /* America/Boa_Vista */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -28575,27 +28624,18 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Coral_Harbour */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, -0x9E, 0xB8, 0xA1, 0x80, 0x9F, 0xBA, 0xF9, 0x70, 0xC8, 0xF8, 0x57, 0x60, 0xCB, 0x88, 0xFE, 0x80, -0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0xFF, -0xFF, 0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, -0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, -0xB0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, -0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x84, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, -0xB8, 0xA1, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, -0xF8, 0x57, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, -0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, -0x04, 0x05, 0xFF, 0xFF, 0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, -0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0x8B, 0xF4, 0x61, 0xE8, 0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, +0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, +0x45, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xF4, 0x61, 0xE8, +0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, +0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Cordoba */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -28694,19 +28734,27 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Creston */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, -0x9B, 0xD6, 0x4B, 0x70, 0x9E, 0xF9, 0x3B, 0x00, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0x92, 0xC4, 0x00, -0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, -0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x9E, 0xA6, 0x3A, 0x90, 0x9F, 0xBB, 0x07, 0x80, 0xA0, 0x86, 0x1C, 0x90, 0xA1, 0x9A, 0xE9, 0x80, +0xCB, 0x89, 0x0C, 0x90, 0xCF, 0x17, 0xDF, 0x1C, 0xCF, 0x8F, 0xE5, 0xAC, 0xD0, 0x81, 0x1A, 0x1C, +0xFA, 0xF8, 0x75, 0x10, 0xFB, 0xE8, 0x58, 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x03, +0x02, 0x01, 0x02, 0xFF, 0xFF, 0x96, 0xEE, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x04, 0xFF, +0xFF, 0x9D, 0x90, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, +0x44, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, -0x3D, 0x70, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD6, 0x4B, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, -0xF9, 0x3B, 0x00, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0x92, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, -0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0x4C, 0x4D, -0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, -0x00, 0xD4, 0x3F, 0xF0, 0x00, 0x60, 0xDE, 0x2D, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x54, 0x20, -0x2D, 0x20, 0x42, 0x43, 0x20, 0x28, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x6E, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x04, 0x0C, 0xB0, 0xFF, +0xFF, 0xFF, 0xFF, 0x9E, 0xA6, 0x3A, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBB, 0x07, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xA0, 0x86, 0x1C, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xE9, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xCB, 0x89, 0x0C, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x17, 0xDF, 0x1C, 0xFF, +0xFF, 0xFF, 0xFF, 0xCF, 0x8F, 0xE5, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x81, 0x1A, 0x1C, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x75, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x58, 0x00, 0x02, +0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0x96, 0xEE, 0x00, 0x00, +0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x04, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, +0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x4D, 0x57, +0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, 0x00, 0xD4, 0x3F, 0xF0, 0x00, 0x60, 0xDE, 0x2D, +0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x54, 0x20, 0x2D, 0x20, 0x42, 0x43, 0x20, 0x28, 0x43, 0x72, +0x65, 0x73, 0x74, 0x6F, 0x6E, 0x29, /* America/Cuiaba */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -28802,18 +28850,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Curacao */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x1E, 0x2E, 0x23, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, -0x30, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, -0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xEB, 0x5D, 0x00, 0xA9, -0x5F, 0x60, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xEB, 0x5D, 0x00, 0xA9, 0x5F, 0x60, 0x00, 0x00, +0x00, 0x00, /* America/Danmarkshavn */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -29343,16 +29395,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Dominica */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x44, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA0, 0xAC, 0xD0, 0x00, 0xB4, 0xF8, 0x20, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA0, 0xAC, 0xD0, 0x00, 0xB4, 0xF8, 0x20, 0x00, 0x00, +0x00, 0x00, /* America/Edmonton */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -30608,29 +30666,41 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Grenada */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xB7, 0x48, 0x00, 0xB4, 0x6F, 0x68, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xB7, 0x48, 0x00, 0xB4, 0x6F, 0x68, 0x00, 0x00, +0x00, 0x00, /* America/Guadeloupe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA2, 0x19, 0x65, 0x00, 0xB4, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA2, 0x19, 0x65, 0x00, 0xB4, 0xC4, 0x0A, 0x00, 0x00, +0x00, 0x00, /* America/Guatemala */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -30676,20 +30746,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Guyana */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x98, 0xD9, 0x79, 0x88, -0x0A, 0x7D, 0xB4, 0x3C, 0x27, 0x7F, 0xFB, 0x30, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0xFF, 0xFF, 0xC9, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x0A, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x34, -0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x92, 0x1D, 0x0F, 0x87, +0x98, 0xD9, 0x7B, 0x40, 0x0A, 0x7F, 0x05, 0xBC, 0x29, 0xD5, 0x40, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, +0x01, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, +0x04, 0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0xFF, 0xFF, 0xC7, +0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, +0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, -0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xD9, 0x79, 0x88, 0x00, 0x00, -0x00, 0x00, 0x0A, 0x7D, 0xB4, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x27, 0x7F, 0xFB, 0x30, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xC9, 0x78, 0x00, 0x00, -0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0A, 0xFF, 0xFF, 0xC7, 0xC0, -0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x93, 0xB4, 0x80, -0x00, 0xB9, 0xE7, 0x25, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x1D, 0x0F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xD9, 0x7B, +0x40, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x7F, 0x05, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x40, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, +0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x08, +0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x93, 0xB4, 0x80, 0x00, 0xB9, 0xE7, 0x25, 0x00, 0x00, +0x00, 0x00, /* America/Halifax */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33128,18 +33200,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Kralendijk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x1E, 0x2E, 0x23, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, -0x30, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, -0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, -0x79, 0xED, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, 0x79, 0xED, 0x00, 0x00, +0x00, 0x00, /* America/La_Paz */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33548,18 +33624,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Lower_Princes */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x1E, 0x2E, 0x23, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, -0x30, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, -0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, -0x74, 0xAD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, 0x74, 0xAD, 0x00, 0x00, +0x00, 0x00, /* America/Maceio */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33686,16 +33766,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Marigot */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, +0x00, 0x00, /* America/Martinique */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -35140,175 +35226,250 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, -0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, + +/* America/Montserrat */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA2, 0xD6, 0x32, 0x00, 0xB3, 0xB9, 0x1D, 0x00, 0x00, +0x00, 0x00, + +/* America/Nassau */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x2E, 0xC8, 0xA1, 0x9A, 0xB1, 0x40, +0xA2, 0x94, 0x06, 0xF0, 0xA3, 0x55, 0xA9, 0x40, 0xA4, 0x86, 0x5D, 0xF0, 0xA5, 0x28, 0x78, 0x60, +0xA6, 0x66, 0x3F, 0xF0, 0xA7, 0x0C, 0x4E, 0xE0, 0xA8, 0x46, 0x21, 0xF0, 0xA8, 0xEC, 0x30, 0xE0, +0xAA, 0x1C, 0xC9, 0x70, 0xAA, 0xD5, 0x4D, 0x60, 0xAB, 0xFC, 0xAB, 0x70, 0xAC, 0xB5, 0x2F, 0x60, +0xAD, 0xDC, 0x8D, 0x70, 0xAE, 0x95, 0x11, 0x60, 0xAF, 0xBC, 0x6F, 0x70, 0xB0, 0x7E, 0x2D, 0xE0, +0xB1, 0x9C, 0x51, 0x70, 0xB2, 0x67, 0x4A, 0x60, 0xB3, 0x7C, 0x33, 0x70, 0xB4, 0x47, 0x2C, 0x60, +0xB5, 0x5C, 0x15, 0x70, 0xB6, 0x27, 0x0E, 0x60, 0xB7, 0x3B, 0xF7, 0x70, 0xB8, 0x06, 0xF0, 0x60, +0xB9, 0x25, 0x13, 0xF0, 0xB9, 0xE6, 0xD2, 0x60, 0xBB, 0x04, 0xF5, 0xF0, 0xBB, 0xCF, 0xEE, 0xE0, +0xBC, 0xE4, 0xD7, 0xF0, 0xBD, 0xAF, 0xD0, 0xE0, 0xBE, 0xC4, 0xB9, 0xF0, 0xBF, 0x8F, 0xB2, 0xE0, +0xC0, 0xA4, 0x9B, 0xF0, 0xC1, 0x6F, 0x94, 0xE0, 0xC2, 0x84, 0x7D, 0xF0, 0xC3, 0x4F, 0x76, 0xE0, +0xC4, 0x64, 0x5F, 0xF0, 0xC5, 0x2F, 0x58, 0xE0, 0xC6, 0x4D, 0x7C, 0x70, 0xC7, 0x0F, 0x3A, 0xE0, +0xC8, 0x2D, 0x5E, 0x70, 0xCB, 0x88, 0xF0, 0x70, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xFB, 0xE0, +0xD3, 0x75, 0xE4, 0xF0, 0xD4, 0x40, 0xDD, 0xE0, 0xD5, 0x55, 0xAA, 0xD0, 0xD6, 0x20, 0xA3, 0xC0, +0xD7, 0x35, 0x8C, 0xD0, 0xD8, 0x00, 0x85, 0xC0, 0xD9, 0x15, 0x6E, 0xD0, 0xDA, 0x33, 0x76, 0x40, +0xDA, 0xFE, 0xA7, 0x70, 0xDC, 0x13, 0x74, 0x60, 0xDC, 0xDE, 0x89, 0x70, 0xDD, 0xA9, 0x82, 0x60, +0xDE, 0xBE, 0x6B, 0x70, 0xDF, 0x89, 0x64, 0x60, 0xE0, 0x9E, 0x4D, 0x70, 0xE1, 0x69, 0x46, 0x60, +0xE2, 0x7E, 0x2F, 0x70, 0xE3, 0x49, 0x28, 0x60, 0xE4, 0x5E, 0x11, 0x70, 0xE5, 0x29, 0x0A, 0x60, +0xE6, 0x47, 0x2D, 0xF0, 0xE7, 0x12, 0x26, 0xE0, 0xE8, 0x27, 0x0F, 0xF0, 0xE9, 0x16, 0xF2, 0xE0, +0xEA, 0x06, 0xF1, 0xF0, 0xEA, 0xF6, 0xD4, 0xE0, 0xEB, 0xE6, 0xD3, 0xF0, 0xEC, 0xD6, 0xB6, 0xE0, +0xED, 0xC6, 0xB5, 0xF0, 0xEE, 0xBF, 0xD3, 0x60, 0xEF, 0xAF, 0xD2, 0x70, 0xF0, 0x9F, 0xB5, 0x60, +0xF1, 0x8F, 0xB4, 0x70, 0xF2, 0x7F, 0x97, 0x60, 0xF3, 0x6F, 0x96, 0x70, 0xF4, 0x5F, 0x79, 0x60, +0xF5, 0x4F, 0x78, 0x70, 0xF6, 0x3F, 0x5B, 0x60, 0xF7, 0x2F, 0x5A, 0x70, 0xF8, 0x28, 0x77, 0xE0, +0xF9, 0x0F, 0x3C, 0x70, 0xFA, 0x08, 0x59, 0xE0, 0xFA, 0xF8, 0x58, 0xF0, 0xFB, 0xE8, 0x3B, 0xE0, +0xFC, 0xD8, 0x3A, 0xF0, 0xFD, 0xC8, 0x1D, 0xE0, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, 0xA7, 0xFF, 0xE0, +0x00, 0x97, 0xFE, 0xF0, 0x01, 0x87, 0xE1, 0xE0, 0x02, 0x77, 0xE0, 0xF0, 0x03, 0x70, 0xFE, 0x60, +0x04, 0x60, 0xFD, 0x70, 0x05, 0x50, 0xE0, 0x60, 0x06, 0x40, 0xDF, 0x70, 0x07, 0x30, 0xC2, 0x60, +0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x0A, 0x00, 0xA3, 0x70, 0x0A, 0xF0, 0x86, 0x60, +0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, +0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, +0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, +0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, +0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, 0x1C, 0xD1, 0xEC, 0x70, 0x1D, 0xC1, 0xCF, 0x60, +0x1E, 0xB1, 0xCE, 0x70, 0x1F, 0xA1, 0xB1, 0x60, 0x20, 0x76, 0x00, 0xF0, 0x21, 0x81, 0x93, 0x60, +0x22, 0x55, 0xE2, 0xF0, 0x23, 0x6A, 0xAF, 0xE0, 0x24, 0x35, 0xC4, 0xF0, 0x25, 0x4A, 0x91, 0xE0, +0x26, 0x15, 0xA6, 0xF0, 0x27, 0x2A, 0x73, 0xE0, 0x27, 0xFE, 0xC3, 0x70, 0x29, 0x0A, 0x55, 0xE0, +0x29, 0xDE, 0xA5, 0x70, 0x2A, 0xEA, 0x37, 0xE0, 0x2B, 0xBE, 0x87, 0x70, 0x2C, 0xD3, 0x54, 0x60, +0x2D, 0x9E, 0x69, 0x70, 0x2E, 0xB3, 0x36, 0x60, 0x2F, 0x7E, 0x4B, 0x70, 0x30, 0x93, 0x18, 0x60, +0x31, 0x67, 0x67, 0xF0, 0x32, 0x72, 0xFA, 0x60, 0x33, 0x47, 0x49, 0xF0, 0x34, 0x52, 0xDC, 0x60, +0x35, 0x27, 0x2B, 0xF0, 0x36, 0x32, 0xBE, 0x60, 0x37, 0x07, 0x0D, 0xF0, 0x38, 0x1B, 0xDA, 0xE0, +0x38, 0xE6, 0xEF, 0xF0, 0x39, 0xFB, 0xBC, 0xE0, 0x3A, 0xC6, 0xD1, 0xF0, 0x3B, 0xDB, 0x9E, 0xE0, +0x3C, 0xAF, 0xEE, 0x70, 0x3D, 0xBB, 0x80, 0xE0, 0x3E, 0x8F, 0xD0, 0x70, 0x3F, 0x9B, 0x62, 0xE0, +0x40, 0x6F, 0xB2, 0x70, 0x41, 0x84, 0x7F, 0x60, 0x42, 0x4F, 0x94, 0x70, 0x43, 0x64, 0x61, 0x60, +0x44, 0x2F, 0x76, 0x70, 0x45, 0x44, 0x43, 0x60, 0x45, 0xF3, 0xA8, 0xF0, 0x47, 0x2D, 0x5F, 0xE0, +0x47, 0xD3, 0x8A, 0xF0, 0x49, 0x0D, 0x41, 0xE0, 0x49, 0xB3, 0x6C, 0xF0, 0x4A, 0xED, 0x23, 0xE0, +0x4B, 0x9C, 0x89, 0x70, 0x4C, 0xD6, 0x40, 0x60, 0x4D, 0x7C, 0x6B, 0x70, 0x4E, 0xB6, 0x22, 0x60, +0x4F, 0x5C, 0x4D, 0x70, 0x50, 0x96, 0x04, 0x60, 0x51, 0x3C, 0x2F, 0x70, 0x52, 0x75, 0xE6, 0x60, +0x53, 0x1C, 0x11, 0x70, 0x54, 0x55, 0xC8, 0x60, 0x54, 0xFB, 0xF3, 0x70, 0x56, 0x35, 0xAA, 0x60, +0x56, 0xE5, 0x0F, 0xF0, 0x58, 0x1E, 0xC6, 0xE0, 0x58, 0xC4, 0xF1, 0xF0, 0x59, 0xFE, 0xA8, 0xE0, +0x5A, 0xA4, 0xD3, 0xF0, 0x5B, 0xDE, 0x8A, 0xE0, 0x5C, 0x84, 0xB5, 0xF0, 0x5D, 0xBE, 0x6C, 0xE0, +0x5E, 0x64, 0x97, 0xF0, 0x5F, 0x9E, 0x4E, 0xE0, 0x60, 0x4D, 0xB4, 0x70, 0x61, 0x87, 0x6B, 0x60, +0x62, 0x2D, 0x96, 0x70, 0x63, 0x67, 0x4D, 0x60, 0x64, 0x0D, 0x78, 0x70, 0x65, 0x47, 0x2F, 0x60, +0x65, 0xED, 0x5A, 0x70, 0x67, 0x27, 0x11, 0x60, 0x67, 0xCD, 0x3C, 0x70, 0x69, 0x06, 0xF3, 0x60, +0x69, 0xAD, 0x1E, 0x70, 0x6A, 0xE6, 0xD5, 0x60, 0x6B, 0x96, 0x3A, 0xF0, 0x6C, 0xCF, 0xF1, 0xE0, +0x6D, 0x76, 0x1C, 0xF0, 0x6E, 0xAF, 0xD3, 0xE0, 0x6F, 0x55, 0xFE, 0xF0, 0x70, 0x8F, 0xB5, 0xE0, +0x71, 0x35, 0xE0, 0xF0, 0x72, 0x6F, 0x97, 0xE0, 0x73, 0x15, 0xC2, 0xF0, 0x74, 0x4F, 0x79, 0xE0, +0x74, 0xFE, 0xDF, 0x70, 0x76, 0x38, 0x96, 0x60, 0x76, 0xDE, 0xC1, 0x70, 0x78, 0x18, 0x78, 0x60, +0x78, 0xBE, 0xA3, 0x70, 0x79, 0xF8, 0x5A, 0x60, 0x7A, 0x9E, 0x85, 0x70, 0x7B, 0xD8, 0x3C, 0x60, +0x7C, 0x7E, 0x67, 0x70, 0x7D, 0xB8, 0x1E, 0x60, 0x7E, 0x5E, 0x49, 0x70, 0x7F, 0x98, 0x00, 0x60, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x94, 0x00, 0x00, 0xFF, +0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, +0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, +0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, +0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, +0x70, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, +0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, +0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, +0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, +0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, +0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, +0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, +0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, +0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x5F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x8A, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x6C, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x23, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x89, +0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x6B, +0x70, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x4D, +0x70, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x2F, +0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x11, +0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xF3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x0F, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xC6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC4, 0xF1, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xD3, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x8A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xB5, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0x97, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xB4, +0x70, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0x96, +0x70, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x78, +0x70, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x2F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x5A, +0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x11, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x3C, +0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xF3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x1E, +0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x3A, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x1C, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xD3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x55, 0xFE, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xB5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xE0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x97, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xC2, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xDF, +0x70, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xC1, +0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xA3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0x85, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x67, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x49, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x94, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, +0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, +0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x45, +0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, +0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xAF, 0x9A, 0x6D, 0x00, 0x9C, 0xA1, 0xA8, 0x00, 0x00, 0x00, 0x00, -/* America/Montserrat */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA2, 0xD6, 0x32, 0x00, 0xB3, 0xB9, 0x1D, 0x00, 0x00, 0x00, 0x00, - - -/* America/Nassau */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x93, 0x37, 0x42, 0x8A, -0xCB, 0xF4, 0xEF, 0x50, 0xD0, 0xFA, 0x47, 0xC0, 0xD1, 0x23, 0x34, 0x50, 0xD2, 0x23, 0xF4, 0x70, -0xD2, 0x78, 0x9A, 0xC0, 0xF5, 0x4F, 0x78, 0x70, 0xF6, 0x3F, 0x5B, 0x60, 0xF7, 0x2F, 0x5A, 0x70, -0xF8, 0x28, 0x77, 0xE0, 0xF9, 0x0F, 0x3C, 0x70, 0xFA, 0x08, 0x59, 0xE0, 0xFA, 0xF8, 0x58, 0xF0, -0xFB, 0xE8, 0x3B, 0xE0, 0xFC, 0xD8, 0x3A, 0xF0, 0xFD, 0xC8, 0x1D, 0xE0, 0xFE, 0xB8, 0x1C, 0xF0, -0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x97, 0xFE, 0xF0, 0x01, 0x87, 0xE1, 0xE0, 0x02, 0x77, 0xE0, 0xF0, -0x03, 0x70, 0xFE, 0x60, 0x04, 0x60, 0xFD, 0x70, 0x05, 0x50, 0xE0, 0x60, 0x06, 0x40, 0xDF, 0x70, -0x07, 0x30, 0xC2, 0x60, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x0A, 0x00, 0xA3, 0x70, -0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, -0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, -0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, -0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, -0x1A, 0x02, 0x0B, 0x60, 0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, 0x1C, 0xD1, 0xEC, 0x70, -0x1D, 0xC1, 0xCF, 0x60, 0x1E, 0xB1, 0xCE, 0x70, 0x1F, 0xA1, 0xB1, 0x60, 0x20, 0x76, 0x00, 0xF0, -0x21, 0x81, 0x93, 0x60, 0x22, 0x55, 0xE2, 0xF0, 0x23, 0x6A, 0xAF, 0xE0, 0x24, 0x35, 0xC4, 0xF0, -0x25, 0x4A, 0x91, 0xE0, 0x26, 0x15, 0xA6, 0xF0, 0x27, 0x2A, 0x73, 0xE0, 0x27, 0xFE, 0xC3, 0x70, -0x29, 0x0A, 0x55, 0xE0, 0x29, 0xDE, 0xA5, 0x70, 0x2A, 0xEA, 0x37, 0xE0, 0x2B, 0xBE, 0x87, 0x70, -0x2C, 0xD3, 0x54, 0x60, 0x2D, 0x9E, 0x69, 0x70, 0x2E, 0xB3, 0x36, 0x60, 0x2F, 0x7E, 0x4B, 0x70, -0x30, 0x93, 0x18, 0x60, 0x31, 0x67, 0x67, 0xF0, 0x32, 0x72, 0xFA, 0x60, 0x33, 0x47, 0x49, 0xF0, -0x34, 0x52, 0xDC, 0x60, 0x35, 0x27, 0x2B, 0xF0, 0x36, 0x32, 0xBE, 0x60, 0x37, 0x07, 0x0D, 0xF0, -0x38, 0x1B, 0xDA, 0xE0, 0x38, 0xE6, 0xEF, 0xF0, 0x39, 0xFB, 0xBC, 0xE0, 0x3A, 0xC6, 0xD1, 0xF0, -0x3B, 0xDB, 0x9E, 0xE0, 0x3C, 0xAF, 0xEE, 0x70, 0x3D, 0xBB, 0x80, 0xE0, 0x3E, 0x8F, 0xD0, 0x70, -0x3F, 0x9B, 0x62, 0xE0, 0x40, 0x6F, 0xB2, 0x70, 0x41, 0x84, 0x7F, 0x60, 0x42, 0x4F, 0x94, 0x70, -0x43, 0x64, 0x61, 0x60, 0x44, 0x2F, 0x76, 0x70, 0x45, 0x44, 0x43, 0x60, 0x45, 0xF3, 0xA8, 0xF0, -0x47, 0x2D, 0x5F, 0xE0, 0x47, 0xD3, 0x8A, 0xF0, 0x49, 0x0D, 0x41, 0xE0, 0x49, 0xB3, 0x6C, 0xF0, -0x4A, 0xED, 0x23, 0xE0, 0x4B, 0x9C, 0x89, 0x70, 0x4C, 0xD6, 0x40, 0x60, 0x4D, 0x7C, 0x6B, 0x70, -0x4E, 0xB6, 0x22, 0x60, 0x4F, 0x5C, 0x4D, 0x70, 0x50, 0x96, 0x04, 0x60, 0x51, 0x3C, 0x2F, 0x70, -0x52, 0x75, 0xE6, 0x60, 0x53, 0x1C, 0x11, 0x70, 0x54, 0x55, 0xC8, 0x60, 0x54, 0xFB, 0xF3, 0x70, -0x56, 0x35, 0xAA, 0x60, 0x56, 0xE5, 0x0F, 0xF0, 0x58, 0x1E, 0xC6, 0xE0, 0x58, 0xC4, 0xF1, 0xF0, -0x59, 0xFE, 0xA8, 0xE0, 0x5A, 0xA4, 0xD3, 0xF0, 0x5B, 0xDE, 0x8A, 0xE0, 0x5C, 0x84, 0xB5, 0xF0, -0x5D, 0xBE, 0x6C, 0xE0, 0x5E, 0x64, 0x97, 0xF0, 0x5F, 0x9E, 0x4E, 0xE0, 0x60, 0x4D, 0xB4, 0x70, -0x61, 0x87, 0x6B, 0x60, 0x62, 0x2D, 0x96, 0x70, 0x63, 0x67, 0x4D, 0x60, 0x64, 0x0D, 0x78, 0x70, -0x65, 0x47, 0x2F, 0x60, 0x65, 0xED, 0x5A, 0x70, 0x67, 0x27, 0x11, 0x60, 0x67, 0xCD, 0x3C, 0x70, -0x69, 0x06, 0xF3, 0x60, 0x69, 0xAD, 0x1E, 0x70, 0x6A, 0xE6, 0xD5, 0x60, 0x6B, 0x96, 0x3A, 0xF0, -0x6C, 0xCF, 0xF1, 0xE0, 0x6D, 0x76, 0x1C, 0xF0, 0x6E, 0xAF, 0xD3, 0xE0, 0x6F, 0x55, 0xFE, 0xF0, -0x70, 0x8F, 0xB5, 0xE0, 0x71, 0x35, 0xE0, 0xF0, 0x72, 0x6F, 0x97, 0xE0, 0x73, 0x15, 0xC2, 0xF0, -0x74, 0x4F, 0x79, 0xE0, 0x74, 0xFE, 0xDF, 0x70, 0x76, 0x38, 0x96, 0x60, 0x76, 0xDE, 0xC1, 0x70, -0x78, 0x18, 0x78, 0x60, 0x78, 0xBE, 0xA3, 0x70, 0x79, 0xF8, 0x5A, 0x60, 0x7A, 0x9E, 0x85, 0x70, -0x7B, 0xD8, 0x3C, 0x60, 0x7C, 0x7E, 0x67, 0x70, 0x7D, 0xB8, 0x1E, 0x60, 0x7E, 0x5E, 0x49, 0x70, -0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, -0xB7, 0x76, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, -0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, -0x45, 0x57, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x00, 0x00, -0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x42, 0x8A, 0xFF, 0xFF, -0xFF, 0xFF, 0xCB, 0xF4, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xFA, 0x47, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD1, 0x23, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xD2, 0x78, 0x9A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, 0x00, -0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, 0x00, -0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, 0x00, -0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, 0x00, -0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, 0x00, -0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, 0x00, -0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, 0x00, -0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, 0x00, -0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, 0x00, -0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, 0x00, -0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, 0x00, -0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, 0x00, -0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x2D, 0x5F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x8A, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x49, 0x0D, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x6C, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xED, 0x23, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x89, 0x70, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xD6, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x6B, 0x70, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xB6, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x4D, 0x70, 0x00, 0x00, -0x00, 0x00, 0x50, 0x96, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x2F, 0x70, 0x00, 0x00, -0x00, 0x00, 0x52, 0x75, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x11, 0x70, 0x00, 0x00, -0x00, 0x00, 0x54, 0x55, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xF3, 0x70, 0x00, 0x00, -0x00, 0x00, 0x56, 0x35, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x0F, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x58, 0x1E, 0xC6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC4, 0xF1, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x59, 0xFE, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xD3, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xDE, 0x8A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xB5, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xBE, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0x97, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x9E, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xB4, 0x70, 0x00, 0x00, -0x00, 0x00, 0x61, 0x87, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0x96, 0x70, 0x00, 0x00, -0x00, 0x00, 0x63, 0x67, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x78, 0x70, 0x00, 0x00, -0x00, 0x00, 0x65, 0x47, 0x2F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x5A, 0x70, 0x00, 0x00, -0x00, 0x00, 0x67, 0x27, 0x11, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x3C, 0x70, 0x00, 0x00, -0x00, 0x00, 0x69, 0x06, 0xF3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x1E, 0x70, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xE6, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x3A, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xCF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x1C, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xAF, 0xD3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x55, 0xFE, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x70, 0x8F, 0xB5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xE0, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x72, 0x6F, 0x97, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xC2, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x74, 0x4F, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xDF, 0x70, 0x00, 0x00, -0x00, 0x00, 0x76, 0x38, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xC1, 0x70, 0x00, 0x00, -0x00, 0x00, 0x78, 0x18, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xA3, 0x70, 0x00, 0x00, -0x00, 0x00, 0x79, 0xF8, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0x85, 0x70, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xD8, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x67, 0x70, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xB8, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x49, 0x70, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0xFF, 0xFF, 0xB7, 0x76, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, -0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, -0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x45, 0x44, -0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x45, 0x53, 0x54, -0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, -0x31, 0x2E, 0x30, 0x0A, 0x00, 0xAF, 0x9A, 0x6D, 0x00, 0x9C, 0xA1, 0xA8, 0x00, 0x00, 0x00, 0x00, - - /* America/New_York */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, @@ -36847,16 +37008,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Port_of_Spain */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0x99, 0x94, 0x68, 0x00, 0xB4, 0xCA, 0x8D, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x99, 0x94, 0x68, 0x00, 0xB4, 0xCA, 0x8D, 0x00, 0x00, +0x00, 0x00, /* America/Porto_Acre */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -38612,16 +38779,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/St_Barthelemy */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, +0x00, 0x00, /* America/St_Johns */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -38859,55 +39032,79 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/St_Kitts */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA3, 0xBA, 0x10, 0x00, 0xB2, 0xF5, 0xCD, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA3, 0xBA, 0x10, 0x00, 0xB2, 0xF5, 0xCD, 0x00, 0x00, +0x00, 0x00, /* America/St_Lucia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0x9E, 0xB7, 0x82, 0x00, 0xB5, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9E, 0xB7, 0x82, 0x00, 0xB5, 0x94, 0x60, 0x00, 0x00, +0x00, 0x00, /* America/St_Thomas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA5, 0x54, 0x38, 0x00, 0xAF, 0x93, 0xEA, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA5, 0x54, 0x38, 0x00, 0xAF, 0x93, 0xEA, 0x00, 0x00, +0x00, 0x00, /* America/St_Vincent */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0x9D, 0x64, 0xF8, 0x00, 0xB5, 0x39, 0x3A, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9D, 0x64, 0xF8, 0x00, 0xB5, 0x39, 0x3A, 0x00, 0x00, +0x00, 0x00, /* America/Swift_Current */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -39585,16 +39782,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Tortola */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA5, 0x7B, 0x48, 0x00, 0xB0, 0x0F, 0x9D, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA5, 0x7B, 0x48, 0x00, 0xB0, 0x0F, 0x9D, 0x00, 0x00, +0x00, 0x00, /* America/Vancouver */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -39784,16 +39987,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* America/Virgin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Whitehorse */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -40413,18 +40622,18 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Antarctica/DumontDUrville */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xD4, 0xBC, 0x76, 0x80, -0xDE, 0x34, 0x60, 0x60, 0xE7, 0x3C, 0x02, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, -0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, +0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, -0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0xBC, 0x76, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x34, 0x60, 0x60, -0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x3C, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, -0x2D, 0x30, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, -0x30, 0x0A, 0x00, 0x23, 0x9A, 0x95, 0x01, 0xE8, 0x4E, 0x82, 0x00, 0x00, 0x00, 0x10, 0x44, 0x75, -0x6D, 0x6F, 0x6E, 0x74, 0x2D, 0x64, 0x27, 0x55, 0x72, 0x76, 0x69, 0x6C, 0x6C, 0x65, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, +0xFF, 0xFF, 0x72, 0xED, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, +0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x23, 0x9A, 0x95, 0x01, 0xE8, +0x4E, 0x82, 0x00, 0x00, 0x00, 0x10, 0x44, 0x75, 0x6D, 0x6F, 0x6E, 0x74, 0x2D, 0x64, 0x27, 0x55, +0x72, 0x76, 0x69, 0x6C, 0x6C, 0x65, /* Antarctica/Macquarie */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -41011,14 +41220,14 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Antarctica/Syowa */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xE7, 0xB1, 0x58, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xD5, 0x1B, 0x36, 0xB4, +0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xB1, 0x58, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, +0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x1B, 0x36, 0xB4, 0x00, 0x00, +0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x20, 0x08, 0xBC, 0x01, 0x4F, 0x11, 0x58, 0x00, 0x00, 0x00, 0x05, 0x53, 0x79, 0x6F, 0x77, 0x61, @@ -41361,14 +41570,14 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0x56, 0xFD, 0x9D, 0xE0, 0x58, 0x12, 0x78, 0xE0, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xF2, 0x5A, 0xE0, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xD2, 0x3C, 0xE0, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB2, 0x1E, 0xE0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x9B, 0x3B, 0x60, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x7B, 0x1D, 0x60, -0x62, 0x46, 0x24, 0x60, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x26, 0x06, 0x60, 0x65, 0x3A, 0xE1, 0x60, -0x66, 0x05, 0xE8, 0x60, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE5, 0xCA, 0x60, 0x69, 0x03, 0xDF, 0xE0, -0x69, 0xC5, 0xAC, 0x60, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA5, 0x8E, 0x60, 0x6C, 0xC3, 0xA3, 0xE0, -0x6D, 0x8E, 0xAA, 0xE0, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x6E, 0x8C, 0xE0, 0x70, 0x83, 0x67, 0xE0, -0x71, 0x4E, 0x6E, 0xE0, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x2E, 0x50, 0xE0, 0x74, 0x4C, 0x66, 0x60, -0x75, 0x0E, 0x32, 0xE0, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xF7, 0x4F, 0x60, 0x78, 0x0C, 0x2A, 0x60, -0x78, 0xD7, 0x31, 0x60, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB7, 0x13, 0x60, 0x7B, 0xCB, 0xEE, 0x60, -0x7C, 0x96, 0xF5, 0x60, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x76, 0xD7, 0x60, 0x7F, 0x94, 0xEC, 0xE0, +0x62, 0x17, 0xFF, 0xE0, 0x63, 0x5A, 0xFF, 0x60, 0x63, 0xF7, 0xE1, 0xE0, 0x65, 0x3A, 0xE1, 0x60, +0x65, 0xE0, 0xFE, 0x60, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xC0, 0xE0, 0x60, 0x69, 0x03, 0xDF, 0xE0, +0x69, 0xA0, 0xC2, 0x60, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0x80, 0xA4, 0x60, 0x6C, 0xC3, 0xA3, 0xE0, +0x6D, 0x60, 0x86, 0x60, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x40, 0x68, 0x60, 0x70, 0x83, 0x67, 0xE0, +0x71, 0x29, 0x84, 0xE0, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x09, 0x66, 0xE0, 0x74, 0x4C, 0x66, 0x60, +0x74, 0xE9, 0x48, 0xE0, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xC9, 0x2A, 0xE0, 0x78, 0x0C, 0x2A, 0x60, +0x78, 0xA9, 0x0C, 0xE0, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0x88, 0xEE, 0xE0, 0x7B, 0xCB, 0xEE, 0x60, +0x7C, 0x72, 0x0B, 0x60, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x51, 0xED, 0x60, 0x7F, 0x94, 0xEC, 0xE0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, @@ -41424,22 +41633,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD2, 0x3C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB2, 0x1E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7D, 0x25, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9B, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5D, 0x07, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x46, 0x24, -0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x26, 0x06, -0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x05, 0xE8, -0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE5, 0xCA, -0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC5, 0xAC, -0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA5, 0x8E, -0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x8E, 0xAA, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x6E, 0x8C, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x4E, 0x6E, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2E, 0x50, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0E, 0x32, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF7, 0x4F, -0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD7, 0x31, -0x60, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB7, 0x13, -0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x96, 0xF5, -0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x76, 0xD7, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x17, 0xFF, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF7, 0xE1, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0xE0, 0xFE, +0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xC0, 0xE0, +0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xA0, 0xC2, +0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x80, 0xA4, +0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x60, 0x86, +0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x40, 0x68, +0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x29, 0x84, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x09, 0x66, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0xE9, 0x48, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xC9, 0x2A, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xA9, 0x0C, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x88, 0xEE, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x72, 0x0B, +0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x51, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, @@ -41451,7 +41660,7 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, -0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x34, 0x2F, +0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x32, 0x2E, 0x35, 0x2E, 0x34, 0x2F, 0x32, 0x34, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, 0x7C, 0xF5, 0x00, 0x00, 0x00, 0x00, @@ -46836,7 +47045,7 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Atlantic/Azores */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x92, 0xE6, 0xAA, 0xA0, 0x9B, 0x4B, 0x89, 0x90, 0x9B, 0xFE, 0xE3, 0xA0, 0x9C, 0x9D, 0x09, 0x90, 0x9D, 0xC9, 0x9F, 0x90, 0x9E, 0x7F, 0x8E, 0x90, 0x9F, 0xAA, 0xD3, 0x10, 0xA0, 0x5F, 0x70, 0x90, 0xA1, 0x8C, 0x06, 0x90, 0xA2, 0x41, 0xF5, 0x90, 0xA3, 0x6E, 0x8B, 0x90, 0xA4, 0x23, 0x29, 0x10, @@ -46853,185 +47062,50 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0xCF, 0xAC, 0x84, 0x00, 0xD0, 0x52, 0xA1, 0x00, 0xD0, 0xA5, 0xBD, 0x90, 0xD1, 0x55, 0x15, 0x10, 0xD1, 0x8C, 0x66, 0x00, 0xD2, 0x32, 0x83, 0x00, 0xD2, 0x85, 0x9F, 0x90, 0xD3, 0x59, 0xE1, 0x10, 0xD4, 0x49, 0xD2, 0x10, 0xD5, 0x39, 0xED, 0x40, 0xD6, 0x29, 0xDE, 0x40, 0xD7, 0x19, 0xCF, 0x40, -0xD8, 0x09, 0xC0, 0x40, 0xD8, 0xF9, 0xB1, 0x40, 0xD9, 0xE9, 0xA2, 0x40, 0xDC, 0xB9, 0x75, 0x40, -0xDD, 0xB2, 0xA0, 0xC0, 0xDE, 0xA2, 0x91, 0xC0, 0xDF, 0x92, 0x82, 0xC0, 0xE0, 0x82, 0x73, 0xC0, -0xE1, 0x72, 0x64, 0xC0, 0xE2, 0x62, 0x55, 0xC0, 0xE3, 0x52, 0x46, 0xC0, 0xE4, 0x42, 0x37, 0xC0, -0xE5, 0x32, 0x28, 0xC0, 0xE6, 0x22, 0x19, 0xC0, 0xE7, 0x1B, 0x45, 0x40, 0xE8, 0x0B, 0x36, 0x40, -0xE8, 0xFB, 0x27, 0x40, 0xE9, 0xEB, 0x18, 0x40, 0xEA, 0xDB, 0x09, 0x40, 0xEB, 0xCA, 0xFA, 0x40, -0xEC, 0xBA, 0xEB, 0x40, 0xED, 0xAA, 0xDC, 0x40, 0xEE, 0x9A, 0xCD, 0x40, 0xEF, 0x8A, 0xBE, 0x40, -0xF0, 0x7A, 0xAF, 0x40, 0xF1, 0x6A, 0xA0, 0x40, 0xF2, 0x63, 0xCB, 0xC0, 0xF3, 0x53, 0xBC, 0xC0, -0xF4, 0x43, 0xAD, 0xC0, 0xF5, 0x33, 0x9E, 0xC0, 0xF6, 0x23, 0x8F, 0xC0, 0xF7, 0x13, 0x80, 0xC0, -0xF8, 0x03, 0x71, 0xC0, 0xF8, 0xF3, 0x62, 0xC0, 0x0D, 0x9B, 0x29, 0x10, 0x0E, 0x8B, 0x1A, 0x10, -0x0F, 0x84, 0x45, 0x90, 0x10, 0x74, 0x36, 0x90, 0x11, 0x64, 0x27, 0x90, 0x12, 0x54, 0x26, 0xA0, -0x13, 0x44, 0x09, 0x90, 0x14, 0x34, 0x08, 0xA0, 0x15, 0x23, 0xF9, 0xA0, 0x16, 0x13, 0xEA, 0xA0, -0x17, 0x03, 0xDB, 0xA0, 0x17, 0xF3, 0xCC, 0xA0, 0x18, 0xE3, 0xCB, 0xB0, 0x19, 0xD3, 0xAE, 0xA0, -0x1A, 0xC3, 0x9F, 0xA0, 0x1B, 0xBC, 0xCB, 0x20, 0x1C, 0xAC, 0xBC, 0x20, 0x1D, 0x9C, 0xAD, 0x20, -0x1E, 0x8C, 0x9E, 0x20, 0x1F, 0x7C, 0x8F, 0x20, 0x20, 0x6C, 0x80, 0x20, 0x21, 0x5C, 0x71, 0x20, -0x22, 0x4C, 0x62, 0x20, 0x23, 0x3C, 0x53, 0x20, 0x24, 0x2C, 0x44, 0x20, 0x25, 0x1C, 0x35, 0x20, -0x26, 0x0C, 0x26, 0x20, 0x27, 0x05, 0x51, 0xA0, 0x27, 0xF5, 0x42, 0xA0, 0x28, 0xE5, 0x33, 0xA0, -0x29, 0xD5, 0x24, 0xA0, 0x2A, 0xC5, 0x15, 0xA0, 0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, -0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, -0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, -0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, -0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, -0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, -0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, -0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, -0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, -0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, -0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, -0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, -0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, -0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, -0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, -0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, -0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, -0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, -0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, -0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, -0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, -0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0xD8, 0x09, 0xC0, 0x40, 0xD8, 0xF9, 0xB1, 0x40, 0xD9, 0xE9, 0xA2, 0x40, 0xDA, 0xD9, 0x93, 0x40, +0xDB, 0xC9, 0x84, 0x40, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xB2, 0xA0, 0xC0, 0xDE, 0xA2, 0x91, 0xC0, +0xDF, 0x92, 0x82, 0xC0, 0xE0, 0x82, 0x73, 0xC0, 0xE1, 0x72, 0x64, 0xC0, 0xE2, 0x62, 0x55, 0xC0, +0xE3, 0x52, 0x46, 0xC0, 0xE4, 0x42, 0x37, 0xC0, 0xE5, 0x32, 0x28, 0xC0, 0xE6, 0x22, 0x19, 0xC0, +0xE7, 0x1B, 0x45, 0x40, 0xE8, 0x0B, 0x36, 0x40, 0xE8, 0xFB, 0x27, 0x40, 0xE9, 0xEB, 0x18, 0x40, +0xEA, 0xDB, 0x09, 0x40, 0xEB, 0xCA, 0xFA, 0x40, 0xEC, 0xBA, 0xEB, 0x40, 0xED, 0xAA, 0xDC, 0x40, +0xEE, 0x9A, 0xCD, 0x40, 0xEF, 0x8A, 0xBE, 0x40, 0xF0, 0x7A, 0xAF, 0x40, 0xF1, 0x6A, 0xA0, 0x40, +0xF2, 0x63, 0xCB, 0xC0, 0xF3, 0x53, 0xBC, 0xC0, 0xF4, 0x43, 0xAD, 0xC0, 0xF5, 0x33, 0x9E, 0xC0, +0xF6, 0x23, 0x8F, 0xC0, 0xF7, 0x13, 0x80, 0xC0, 0xF8, 0x03, 0x71, 0xC0, 0xF8, 0xF3, 0x62, 0xC0, +0x0D, 0x9B, 0x29, 0x10, 0x0E, 0x8B, 0x1A, 0x10, 0x0F, 0x84, 0x45, 0x90, 0x10, 0x74, 0x36, 0x90, +0x11, 0x64, 0x27, 0x90, 0x12, 0x54, 0x26, 0xA0, 0x13, 0x44, 0x09, 0x90, 0x14, 0x34, 0x08, 0xA0, +0x15, 0x23, 0xF9, 0xA0, 0x16, 0x13, 0xEA, 0xA0, 0x17, 0x03, 0xDB, 0xA0, 0x17, 0xF3, 0xCC, 0xA0, +0x18, 0xE3, 0xCB, 0xB0, 0x19, 0xD3, 0xAE, 0xA0, 0x1A, 0xC3, 0x9F, 0xA0, 0x1B, 0xBC, 0xCB, 0x20, +0x1C, 0xAC, 0xBC, 0x20, 0x1D, 0x9C, 0xAD, 0x20, 0x1E, 0x8C, 0x9E, 0x20, 0x1F, 0x7C, 0x8F, 0x20, +0x20, 0x6C, 0x80, 0x20, 0x21, 0x5C, 0x71, 0x20, 0x22, 0x4C, 0x62, 0x20, 0x23, 0x3C, 0x53, 0x20, +0x24, 0x2C, 0x44, 0x20, 0x25, 0x1C, 0x35, 0x20, 0x26, 0x0C, 0x26, 0x20, 0x27, 0x05, 0x51, 0xA0, +0x27, 0xF5, 0x42, 0xA0, 0x28, 0xE5, 0x33, 0xA0, 0x29, 0xD5, 0x24, 0xA0, 0x2A, 0xC5, 0x15, 0xA0, +0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, +0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, +0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, +0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, +0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, +0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, +0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, +0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, +0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, +0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, +0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, +0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, +0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, +0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, +0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, +0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, +0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, +0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, +0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, +0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, +0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, +0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, +0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x09, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x0A, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0C, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, -0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, -0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, -0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, -0xFF, 0xFF, 0x5E, 0x3D, 0x1B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0xAA, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0x9B, 0x4B, 0x89, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xE3, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0x9C, 0x9D, 0x09, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x9F, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0x9E, 0x7F, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xD3, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xA0, 0x5F, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8C, 0x06, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x41, 0xF5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x8B, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xA4, 0x23, 0x29, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xBF, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xAA, 0x06, 0x0B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0xAB, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xAD, 0xC9, 0xC4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x40, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xAF, 0xA0, 0x6B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x22, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xB1, 0x89, 0x88, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x3E, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xB3, 0x72, 0xA4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x20, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x32, 0x68, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xE4, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFF, 0xD5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xC6, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0xC8, 0xD4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xC5, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x9F, 0x7B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0xA7, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x9B, 0x0D, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x89, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x68, 0x7A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x6B, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x3F, 0x21, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x4D, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xC6, 0x3A, 0xB3, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xC8, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xD9, 0xFB, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x4B, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xC9, 0xF1, 0x3C, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x7F, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xCB, 0xB5, 0x6F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xC0, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xCC, 0x80, 0x68, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xBF, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xCD, 0x95, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x67, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x72, 0xBF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xDB, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCF, 0x75, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x84, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xD0, 0x52, 0xA1, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xBD, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xD1, 0x55, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x66, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xD2, 0x32, 0x83, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x9F, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x59, 0xE1, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xD2, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD5, 0x39, 0xED, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xDE, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xD7, 0x19, 0xCF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xC0, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xD8, 0xF9, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0xA2, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0xA0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0xA2, 0x91, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x82, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x82, 0x73, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE2, 0x62, 0x55, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x46, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE4, 0x42, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x28, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE6, 0x22, 0x19, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x45, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xE8, 0x0B, 0x36, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x27, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xE9, 0xEB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDB, 0x09, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xEB, 0xCA, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xEB, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xED, 0xAA, 0xDC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xCD, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xEF, 0x8A, 0xBE, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0xAF, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF1, 0x6A, 0xA0, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xCB, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF3, 0x53, 0xBC, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0xAD, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x33, 0x9E, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x8F, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x13, 0x80, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x71, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xF3, 0x62, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x29, 0x10, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x8B, 0x1A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x45, 0x90, 0x00, 0x00, -0x00, 0x00, 0x10, 0x74, 0x36, 0x90, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x27, 0x90, 0x00, 0x00, -0x00, 0x00, 0x12, 0x54, 0x26, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x44, 0x09, 0x90, 0x00, 0x00, -0x00, 0x00, 0x14, 0x34, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xF9, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x16, 0x13, 0xEA, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xDB, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF3, 0xCC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xCB, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x19, 0xD3, 0xAE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x9F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0xCB, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xBC, 0x20, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0xAD, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x9E, 0x20, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x8F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x80, 0x20, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x71, 0x20, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x62, 0x20, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x53, 0x20, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x44, 0x20, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1C, 0x35, 0x20, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x26, 0x20, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE5, 0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x24, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC5, 0x15, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, -0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, -0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, -0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, -0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, -0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, -0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, -0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x06, -0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, -0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, +0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x09, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, @@ -47049,10 +47123,147 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, -0x31, 0x3E, 0x31, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, -0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xC2, 0xE7, 0xD5, -0x00, 0xEB, 0x7E, 0x75, 0x00, 0x00, 0x00, 0x06, 0x41, 0x7A, 0x6F, 0x72, 0x65, 0x73, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x1B, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0xAA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x89, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xE3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9D, 0x09, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x9F, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x8E, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xD3, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x70, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8C, 0x06, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xF5, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x8B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x29, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xBF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x06, 0x0B, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0xAB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xC4, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x40, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x6B, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x22, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x88, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x3E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0xA4, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x20, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x68, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xE4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xD5, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xC6, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xD4, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xC5, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x7B, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0xA7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9B, 0x0D, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x89, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x7A, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x6B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x21, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x4D, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0xB3, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xC8, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xFB, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x3C, 0x90, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x7F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x6F, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x68, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xBF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x51, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x67, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xBF, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xDB, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x33, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x84, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0xA1, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xBD, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x55, 0x15, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x83, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x9F, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xE1, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xED, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xDE, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xCF, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xC0, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0xB1, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0xA2, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x93, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x84, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0xA0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x91, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x82, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x73, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x55, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x46, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x37, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x28, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x22, 0x19, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x45, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x36, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x27, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEB, 0x18, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDB, 0x09, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xFA, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xEB, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xDC, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xCD, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xBE, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0xAF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0xA0, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xCB, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xBC, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0xAD, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x9E, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x8F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x80, 0xC0, +0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x62, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x29, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x8B, 0x1A, 0x10, +0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x45, 0x90, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x36, 0x90, +0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x27, 0x90, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x26, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x13, 0x44, 0x09, 0x90, 0x00, 0x00, 0x00, 0x00, 0x14, 0x34, 0x08, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xF9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xEA, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xDB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xCC, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xCB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xAE, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x9F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xCB, 0x20, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xBC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0xAD, 0x20, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x9E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x8F, 0x20, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x71, 0x20, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x62, 0x20, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x53, 0x20, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x35, 0x20, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x26, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x51, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x33, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x24, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x15, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, +0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, +0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, +0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, +0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, +0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, +0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, +0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, +0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, +0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, +0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, +0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, +0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, +0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, +0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, +0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, +0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, +0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, +0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, +0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, +0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, +0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, +0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, +0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, +0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, +0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, +0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, +0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, +0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, +0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x09, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x0A, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0C, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0xFF, +0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, +0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, +0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0xFF, 0xFF, +0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, +0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x31, 0x3E, 0x31, 0x3C, +0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x30, 0x2C, 0x4D, 0x31, +0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xC2, 0xE7, 0xD5, 0x00, 0xEB, 0x7E, 0x75, +0x00, 0x00, 0x00, 0x06, 0x41, 0x7A, 0x6F, 0x72, 0x65, 0x73, /* Atlantic/Bermuda */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -47730,7 +47941,7 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Atlantic/Madeira */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xDD, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x1D, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xDF, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x1D, 0x80, 0x00, 0x00, 0x00, 0x92, 0xE6, 0x9C, 0x90, 0x9B, 0x4B, 0x7B, 0x80, 0x9B, 0xFE, 0xD5, 0x90, 0x9C, 0x9C, 0xFB, 0x80, 0x9D, 0xC9, 0x91, 0x80, 0x9E, 0x7F, 0x80, 0x80, 0x9F, 0xAA, 0xC5, 0x00, 0xA0, 0x5F, 0x62, 0x80, 0xA1, 0x8B, 0xF8, 0x80, 0xA2, 0x41, 0xE7, 0x80, 0xA3, 0x6E, 0x7D, 0x80, 0xA4, 0x23, 0x1B, 0x00, @@ -47747,206 +47958,208 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0xCF, 0xAC, 0x75, 0xF0, 0xD0, 0x52, 0x92, 0xF0, 0xD0, 0xA5, 0xAF, 0x80, 0xD1, 0x55, 0x07, 0x00, 0xD1, 0x8C, 0x57, 0xF0, 0xD2, 0x32, 0x74, 0xF0, 0xD2, 0x85, 0x91, 0x80, 0xD3, 0x59, 0xD3, 0x00, 0xD4, 0x49, 0xC4, 0x00, 0xD5, 0x39, 0xDF, 0x30, 0xD6, 0x29, 0xD0, 0x30, 0xD7, 0x19, 0xC1, 0x30, -0xD8, 0x09, 0xB2, 0x30, 0xD8, 0xF9, 0xA3, 0x30, 0xD9, 0xE9, 0x94, 0x30, 0xDC, 0xB9, 0x67, 0x30, -0xDD, 0xB2, 0x92, 0xB0, 0xDE, 0xA2, 0x83, 0xB0, 0xDF, 0x92, 0x74, 0xB0, 0xE0, 0x82, 0x65, 0xB0, -0xE1, 0x72, 0x56, 0xB0, 0xE2, 0x62, 0x47, 0xB0, 0xE3, 0x52, 0x38, 0xB0, 0xE4, 0x42, 0x29, 0xB0, -0xE5, 0x32, 0x1A, 0xB0, 0xE6, 0x22, 0x0B, 0xB0, 0xE7, 0x1B, 0x37, 0x30, 0xE8, 0x0B, 0x28, 0x30, -0xE8, 0xFB, 0x19, 0x30, 0xE9, 0xEB, 0x0A, 0x30, 0xEA, 0xDA, 0xFB, 0x30, 0xEB, 0xCA, 0xEC, 0x30, -0xEC, 0xBA, 0xDD, 0x30, 0xED, 0xAA, 0xCE, 0x30, 0xEE, 0x9A, 0xBF, 0x30, 0xEF, 0x8A, 0xB0, 0x30, -0xF0, 0x7A, 0xA1, 0x30, 0xF1, 0x6A, 0x92, 0x30, 0xF2, 0x63, 0xBD, 0xB0, 0xF3, 0x53, 0xAE, 0xB0, -0xF4, 0x43, 0x9F, 0xB0, 0xF5, 0x33, 0x90, 0xB0, 0xF6, 0x23, 0x81, 0xB0, 0xF7, 0x13, 0x72, 0xB0, -0xF8, 0x03, 0x63, 0xB0, 0xF8, 0xF3, 0x54, 0xB0, 0x0D, 0x9B, 0x1B, 0x00, 0x0E, 0x8B, 0x0C, 0x00, -0x0F, 0x84, 0x37, 0x80, 0x10, 0x74, 0x28, 0x80, 0x11, 0x64, 0x19, 0x80, 0x12, 0x54, 0x18, 0x90, -0x13, 0x43, 0xFB, 0x80, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, -0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xBD, 0xA0, 0x19, 0xD3, 0xA0, 0x90, -0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, -0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, -0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, -0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, -0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, -0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, -0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, -0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, -0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, -0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, -0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, -0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, -0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, -0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, -0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, -0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, -0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, -0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, -0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, -0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, -0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, -0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, -0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, -0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, -0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, -0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0xD8, 0x09, 0xB2, 0x30, 0xD8, 0xF9, 0xA3, 0x30, 0xD9, 0xE9, 0x94, 0x30, 0xDA, 0xD9, 0x85, 0x30, +0xDB, 0xC9, 0x76, 0x30, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xB2, 0x92, 0xB0, 0xDE, 0xA2, 0x83, 0xB0, +0xDF, 0x92, 0x74, 0xB0, 0xE0, 0x82, 0x65, 0xB0, 0xE1, 0x72, 0x56, 0xB0, 0xE2, 0x62, 0x47, 0xB0, +0xE3, 0x52, 0x38, 0xB0, 0xE4, 0x42, 0x29, 0xB0, 0xE5, 0x32, 0x1A, 0xB0, 0xE6, 0x22, 0x0B, 0xB0, +0xE7, 0x1B, 0x37, 0x30, 0xE8, 0x0B, 0x28, 0x30, 0xE8, 0xFB, 0x19, 0x30, 0xE9, 0xEB, 0x0A, 0x30, +0xEA, 0xDA, 0xFB, 0x30, 0xEB, 0xCA, 0xEC, 0x30, 0xEC, 0xBA, 0xDD, 0x30, 0xED, 0xAA, 0xCE, 0x30, +0xEE, 0x9A, 0xBF, 0x30, 0xEF, 0x8A, 0xB0, 0x30, 0xF0, 0x7A, 0xA1, 0x30, 0xF1, 0x6A, 0x92, 0x30, +0xF2, 0x63, 0xBD, 0xB0, 0xF3, 0x53, 0xAE, 0xB0, 0xF4, 0x43, 0x9F, 0xB0, 0xF5, 0x33, 0x90, 0xB0, +0xF6, 0x23, 0x81, 0xB0, 0xF7, 0x13, 0x72, 0xB0, 0xF8, 0x03, 0x63, 0xB0, 0xF8, 0xF3, 0x54, 0xB0, +0x0D, 0x9B, 0x1B, 0x00, 0x0E, 0x8B, 0x0C, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x10, 0x74, 0x28, 0x80, +0x11, 0x64, 0x19, 0x80, 0x12, 0x54, 0x18, 0x90, 0x13, 0x43, 0xFB, 0x80, 0x14, 0x33, 0xFA, 0x90, +0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, +0x18, 0xE3, 0xBD, 0xA0, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, +0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, +0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, +0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, +0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, +0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, +0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, +0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, +0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, +0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, +0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, +0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, +0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, +0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, +0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, +0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, +0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, +0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, +0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, +0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, +0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, +0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, +0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, +0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, +0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, +0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, +0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, +0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, -0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, +0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x0A, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x0A, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0xFF, 0xFF, 0xF0, -0x28, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, -0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, -0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x10, 0x00, 0x00, 0x0E, -0x10, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, -0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x46, -0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x31, 0x00, 0x57, -0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, -0xFF, 0xFF, 0x5E, 0x3D, 0x13, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x9C, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0x9B, 0x4B, 0x7B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xD5, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0x9C, 0x9C, 0xFB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x91, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0x9E, 0x7F, 0x80, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xC5, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xA0, 0x5F, 0x62, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8B, 0xF8, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x41, 0xE7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x7D, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xA4, 0x23, 0x1B, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xB1, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xAA, 0x05, 0xFD, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0x9D, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xAD, 0xC9, 0xB6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x32, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xAF, 0xA0, 0x5D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x14, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xB1, 0x89, 0x7A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x30, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xB3, 0x72, 0x96, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x12, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x32, 0x5A, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xD6, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFF, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xB8, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0xC8, 0xC6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xB7, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x9F, 0x6D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0x99, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x9A, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x7B, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x68, 0x6C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x5D, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x3F, 0x13, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x3F, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xC6, 0x3A, 0xA5, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xBA, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xD9, 0xED, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x3D, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xC9, 0xF1, 0x2E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x71, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xCB, 0xB5, 0x61, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xB1, 0xF0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCC, 0x80, 0x59, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xB1, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xCD, 0x95, 0x43, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x59, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x72, 0xB0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xCD, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xCF, 0x75, 0x25, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x75, 0xF0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD0, 0x52, 0x92, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xAF, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xD1, 0x55, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x57, 0xF0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD2, 0x32, 0x74, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x91, 0x80, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x59, 0xD3, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xC4, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0xD5, 0x39, 0xDF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xD0, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xD7, 0x19, 0xC1, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xB2, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xD8, 0xF9, 0xA3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x94, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x92, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0xA2, 0x83, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x74, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x82, 0x65, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x56, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE2, 0x62, 0x47, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x38, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE4, 0x42, 0x29, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x1A, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE6, 0x22, 0x0B, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x37, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xE8, 0x0B, 0x28, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x19, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xE9, 0xEB, 0x0A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDA, 0xFB, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xEB, 0xCA, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xDD, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xED, 0xAA, 0xCE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xBF, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xEF, 0x8A, 0xB0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0xA1, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF1, 0x6A, 0x92, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xBD, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF3, 0x53, 0xAE, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0x9F, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x33, 0x90, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x81, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x13, 0x72, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x63, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xF3, 0x54, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x1B, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, -0x00, 0x00, 0x10, 0x74, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x19, 0x80, 0x00, 0x00, -0x00, 0x00, 0x12, 0x54, 0x18, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x43, 0xFB, 0x80, 0x00, 0x00, -0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xBD, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, -0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, -0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, -0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, -0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, -0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, -0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, -0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xF0, +0x28, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, +0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, +0x0C, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x10, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, +0x00, 0x0E, 0x10, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, +0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x31, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, +0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x13, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x9C, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x7B, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xD5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xFB, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x91, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x80, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xC5, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x62, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8B, 0xF8, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xE7, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x7D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x1B, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xB1, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x05, 0xFD, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0x9D, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xB6, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x32, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x5D, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x14, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x7A, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x30, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0x96, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x12, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x5A, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xD6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xC7, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xB8, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xC6, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xB7, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x6D, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0x99, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9A, 0xFF, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x7B, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x6C, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x5D, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x13, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x3F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0xA5, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xBA, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xED, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x3D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x2E, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x71, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x61, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xB1, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x59, 0xF0, +0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xB1, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x43, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x59, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xB0, 0xF0, +0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xCD, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x25, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x75, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0x92, 0xF0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xAF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x55, 0x07, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x74, 0xF0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x91, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xD3, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xC4, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xDF, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xD0, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xC1, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xB2, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0xA3, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x94, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x85, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x76, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x92, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x83, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x74, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x65, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x56, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x47, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x38, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x29, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x1A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x22, 0x0B, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x37, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x28, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x19, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEB, 0x0A, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDA, 0xFB, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xEC, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xDD, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xCE, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xBF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xB0, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0xA1, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0x92, 0x30, +0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xBD, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xAE, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x90, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x81, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x72, 0xB0, +0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x63, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x54, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x8B, 0x0C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x28, 0x80, +0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x18, 0x90, +0x00, 0x00, 0x00, 0x00, 0x13, 0x43, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, +0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, +0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, +0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xBD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, +0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x43, 0x90, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, +0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, +0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, +0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, +0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, +0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, +0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, +0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, +0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, +0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, +0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, +0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, +0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, +0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, +0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, +0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, +0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, +0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, +0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, +0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, +0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, +0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, +0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, +0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, +0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, +0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, +0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, +0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, +0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, +0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, +0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, +0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, +0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, +0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x0A, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x04, 0x05, 0x04, 0x05, 0x0A, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x04, 0x00, -0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, -0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x0E, -0x10, 0x01, 0x10, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, -0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x0E, 0x10, 0x01, -0x14, 0x4C, 0x4D, 0x54, 0x00, 0x46, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x31, -0x00, 0x2B, 0x30, 0x31, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x30, 0x0A, 0x00, 0xBB, 0x1F, 0xA5, 0x00, 0xF8, 0xDE, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x4D, -0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0xFF, +0xFF, 0xF0, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x28, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, +0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0xFF, 0xFF, 0xF1, +0xF0, 0x00, 0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x10, 0x00, +0x00, 0x0E, 0x10, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, +0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x14, 0x4C, 0x4D, 0x54, +0x00, 0x46, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x31, +0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, +0xBB, 0x1F, 0xA5, 0x00, 0xF8, 0xDE, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0x4D, 0x61, 0x64, 0x65, 0x69, +0x72, 0x61, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* Atlantic/Reykjavik */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -57532,7 +57745,7 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Europe/Lisbon */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x80, 0x00, 0x00, 0x00, 0x92, 0xE6, 0x8E, 0x80, 0x9B, 0x4B, 0x6D, 0x70, 0x9B, 0xFE, 0xC7, 0x80, 0x9C, 0x9C, 0xED, 0x70, 0x9D, 0xC9, 0x83, 0x70, 0x9E, 0x7F, 0x72, 0x70, 0x9F, 0xAA, 0xB6, 0xF0, 0xA0, 0x5F, 0x54, 0x70, 0xA1, 0x8B, 0xEA, 0x70, 0xA2, 0x41, 0xD9, 0x70, 0xA3, 0x6E, 0x6F, 0x70, 0xA4, 0x23, 0x0C, 0xF0, @@ -57549,206 +57762,208 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0xCF, 0xAC, 0x67, 0xE0, 0xD0, 0x52, 0x84, 0xE0, 0xD0, 0xA5, 0xA1, 0x70, 0xD1, 0x54, 0xF8, 0xF0, 0xD1, 0x8C, 0x49, 0xE0, 0xD2, 0x32, 0x66, 0xE0, 0xD2, 0x85, 0x83, 0x70, 0xD3, 0x59, 0xC4, 0xF0, 0xD4, 0x49, 0xB5, 0xF0, 0xD5, 0x39, 0xD1, 0x20, 0xD6, 0x29, 0xC2, 0x20, 0xD7, 0x19, 0xB3, 0x20, -0xD8, 0x09, 0xA4, 0x20, 0xD8, 0xF9, 0x95, 0x20, 0xD9, 0xE9, 0x86, 0x20, 0xDC, 0xB9, 0x59, 0x20, -0xDD, 0xB2, 0x84, 0xA0, 0xDE, 0xA2, 0x75, 0xA0, 0xDF, 0x92, 0x66, 0xA0, 0xE0, 0x82, 0x57, 0xA0, -0xE1, 0x72, 0x48, 0xA0, 0xE2, 0x62, 0x39, 0xA0, 0xE3, 0x52, 0x2A, 0xA0, 0xE4, 0x42, 0x1B, 0xA0, -0xE5, 0x32, 0x0C, 0xA0, 0xE6, 0x21, 0xFD, 0xA0, 0xE7, 0x1B, 0x29, 0x20, 0xE8, 0x0B, 0x1A, 0x20, -0xE8, 0xFB, 0x0B, 0x20, 0xE9, 0xEA, 0xFC, 0x20, 0xEA, 0xDA, 0xED, 0x20, 0xEB, 0xCA, 0xDE, 0x20, -0xEC, 0xBA, 0xCF, 0x20, 0xED, 0xAA, 0xC0, 0x20, 0xEE, 0x9A, 0xB1, 0x20, 0xEF, 0x8A, 0xA2, 0x20, -0xF0, 0x7A, 0x93, 0x20, 0xF1, 0x6A, 0x84, 0x20, 0xF2, 0x63, 0xAF, 0xA0, 0xF3, 0x53, 0xA0, 0xA0, -0xF4, 0x43, 0x91, 0xA0, 0xF5, 0x33, 0x82, 0xA0, 0xF6, 0x23, 0x73, 0xA0, 0xF7, 0x13, 0x64, 0xA0, -0xF8, 0x03, 0x55, 0xA0, 0xF8, 0xF3, 0x46, 0xA0, 0x0C, 0xAB, 0x2A, 0x00, 0x0D, 0x9B, 0x1B, 0x00, -0x0E, 0x8B, 0x0C, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x10, 0x74, 0x28, 0x80, 0x11, 0x64, 0x19, 0x80, -0x12, 0x54, 0x18, 0x90, 0x13, 0x43, 0xFB, 0x80, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, -0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xBD, 0xA0, -0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, -0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, -0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, -0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, -0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, -0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, -0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, -0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, -0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, -0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, -0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, -0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, -0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, -0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, -0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, -0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, -0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, -0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, -0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, -0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, -0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, -0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, -0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, -0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, -0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, -0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, -0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, -0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0xD8, 0x09, 0xA4, 0x20, 0xD8, 0xF9, 0x95, 0x20, 0xD9, 0xE9, 0x86, 0x20, 0xDA, 0xD9, 0x77, 0x20, +0xDB, 0xC9, 0x68, 0x20, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xB2, 0x84, 0xA0, 0xDE, 0xA2, 0x75, 0xA0, +0xDF, 0x92, 0x66, 0xA0, 0xE0, 0x82, 0x57, 0xA0, 0xE1, 0x72, 0x48, 0xA0, 0xE2, 0x62, 0x39, 0xA0, +0xE3, 0x52, 0x2A, 0xA0, 0xE4, 0x42, 0x1B, 0xA0, 0xE5, 0x32, 0x0C, 0xA0, 0xE6, 0x21, 0xFD, 0xA0, +0xE7, 0x1B, 0x29, 0x20, 0xE8, 0x0B, 0x1A, 0x20, 0xE8, 0xFB, 0x0B, 0x20, 0xE9, 0xEA, 0xFC, 0x20, +0xEA, 0xDA, 0xED, 0x20, 0xEB, 0xCA, 0xDE, 0x20, 0xEC, 0xBA, 0xCF, 0x20, 0xED, 0xAA, 0xC0, 0x20, +0xEE, 0x9A, 0xB1, 0x20, 0xEF, 0x8A, 0xA2, 0x20, 0xF0, 0x7A, 0x93, 0x20, 0xF1, 0x6A, 0x84, 0x20, +0xF2, 0x63, 0xAF, 0xA0, 0xF3, 0x53, 0xA0, 0xA0, 0xF4, 0x43, 0x91, 0xA0, 0xF5, 0x33, 0x82, 0xA0, +0xF6, 0x23, 0x73, 0xA0, 0xF7, 0x13, 0x64, 0xA0, 0xF8, 0x03, 0x55, 0xA0, 0xF8, 0xF3, 0x46, 0xA0, +0x0C, 0xAB, 0x2A, 0x00, 0x0D, 0x9B, 0x1B, 0x00, 0x0E, 0x8B, 0x0C, 0x00, 0x0F, 0x84, 0x37, 0x80, +0x10, 0x74, 0x28, 0x80, 0x11, 0x64, 0x19, 0x80, 0x12, 0x54, 0x18, 0x90, 0x13, 0x43, 0xFB, 0x80, +0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, +0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xBD, 0xA0, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, +0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, +0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, +0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, +0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, +0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, +0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, +0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, +0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, +0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, +0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, +0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, +0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, +0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, +0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, +0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, +0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, +0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, +0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, +0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, +0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, +0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, +0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, +0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, +0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, +0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, +0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, +0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, +0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x07, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x07, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x06, -0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, +0x03, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, -0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, -0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, -0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, -0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, -0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, -0x43, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xDE, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x0C, -0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x8E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x6D, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xED, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x72, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xB6, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x54, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8B, 0xEA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xD9, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x6F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x0C, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x05, 0xEF, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0x8E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xA7, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x23, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x4F, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x05, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x6B, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x22, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0x88, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x04, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x4C, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xC8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xB9, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xAA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xB7, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xA8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x5F, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0x8A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9A, 0xF0, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x6C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x5D, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x4E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x05, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x30, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0x96, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xAC, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xDF, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x2F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x20, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x52, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x4B, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x34, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x4B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xA2, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xBF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x16, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x67, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0x84, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xA1, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x54, 0xF8, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x66, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xC4, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xB5, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xC2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x86, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x84, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x66, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x48, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x39, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x2A, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x1B, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x0C, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x21, 0xFD, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x29, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x1A, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x0B, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEA, 0xFC, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDA, 0xED, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xDE, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xCF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xC0, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xB1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xA2, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0x93, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0x84, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xAF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xA0, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0x91, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x82, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x73, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x64, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x55, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x46, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xAB, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x1B, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, -0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x19, -0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x18, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x43, 0xFB, -0x80, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, -0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, -0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xBD, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, -0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, -0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, -0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, -0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, -0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, -0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, -0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, -0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, -0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, -0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, -0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, -0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, -0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, -0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, -0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, -0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, -0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, -0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, -0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, -0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, -0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, -0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, -0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, -0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, -0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, -0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, -0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, -0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, -0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, -0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, -0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, -0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, -0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, -0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, -0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, -0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, -0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, -0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, -0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, +0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, +0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, +0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, +0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x00, +0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x0C, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, +0xE6, 0x8E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x6D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, +0xFE, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xED, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, +0xC9, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x72, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, +0xAA, 0xB6, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x54, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, +0x8B, 0xEA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xD9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, +0x6E, 0x6F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x0C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, +0x4F, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x05, 0xEF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, +0xF4, 0x8E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xA7, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, +0xA7, 0x23, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, +0x87, 0x05, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x6B, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, +0x70, 0x22, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0x88, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, +0x50, 0x04, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x4C, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0x0F, 0xC8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xB9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, +0xEF, 0xAA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xB7, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, +0xB8, 0xA8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x5F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, +0x98, 0x8A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9A, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, +0x78, 0x6C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x5D, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, +0x58, 0x4E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x05, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, +0x38, 0x30, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0x96, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, +0x58, 0xAC, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xDF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, +0x01, 0x2F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x20, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, +0xE2, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x52, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, +0xEC, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x4B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, +0xDC, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x34, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, +0xC3, 0x4B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xA2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, +0xC5, 0xBF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x16, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, +0xAC, 0x67, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0x84, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, +0xA5, 0xA1, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x54, 0xF8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, +0x8C, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x66, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, +0x85, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xC4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, +0x49, 0xB5, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, +0x29, 0xC2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, +0x09, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, +0xE9, 0x86, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x77, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, +0xC9, 0x68, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xB2, 0x84, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, +0x92, 0x66, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, +0x72, 0x48, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x39, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, +0x52, 0x2A, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x1B, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, +0x32, 0x0C, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x21, 0xFD, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, +0x1B, 0x29, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x1A, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, +0xFB, 0x0B, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEA, 0xFC, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, +0xDA, 0xED, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, +0xBA, 0xCF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xC0, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, +0x9A, 0xB1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xA2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, +0x7A, 0x93, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0x84, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, +0x63, 0xAF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xA0, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, +0x43, 0x91, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x82, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, +0x23, 0x73, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x64, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0x03, 0x55, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x46, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, +0xAB, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, +0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, +0x74, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, +0x54, 0x18, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x43, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x14, +0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, +0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, +0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xBD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, +0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, +0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, +0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, +0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, +0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, +0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, +0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, +0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, +0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, +0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, +0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, +0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, +0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, +0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, +0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, +0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, +0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, +0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, +0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, +0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, +0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, +0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, +0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, +0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, +0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, +0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, +0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, +0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, +0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, +0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, +0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, +0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, +0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, +0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, +0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, +0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, +0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, +0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, +0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, +0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, +0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, +0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, +0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, +0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, +0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, +0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, +0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, +0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, +0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, +0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, +0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, +0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, -0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x07, 0x02, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x07, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, -0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, -0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, -0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, -0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, -0x20, 0x01, 0x16, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4C, -0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, -0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, -0x01, 0x01, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xC4, 0x67, -0xF2, 0x01, 0x04, 0xB8, 0xCA, 0x00, 0x00, 0x00, 0x13, 0x50, 0x6F, 0x72, 0x74, 0x75, 0x67, 0x61, -0x6C, 0x20, 0x28, 0x6D, 0x61, 0x69, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x29, +0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, +0x06, 0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, +0x10, 0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, +0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x57, +0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, +0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, +0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x57, +0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, +0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xC4, 0x67, 0xF2, 0x01, 0x04, 0xB8, +0xCA, 0x00, 0x00, 0x00, 0x13, 0x50, 0x6F, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6C, 0x20, 0x28, 0x6D, +0x61, 0x69, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x29, /* Europe/Ljubljana */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -65319,74 +65534,44 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Pacific/Apia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x57, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0x80, 0x00, 0x00, 0x00, 0x91, 0x05, 0xFC, 0x00, 0xDA, 0x62, 0x04, 0x38, 0x4C, 0x9F, 0x27, 0xB0, 0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4E, 0xFD, 0x8B, 0xA0, 0x4F, 0x77, 0x0D, 0xE0, 0x50, 0x66, 0xFE, 0xE0, 0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, 0x54, 0x26, 0xC2, 0xE0, 0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, 0x57, 0xE6, 0x86, 0xE0, 0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, 0x5B, 0xAF, 0x85, 0x60, 0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, 0x5F, 0x6F, 0x49, 0x60, -0x60, 0x68, 0x74, 0xE0, 0x61, 0x4F, 0x2B, 0x60, 0x62, 0x48, 0x56, 0xE0, 0x63, 0x2F, 0x0D, 0x60, -0x64, 0x28, 0x38, 0xE0, 0x65, 0x0E, 0xEF, 0x60, 0x66, 0x11, 0x55, 0x60, 0x66, 0xF8, 0x0B, 0xE0, -0x67, 0xF1, 0x37, 0x60, 0x68, 0xD7, 0xED, 0xE0, 0x69, 0xD1, 0x19, 0x60, 0x6A, 0xB7, 0xCF, 0xE0, -0x6B, 0xB0, 0xFB, 0x60, 0x6C, 0x97, 0xB1, 0xE0, 0x6D, 0x90, 0xDD, 0x60, 0x6E, 0x77, 0x93, 0xE0, -0x6F, 0x70, 0xBF, 0x60, 0x70, 0x60, 0xB0, 0x60, 0x71, 0x59, 0xDB, 0xE0, 0x72, 0x40, 0x92, 0x60, -0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, -0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, -0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, -0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, -0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x60, 0x68, 0x74, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, -0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, -0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, -0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, -0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x6E, 0x3D, 0xC9, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x05, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x62, 0x04, 0x38, -0x00, 0x00, 0x00, 0x00, 0x4C, 0x9F, 0x27, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFD, 0x8B, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, -0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, -0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, -0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x4F, 0x2B, 0x60, -0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, 0x0D, 0x60, -0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0E, 0xEF, 0x60, -0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x55, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0xF8, 0x0B, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, 0xD7, 0xED, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xB7, 0xCF, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x97, 0xB1, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x77, 0x93, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0xB0, 0x60, -0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x40, 0x92, 0x60, -0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x20, 0x74, 0x60, -0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x56, 0x60, -0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE0, 0x38, 0x60, -0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC0, 0x1A, 0x60, -0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xA9, 0x36, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x89, 0x18, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x68, 0xFA, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x06, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, -0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, 0xFF, 0x65, 0x50, -0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x16, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, -0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, -0x33, 0x3C, 0x2B, 0x31, 0x34, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, -0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0x74, 0x38, 0x9A, 0x00, 0x0C, 0x9D, -0x2A, 0x00, 0x00, 0x00, 0x00, +0x06, 0x05, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, 0xFF, 0x65, 0x50, 0x00, +0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x16, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, +0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x07, 0x00, +0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x6E, 0x3D, 0xC9, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, +0x05, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x62, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4C, +0x9F, 0x27, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, +0x7D, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFD, 0x8B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4F, +0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, +0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, +0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, +0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, +0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, +0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, +0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, +0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, +0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, +0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, +0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, 0xFF, +0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x16, +0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x31, +0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, +0x2D, 0x31, 0x33, 0x0A, 0x00, 0x74, 0x38, 0x9A, 0x00, 0x0C, 0x9D, 0x2A, 0x00, 0x00, 0x00, 0x00, + /* Pacific/Auckland */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -65902,23 +66087,22 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0xA4, 0x42, 0x00, 0x00, 0x00, 0x00, /* Pacific/Enderbury */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xC3, 0x2C, 0xDB, 0x80, 0x12, 0x56, 0x04, 0xC0, 0x2F, 0x05, 0x39, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0xFF, 0xFF, 0x5F, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, -0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, +0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, -0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x55, 0x64, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0x5F, 0x9C, 0x00, 0x00, 0xFF, 0xFF, +0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, -0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x84, 0x8C, 0x4A, 0x00, 0x0D, -0x9B, 0x12, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x68, 0x6F, 0x65, 0x6E, 0x69, 0x78, 0x20, 0x49, 0x73, -0x6C, 0x61, 0x6E, 0x64, 0x73, +0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Fakaofo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66150,6 +66334,25 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0x01, 0x00, 0x0A, 0x48, 0x53, 0x54, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* Pacific/Kanton */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xC3, 0x2C, 0xDB, 0x80, +0x12, 0x56, 0x04, 0xC0, 0x2F, 0x05, 0x39, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, +0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, +0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, +0x12, 0x56, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, +0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x85, 0x15, 0x02, 0x00, 0x0C, +0xA3, 0xAD, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x68, 0x6F, 0x65, 0x6E, 0x69, 0x78, 0x20, 0x49, 0x73, +0x6C, 0x61, 0x6E, 0x64, 0x73, + /* Pacific/Kiritimati */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66295,20 +66498,18 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Pacific/Niue */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0xDC, 0x43, 0x35, 0x60, 0x10, 0x74, 0xCA, 0x38, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0x5E, 0x48, -0x00, 0x0A, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, -0x30, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x54, 0x4C, -0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x43, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0xCA, 0x38, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0x60, 0xB4, -0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x0A, 0xFF, 0xFF, -0x65, 0x50, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, -0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x31, 0x3E, 0x31, 0x31, -0x0A, 0x00, 0x6C, 0x4F, 0xDD, 0x00, 0x0F, 0x62, 0xCD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xDF, 0xA1, 0x6A, 0x4C, +0xF5, 0xA6, 0xB8, 0x60, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, +0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x6A, 0x4C, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0xA6, 0xB8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, +0x02, 0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, +0x65, 0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, +0x31, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x31, 0x3E, 0x31, 0x31, 0x0A, 0x00, 0x6C, 0x4F, 0xDD, 0x00, +0x0F, 0x62, 0xCD, 0x00, 0x00, 0x00, 0x00, /* Pacific/Norfolk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66500,41 +66701,43 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Pacific/Rarotonga */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x10, 0xAC, 0x1B, 0x28, 0x11, 0x3F, 0xB5, 0x18, 0x12, 0x79, 0x81, 0x20, 0x13, 0x1F, 0x97, 0x18, -0x14, 0x59, 0x63, 0x20, 0x14, 0xFF, 0x79, 0x18, 0x16, 0x39, 0x45, 0x20, 0x16, 0xE8, 0x95, 0x98, -0x18, 0x22, 0x61, 0xA0, 0x18, 0xC8, 0x77, 0x98, 0x1A, 0x02, 0x43, 0xA0, 0x1A, 0xA8, 0x59, 0x98, -0x1B, 0xE2, 0x25, 0xA0, 0x1C, 0x88, 0x3B, 0x98, 0x1D, 0xC2, 0x07, 0xA0, 0x1E, 0x68, 0x1D, 0x98, -0x1F, 0xA1, 0xE9, 0xA0, 0x20, 0x47, 0xFF, 0x98, 0x21, 0x81, 0xCB, 0xA0, 0x22, 0x31, 0x1C, 0x18, -0x23, 0x6A, 0xE8, 0x20, 0x24, 0x10, 0xFE, 0x18, 0x25, 0x4A, 0xCA, 0x20, 0x25, 0xF0, 0xE0, 0x18, -0x27, 0x2A, 0xAC, 0x20, 0x27, 0xD0, 0xC2, 0x18, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, -0x6C, 0x58, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, -0x39, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, -0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x4A, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x10, 0xAC, 0x1B, 0x28, -0x00, 0x00, 0x00, 0x00, 0x11, 0x3F, 0xB5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x81, 0x20, -0x00, 0x00, 0x00, 0x00, 0x13, 0x1F, 0x97, 0x18, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x63, 0x20, -0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0x79, 0x18, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x45, 0x20, -0x00, 0x00, 0x00, 0x00, 0x16, 0xE8, 0x95, 0x98, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x61, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x18, 0xC8, 0x77, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x43, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x59, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x25, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x1C, 0x88, 0x3B, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC2, 0x07, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x1E, 0x68, 0x1D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xE9, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x20, 0x47, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xCB, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x22, 0x31, 0x1C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xE8, 0x20, -0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xCA, 0x20, -0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0xAC, 0x20, -0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0xC2, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x6A, 0x38, -0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, -0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, -0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x30, 0x3E, 0x31, 0x30, -0x0A, 0x00, 0x68, 0xED, 0xFA, 0x00, 0x1E, 0xDF, 0xA5, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0xDF, 0xA1, 0x60, 0xC8, 0x10, 0xAC, 0x1B, 0x28, 0x11, 0x3F, 0xB5, 0x18, 0x12, 0x79, 0x81, 0x20, +0x13, 0x1F, 0x97, 0x18, 0x14, 0x59, 0x63, 0x20, 0x14, 0xFF, 0x79, 0x18, 0x16, 0x39, 0x45, 0x20, +0x16, 0xE8, 0x95, 0x98, 0x18, 0x22, 0x61, 0xA0, 0x18, 0xC8, 0x77, 0x98, 0x1A, 0x02, 0x43, 0xA0, +0x1A, 0xA8, 0x59, 0x98, 0x1B, 0xE2, 0x25, 0xA0, 0x1C, 0x88, 0x3B, 0x98, 0x1D, 0xC2, 0x07, 0xA0, +0x1E, 0x68, 0x1D, 0x98, 0x1F, 0xA1, 0xE9, 0xA0, 0x20, 0x47, 0xFF, 0x98, 0x21, 0x81, 0xCB, 0xA0, +0x22, 0x31, 0x1C, 0x18, 0x23, 0x6A, 0xE8, 0x20, 0x24, 0x10, 0xFE, 0x18, 0x25, 0x4A, 0xCA, 0x20, +0x25, 0xF0, 0xE0, 0x18, 0x27, 0x2A, 0xAC, 0x20, 0x27, 0xD0, 0xC2, 0x18, 0x7F, 0xFF, 0xFF, 0xFF, +0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x03, 0x00, 0x00, 0xBB, +0xB8, 0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x04, 0xFF, +0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, +0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, +0x4C, 0xDC, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x60, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x10, +0xAC, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3F, 0xB5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x12, +0x79, 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1F, 0x97, 0x18, 0x00, 0x00, 0x00, 0x00, 0x14, +0x59, 0x63, 0x20, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0x79, 0x18, 0x00, 0x00, 0x00, 0x00, 0x16, +0x39, 0x45, 0x20, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE8, 0x95, 0x98, 0x00, 0x00, 0x00, 0x00, 0x18, +0x22, 0x61, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC8, 0x77, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1A, +0x02, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x59, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1B, +0xE2, 0x25, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x88, 0x3B, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1D, +0xC2, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x68, 0x1D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1F, +0xA1, 0xE9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x47, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x21, +0x81, 0xCB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x31, 0x1C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x23, +0x6A, 0xE8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00, 0x25, +0x4A, 0xCA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x27, +0x2A, 0xAC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0xC2, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7F, +0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x03, +0x00, 0x00, 0xBB, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, +0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, +0x30, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x68, 0xED, 0xFA, 0x00, +0x1E, 0xDF, 0xA5, 0x00, 0x00, 0x00, 0x00, /* Pacific/Saipan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66617,28 +66820,28 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Pacific/Tongatapu */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, -0xC9, 0x73, 0x42, 0x90, 0x37, 0xFB, 0x47, 0xD0, 0x38, 0xD3, 0x7D, 0xD0, 0x3A, 0x04, 0x08, 0x50, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xD2, 0x45, 0x9C, 0x40, +0xEF, 0x11, 0xE0, 0x10, 0x37, 0xFB, 0x47, 0xD0, 0x38, 0xD3, 0x7D, 0xD0, 0x3A, 0x04, 0x08, 0x50, 0x3A, 0x72, 0xB8, 0x40, 0x3B, 0xE3, 0xEA, 0x50, 0x3C, 0x52, 0x9A, 0x40, 0x58, 0x1D, 0xD7, 0xD0, 0x58, 0x7A, 0x20, 0xD0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x02, 0x00, 0x00, 0xAD, 0x48, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, +0x05, 0x02, 0x02, 0x00, 0x00, 0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x32, 0x30, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, -0x36, 0x07, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x73, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x37, +0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, +0x45, 0x9C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x11, 0xE0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFB, 0x47, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x7D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x04, 0x08, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x72, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xE3, 0xEA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x52, 0x9A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1D, 0xD7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7A, 0x20, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x02, 0x00, 0x00, -0xAD, 0x48, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, +0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x32, 0x30, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, -0x2D, 0x31, 0x33, 0x0A, 0x00, 0x69, 0x08, 0x05, 0x00, 0x07, 0x60, 0x05, 0x00, 0x00, 0x00, 0x00, +0x2D, 0x31, 0x33, 0x0A, 0x00, 0x69, 0x15, 0x0A, 0x00, 0x07, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Truk */ @@ -66881,7 +67084,7 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { /* Portugal */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xDE, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x80, 0x00, 0x00, 0x00, 0x92, 0xE6, 0x8E, 0x80, 0x9B, 0x4B, 0x6D, 0x70, 0x9B, 0xFE, 0xC7, 0x80, 0x9C, 0x9C, 0xED, 0x70, 0x9D, 0xC9, 0x83, 0x70, 0x9E, 0x7F, 0x72, 0x70, 0x9F, 0xAA, 0xB6, 0xF0, 0xA0, 0x5F, 0x54, 0x70, 0xA1, 0x8B, 0xEA, 0x70, 0xA2, 0x41, 0xD9, 0x70, 0xA3, 0x6E, 0x6F, 0x70, 0xA4, 0x23, 0x0C, 0xF0, @@ -66898,205 +67101,207 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { 0xCF, 0xAC, 0x67, 0xE0, 0xD0, 0x52, 0x84, 0xE0, 0xD0, 0xA5, 0xA1, 0x70, 0xD1, 0x54, 0xF8, 0xF0, 0xD1, 0x8C, 0x49, 0xE0, 0xD2, 0x32, 0x66, 0xE0, 0xD2, 0x85, 0x83, 0x70, 0xD3, 0x59, 0xC4, 0xF0, 0xD4, 0x49, 0xB5, 0xF0, 0xD5, 0x39, 0xD1, 0x20, 0xD6, 0x29, 0xC2, 0x20, 0xD7, 0x19, 0xB3, 0x20, -0xD8, 0x09, 0xA4, 0x20, 0xD8, 0xF9, 0x95, 0x20, 0xD9, 0xE9, 0x86, 0x20, 0xDC, 0xB9, 0x59, 0x20, -0xDD, 0xB2, 0x84, 0xA0, 0xDE, 0xA2, 0x75, 0xA0, 0xDF, 0x92, 0x66, 0xA0, 0xE0, 0x82, 0x57, 0xA0, -0xE1, 0x72, 0x48, 0xA0, 0xE2, 0x62, 0x39, 0xA0, 0xE3, 0x52, 0x2A, 0xA0, 0xE4, 0x42, 0x1B, 0xA0, -0xE5, 0x32, 0x0C, 0xA0, 0xE6, 0x21, 0xFD, 0xA0, 0xE7, 0x1B, 0x29, 0x20, 0xE8, 0x0B, 0x1A, 0x20, -0xE8, 0xFB, 0x0B, 0x20, 0xE9, 0xEA, 0xFC, 0x20, 0xEA, 0xDA, 0xED, 0x20, 0xEB, 0xCA, 0xDE, 0x20, -0xEC, 0xBA, 0xCF, 0x20, 0xED, 0xAA, 0xC0, 0x20, 0xEE, 0x9A, 0xB1, 0x20, 0xEF, 0x8A, 0xA2, 0x20, -0xF0, 0x7A, 0x93, 0x20, 0xF1, 0x6A, 0x84, 0x20, 0xF2, 0x63, 0xAF, 0xA0, 0xF3, 0x53, 0xA0, 0xA0, -0xF4, 0x43, 0x91, 0xA0, 0xF5, 0x33, 0x82, 0xA0, 0xF6, 0x23, 0x73, 0xA0, 0xF7, 0x13, 0x64, 0xA0, -0xF8, 0x03, 0x55, 0xA0, 0xF8, 0xF3, 0x46, 0xA0, 0x0C, 0xAB, 0x2A, 0x00, 0x0D, 0x9B, 0x1B, 0x00, -0x0E, 0x8B, 0x0C, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x10, 0x74, 0x28, 0x80, 0x11, 0x64, 0x19, 0x80, -0x12, 0x54, 0x18, 0x90, 0x13, 0x43, 0xFB, 0x80, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, -0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xBD, 0xA0, -0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, -0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, -0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, -0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, -0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, -0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, -0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, -0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, -0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, -0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, -0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, -0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, -0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, -0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, -0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, -0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, -0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, -0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, -0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, -0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, -0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, -0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, -0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, -0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, -0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, -0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, -0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, -0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0xD8, 0x09, 0xA4, 0x20, 0xD8, 0xF9, 0x95, 0x20, 0xD9, 0xE9, 0x86, 0x20, 0xDA, 0xD9, 0x77, 0x20, +0xDB, 0xC9, 0x68, 0x20, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xB2, 0x84, 0xA0, 0xDE, 0xA2, 0x75, 0xA0, +0xDF, 0x92, 0x66, 0xA0, 0xE0, 0x82, 0x57, 0xA0, 0xE1, 0x72, 0x48, 0xA0, 0xE2, 0x62, 0x39, 0xA0, +0xE3, 0x52, 0x2A, 0xA0, 0xE4, 0x42, 0x1B, 0xA0, 0xE5, 0x32, 0x0C, 0xA0, 0xE6, 0x21, 0xFD, 0xA0, +0xE7, 0x1B, 0x29, 0x20, 0xE8, 0x0B, 0x1A, 0x20, 0xE8, 0xFB, 0x0B, 0x20, 0xE9, 0xEA, 0xFC, 0x20, +0xEA, 0xDA, 0xED, 0x20, 0xEB, 0xCA, 0xDE, 0x20, 0xEC, 0xBA, 0xCF, 0x20, 0xED, 0xAA, 0xC0, 0x20, +0xEE, 0x9A, 0xB1, 0x20, 0xEF, 0x8A, 0xA2, 0x20, 0xF0, 0x7A, 0x93, 0x20, 0xF1, 0x6A, 0x84, 0x20, +0xF2, 0x63, 0xAF, 0xA0, 0xF3, 0x53, 0xA0, 0xA0, 0xF4, 0x43, 0x91, 0xA0, 0xF5, 0x33, 0x82, 0xA0, +0xF6, 0x23, 0x73, 0xA0, 0xF7, 0x13, 0x64, 0xA0, 0xF8, 0x03, 0x55, 0xA0, 0xF8, 0xF3, 0x46, 0xA0, +0x0C, 0xAB, 0x2A, 0x00, 0x0D, 0x9B, 0x1B, 0x00, 0x0E, 0x8B, 0x0C, 0x00, 0x0F, 0x84, 0x37, 0x80, +0x10, 0x74, 0x28, 0x80, 0x11, 0x64, 0x19, 0x80, 0x12, 0x54, 0x18, 0x90, 0x13, 0x43, 0xFB, 0x80, +0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, +0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xBD, 0xA0, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, +0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, +0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, +0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, +0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, +0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, +0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, +0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, +0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, +0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, +0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, +0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, +0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, +0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, +0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, +0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, +0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, +0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, +0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, +0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, +0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, +0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, +0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, +0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, +0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, +0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, +0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, +0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, +0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x07, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x07, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x06, +0x03, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, -0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, -0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, -0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, -0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, -0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, -0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, -0x43, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xDE, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x0C, -0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x8E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x6D, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xED, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x72, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xB6, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x54, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8B, 0xEA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xD9, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x6F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x0C, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x05, 0xEF, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0x8E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xA7, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x23, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x4F, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x05, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x6B, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x22, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0x88, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x04, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x4C, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xC8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xB9, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xAA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xB7, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xA8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x5F, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0x8A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9A, 0xF0, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x6C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x5D, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x4E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x05, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x30, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0x96, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xAC, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xDF, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x2F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x20, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x52, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x4B, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x34, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x4B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xA2, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xBF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x16, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x67, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0x84, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xA1, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x54, 0xF8, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x66, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xC4, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xB5, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xC2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x86, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x84, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x66, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x48, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x39, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x2A, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x1B, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x0C, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x21, 0xFD, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x29, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x1A, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x0B, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEA, 0xFC, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDA, 0xED, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xDE, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xCF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xC0, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xB1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xA2, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0x93, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0x84, -0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xAF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xA0, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0x91, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x82, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x73, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x64, -0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x55, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x46, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xAB, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x1B, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, -0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x19, -0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x18, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x43, 0xFB, -0x80, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, -0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, -0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xBD, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, -0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, -0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, -0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, -0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, -0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, -0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, -0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, -0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, -0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, -0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, -0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, -0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, -0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, -0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, -0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, -0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, -0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, -0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, -0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, -0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, -0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, -0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, -0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, -0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, -0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, -0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, -0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, -0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, -0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, -0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, -0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, -0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, -0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, -0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, -0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, -0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, -0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, -0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, -0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, +0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, +0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, +0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, +0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, +0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x00, +0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x0C, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, +0xE6, 0x8E, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x6D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, +0xFE, 0xC7, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9C, 0xED, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, +0xC9, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x72, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, +0xAA, 0xB6, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x54, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, +0x8B, 0xEA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xD9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, +0x6E, 0x6F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x0C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, +0x4F, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x05, 0xEF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, +0xF4, 0x8E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xA7, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, +0xA7, 0x23, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, +0x87, 0x05, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x6B, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, +0x70, 0x22, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0x88, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, +0x50, 0x04, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x4C, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0x0F, 0xC8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xB9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, +0xEF, 0xAA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xB7, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, +0xB8, 0xA8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x5F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, +0x98, 0x8A, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9A, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, +0x78, 0x6C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x5D, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, +0x58, 0x4E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x05, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, +0x38, 0x30, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0x96, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, +0x58, 0xAC, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xDF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, +0x01, 0x2F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x20, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, +0xE2, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x52, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, +0xEC, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x4B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, +0xDC, 0xA2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x34, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, +0xC3, 0x4B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xA2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, +0xC5, 0xBF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x16, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, +0xAC, 0x67, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0x84, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, +0xA5, 0xA1, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x54, 0xF8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, +0x8C, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x66, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, +0x85, 0x83, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xC4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, +0x49, 0xB5, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, +0x29, 0xC2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, +0x09, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, +0xE9, 0x86, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x77, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, +0xC9, 0x68, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xB2, 0x84, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, +0x92, 0x66, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, +0x72, 0x48, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x39, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, +0x52, 0x2A, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x1B, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, +0x32, 0x0C, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x21, 0xFD, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, +0x1B, 0x29, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x1A, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, +0xFB, 0x0B, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEA, 0xFC, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, +0xDA, 0xED, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, +0xBA, 0xCF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xC0, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, +0x9A, 0xB1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xA2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, +0x7A, 0x93, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0x84, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, +0x63, 0xAF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xA0, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, +0x43, 0x91, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x82, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, +0x23, 0x73, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x64, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0x03, 0x55, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x46, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, +0xAB, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, +0x8B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, +0x74, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, +0x54, 0x18, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x43, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x14, +0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, +0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, +0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xBD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, +0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, +0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, +0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, +0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, +0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, +0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, +0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, +0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, +0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, +0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, +0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, +0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, +0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, +0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, +0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, +0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, +0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, +0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, +0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, +0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, +0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, +0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, +0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, +0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, +0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, +0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, +0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, +0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, +0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, +0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, +0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, +0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, +0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, +0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, +0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, +0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, +0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, +0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, +0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, +0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, +0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, +0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, +0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, +0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, +0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, +0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, +0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, +0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, +0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, +0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, +0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, +0x8E, 0x7F, 0x90, 0x00, 0x06, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x05, 0x03, -0x04, 0x03, 0x05, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x07, 0x02, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x07, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, -0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, -0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, -0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, -0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, -0x20, 0x01, 0x16, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4C, -0x4D, 0x54, 0x00, 0x57, 0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, -0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, -0x01, 0x01, 0x0A, 0x57, 0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, 0x06, 0x0A, +0x06, 0x0A, 0x06, 0xFF, 0xFF, 0xF7, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, +0x10, 0x00, 0x12, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, +0x00, 0x0E, 0x10, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x57, +0x45, 0x53, 0x54, 0x00, 0x57, 0x45, 0x54, 0x00, 0x57, 0x45, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, +0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, +0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x57, +0x45, 0x54, 0x30, 0x57, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, +0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, /* PRC */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -69349,4 +69554,4 @@ const unsigned char timelib_timezone_db_data_builtin[702099] = { }; #endif -const timelib_tzdb timezonedb_builtin = { "2021.1", 594, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2021.3", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From ad9c10b47b0e157fc7299639a89f00b015f10599 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 4 Oct 2021 00:42:39 +0200 Subject: [PATCH 0154/1346] Prefer userfaultfd over mprotect+SIGSEGV signal handling on linux for phpdbg watchpoints Closes GH-7551. --- sapi/phpdbg/config.m4 | 22 +++++++ sapi/phpdbg/phpdbg.c | 14 ++++- sapi/phpdbg/phpdbg.h | 4 ++ sapi/phpdbg/phpdbg_watch.c | 123 ++++++++++++++++++++++++++++++++----- 4 files changed, 146 insertions(+), 17 deletions(-) diff --git a/sapi/phpdbg/config.m4 b/sapi/phpdbg/config.m4 index 2f9a5e4a0f847..a494e9daae226 100644 --- a/sapi/phpdbg/config.m4 +++ b/sapi/phpdbg/config.m4 @@ -45,6 +45,28 @@ if test "$BUILD_PHPDBG" = "" && test "$PHP_PHPDBG" != "no"; then AC_MSG_RESULT([disabled]) fi + AC_CACHE_CHECK([for userfaultfd faulting on write-protected memory support], ac_phpdbg_userfaultfd_writefault, AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + #include + #ifndef UFFDIO_WRITEPROTECT_MODE_WP + # error userfaults on write-protected memory not supported + #endif + ]])], [ac_phpdbg_userfaultfd_writefault=yes], [ac_phpdbg_userfaultfd_writefault=no])) + if test "$ac_phpdbg_userfaultfd_writefault" = "yes"; then + if test "$enable_zts" != "yes"; then + dnl Add pthreads linker and compiler flags for userfaultfd background thread + if test -n "$ac_cv_pthreads_lib"; then + LIBS="$LIBS -l$ac_cv_pthreads_lib" + fi + if test -n "$ac_cv_pthreads_cflags"; then + CFLAGS="$CFLAGS $ac_cv_pthreads_cflags" + fi + + PTHREADS_FLAGS + fi + + AC_DEFINE(HAVE_USERFAULTFD_WRITEFAULT, 1, [Whether faulting on write-protected memory support can be compiled for userfaultfd]) + fi + PHP_SUBST(PHP_PHPDBG_CFLAGS) PHP_SUBST(PHP_PHPDBG_FILES) PHP_SUBST(PHPDBG_EXTRA_LIBS) diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index ed56aa68f2546..e9a5884b728f2 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -140,6 +140,11 @@ static inline void php_phpdbg_globals_ctor(zend_phpdbg_globals *pg) /* {{{ */ pg->cur_command = NULL; pg->last_line = 0; + +#ifdef HAVE_USERFAULTFD_WRITEFAULT + pg->watch_userfaultfd = 0; + pg->watch_userfault_thread = 0; +#endif } /* }}} */ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */ @@ -1499,8 +1504,13 @@ int main(int argc, char **argv) /* {{{ */ } #ifndef _WIN32 - zend_try { zend_sigaction(SIGSEGV, &signal_struct, &PHPDBG_G(old_sigsegv_signal)); } zend_end_try(); - zend_try { zend_sigaction(SIGBUS, &signal_struct, &PHPDBG_G(old_sigsegv_signal)); } zend_end_try(); +#ifdef HAVE_USERFAULTFD_WRITEFAULT + if (!PHPDBG_G(watch_userfaultfd)) +#endif + { + zend_try { zend_sigaction(SIGSEGV, &signal_struct, &PHPDBG_G(old_sigsegv_signal)); } zend_end_try(); + zend_try { zend_sigaction(SIGBUS, &signal_struct, &PHPDBG_G(old_sigsegv_signal)); } zend_end_try(); + } #endif zend_try { zend_signal(SIGINT, phpdbg_sigint_handler); } zend_end_try(); diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h index 45c5eb0593b7b..1da3b055dd9d3 100644 --- a/sapi/phpdbg/phpdbg.h +++ b/sapi/phpdbg/phpdbg.h @@ -246,6 +246,10 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg) #ifndef _WIN32 struct sigaction old_sigsegv_signal; /* segv signal handler */ +#endif +#ifdef HAVE_USERFAULTFD_WRITEFAULT + int watch_userfaultfd; /* userfaultfd(2) handler, 0 if unused */ + pthread_t watch_userfault_thread; /* thread for watch fault handling */ #endif phpdbg_btree watchpoint_tree; /* tree with watchpoints */ phpdbg_btree watch_HashTables; /* tree with original dtors of watchpoints */ diff --git a/sapi/phpdbg/phpdbg_watch.c b/sapi/phpdbg/phpdbg_watch.c index 4da831019d5ec..05155bdd069ee 100644 --- a/sapi/phpdbg/phpdbg_watch.c +++ b/sapi/phpdbg/phpdbg_watch.c @@ -111,6 +111,13 @@ # include #endif +#ifdef HAVE_USERFAULTFD_WRITEFAULT +# include +# include +# include +# include +#endif + ZEND_EXTERN_MODULE_GLOBALS(phpdbg) const phpdbg_command_t phpdbg_watch_commands[] = { @@ -208,9 +215,9 @@ void phpdbg_print_watch_diff(phpdbg_watchtype type, zend_string *name, void *old } /* ### LOW LEVEL WATCHPOINT HANDLING ### */ -static phpdbg_watchpoint_t *phpdbg_check_for_watchpoint(void *addr) { +static phpdbg_watchpoint_t *phpdbg_check_for_watchpoint(phpdbg_btree *tree, void *addr) { phpdbg_watchpoint_t *watch; - phpdbg_btree_result *result = phpdbg_btree_find_closest(&PHPDBG_G(watchpoint_tree), (zend_ulong) phpdbg_get_page_boundary(addr) + phpdbg_pagesize - 1); + phpdbg_btree_result *result = phpdbg_btree_find_closest(tree, (zend_ulong) phpdbg_get_page_boundary(addr) + phpdbg_pagesize - 1); if (result == NULL) { return NULL; @@ -228,8 +235,38 @@ static phpdbg_watchpoint_t *phpdbg_check_for_watchpoint(void *addr) { } static void phpdbg_change_watchpoint_access(phpdbg_watchpoint_t *watch, int access) { + void *page_addr = phpdbg_get_page_boundary(watch->addr.ptr); + size_t size = phpdbg_get_total_page_size(watch->addr.ptr, watch->size); +#ifdef HAVE_USERFAULTFD_WRITEFAULT + if (PHPDBG_G(watch_userfaultfd)) { + struct uffdio_range range = { + .start = (__u64) page_addr, + .len = size + }; + if (access == PROT_READ) { + struct uffdio_register reg = { + .mode = UFFDIO_REGISTER_MODE_WP, + .range = range + }; + struct uffdio_writeprotect protect = { + .mode = UFFDIO_WRITEPROTECT_MODE_WP, + .range = range + }; + ioctl(PHPDBG_G(watch_userfaultfd), UFFDIO_REGISTER, ®); + ioctl(PHPDBG_G(watch_userfaultfd), UFFDIO_WRITEPROTECT, &protect); + } else { + struct uffdio_register reg = { + .mode = UFFDIO_REGISTER_MODE_WP, + .range = range + }; + ioctl(PHPDBG_G(watch_userfaultfd), UFFDIO_UNREGISTER, ®); + } + } else +#endif /* pagesize is assumed to be in the range of 2^x */ - mprotect(phpdbg_get_page_boundary(watch->addr.ptr), phpdbg_get_total_page_size(watch->addr.ptr, watch->size), access); + { + mprotect(page_addr, size, access); + } } static inline void phpdbg_activate_watchpoint(phpdbg_watchpoint_t *watch) { @@ -256,7 +293,7 @@ int phpdbg_watchpoint_segfault_handler(siginfo_t *info, void *context) { ); /* perhaps unnecessary, but check to be sure to not conflict with other segfault handlers */ - if (phpdbg_check_for_watchpoint(page) == NULL) { + if (phpdbg_check_for_watchpoint(&PHPDBG_G(watchpoint_tree), page) == NULL) { return FAILURE; } @@ -268,6 +305,29 @@ int phpdbg_watchpoint_segfault_handler(siginfo_t *info, void *context) { return SUCCESS; } +#ifdef HAVE_USERFAULTFD_WRITEFAULT +void *phpdbg_watchpoint_userfaultfd_thread(void *phpdbg_globals) { + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + zend_phpdbg_globals *globals = (zend_phpdbg_globals *) phpdbg_globals; + + struct uffd_msg fault_msg = {0}; + while (read(globals->watch_userfaultfd, &fault_msg, sizeof(fault_msg)) == sizeof(fault_msg)) { + void *page = phpdbg_get_page_boundary((char *) fault_msg.arg.pagefault.address); + zend_hash_index_add_empty_element(globals->watchlist_mem, (zend_ulong) page); + struct uffdio_writeprotect unprotect = { + .mode = 0, + .range = { + .start = (__u64) page, + .len = phpdbg_pagesize + } + }; + ioctl(globals->watch_userfaultfd, UFFDIO_WRITEPROTECT, &unprotect); + } + + return NULL; +} +#endif + /* ### REGISTER WATCHPOINT ### To be used only by watch element and collision managers ### */ static inline void phpdbg_store_watchpoint_btree(phpdbg_watchpoint_t *watch) { phpdbg_btree_result *res; @@ -331,14 +391,14 @@ void phpdbg_delete_watch_collision(phpdbg_watchpoint_t *watch) { if ((coll = zend_hash_index_find_ptr(&PHPDBG_G(watch_collisions), (zend_ulong) watch->ref))) { zend_hash_index_del(&coll->parents, (zend_ulong) watch); if (zend_hash_num_elements(&coll->parents) == 0) { - phpdbg_deactivate_watchpoint(&coll->ref); phpdbg_remove_watchpoint_btree(&coll->ref); + phpdbg_deactivate_watchpoint(&coll->ref); if (coll->ref.type == WATCH_ON_ZVAL) { phpdbg_delete_watch_collision(&coll->ref); } else if (coll->reference.addr.ptr) { - phpdbg_deactivate_watchpoint(&coll->reference); phpdbg_remove_watchpoint_btree(&coll->reference); + phpdbg_deactivate_watchpoint(&coll->reference); phpdbg_delete_watch_collision(&coll->reference); if (coll->reference.type == WATCH_ON_STR) { zend_string_release(coll->reference.backup.str); @@ -614,8 +674,8 @@ void phpdbg_unwatch_parent_ht(phpdbg_watch_element *element) { if (zend_hash_num_elements(&hti->watches) == 1) { zend_hash_destroy(&hti->watches); phpdbg_btree_delete(&PHPDBG_G(watch_HashTables), (zend_ulong) hti->ht); - phpdbg_deactivate_watchpoint(&hti->hash_watch); phpdbg_remove_watchpoint_btree(&hti->hash_watch); + phpdbg_deactivate_watchpoint(&hti->hash_watch); efree(hti); } else { zend_hash_del(&hti->watches, element->name_in_parent); @@ -887,8 +947,8 @@ void phpdbg_update_watch_collision_elements(phpdbg_watchpoint_t *watch) { void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch) { phpdbg_watch_element *element; - phpdbg_deactivate_watchpoint(watch); phpdbg_remove_watchpoint_btree(watch); + phpdbg_deactivate_watchpoint(watch); phpdbg_delete_watch_collision(watch); if (watch->coll) { @@ -1020,8 +1080,8 @@ void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { return; } - phpdbg_deactivate_watchpoint(watch); phpdbg_remove_watchpoint_btree(watch); + phpdbg_deactivate_watchpoint(watch); watch->addr.zv = new; phpdbg_store_watchpoint_btree(watch); phpdbg_activate_watchpoint(watch); @@ -1068,7 +1128,21 @@ void phpdbg_reenable_memory_watches(void) { if (res) { watch = res->ptr; if ((char *) page < (char *) watch->addr.ptr + watch->size) { - mprotect((void *) page, phpdbg_pagesize, PROT_READ); +#ifdef HAVE_USERFAULTFD_WRITEFAULT + if (PHPDBG_G(watch_userfaultfd)) { + struct uffdio_writeprotect protect = { + .mode = UFFDIO_WRITEPROTECT_MODE_WP, + .range = { + .start = (__u64) page, + .len = phpdbg_pagesize + } + }; + ioctl(PHPDBG_G(watch_userfaultfd), UFFDIO_WRITEPROTECT, &protect); + } else +#endif + { + mprotect((void *) page, phpdbg_pagesize, PROT_READ); + } } } } ZEND_HASH_FOREACH_END(); @@ -1396,12 +1470,27 @@ void phpdbg_setup_watchpoints(void) { zend_hash_init(PHPDBG_G(watchlist_mem_backup), phpdbg_pagesize / (sizeof(Bucket) + sizeof(uint32_t)), NULL, NULL, 1); PHPDBG_G(watch_tmp) = NULL; + +#ifdef HAVE_USERFAULTFD_WRITEFAULT + PHPDBG_G(watch_userfaultfd) = syscall(SYS_userfaultfd, O_CLOEXEC); + if (PHPDBG_G(watch_userfaultfd) < 0) { + PHPDBG_G(watch_userfaultfd) = 0; + } else { + struct uffdio_api userfaultfd_features = {0}; + userfaultfd_features.api = UFFD_API; + userfaultfd_features.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP; + ioctl(PHPDBG_G(watch_userfaultfd), UFFDIO_API, &userfaultfd_features); + if (userfaultfd_features.features & UFFD_FEATURE_PAGEFAULT_FLAG_WP) { + pthread_create(&PHPDBG_G(watch_userfault_thread), NULL, phpdbg_watchpoint_userfaultfd_thread, ZEND_MODULE_GLOBALS_BULK(phpdbg)); + } else { + PHPDBG_G(watch_userfaultfd) = 0; + } + } +#endif } void phpdbg_destroy_watchpoints(void) { phpdbg_watch_element *element; - phpdbg_btree_position pos; - phpdbg_btree_result *res; /* unconditionally free all remaining elements to avoid memory leaks */ ZEND_HASH_FOREACH_PTR(&PHPDBG_G(watch_recreation), element) { @@ -1409,10 +1498,14 @@ void phpdbg_destroy_watchpoints(void) { } ZEND_HASH_FOREACH_END(); /* upon fatal errors etc. (i.e. CG(unclean_shutdown) == 1), some watchpoints may still be active. Ensure memory is not watched anymore for next run. Do not care about memory freeing here, shutdown is unclean and near anyway. */ - pos = phpdbg_btree_find_between(&PHPDBG_G(watchpoint_tree), 0, -1); - while ((res = phpdbg_btree_next(&pos))) { - phpdbg_deactivate_watchpoint(res->ptr); + phpdbg_purge_watchpoint_tree(); + +#ifdef HAVE_USERFAULTFD_WRITEFAULT + if (PHPDBG_G(watch_userfaultfd)) { + pthread_cancel(PHPDBG_G(watch_userfault_thread)); + close(PHPDBG_G(watch_userfaultfd)); } +#endif zend_hash_destroy(&PHPDBG_G(watch_elements)); PHPDBG_G(watch_elements).nNumOfElements = 0; /* phpdbg_watch_efree() is checking against this arrays size */ zend_hash_destroy(&PHPDBG_G(watch_recreation)); From 70bd46cdacd9ffecd16c4672b6e42b8c0943cc48 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Oct 2021 11:22:10 +0200 Subject: [PATCH 0155/1346] Release trampoline on zend_call_function with active exception zend_call_function() normally always releases a cached call trampoline. Do this also if the call does not actually happen due to an active exception, so the caller does not need to deal with this very special case. Fixes oss-fuzz #39792. --- Zend/tests/exception_stream_wrapper.phpt | 31 ++++++++++++++++++++++++ Zend/zend_execute_API.c | 3 +++ 2 files changed, 34 insertions(+) create mode 100644 Zend/tests/exception_stream_wrapper.phpt diff --git a/Zend/tests/exception_stream_wrapper.phpt b/Zend/tests/exception_stream_wrapper.phpt new file mode 100644 index 0000000000000..7a70645cc140f --- /dev/null +++ b/Zend/tests/exception_stream_wrapper.phpt @@ -0,0 +1,31 @@ +--TEST-- +Exception in stream wrapper + __call +--FILE-- +getMessage(), "\n"; +} + +?> +--EXPECT-- +stream_set_option +stream_stat +stream_read +Message diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 48b088c757561..7b9f8b849dc18 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -719,6 +719,9 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ } if (EG(exception)) { + if (fci_cache) { + zend_release_fcall_info_cache(fci_cache); + } return SUCCESS; /* we would result in an instable executor otherwise */ } From 0603d3b2e2c6e4304ffe86057ceba08655607f61 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Mon, 11 Oct 2021 12:57:41 +0200 Subject: [PATCH 0156/1346] improve configuration of pthread link for userfaultd thread under NTS (#7568) --- sapi/phpdbg/config.m4 | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/sapi/phpdbg/config.m4 b/sapi/phpdbg/config.m4 index a494e9daae226..2de2a3fa33164 100644 --- a/sapi/phpdbg/config.m4 +++ b/sapi/phpdbg/config.m4 @@ -45,26 +45,34 @@ if test "$BUILD_PHPDBG" = "" && test "$PHP_PHPDBG" != "no"; then AC_MSG_RESULT([disabled]) fi - AC_CACHE_CHECK([for userfaultfd faulting on write-protected memory support], ac_phpdbg_userfaultfd_writefault, AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + AC_CACHE_CHECK([for userfaultfd faulting on write-protected memory support], ac_cv_phpdbg_userfaultfd_writefault, AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include #ifndef UFFDIO_WRITEPROTECT_MODE_WP # error userfaults on write-protected memory not supported #endif - ]])], [ac_phpdbg_userfaultfd_writefault=yes], [ac_phpdbg_userfaultfd_writefault=no])) - if test "$ac_phpdbg_userfaultfd_writefault" = "yes"; then + ]])], [ac_cv_phpdbg_userfaultfd_writefault=yes], [ac_cv_phpdbg_userfaultfd_writefault=no])) + if test "$ac_cv_phpdbg_userfaultfd_writefault" = "yes"; then if test "$enable_zts" != "yes"; then - dnl Add pthreads linker and compiler flags for userfaultfd background thread - if test -n "$ac_cv_pthreads_lib"; then - LIBS="$LIBS -l$ac_cv_pthreads_lib" - fi - if test -n "$ac_cv_pthreads_cflags"; then - CFLAGS="$CFLAGS $ac_cv_pthreads_cflags" + CFLAGS_SAVE="$CFLAGS" + LIBS_SAVE="$LIBS" + + PTHREADS_CHECK + AC_MSG_CHECKING([working pthreads]); + + if test "$pthreads_working" = "yes"; then + AC_MSG_RESULT([$ac_cv_pthreads_cflags -l$ac_cv_pthreads_lib]); + PHP_PHPDBG_CFLAGS="$PHP_PHPDBG_CFLAGS $ac_cv_pthreads_cflags" + PHPDBG_EXTRA_LIBS="$PHPDBG_EXTRA_LIBS -l$ac_cv_pthreads_lib" + AC_DEFINE(HAVE_USERFAULTFD_WRITEFAULT, 1, [Whether faulting on write-protected memory support can be compiled for userfaultfd]) + else + AC_MSG_WARN([pthreads not available]) fi - PTHREADS_FLAGS + CFLAGS="$CLFAGS_SAVE" + LIBS="$LIBS_SAVE" + else + AC_DEFINE(HAVE_USERFAULTFD_WRITEFAULT, 1, [Whether faulting on write-protected memory support can be compiled for userfaultfd]) fi - - AC_DEFINE(HAVE_USERFAULTFD_WRITEFAULT, 1, [Whether faulting on write-protected memory support can be compiled for userfaultfd]) fi PHP_SUBST(PHP_PHPDBG_CFLAGS) From 39a1cab4717ae6fd3fc3af886b2656e93c73ee7b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Oct 2021 14:32:51 +0200 Subject: [PATCH 0157/1346] Generate tracing jit corpus in generate_all.php Using same corpus as function jit. To allow oss-fuzz integration. --- sapi/fuzzer/generate_all.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sapi/fuzzer/generate_all.php b/sapi/fuzzer/generate_all.php index 9c6f97ca6ceee..7a81bc94244bb 100644 --- a/sapi/fuzzer/generate_all.php +++ b/sapi/fuzzer/generate_all.php @@ -14,3 +14,7 @@ __DIR__ . '/corpus/function-jit', ["$baseDir/Zend/tests", "$baseDir/ext/opcache/tests/jit"] ); +generate_corpus_from_phpt( + __DIR__ . '/corpus/tracing-jit', + ["$baseDir/Zend/tests", "$baseDir/ext/opcache/tests/jit"] +); From e9b96ae5da50e9941069422fe6ed5c11268d3932 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 5 Oct 2021 16:27:03 +0200 Subject: [PATCH 0158/1346] Add ZipArchive::clearError, getStreamIndex and getStreamName methods public function clearError(): void {} public function getStreamIndex(int $index, int $flags = 0) {} public function getStreamName(string $name, int $flags = 0) {} ZipArchive::getStream is kept for BC See https://github.com/pierrejoye/php_zip/issues/20 --- NEWS | 5 +++ UPGRADING | 4 ++ ext/zip/php_zip.c | 56 ++++++++++++++++++++--- ext/zip/php_zip.h | 4 +- ext/zip/php_zip.stub.php | 11 +++++ ext/zip/php_zip_arginfo.h | 24 ++++++++-- ext/zip/tests/oo_getstreamindex.phpt | 67 ++++++++++++++++++++++++++++ ext/zip/zip_stream.c | 6 +-- 8 files changed, 162 insertions(+), 15 deletions(-) create mode 100644 ext/zip/tests/oo_getstreamindex.phpt diff --git a/NEWS b/NEWS index e0453e4dd99f1..d0d6ac06a9b3c 100644 --- a/NEWS +++ b/NEWS @@ -8,4 +8,9 @@ PHP NEWS - Core: . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) +- Zip: + . add ZipArchive::clearError() method + . add ZipArchive::getStreamName() method + . add ZipArchive::getStreamIndex() method + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/UPGRADING b/UPGRADING index 850bc2e13b13d..b04ab68fc6e9c 100644 --- a/UPGRADING +++ b/UPGRADING @@ -51,6 +51,10 @@ PHP 8.2 UPGRADE NOTES 9. Other Changes to Extensions ======================================== +- Zip: + . extension updated to 1.20.0 with new methods: + ZipArchive::cleaError, getStreamName and getStreamIndex + ======================================== 10. New Global Constants ======================================== diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 43d8d27d564e1..8aeec35fb08fd 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1602,6 +1602,26 @@ PHP_METHOD(ZipArchive, count) } /* }}} */ +/* {{{ clear the internal status */ +PHP_METHOD(ZipArchive, clearError) +{ + zval *self = ZEND_THIS; + ze_zip_object *ze_obj; + + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + + ze_obj = Z_ZIP_P(self); /* not ZIP_FROM_OBJECT as we can use saved error after close */ + if (ze_obj->za) { + zip_error_clear(ze_obj->za); + } else { + ze_obj->err_zip = 0; + ze_obj->err_sys = 0; + } +} +/* }}} */ + /* {{{ Returns the status error message, system and/or zip messages */ PHP_METHOD(ZipArchive, getStatusString) { @@ -2880,33 +2900,55 @@ PHP_METHOD(ZipArchive, getFromIndex) } /* }}} */ -/* {{{ get a stream for an entry using its name */ -PHP_METHOD(ZipArchive, getStream) +static void php_zip_get_stream(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ { struct zip *intern; zval *self = ZEND_THIS; + zend_long index; + zend_long flags = 0; struct zip_stat sb; char *mode = "rb"; zend_string *filename; php_stream *stream; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &filename) == FAILURE) { - RETURN_THROWS(); + if (type) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &filename, &flags) == FAILURE) { + RETURN_THROWS(); + } + } else { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &index, &flags) == FAILURE) { + RETURN_THROWS(); + } } ZIP_FROM_OBJECT(intern, self); - if (zip_stat(intern, ZSTR_VAL(filename), 0, &sb) != 0) { - RETURN_FALSE; + if (type) { + PHP_ZIP_STAT_PATH(intern, ZSTR_VAL(filename), ZSTR_LEN(filename), flags, sb); + } else { + PHP_ZIP_STAT_INDEX(intern, index, flags, sb); } - stream = php_stream_zip_open(intern, ZSTR_VAL(filename), mode STREAMS_CC); + stream = php_stream_zip_open(intern, &sb, mode, flags STREAMS_CC); if (stream) { php_stream_to_zval(stream, return_value); } else { RETURN_FALSE; } } + +/* {{{ get a stream for an entry using its name */ +PHP_METHOD(ZipArchive, getStreamName) +{ + php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +/* }}} */ + +/* {{{ get a stream for an entry using its index */ +PHP_METHOD(ZipArchive, getStreamIndex) +{ + php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); +} /* }}} */ #ifdef HAVE_PROGRESS_CALLBACK diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 5355e50b93279..30da16028dc13 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -31,7 +31,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_OVERWRITE ZIP_TRUNCATE #endif -#define PHP_ZIP_VERSION "1.19.4" +#define PHP_ZIP_VERSION "1.20.0-dev" #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) @@ -75,7 +75,7 @@ static inline ze_zip_object *php_zip_fetch_object(zend_object *obj) { #define Z_ZIP_P(zv) php_zip_fetch_object(Z_OBJ_P((zv))) php_stream *php_stream_zip_opener(php_stream_wrapper *wrapper, const char *path, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC); -php_stream *php_stream_zip_open(struct zip *arch, const char *path, const char *mode STREAMS_DC); +php_stream *php_stream_zip_open(struct zip *arch, struct zip_stat *sb, const char *mode, zip_flags_t flags STREAMS_DC); extern const php_stream_wrapper php_stream_zip_wrapper; diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php index 775054d4fdbfb..2eee6bdef59a4 100644 --- a/ext/zip/php_zip.stub.php +++ b/ext/zip/php_zip.stub.php @@ -94,6 +94,8 @@ public function count(): int {} /** @tentative-return-type */ public function getStatusString(): string {} + public function clearError(): void {} + /** @tentative-return-type */ public function addEmptyDir(string $dirname, int $flags = 0): bool {} @@ -184,6 +186,15 @@ public function getFromName(string $name, int $len = 0, int $flags = 0): string| public function getFromIndex(int $index, int $len = 0, int $flags = 0): string|false {} /** @return resource|false */ + public function getStreamIndex(int $index, int $flags = 0) {} + + /** @return resource|false */ + public function getStreamName(string $name, int $flags = 0) {} + + /** + * @return resource|false + * @alias ZipArchive::getStreamName + */ public function getStream(string $name) {} #ifdef ZIP_OPSYS_DEFAULT diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h index d2bdd541ed6db..bb6f1b532f4a9 100644 --- a/ext/zip/php_zip_arginfo.h +++ b/ext/zip/php_zip_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 93db1517143e903f01e4726a6b6c9bcbe0510f5b */ + * Stub hash: 214a5d606d5535032251a41d4fa18f47d93ec42e */ ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -58,6 +58,9 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_getStatusString, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_clearError, 0, 0, IS_VOID, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_addEmptyDir, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, dirname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") @@ -201,6 +204,16 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_MASK_EX(arginfo_class_ZipArchive_getFr ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStreamIndex, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStreamName, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStream, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -309,6 +322,7 @@ ZEND_METHOD(ZipArchive, setPassword); ZEND_METHOD(ZipArchive, close); ZEND_METHOD(ZipArchive, count); ZEND_METHOD(ZipArchive, getStatusString); +ZEND_METHOD(ZipArchive, clearError); ZEND_METHOD(ZipArchive, addEmptyDir); ZEND_METHOD(ZipArchive, addFromString); ZEND_METHOD(ZipArchive, addFile); @@ -342,7 +356,8 @@ ZEND_METHOD(ZipArchive, unchangeName); ZEND_METHOD(ZipArchive, extractTo); ZEND_METHOD(ZipArchive, getFromName); ZEND_METHOD(ZipArchive, getFromIndex); -ZEND_METHOD(ZipArchive, getStream); +ZEND_METHOD(ZipArchive, getStreamIndex); +ZEND_METHOD(ZipArchive, getStreamName); #if defined(ZIP_OPSYS_DEFAULT) ZEND_METHOD(ZipArchive, setExternalAttributesName); #endif @@ -398,6 +413,7 @@ static const zend_function_entry class_ZipArchive_methods[] = { ZEND_ME(ZipArchive, close, arginfo_class_ZipArchive_close, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, count, arginfo_class_ZipArchive_count, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, getStatusString, arginfo_class_ZipArchive_getStatusString, ZEND_ACC_PUBLIC) + ZEND_ME(ZipArchive, clearError, arginfo_class_ZipArchive_clearError, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, addEmptyDir, arginfo_class_ZipArchive_addEmptyDir, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, addFromString, arginfo_class_ZipArchive_addFromString, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, addFile, arginfo_class_ZipArchive_addFile, ZEND_ACC_PUBLIC) @@ -431,7 +447,9 @@ static const zend_function_entry class_ZipArchive_methods[] = { ZEND_ME(ZipArchive, extractTo, arginfo_class_ZipArchive_extractTo, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, getFromName, arginfo_class_ZipArchive_getFromName, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, getFromIndex, arginfo_class_ZipArchive_getFromIndex, ZEND_ACC_PUBLIC) - ZEND_ME(ZipArchive, getStream, arginfo_class_ZipArchive_getStream, ZEND_ACC_PUBLIC) + ZEND_ME(ZipArchive, getStreamIndex, arginfo_class_ZipArchive_getStreamIndex, ZEND_ACC_PUBLIC) + ZEND_ME(ZipArchive, getStreamName, arginfo_class_ZipArchive_getStreamName, ZEND_ACC_PUBLIC) + ZEND_MALIAS(ZipArchive, getStream, getStreamName, arginfo_class_ZipArchive_getStream, ZEND_ACC_PUBLIC) #if defined(ZIP_OPSYS_DEFAULT) ZEND_ME(ZipArchive, setExternalAttributesName, arginfo_class_ZipArchive_setExternalAttributesName, ZEND_ACC_PUBLIC) #endif diff --git a/ext/zip/tests/oo_getstreamindex.phpt b/ext/zip/tests/oo_getstreamindex.phpt new file mode 100644 index 0000000000000..6aba5ca7e52eb --- /dev/null +++ b/ext/zip/tests/oo_getstreamindex.phpt @@ -0,0 +1,67 @@ +--TEST-- +ZipArchive::getStreamIndex / ZipArchive::getName +--EXTENSIONS-- +zip +--FILE-- +open($name, ZIPARCHIVE::CREATE); +$zip->addFromString('foo.txt', 'foo'); +$zip->addFromString('bar.txt', 'bar'); +$zip->close(); + +$r = $zip->open($name); + +$zip->addFromString('bar.txt', 'baz', ZipArchive::FL_OVERWRITE); + + +echo "== Name\n"; +$fp = $zip->getStreamName('foo.txt'); +var_dump($zip->status); +var_dump(stream_get_contents($fp)); +$zip->clearError(); +fclose($fp); + +echo "== Index\n"; +$fp = $zip->getStreamIndex(0); +var_dump($zip->status); +var_dump(stream_get_contents($fp)); +$zip->clearError(); +fclose($fp); + +echo "== Index, changed\n"; +$fp = $zip->getStreamIndex(1); +var_dump($zip->status); +$zip->clearError(); + +echo "== Index, unchanged\n"; +$fp = $zip->getStreamIndex(1, ZipArchive::FL_UNCHANGED); +var_dump($zip->status); +var_dump(stream_get_contents($fp)); +$zip->clearError(); +fclose($fp); + +$zip->close(); +?> +== Done +--CLEAN-- + +--EXPECTF-- +== Name +int(0) +string(3) "foo" +== Index +int(0) +string(3) "foo" +== Index, changed +int(15) +== Index, unchanged +int(0) +string(3) "bar" +== Done diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c index 3ee314457a9ba..63b912ff95282 100644 --- a/ext/zip/zip_stream.c +++ b/ext/zip/zip_stream.c @@ -208,7 +208,7 @@ const php_stream_ops php_stream_zipio_ops = { }; /* {{{ php_stream_zip_open */ -php_stream *php_stream_zip_open(struct zip *arch, const char *path, const char *mode STREAMS_DC) +php_stream *php_stream_zip_open(struct zip *arch, struct zip_stat *sb, const char *mode, zip_flags_t flags STREAMS_DC) { struct zip_file *zf = NULL; @@ -220,7 +220,7 @@ php_stream *php_stream_zip_open(struct zip *arch, const char *path, const char * } if (arch) { - zf = zip_fopen(arch, path, 0); + zf = zip_fopen_index(arch, sb->index, flags); if (zf) { self = emalloc(sizeof(*self)); @@ -229,7 +229,7 @@ php_stream *php_stream_zip_open(struct zip *arch, const char *path, const char * self->stream = NULL; self->cursor = 0; stream = php_stream_alloc(&php_stream_zipio_ops, self, NULL, mode); - stream->orig_path = estrdup(path); + stream->orig_path = estrdup(sb->name); } } From 1b120b4a592c9d94eea7c46df227e3f6e2cc15aa Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Oct 2021 15:55:21 +0200 Subject: [PATCH 0159/1346] Declare some properties in tests --- Zend/tests/bug24635.phpt | 2 ++ Zend/tests/bug38779.phpt | 1 + Zend/tests/bug41421.phpt | 1 + Zend/tests/bug60598.phpt | 2 +- Zend/tests/debug_backtrace_with_include_and_this.phpt | 1 + Zend/tests/exception_during_include_stat.phpt | 1 + Zend/tests/include_stat_is_quiet.phpt | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Zend/tests/bug24635.phpt b/Zend/tests/bug24635.phpt index 7210f83743a2e..e4bb1b6db3e82 100644 --- a/Zend/tests/bug24635.phpt +++ b/Zend/tests/bug24635.phpt @@ -3,6 +3,7 @@ Bug #24635 (crash on dtor calling other functions) --FILE-- page = new PageClass(); } } class PageClass { @@ -11,6 +12,7 @@ class PageClass { } } class SectionClass { + public $Comment; function __construct($comment) { $this->Comment = $comment; } diff --git a/Zend/tests/bug38779.phpt b/Zend/tests/bug38779.phpt index 7260a709d0fa4..f99eb2c9606f1 100644 --- a/Zend/tests/bug38779.phpt +++ b/Zend/tests/bug38779.phpt @@ -4,6 +4,7 @@ Bug #38779 (engine crashes when require()'ing file with syntax error through use guid = 1; diff --git a/Zend/tests/debug_backtrace_with_include_and_this.phpt b/Zend/tests/debug_backtrace_with_include_and_this.phpt index 1364432f5dd4f..49796a9b91034 100644 --- a/Zend/tests/debug_backtrace_with_include_and_this.phpt +++ b/Zend/tests/debug_backtrace_with_include_and_this.phpt @@ -3,6 +3,7 @@ debug_backtrace segmentation fault with include and error handler --FILE-- Date: Mon, 11 Oct 2021 16:01:16 +0200 Subject: [PATCH 0160/1346] Add missing $flags param to getStream() This is an alias of getStreamName() but was missing the optional $flags parameter. --- ext/zend_test/test_arginfo.h | 2 +- ext/zip/php_zip.stub.php | 2 +- ext/zip/php_zip_arginfo.h | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index e1f9b72e7d47d..3add1d7b38ec8 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: 91ffc3205c6ac7b07953c9446e9cb9988d893dd4 */ + * Stub hash: f5566ec4bffa9878e1c5eaba0c2ceeff4435c8d3 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php index 2eee6bdef59a4..4338e519bdaf3 100644 --- a/ext/zip/php_zip.stub.php +++ b/ext/zip/php_zip.stub.php @@ -195,7 +195,7 @@ public function getStreamName(string $name, int $flags = 0) {} * @return resource|false * @alias ZipArchive::getStreamName */ - public function getStream(string $name) {} + public function getStream(string $name, int $flags = 0) {} #ifdef ZIP_OPSYS_DEFAULT /** @tentative-return-type */ diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h index bb6f1b532f4a9..16d3ba746a64e 100644 --- a/ext/zip/php_zip_arginfo.h +++ b/ext/zip/php_zip_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 214a5d606d5535032251a41d4fa18f47d93ec42e */ + * Stub hash: 1c1e7e6e4a9790706f2330f5e4e7e263dc5440e3 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -214,9 +214,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStreamName, 0, 0, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStream, 0, 0, 1) - ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) -ZEND_END_ARG_INFO() +#define arginfo_class_ZipArchive_getStream arginfo_class_ZipArchive_getStreamName #if defined(ZIP_OPSYS_DEFAULT) ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_setExternalAttributesName, 0, 3, _IS_BOOL, 0) From dc4cfb1ccb69982f77da501babb34aceeb85ac2b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 12 Oct 2021 09:29:08 +0200 Subject: [PATCH 0161/1346] Don't accept flags in ZipArchive::getStream() Per discussion on https://github.com/php/php-src/commit/e489e2d3885c35a2a969d92bada5d42aac1bbec6 this method should not accept $flags, so un-alias it from getStreamName(). --- ext/zip/php_zip.c | 22 +++++++++++++++++----- ext/zip/php_zip.stub.php | 7 ++----- ext/zip/php_zip_arginfo.h | 9 ++++++--- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 8aeec35fb08fd..ca040b52e2b36 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2900,7 +2900,7 @@ PHP_METHOD(ZipArchive, getFromIndex) } /* }}} */ -static void php_zip_get_stream(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ +static void php_zip_get_stream(INTERNAL_FUNCTION_PARAMETERS, int type, bool accept_flags) /* {{{ */ { struct zip *intern; zval *self = ZEND_THIS; @@ -2912,10 +2912,17 @@ static void php_zip_get_stream(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ php_stream *stream; if (type) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &filename, &flags) == FAILURE) { - RETURN_THROWS(); + if (accept_flags) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "P|l", &filename, &flags) == FAILURE) { + RETURN_THROWS(); + } + } else { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "P", &filename) == FAILURE) { + RETURN_THROWS(); + } } } else { + ZEND_ASSERT(accept_flags); if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l", &index, &flags) == FAILURE) { RETURN_THROWS(); } @@ -2940,17 +2947,22 @@ static void php_zip_get_stream(INTERNAL_FUNCTION_PARAMETERS, int type) /* {{{ */ /* {{{ get a stream for an entry using its name */ PHP_METHOD(ZipArchive, getStreamName) { - php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); + php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, /* accept_flags */ true); } /* }}} */ /* {{{ get a stream for an entry using its index */ PHP_METHOD(ZipArchive, getStreamIndex) { - php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); + php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, /* accept_flags */ true); } /* }}} */ +PHP_METHOD(ZipArchive, getStream) +{ + php_zip_get_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, /* accept_flags */ false); +} + #ifdef HAVE_PROGRESS_CALLBACK static void _php_zip_progress_callback(zip_t *arch, double state, void *ptr) { diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php index 4338e519bdaf3..26ef522470e91 100644 --- a/ext/zip/php_zip.stub.php +++ b/ext/zip/php_zip.stub.php @@ -191,11 +191,8 @@ public function getStreamIndex(int $index, int $flags = 0) {} /** @return resource|false */ public function getStreamName(string $name, int $flags = 0) {} - /** - * @return resource|false - * @alias ZipArchive::getStreamName - */ - public function getStream(string $name, int $flags = 0) {} + /** @return resource|false */ + public function getStream(string $name) {} #ifdef ZIP_OPSYS_DEFAULT /** @tentative-return-type */ diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h index 16d3ba746a64e..09e586502c780 100644 --- a/ext/zip/php_zip_arginfo.h +++ b/ext/zip/php_zip_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 1c1e7e6e4a9790706f2330f5e4e7e263dc5440e3 */ + * Stub hash: 13bf4e67d7a36ba19e7222fbbcb94fea4e59c558 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -214,7 +214,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStreamName, 0, 0, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -#define arginfo_class_ZipArchive_getStream arginfo_class_ZipArchive_getStreamName +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZipArchive_getStream, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) +ZEND_END_ARG_INFO() #if defined(ZIP_OPSYS_DEFAULT) ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ZipArchive_setExternalAttributesName, 0, 3, _IS_BOOL, 0) @@ -356,6 +358,7 @@ ZEND_METHOD(ZipArchive, getFromName); ZEND_METHOD(ZipArchive, getFromIndex); ZEND_METHOD(ZipArchive, getStreamIndex); ZEND_METHOD(ZipArchive, getStreamName); +ZEND_METHOD(ZipArchive, getStream); #if defined(ZIP_OPSYS_DEFAULT) ZEND_METHOD(ZipArchive, setExternalAttributesName); #endif @@ -447,7 +450,7 @@ static const zend_function_entry class_ZipArchive_methods[] = { ZEND_ME(ZipArchive, getFromIndex, arginfo_class_ZipArchive_getFromIndex, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, getStreamIndex, arginfo_class_ZipArchive_getStreamIndex, ZEND_ACC_PUBLIC) ZEND_ME(ZipArchive, getStreamName, arginfo_class_ZipArchive_getStreamName, ZEND_ACC_PUBLIC) - ZEND_MALIAS(ZipArchive, getStream, getStreamName, arginfo_class_ZipArchive_getStream, ZEND_ACC_PUBLIC) + ZEND_ME(ZipArchive, getStream, arginfo_class_ZipArchive_getStream, ZEND_ACC_PUBLIC) #if defined(ZIP_OPSYS_DEFAULT) ZEND_ME(ZipArchive, setExternalAttributesName, arginfo_class_ZipArchive_setExternalAttributesName, ZEND_ACC_PUBLIC) #endif From 3fb1cf24c359dfca9e8f36bb1e092b93ad265f15 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 12 Oct 2021 13:33:16 +0200 Subject: [PATCH 0162/1346] Fix #81520 TEST_PHP_CGI_EXECUTABLE badly set in run-tests.php --- run-tests.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/run-tests.php b/run-tests.php index ce86e068dc4df..fa18046dbfbf8 100755 --- a/run-tests.php +++ b/run-tests.php @@ -1057,11 +1057,14 @@ function get_binary(string $php, string $sapi, string $sapi_path): ?string if (IS_WINDOWS && file_exists("$dir/$sapi.exe")) { return realpath("$dir/$sapi.exe"); } + // Sources tree if (file_exists("$dir/../../$sapi_path")) { return realpath("$dir/../../$sapi_path"); } - if (file_exists("$dir/$sapi")) { - return realpath("$dir/$sapi"); + // Installation tre, preserve command prefix/suffix + $inst = str_replace('php', $sapi, basename($php)); + if (file_exists("$dir/$inst")) { + return realpath("$dir/$inst"); } return null; } From 7699aed37728be4616b5895610e2102bbdf750df Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Wed, 13 Oct 2021 07:12:09 +0200 Subject: [PATCH 0163/1346] missing shutdown in observer --- Zend/zend_observer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c index 35958aeac5a6c..6574fc68d1c34 100644 --- a/Zend/zend_observer.c +++ b/Zend/zend_observer.c @@ -101,7 +101,9 @@ ZEND_API void zend_observer_deactivate(void) { ZEND_API void zend_observer_shutdown(void) { zend_llist_destroy(&zend_observers_fcall_list); zend_llist_destroy(&zend_observer_error_callbacks); + zend_llist_destroy(&zend_observer_fiber_init); zend_llist_destroy(&zend_observer_fiber_switch); + zend_llist_destroy(&zend_observer_fiber_destroy); } static void zend_observer_fcall_install(zend_execute_data *execute_data) { From 105c2e0fcb884bdf4408790b56a93b27beb626f9 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 13 Oct 2021 11:54:28 +0200 Subject: [PATCH 0164/1346] bump zip ext version --- ext/zip/php_zip.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 30da16028dc13..49c1491828f06 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -31,7 +31,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_OVERWRITE ZIP_TRUNCATE #endif -#define PHP_ZIP_VERSION "1.20.0-dev" +#define PHP_ZIP_VERSION "1.20.0" #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) From ddaf64b56c88f0ae223b1aca25293dd7fec77fc0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 14 Oct 2021 12:16:18 +0300 Subject: [PATCH 0165/1346] Avoid non-immutable map_ptr indirection --- Zend/zend.c | 47 +++-------------------- Zend/zend_API.c | 4 -- Zend/zend_closures.c | 19 +++++---- Zend/zend_compile.c | 19 +-------- Zend/zend_compile.h | 1 - Zend/zend_execute.c | 4 +- Zend/zend_inheritance.c | 25 ++---------- Zend/zend_language_scanner.l | 1 - Zend/zend_map_ptr.h | 36 +++++------------ Zend/zend_object_handlers.c | 2 +- ext/opcache/jit/zend_jit_arm64.dasc | 4 +- ext/opcache/jit/zend_jit_helpers.c | 2 +- ext/opcache/jit/zend_jit_x86.dasc | 5 ++- ext/opcache/zend_accelerator_util_funcs.c | 9 ++--- ext/opcache/zend_file_cache.c | 19 ++------- 15 files changed, 47 insertions(+), 150 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index b5339c4f87afa..52295761245f1 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -702,7 +702,6 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{ compiler_globals->script_encoding_list = NULL; compiler_globals->current_linking_class = NULL; -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET /* Map region is going to be created and resized at run-time. */ compiler_globals->map_ptr_real_base = NULL; compiler_globals->map_ptr_base = ZEND_MAP_PTR_BIASED_BASE(NULL); @@ -716,9 +715,6 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{ compiler_globals->map_ptr_base = ZEND_MAP_PTR_BIASED_BASE(base); memset(base, 0, compiler_globals->map_ptr_last * sizeof(void*)); } -#else -# error "Unknown ZEND_MAP_PTR_KIND" -#endif } /* }}} */ @@ -967,24 +963,11 @@ void zend_startup(zend_utility_functions *utility_functions) /* {{{ */ #ifdef ZEND_WIN32 zend_get_windows_version_info(&EG(windows_version_info)); #endif -# if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR - /* Create a map region, used for indirect pointers from shared to - * process memory. It's allocated once and never resized. - * All processes must map it into the same address space. - */ - CG(map_ptr_size) = 1024 * 1024; // TODO: initial size ??? - CG(map_ptr_last) = 0; - CG(map_ptr_real_base) = pemalloc(CG(map_ptr_size) * sizeof(void*), 1); - CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(CG(map_ptr_real_base)); -# elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET - /* Map region is going to be created and resized at run-time. */ - CG(map_ptr_real_base) = NULL; - CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(NULL); - CG(map_ptr_size) = 0; - CG(map_ptr_last) = 0; -# else -# error "Unknown ZEND_MAP_PTR_KIND" -# endif + /* Map region is going to be created and resized at run-time. */ + CG(map_ptr_real_base) = NULL; + CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(NULL); + CG(map_ptr_size) = 0; + CG(map_ptr_last) = 0; #endif EG(error_reporting) = E_ALL & ~E_NOTICE; @@ -1821,28 +1804,15 @@ ZEND_API void *zend_map_ptr_new(void) void **ptr; if (CG(map_ptr_last) >= CG(map_ptr_size)) { -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR - // TODO: error ??? - ZEND_UNREACHABLE(); -#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET /* Grow map_ptr table */ CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(CG(map_ptr_last) + 1, 4096); CG(map_ptr_real_base) = perealloc(CG(map_ptr_real_base), CG(map_ptr_size) * sizeof(void*), 1); CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(CG(map_ptr_real_base)); -#else -# error "Unknown ZEND_MAP_PTR_KIND" -#endif } ptr = (void**)CG(map_ptr_real_base) + CG(map_ptr_last); *ptr = NULL; CG(map_ptr_last)++; -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR - return ptr; -#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET return ZEND_MAP_PTR_PTR2OFFSET(ptr); -#else -# error "Unknown ZEND_MAP_PTR_KIND" -#endif } ZEND_API void zend_map_ptr_extend(size_t last) @@ -1851,17 +1821,10 @@ ZEND_API void zend_map_ptr_extend(size_t last) void **ptr; if (last >= CG(map_ptr_size)) { -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR - /* This may never happen */ - ZEND_UNREACHABLE(); -#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET /* Grow map_ptr table */ CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(last, 4096); CG(map_ptr_real_base) = perealloc(CG(map_ptr_real_base), CG(map_ptr_size) * sizeof(void*), 1); CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(CG(map_ptr_real_base)); -#else -# error "Unknown ZEND_MAP_PTR_KIND" -#endif } ptr = (void**)CG(map_ptr_real_base) + CG(map_ptr_last); memset(ptr, 0, (last - CG(map_ptr_last)) * sizeof(void*)); diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 294a527434767..12453a53e8ded 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4054,10 +4054,6 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z if (ce->type == ZEND_INTERNAL_CLASS && ce->info.internal.module->type == MODULE_PERSISTENT) { ZEND_MAP_PTR_NEW(ce->static_members_table); - } else { - ZEND_MAP_PTR_INIT(ce->static_members_table, - zend_arena_alloc(&CG(arena), sizeof(zval **))); - ZEND_MAP_PTR_SET(ce->static_members_table, NULL); } } } else { diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index a5ae8cde359e2..a5a3da2587dd2 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -164,10 +164,8 @@ ZEND_METHOD(Closure, call) void *ptr; my_function.op_array.fn_flags |= ZEND_ACC_HEAP_RT_CACHE; - ptr = emalloc(sizeof(void*) + my_function.op_array.cache_size); + ptr = emalloc(my_function.op_array.cache_size); ZEND_MAP_PTR_INIT(my_function.op_array.run_time_cache, ptr); - ptr = (char*)ptr + sizeof(void*); - ZEND_MAP_PTR_SET(my_function.op_array.run_time_cache, ptr); memset(ptr, 0, my_function.op_array.cache_size); } } @@ -487,6 +485,7 @@ static void zend_closure_free_storage(zend_object *object) /* {{{ */ /* We don't own the static variables of fake closures. */ if (!(closure->func.op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) { zend_destroy_static_vars(&closure->func.op_array); + closure->func.op_array.static_variables = NULL; } destroy_op_array(&closure->func.op_array); } else if (closure->func.type == ZEND_INTERNAL_FUNCTION) { @@ -696,7 +695,15 @@ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_en zend_array_dup(closure->func.op_array.static_variables); } ZEND_MAP_PTR_INIT(closure->func.op_array.static_variables_ptr, - &closure->func.op_array.static_variables); + closure->func.op_array.static_variables); + } else if (func->op_array.static_variables) { + HashTable *ht = ZEND_MAP_PTR_GET(func->op_array.static_variables_ptr); + + if (!ht) { + ht = zend_array_dup(func->op_array.static_variables); + ZEND_MAP_PTR_SET(func->op_array.static_variables_ptr, ht); + } + ZEND_MAP_PTR_INIT(closure->func.op_array.static_variables_ptr, ht); } /* Runtime cache is scope-dependent, so we cannot reuse it if the scope changed */ @@ -722,10 +729,8 @@ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_en } else { /* Otherwise, we use a non-shared runtime cache */ closure->func.op_array.fn_flags |= ZEND_ACC_HEAP_RT_CACHE; - ptr = emalloc(sizeof(void*) + func->op_array.cache_size); + ptr = emalloc(func->op_array.cache_size); ZEND_MAP_PTR_INIT(closure->func.op_array.run_time_cache, ptr); - ptr = (char*)ptr + sizeof(void*); - ZEND_MAP_PTR_SET(closure->func.op_array.run_time_cache, ptr); } memset(ptr, 0, func->op_array.cache_size); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 8ac6bdec57726..1cc2f9e211d91 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1037,15 +1037,6 @@ static uint32_t zend_add_try_element(uint32_t try_op) /* {{{ */ } /* }}} */ -void zend_init_static_variables_map_ptr(zend_op_array *op_array) -{ - if (op_array->static_variables) { - ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, - zend_arena_alloc(&CG(arena), sizeof(HashTable *))); - ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL); - } -} - ZEND_API void function_add_ref(zend_function *function) /* {{{ */ { if (function->type == ZEND_USER_FUNCTION) { @@ -1054,10 +1045,8 @@ ZEND_API void function_add_ref(zend_function *function) /* {{{ */ (*op_array->refcount)++; } - ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void *))); - ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL); - - zend_init_static_variables_map_ptr(op_array); + ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL); + ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL); } if (function->common.function_name) { @@ -7093,9 +7082,6 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) op_array->fn_flags |= ZEND_ACC_PRELOADED; } - ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void *))); - ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL); - op_array->fn_flags |= (orig_op_array->fn_flags & ZEND_ACC_STRICT_TYPES); op_array->fn_flags |= decl->flags; op_array->line_start = decl->start_lineno; @@ -7181,7 +7167,6 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) zend_do_extended_stmt(); zend_emit_final_return(0); - zend_init_static_variables_map_ptr(op_array); pass_two(CG(active_op_array)); zend_oparray_context_end(&orig_oparray_context); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 1a4d3afcac04e..ed97614c8e183 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -801,7 +801,6 @@ ZEND_API zend_result do_bind_class(zval *lcname, zend_string *lc_parent_name); void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline); ZEND_API void function_add_ref(zend_function *function); -void zend_init_static_variables_map_ptr(zend_op_array *op_array); zend_string *zval_make_interned_string(zval *zv); #define INITIAL_OP_ARRAY_SIZE 64 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9fa208f362dd1..7879f0ad98465 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3779,10 +3779,8 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu void *ptr; ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE); - ptr = emalloc(op_array->cache_size + sizeof(void*)); + ptr = emalloc(op_array->cache_size); ZEND_MAP_PTR_INIT(op_array->run_time_cache, ptr); - ptr = (char*)ptr + sizeof(void*); - ZEND_MAP_PTR_SET(op_array->run_time_cache, ptr); memset(ptr, 0, op_array->cache_size); } EX(run_time_cache) = RUN_TIME_CACHE(op_array); diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 596d2e302b3b7..0e8e1aa4627a7 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1525,10 +1525,6 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par if (ce->type == ZEND_INTERNAL_CLASS && ce->info.internal.module->type == MODULE_PERSISTENT) { ZEND_MAP_PTR_NEW(ce->static_members_table); - } else { - ZEND_MAP_PTR_INIT(ce->static_members_table, - zend_arena_alloc(&CG(arena), sizeof(zval *))); - ZEND_MAP_PTR_SET(ce->static_members_table, NULL); } } } @@ -2615,30 +2611,18 @@ static zend_class_entry *zend_lazy_class_load(zend_class_entry *pce) end = p + ce->function_table.nNumUsed; for (; p != end; p++) { zend_op_array *op_array, *new_op_array; - void ***run_time_cache_ptr; - size_t alloc_size; op_array = Z_PTR(p->val); ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION); ZEND_ASSERT(op_array->scope == pce); ZEND_ASSERT(op_array->prototype == NULL); - alloc_size = sizeof(zend_op_array) + sizeof(void *); - if (op_array->static_variables) { - alloc_size += sizeof(HashTable *); - } - new_op_array = zend_arena_alloc(&CG(arena), alloc_size); + new_op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); Z_PTR(p->val) = new_op_array; memcpy(new_op_array, op_array, sizeof(zend_op_array)); - run_time_cache_ptr = (void***)(new_op_array + 1); - *run_time_cache_ptr = NULL; new_op_array->fn_flags &= ~ZEND_ACC_IMMUTABLE; new_op_array->scope = ce; - ZEND_MAP_PTR_INIT(new_op_array->run_time_cache, run_time_cache_ptr); - if (op_array->static_variables) { - HashTable **static_variables_ptr = (HashTable **) (run_time_cache_ptr + 1); - *static_variables_ptr = NULL; - ZEND_MAP_PTR_INIT(new_op_array->static_variables_ptr, static_variables_ptr); - } + ZEND_MAP_PTR_INIT(new_op_array->run_time_cache, NULL); + ZEND_MAP_PTR_INIT(new_op_array->static_variables_ptr, NULL); zend_update_inherited_handler(constructor); zend_update_inherited_handler(destructor); @@ -2667,8 +2651,7 @@ static zend_class_entry *zend_lazy_class_load(zend_class_entry *pce) ZVAL_COPY_VALUE(dst, src); } } - ZEND_MAP_PTR_INIT(ce->static_members_table, zend_arena_alloc(&CG(arena), sizeof(zval *))); - ZEND_MAP_PTR_SET(ce->static_members_table, NULL); + ZEND_MAP_PTR_INIT(ce->static_members_table, NULL); /* properties_info */ if (!(HT_FLAGS(&ce->properties_info) & HASH_FLAG_UNINITIALIZED)) { diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index ff70ff2282f7f..a367c2acb82da 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -620,7 +620,6 @@ static zend_op_array *zend_compile(int type) zend_emit_final_return(type == ZEND_USER_FUNCTION); op_array->line_start = 1; op_array->line_end = last_lineno; - zend_init_static_variables_map_ptr(op_array); pass_two(op_array); zend_oparray_context_end(&original_oparray_context); zend_file_context_end(&original_file_context); diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h index 0f8bcbeea9812..f2fe96f19a72c 100644 --- a/Zend/zend_map_ptr.h +++ b/Zend/zend_map_ptr.h @@ -24,16 +24,12 @@ #define ZEND_MAP_PTR_KIND_PTR 0 #define ZEND_MAP_PTR_KIND_PTR_OR_OFFSET 1 -//#if defined(ZTS) || defined(TSRM_WIN32) -# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET -//#else -//# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR -//#endif +#define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET #define ZEND_MAP_PTR(ptr) \ ptr ## __ptr #define ZEND_MAP_PTR_DEF(type, name) \ - type * ZEND_MAP_PTR(name) + type ZEND_MAP_PTR(name) #define ZEND_MAP_PTR_OFFSET2PTR(offset) \ ((void**)((char*)CG(map_ptr_base) + offset)) #define ZEND_MAP_PTR_PTR2OFFSET(ptr) \ @@ -45,37 +41,23 @@ ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \ } while (0) -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR -# define ZEND_MAP_PTR_NEW_OFFSET() \ - ((uint32_t)(uintptr_t)ZEND_MAP_PTR_PTR2OFFSET(zend_map_ptr_new())) -# define ZEND_MAP_PTR_GET(ptr) \ - (*(ZEND_MAP_PTR(ptr))) -# define ZEND_MAP_PTR_GET_IMM(ptr) \ - ZEND_MAP_PTR_GET(ptr) -# define ZEND_MAP_PTR_SET(ptr, val) do { \ - (*(ZEND_MAP_PTR(ptr))) = (val); \ - } while (0) -# define ZEND_MAP_PTR_SET_IMM(ptr, val) \ - ZEND_MAP_PTR_SET(ptr, val) -# define ZEND_MAP_PTR_BIASED_BASE(real_base) \ - (real_base) -#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET +#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET # define ZEND_MAP_PTR_NEW_OFFSET() \ ((uint32_t)(uintptr_t)zend_map_ptr_new()) # define ZEND_MAP_PTR_IS_OFFSET(ptr) \ (((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L) # define ZEND_MAP_PTR_GET(ptr) \ - (*(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \ - ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)) : \ - ((void**)(ZEND_MAP_PTR(ptr))))) + ((ZEND_MAP_PTR_IS_OFFSET(ptr) ? \ + ZEND_MAP_PTR_GET_IMM(ptr) : \ + ((void*)(ZEND_MAP_PTR(ptr))))) # define ZEND_MAP_PTR_GET_IMM(ptr) \ (*ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr))) # define ZEND_MAP_PTR_SET(ptr, val) do { \ - void **__p = (void**)(ZEND_MAP_PTR(ptr)); \ if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \ - __p = ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)); \ + ZEND_MAP_PTR_SET_IMM(ptr, val); \ + } else { \ + ZEND_MAP_PTR_INIT(ptr, val); \ } \ - *__p = (val); \ } while (0) # define ZEND_MAP_PTR_SET_IMM(ptr, val) do { \ void **__p = ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)); \ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 5382ac721110c..48e1a7edc9e6a 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1236,7 +1236,7 @@ ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend func->fn_flags |= ZEND_ACC_STATIC; } func->opcodes = &EG(call_trampoline_op); - ZEND_MAP_PTR_INIT(func->run_time_cache, (void***)&dummy); + ZEND_MAP_PTR_INIT(func->run_time_cache, (void**)dummy); func->scope = fbc->common.scope; /* reserve space for arguments, local and temporary variables */ func->T = (fbc->type == ZEND_USER_FUNCTION)? MAX(fbc->op_array.last_var + fbc->op_array.T, 2) : 2; diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 8eb811888b9f2..fab7cdc21f7f7 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -9244,8 +9244,8 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | TST_64_WITH_ONE REG2 | beq >1 | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 - |1: | ldr REG2, [REG2] + |1: } } else { if (func) { @@ -9255,8 +9255,8 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | TST_64_WITH_ONE REG2 | beq >1 | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 - |1: | ldr REG2, [REG2] + |1: } #else # error "Unknown ZEND_MAP_PTR_KIND" diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 05aac6c837bff..3653f9dc2867e 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -37,7 +37,7 @@ static ZEND_COLD void zend_jit_illegal_string_offset(zval *offset) zend_type_error("Cannot access offset of type %s on string", zend_zval_type_name(offset)); } -static zend_never_inline zend_function* ZEND_FASTCALL _zend_jit_init_func_run_time_cache(const zend_op_array *op_array) /* {{{ */ +static zend_never_inline zend_function* ZEND_FASTCALL _zend_jit_init_func_run_time_cache(zend_op_array *op_array) /* {{{ */ { void **run_time_cache; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 3461135e9cbba..7b2d7dffc8f2d 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -9854,6 +9854,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | mov EX:RX->run_time_cache, r2 } } else { +// Always defined as ZEND_MAP_PTR_KIND_PTR_OR_OFFSET. See Zend/zend_map_ptr.h. #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR if (func) { | mov r0, EX:RX->func @@ -9882,8 +9883,8 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | test r2, 1 | jz >1 | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 - |1: | mov r2, aword [r2] + |1: } } else { if (func) { @@ -9893,8 +9894,8 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | test r2, 1 | jz >1 | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 - |1: | mov r2, aword [r2] + |1: } #else # error "Unknown ZEND_MAP_PTR_KIND" diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index b6b182b1d6f10..16d82a6dd6009 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -309,10 +309,9 @@ static void zend_accel_do_delayed_early_binding( { ZEND_ASSERT(!ZEND_MAP_PTR(op_array->run_time_cache)); ZEND_ASSERT(op_array->fn_flags & ZEND_ACC_HEAP_RT_CACHE); - void *ptr = emalloc(op_array->cache_size + sizeof(void*)); - ZEND_MAP_PTR_INIT(op_array->run_time_cache, ptr); - char *run_time_cache = (char *) ptr + sizeof(void*); - ZEND_MAP_PTR_SET(op_array->run_time_cache, run_time_cache); + void *run_time_cache = emalloc(op_array->cache_size); + + ZEND_MAP_PTR_INIT(op_array->run_time_cache, run_time_cache); memset(run_time_cache, 0, op_array->cache_size); zend_string *orig_compiled_filename = CG(compiled_filename); @@ -329,7 +328,7 @@ static void zend_accel_do_delayed_early_binding( if (parent_ce) { ce = zend_try_early_bind(ce, parent_ce, early_binding->lcname, zv); if (ce && early_binding->cache_slot != (uint32_t) -1) { - *(void**)(run_time_cache + early_binding->cache_slot) = ce; + *(void**)((char*)run_time_cache + early_binding->cache_slot) = ce; } } } diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 9f96bf885abee..b34f434d7c672 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -1256,17 +1256,8 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr } } else { op_array->fn_flags &= ~ZEND_ACC_IMMUTABLE; - if (op_array->static_variables) { - ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, - zend_arena_alloc(&CG(arena), sizeof(HashTable *))); - ZEND_MAP_PTR_SET(op_array->static_variables_ptr, NULL); - } - if (op_array != &script->script.main_op_array) { - ZEND_MAP_PTR_INIT(op_array->run_time_cache, zend_arena_alloc(&CG(arena), sizeof(void*))); - ZEND_MAP_PTR_SET(op_array->run_time_cache, NULL); - } else { - ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL); - } + ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, NULL); + ZEND_MAP_PTR_INIT(op_array->run_time_cache, NULL); } /* Check whether this op_array has already been unserialized. */ @@ -1663,11 +1654,7 @@ static void zend_file_cache_unserialize_class(zval *zv, ce->ce_flags &= ~ZEND_ACC_IMMUTABLE; ce->ce_flags |= ZEND_ACC_FILE_CACHED; ZEND_MAP_PTR_INIT(ce->mutable_data, NULL); - if (ce->default_static_members_count) { - ZEND_MAP_PTR_INIT(ce->static_members_table, - zend_arena_alloc(&CG(arena), sizeof(zval *))); - ZEND_MAP_PTR_SET(ce->static_members_table, NULL); - } + ZEND_MAP_PTR_INIT(ce->static_members_table, NULL); } } From 7193909e86764449f3c4ba6bd6ea2d026de8bd7c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 14 Oct 2021 14:08:57 +0300 Subject: [PATCH 0166/1346] JIT: Cleanup dead and duplicate code --- ext/opcache/jit/zend_jit_arm64.dasc | 42 +++++------------------------ ext/opcache/jit/zend_jit_x86.dasc | 40 ++++----------------------- 2 files changed, 11 insertions(+), 71 deletions(-) diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index fab7cdc21f7f7..89938f3e782a3 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -9214,39 +9214,12 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | str REG2, EX:RX->run_time_cache } } else { -// Always defined as ZEND_MAP_PTR_KIND_PTR_OR_OFFSET. See Zend/zend_map_ptr.h. -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR - if (func) { - | ldr REG0, EX:RX->func - } - | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] - | ldr REG2, [REG2] -#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET - if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) { - if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { - | MEM_LOAD_64_ZTS ldr, REG2, compiler_globals, map_ptr_base, TMP1 - | ADD_SUB_64_WITH_CONST add, REG2, REG2, (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache), TMP1 - | ldr REG2, [REG2] - } else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) - && (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) { - if (func) { - | ldr REG0, EX:RX->func - } - | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] - | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 - | ldr REG2, [REG2] - } else { - /* the called op_array may be not persisted yet */ - if (func) { - | ldr REG0, EX:RX->func - } - | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] - | TST_64_WITH_ONE REG2 - | beq >1 - | MEM_LOAD_OP_ZTS add, ldr, REG2, compiler_globals, map_ptr_base, REG1, TMP1 - | ldr REG2, [REG2] - |1: - } + if (func + && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE) + && ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { + | MEM_LOAD_64_ZTS ldr, REG2, compiler_globals, map_ptr_base, TMP1 + | ADD_SUB_64_WITH_CONST add, REG2, REG2, (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache), TMP1 + | ldr REG2, [REG2] } else { if (func) { | ldr REG0, EX:RX->func @@ -9258,9 +9231,6 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | ldr REG2, [REG2] |1: } -#else -# error "Unknown ZEND_MAP_PTR_KIND" -#endif | str REG2, EX:RX->run_time_cache } } diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 7b2d7dffc8f2d..179a9d27834eb 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -9854,38 +9854,11 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | mov EX:RX->run_time_cache, r2 } } else { -// Always defined as ZEND_MAP_PTR_KIND_PTR_OR_OFFSET. See Zend/zend_map_ptr.h. -#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR - if (func) { - | mov r0, EX:RX->func - } - | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] - | mov r2, aword [r2] -#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET - if (func && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) { - if (ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { - | MEM_LOAD_ZTS r2, aword, compiler_globals, map_ptr_base, r1 - | mov r2, aword [r2 + (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)] - } else if ((func->op_array.fn_flags & ZEND_ACC_IMMUTABLE) - && (!func->op_array.scope || (func->op_array.scope->ce_flags & ZEND_ACC_LINKED))) { - if (func) { - | mov r0, EX:RX->func - } - | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] - | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 - | mov r2, aword [r2] - } else { - /* the called op_array may be not persisted yet */ - if (func) { - | mov r0, EX:RX->func - } - | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] - | test r2, 1 - | jz >1 - | MEM_LOAD_OP_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1 - | mov r2, aword [r2] - |1: - } + if (func + && !(func->op_array.fn_flags & ZEND_ACC_CLOSURE) + && ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { + | MEM_LOAD_ZTS r2, aword, compiler_globals, map_ptr_base, r1 + | mov r2, aword [r2 + (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)] } else { if (func) { | mov r0, EX:RX->func @@ -9897,9 +9870,6 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | mov r2, aword [r2] |1: } -#else -# error "Unknown ZEND_MAP_PTR_KIND" -#endif | mov EX:RX->run_time_cache, r2 } } From 89007f67d4583e70f966ff5b38832fb5dc9ed766 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 14 Oct 2021 14:28:00 +0200 Subject: [PATCH 0167/1346] Fix delayed early bind if class already exists We should not try to perform a delayed early bind if the class has already been declared. This matches the behavior of an ordinary early bind. --- .../no_early_binding_if_already_declared.inc | 5 +++++ .../no_early_binding_if_already_declared.phpt | 11 ++++++++++ ext/opcache/tests/bug67215.phpt | 2 +- ext/opcache/zend_accelerator_util_funcs.c | 21 +++++++++++-------- 4 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 Zend/tests/no_early_binding_if_already_declared.inc create mode 100644 Zend/tests/no_early_binding_if_already_declared.phpt diff --git a/Zend/tests/no_early_binding_if_already_declared.inc b/Zend/tests/no_early_binding_if_already_declared.inc new file mode 100644 index 0000000000000..e2feae12b084c --- /dev/null +++ b/Zend/tests/no_early_binding_if_already_declared.inc @@ -0,0 +1,5 @@ + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/ext/opcache/tests/bug67215.phpt b/ext/opcache/tests/bug67215.phpt index d9bb18e8abf36..133efaf435b1d 100644 --- a/ext/opcache/tests/bug67215.phpt +++ b/ext/opcache/tests/bug67215.phpt @@ -25,4 +25,4 @@ unlink($file_c); unlink($file_p); ?> --EXPECTF-- -Fatal error: Cannot declare class c, because the name is already in use in %sbug67215.c.php on line %d +Fatal error: Cannot declare class p, because the name is already in use in %sbug67215.p.php on line %d diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index 16d82a6dd6009..002ea3e5d22b5 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -320,18 +320,21 @@ static void zend_accel_do_delayed_early_binding( CG(in_compilation) = 1; for (uint32_t i = 0; i < persistent_script->num_early_bindings; i++) { zend_early_binding *early_binding = &persistent_script->early_bindings[i]; - zval *zv = zend_hash_find_known_hash(EG(class_table), early_binding->rtd_key); - if (zv) { - zend_class_entry *ce = Z_CE_P(zv); - zend_class_entry *parent_ce = - zend_hash_find_ex_ptr(EG(class_table), early_binding->lc_parent_name, 1); - if (parent_ce) { - ce = zend_try_early_bind(ce, parent_ce, early_binding->lcname, zv); - if (ce && early_binding->cache_slot != (uint32_t) -1) { - *(void**)((char*)run_time_cache + early_binding->cache_slot) = ce; + zend_class_entry *ce = zend_hash_find_ex_ptr(EG(class_table), early_binding->lcname, 1); + if (!ce) { + zval *zv = zend_hash_find_known_hash(EG(class_table), early_binding->rtd_key); + if (zv) { + zend_class_entry *orig_ce = Z_CE_P(zv); + zend_class_entry *parent_ce = + zend_hash_find_ex_ptr(EG(class_table), early_binding->lc_parent_name, 1); + if (parent_ce) { + ce = zend_try_early_bind(orig_ce, parent_ce, early_binding->lcname, zv); } } } + if (ce && early_binding->cache_slot != (uint32_t) -1) { + *(void**)((char*)run_time_cache + early_binding->cache_slot) = ce; + } } CG(compiled_filename) = orig_compiled_filename; CG(in_compilation) = orig_in_compilation; From a35f72f51e4db937de875dfa98b636f067a48de3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 14 Oct 2021 16:20:02 +0200 Subject: [PATCH 0168/1346] Reduce indentation --- ext/opcache/ZendAccelerator.c | 145 +++++++++++++++++----------------- 1 file changed, 72 insertions(+), 73 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index f8c2a6ef05a57..8fe2d271f7f49 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3879,88 +3879,87 @@ static void preload_link(void) ce = Z_PTR_P(zv); ZEND_ASSERT(ce->type != ZEND_INTERNAL_CLASS); - if ((ce->ce_flags & (ZEND_ACC_TOP_LEVEL|ZEND_ACC_ANON_CLASS)) - && !(ce->ce_flags & ZEND_ACC_LINKED)) { - zend_string *lcname = zend_string_tolower(ce->name); - - if (!(ce->ce_flags & ZEND_ACC_ANON_CLASS)) { - if (zend_hash_exists(EG(class_table), lcname)) { - zend_string_release(lcname); - continue; - } - } + if (!(ce->ce_flags & (ZEND_ACC_TOP_LEVEL|ZEND_ACC_ANON_CLASS)) + || (ce->ce_flags & ZEND_ACC_LINKED)) { + continue; + } - preload_error error_info; - if (preload_resolve_deps(&error_info, ce) == FAILURE) { + zend_string *lcname = zend_string_tolower(ce->name); + if (!(ce->ce_flags & ZEND_ACC_ANON_CLASS)) { + if (zend_hash_exists(EG(class_table), lcname)) { zend_string_release(lcname); continue; } + } - zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, lcname); - - if (EXPECTED(zv)) { - /* Set the FILE_CACHED flag to force a lazy load, and the CACHED flag to - * prevent freeing of interface names. */ - void *checkpoint = zend_arena_checkpoint(CG(arena)); - zend_class_entry *orig_ce = ce; - uint32_t temporary_flags = ZEND_ACC_FILE_CACHED|ZEND_ACC_CACHED; - ce->ce_flags |= temporary_flags; - if (ce->parent_name) { - zend_string_addref(ce->parent_name); - } + preload_error error_info; + if (preload_resolve_deps(&error_info, ce) == FAILURE) { + zend_string_release(lcname); + continue; + } - /* Record and suppress errors during inheritance. */ - orig_error_cb = zend_error_cb; - zend_error_cb = preload_error_cb; - zend_begin_record_errors(); - - /* Set filename & lineno information for inheritance errors */ - CG(in_compilation) = 1; - CG(compiled_filename) = ce->info.user.filename; - CG(zend_lineno) = ce->info.user.line_start; - zend_try { - ce = zend_do_link_class(ce, NULL, lcname); - if (!ce) { - ZEND_ASSERT(0 && "Class linking failed?"); - } - ce->ce_flags &= ~temporary_flags; - changed = true; - - /* Inheritance successful, print out any warnings. */ - zend_error_cb = orig_error_cb; - EG(record_errors) = false; - for (uint32_t i = 0; i < EG(num_errors); i++) { - zend_error_info *error = EG(errors)[i]; - zend_error_zstr_at( - error->type, error->filename, error->lineno, error->message); - } - } zend_catch { - /* Clear variance obligations that were left behind on bailout. */ - if (CG(delayed_variance_obligations)) { - zend_hash_index_del( - CG(delayed_variance_obligations), (uintptr_t) Z_CE_P(zv)); - } + zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, lcname); + ZEND_ASSERT(zv && "We already checked above that the class doesn't exist yet"); + + /* Set the FILE_CACHED flag to force a lazy load, and the CACHED flag to + * prevent freeing of interface names. */ + void *checkpoint = zend_arena_checkpoint(CG(arena)); + zend_class_entry *orig_ce = ce; + uint32_t temporary_flags = ZEND_ACC_FILE_CACHED|ZEND_ACC_CACHED; + ce->ce_flags |= temporary_flags; + if (ce->parent_name) { + zend_string_addref(ce->parent_name); + } - /* Restore the original class. */ - zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, key); - Z_CE_P(zv) = orig_ce; - orig_ce->ce_flags &= ~temporary_flags; - zend_arena_release(&CG(arena), checkpoint); - - /* Remember the last error. */ - zend_error_cb = orig_error_cb; - EG(record_errors) = false; - ZEND_ASSERT(EG(num_errors) > 0); - zend_hash_update_ptr(&errors, key, EG(errors)[EG(num_errors)-1]); - EG(num_errors)--; - } zend_end_try(); - CG(in_compilation) = 0; - CG(compiled_filename) = NULL; - zend_free_recorded_errors(); + /* Record and suppress errors during inheritance. */ + orig_error_cb = zend_error_cb; + zend_error_cb = preload_error_cb; + zend_begin_record_errors(); + + /* Set filename & lineno information for inheritance errors */ + CG(in_compilation) = 1; + CG(compiled_filename) = ce->info.user.filename; + CG(zend_lineno) = ce->info.user.line_start; + zend_try { + ce = zend_do_link_class(ce, NULL, lcname); + if (!ce) { + ZEND_ASSERT(0 && "Class linking failed?"); + } + ce->ce_flags &= ~temporary_flags; + changed = true; + + /* Inheritance successful, print out any warnings. */ + zend_error_cb = orig_error_cb; + EG(record_errors) = false; + for (uint32_t i = 0; i < EG(num_errors); i++) { + zend_error_info *error = EG(errors)[i]; + zend_error_zstr_at( + error->type, error->filename, error->lineno, error->message); + } + } zend_catch { + /* Clear variance obligations that were left behind on bailout. */ + if (CG(delayed_variance_obligations)) { + zend_hash_index_del( + CG(delayed_variance_obligations), (uintptr_t) Z_CE_P(zv)); } - zend_string_release(lcname); - } + /* Restore the original class. */ + zv = zend_hash_set_bucket_key(EG(class_table), (Bucket*)zv, key); + Z_CE_P(zv) = orig_ce; + orig_ce->ce_flags &= ~temporary_flags; + zend_arena_release(&CG(arena), checkpoint); + + /* Remember the last error. */ + zend_error_cb = orig_error_cb; + EG(record_errors) = false; + ZEND_ASSERT(EG(num_errors) > 0); + zend_hash_update_ptr(&errors, key, EG(errors)[EG(num_errors)-1]); + EG(num_errors)--; + } zend_end_try(); + CG(in_compilation) = 0; + CG(compiled_filename) = NULL; + zend_free_recorded_errors(); + zend_string_release(lcname); } ZEND_HASH_FOREACH_END(); } while (changed); From 04cbd8419231c9d4df435627612391c95673d452 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 14 Oct 2021 17:21:37 +0300 Subject: [PATCH 0169/1346] Always use direct pointer (not map_ptr slot) to access run_time_cache of a closure instance --- Zend/zend_closures.c | 12 ++++++------ ext/opcache/jit/zend_jit_arm64.dasc | 7 +++++++ ext/opcache/jit/zend_jit_internal.h | 6 ++++++ ext/opcache/jit/zend_jit_trace.c | 3 +++ ext/opcache/jit/zend_jit_x86.dasc | 7 +++++++ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index a5a3da2587dd2..e2ea9eacc34d2 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -672,6 +672,7 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr, bool is_fake) /* {{{ */ { zend_closure *closure; + void *ptr; object_init_ex(res, zend_ce_closure); @@ -707,13 +708,12 @@ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_en } /* Runtime cache is scope-dependent, so we cannot reuse it if the scope changed */ - if (!ZEND_MAP_PTR_GET(closure->func.op_array.run_time_cache) + ptr = ZEND_MAP_PTR_GET(func->op_array.run_time_cache); + if (!ptr || func->common.scope != scope || (func->common.fn_flags & ZEND_ACC_HEAP_RT_CACHE) ) { - void *ptr; - - if (!ZEND_MAP_PTR_GET(func->op_array.run_time_cache) + if (!ptr && (func->common.fn_flags & ZEND_ACC_CLOSURE) && (func->common.scope == scope || !(func->common.fn_flags & ZEND_ACC_IMMUTABLE))) { @@ -725,15 +725,15 @@ static void zend_create_closure_ex(zval *res, zend_function *func, zend_class_en closure->func.op_array.fn_flags &= ~ZEND_ACC_HEAP_RT_CACHE; ptr = zend_arena_alloc(&CG(arena), func->op_array.cache_size); ZEND_MAP_PTR_SET(func->op_array.run_time_cache, ptr); - ZEND_MAP_PTR_SET(closure->func.op_array.run_time_cache, ptr); } else { /* Otherwise, we use a non-shared runtime cache */ closure->func.op_array.fn_flags |= ZEND_ACC_HEAP_RT_CACHE; ptr = emalloc(func->op_array.cache_size); - ZEND_MAP_PTR_INIT(closure->func.op_array.run_time_cache, ptr); } memset(ptr, 0, func->op_array.cache_size); } + ZEND_MAP_PTR_INIT(closure->func.op_array.run_time_cache, ptr); + zend_string_addref(closure->func.op_array.function_name); if (closure->func.op_array.refcount) { (*closure->func.op_array.refcount)++; diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 89938f3e782a3..d74fbf5f28eef 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -9220,6 +9220,13 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | MEM_LOAD_64_ZTS ldr, REG2, compiler_globals, map_ptr_base, TMP1 | ADD_SUB_64_WITH_CONST add, REG2, REG2, (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache), TMP1 | ldr REG2, [REG2] + } else if ((func && (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) || + (JIT_G(current_frame) && + JIT_G(current_frame)->call && + TRACE_FRAME_IS_CLOSURE_CALL(JIT_G(current_frame)->call))) { + /* Closures always use direct pointers */ + | ldr REG0, EX:RX->func + | ldr REG2, [REG0, #offsetof(zend_op_array, run_time_cache__ptr)] } else { if (func) { | ldr REG0, EX:RX->func diff --git a/ext/opcache/jit/zend_jit_internal.h b/ext/opcache/jit/zend_jit_internal.h index 94f75651e11c5..6ebc1c63a3691 100644 --- a/ext/opcache/jit/zend_jit_internal.h +++ b/ext/opcache/jit/zend_jit_internal.h @@ -613,6 +613,7 @@ struct _zend_jit_trace_stack_frame { #define TRACE_FRAME_MASK_UNKNOWN_RETURN 0x00000040 #define TRACE_FRAME_MASK_NO_NEED_RELEASE_THIS 0x00000080 #define TRACE_FRAME_MASK_THIS_CLASS_CHECKED 0x00000100 +#define TRACE_FRAME_MASK_CLOSURE_CALL 0x00000200 #define TRACE_FRAME_INIT(frame, _func, _flags, num_args) do { \ @@ -648,6 +649,8 @@ struct _zend_jit_trace_stack_frame { ((frame)->_info & TRACE_FRAME_MASK_NO_NEED_RELEASE_THIS) #define TRACE_FRAME_IS_THIS_CLASS_CHECKED(frame) \ ((frame)->_info & TRACE_FRAME_MASK_THIS_CLASS_CHECKED) +#define TRACE_FRAME_IS_CLOSURE_CALL(frame) \ + ((frame)->_info & TRACE_FRAME_MASK_CLOSURE_CALL) #define TRACE_FRAME_SET_UNKNOWN_NUM_ARGS(frame) do { \ (frame)->_info |= (0xffffu << TRACE_FRAME_SHIFT_NUM_ARGS); \ @@ -684,6 +687,9 @@ struct _zend_jit_trace_stack_frame { #define TRACE_FRAME_SET_THIS_CLASS_CHECKED(frame) do { \ (frame)->_info |= TRACE_FRAME_MASK_THIS_CLASS_CHECKED; \ } while (0) +#define TRACE_FRAME_SET_CLOSURE_CALL(frame) do { \ + (frame)->_info |= TRACE_FRAME_MASK_CLOSURE_CALL; \ + } while (0) ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_func_trace_helper(ZEND_OPCODE_HANDLER_ARGS); ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_ret_trace_helper(ZEND_OPCODE_HANDLER_ARGS); diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 69387fd0422b3..0922d96fa946c 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6398,6 +6398,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par call->prev = frame->call; if (!(p->info & ZEND_JIT_TRACE_FAKE_INIT_CALL)) { TRACE_FRAME_SET_LAST_SEND_BY_VAL(call); + if (init_opline && init_opline->opcode == ZEND_INIT_DYNAMIC_CALL) { + TRACE_FRAME_SET_CLOSURE_CALL(call); + } } if (init_opline && init_opline->opcode != ZEND_NEW diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 179a9d27834eb..26abb64af05ad 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -9859,6 +9859,13 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend && ZEND_MAP_PTR_IS_OFFSET(func->op_array.run_time_cache)) { | MEM_LOAD_ZTS r2, aword, compiler_globals, map_ptr_base, r1 | mov r2, aword [r2 + (uintptr_t)ZEND_MAP_PTR(func->op_array.run_time_cache)] + } else if ((func && (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) || + (JIT_G(current_frame) && + JIT_G(current_frame)->call && + TRACE_FRAME_IS_CLOSURE_CALL(JIT_G(current_frame)->call))) { + /* Closures always use direct pointers */ + | mov r0, EX:RX->func + | mov r2, aword [r0 + offsetof(zend_op_array, run_time_cache__ptr)] } else { if (func) { | mov r0, EX:RX->func From 8653174539b079063ecf65e964da09cad06e77f8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 19 Oct 2021 11:40:19 +0200 Subject: [PATCH 0170/1346] Fix nested WeakMap destruction This undoes the change from a4b209fdcfe799ab97f55c4c9d22d889813fc266 and addresses the original problem by dropping the unrefs during shutdown. All objects should get unref'ed without that, and this code path should only get hit for dangling references due to bailout. Alternatively we'd have to relax some assertions that check that the object is part of the weakrefs table, which seems worse. Fixes oss-fuzz #40090. --- Zend/tests/weakrefs/weakmap_nested.phpt | 15 +++++++++++++++ Zend/zend_weakrefs.c | 7 +------ 2 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/weakrefs/weakmap_nested.phpt diff --git a/Zend/tests/weakrefs/weakmap_nested.phpt b/Zend/tests/weakrefs/weakmap_nested.phpt new file mode 100644 index 0000000000000..034a7a5241c9a --- /dev/null +++ b/Zend/tests/weakrefs/weakmap_nested.phpt @@ -0,0 +1,15 @@ +--TEST-- +Nested WeakMap for same object key +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index ad20c4cabd36f..68a896dfa7c20 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -157,17 +157,12 @@ void zend_weakrefs_notify(zend_object *object) { ZEND_ASSERT(tagged_ptr && "Tracking of the IS_OBJ_WEAKLY_REFERENCE flag should be precise"); #endif if (tagged_ptr) { - zend_hash_index_del(&EG(weakrefs), obj_addr); zend_weakref_unref(obj_addr, tagged_ptr); + zend_hash_index_del(&EG(weakrefs), obj_addr); } } void zend_weakrefs_shutdown(void) { - zend_ulong obj_addr; - void *tagged_ptr; - ZEND_HASH_FOREACH_NUM_KEY_PTR(&EG(weakrefs), obj_addr, tagged_ptr) { - zend_weakref_unref(obj_addr, tagged_ptr); - } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&EG(weakrefs)); } From 58a0c5a2e19fff230af18acc560740f775308883 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 19 Oct 2021 12:27:54 +0200 Subject: [PATCH 0171/1346] Remove stale variables from zend_vm_gen.php These "unfetched" variants no longer exist. --- Zend/zend_vm_gen.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 999b6085dbbc7..ae1609021912a 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -718,12 +718,11 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) $op1_get_obj_zval_ptr_deref, $op2_get_obj_zval_ptr_deref, $op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr, $op1_get_obj_zval_ptr_ptr_undef, $op2_get_obj_zval_ptr_ptr_undef, - $op1_free_unfetched, $op2_free_unfetched, $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var, $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr, - $op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched; + $op_data_free_op, $op_data_free_op_var_ptr; // Specializing $specialized_replacements = array( From 5cdc65e245e74dbd2abd713185ea495b5077f9d6 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 19 Oct 2021 15:49:36 +0200 Subject: [PATCH 0172/1346] Add --with-external-libcrypt build option display an error message if some algo not available in external libcrypt --- ext/standard/config.m4 | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 58b9c5e658a41..b85466229febe 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -267,14 +267,25 @@ int main() { ])]) +PHP_ARG_WITH([external-libcrypt], + [for external libcrypt or libxcrypt], + [AS_HELP_STRING([--with-external-libcrypt], + [Use external libcrypt or libxcrypt])], + [no], + [no]) + dnl dnl If one of them is missing, use our own implementation, portable code is then possible dnl -dnl TODO This is currently always enabled -if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "$ac_cv_crypt_md5" = "no" || test "$ac_cv_crypt_sha512" = "no" || test "$ac_cv_crypt_sha256" = "no" || test "$ac_cv_func_crypt_r" != "yes" || true; then - AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5]) - - PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c) +dnl This is currently enabled by default +if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "$ac_cv_crypt_md5" = "no" || test "$ac_cv_crypt_sha512" = "no" || test "$ac_cv_crypt_sha256" = "no" || test "$ac_cv_func_crypt_r" != "yes" || test "$PHP_EXTERNAL_LIBCRYPT" = "no"; then + if test "$PHP_EXTERNAL_LIBCRYPT" = "no"; then + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r]) + + PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c) + else + AC_MSG_ERROR([Cannot use external libcrypt as some algo are missing]) + fi else AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 0, [Whether PHP has to use its own crypt_r for blowfish, des and ext des]) fi From bbcc37216a51f7ad333228434e3a32e7c43f2ff4 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 19 Oct 2021 15:55:12 +0200 Subject: [PATCH 0173/1346] only check crypt algo if we use external libcrypt --- ext/standard/config.m4 | 139 ++++++++++++++++++++--------------------- 1 file changed, 68 insertions(+), 71 deletions(-) diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 32664f8025fbe..5299006892797 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -51,14 +51,23 @@ if test "$ac_cv_flush_io" = "yes"; then AC_DEFINE(HAVE_FLUSHIO, 1, [Define if flush should be called explicitly after a buffered io.]) fi -PHP_CHECK_FUNC(crypt, crypt) -PHP_CHECK_FUNC(crypt_r, crypt) -if test "$ac_cv_func_crypt_r" = "yes"; then - PHP_CRYPT_R_STYLE -fi +PHP_ARG_WITH([external-libcrypt], + [for external libcrypt or libxcrypt], + [AS_HELP_STRING([--with-external-libcrypt], + [Use external libcrypt or libxcrypt])], + [no], + [no]) -AC_CACHE_CHECK(for standard DES crypt, ac_cv_crypt_des,[ - AC_RUN_IFELSE([AC_LANG_SOURCE([[ +if test "$PHP_EXTERNAL_LIBCRYPT" != "no"; then + PHP_CHECK_FUNC(crypt, crypt) + PHP_CHECK_FUNC(crypt_r, crypt) + AC_CHECK_HEADERS(crypt.h) + if test "$ac_cv_func_crypt_r" = "yes"; then + PHP_CRYPT_R_STYLE + fi + + AC_CACHE_CHECK(for standard DES crypt, ac_cv_crypt_des,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H @@ -87,8 +96,8 @@ int main() { ac_cv_crypt_des=yes ])]) -AC_CACHE_CHECK(for extended DES crypt, ac_cv_crypt_ext_des,[ - AC_RUN_IFELSE([AC_LANG_SOURCE([[ + AC_CACHE_CHECK(for extended DES crypt, ac_cv_crypt_ext_des,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H @@ -110,15 +119,15 @@ int main() { return 1; #endif }]])],[ - ac_cv_crypt_ext_des=yes -],[ - ac_cv_crypt_ext_des=no -],[ - ac_cv_crypt_ext_des=no -])]) - -AC_CACHE_CHECK(for MD5 crypt, ac_cv_crypt_md5,[ -AC_RUN_IFELSE([AC_LANG_SOURCE([[ + ac_cv_crypt_ext_des=yes + ],[ + ac_cv_crypt_ext_des=no + ],[ + ac_cv_crypt_ext_des=no + ])]) + + AC_CACHE_CHECK(for MD5 crypt, ac_cv_crypt_md5,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H @@ -150,15 +159,15 @@ int main() { return 1; #endif }]])],[ - ac_cv_crypt_md5=yes -],[ - ac_cv_crypt_md5=no -],[ - ac_cv_crypt_md5=no -])]) - -AC_CACHE_CHECK(for Blowfish crypt, ac_cv_crypt_blowfish,[ -AC_RUN_IFELSE([AC_LANG_SOURCE([[ + ac_cv_crypt_md5=yes + ],[ + ac_cv_crypt_md5=no + ],[ + ac_cv_crypt_md5=no + ])]) + + AC_CACHE_CHECK(for Blowfish crypt, ac_cv_crypt_blowfish,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H @@ -187,15 +196,15 @@ int main() { return 1; #endif }]])],[ - ac_cv_crypt_blowfish=yes -],[ - ac_cv_crypt_blowfish=no -],[ - ac_cv_crypt_blowfish=no -])]) - -AC_CACHE_CHECK(for SHA512 crypt, ac_cv_crypt_sha512,[ -AC_RUN_IFELSE([AC_LANG_SOURCE([[ + ac_cv_crypt_blowfish=yes + ],[ + ac_cv_crypt_blowfish=no + ],[ + ac_cv_crypt_blowfish=no + ])]) + + AC_CACHE_CHECK(for SHA512 crypt, ac_cv_crypt_sha512,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H @@ -222,16 +231,16 @@ int main() { #else return 1; #endif -}]])],[ - ac_cv_crypt_sha512=yes -],[ - ac_cv_crypt_sha512=no -],[ - ac_cv_crypt_sha512=no -])]) - -AC_CACHE_CHECK(for SHA256 crypt, ac_cv_crypt_sha256,[ -AC_RUN_IFELSE([AC_LANG_SOURCE([[ + }]])],[ + ac_cv_crypt_sha512=yes + ],[ + ac_cv_crypt_sha512=no + ],[ + ac_cv_crypt_sha512=no + ])]) + + AC_CACHE_CHECK(for SHA256 crypt, ac_cv_crypt_sha256,[ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #if HAVE_UNISTD_H @@ -259,35 +268,23 @@ int main() { return 1; #endif }]])],[ - ac_cv_crypt_sha256=yes -],[ - ac_cv_crypt_sha256=no -],[ - ac_cv_crypt_sha256=no -])]) - + ac_cv_crypt_sha256=yes + ],[ + ac_cv_crypt_sha256=no + ],[ + ac_cv_crypt_sha256=no + ])]) -PHP_ARG_WITH([external-libcrypt], - [for external libcrypt or libxcrypt], - [AS_HELP_STRING([--with-external-libcrypt], - [Use external libcrypt or libxcrypt])], - [no], - [no]) -dnl -dnl If one of them is missing, use our own implementation, portable code is then possible -dnl -dnl This is currently enabled by default -if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "$ac_cv_crypt_md5" = "no" || test "$ac_cv_crypt_sha512" = "no" || test "$ac_cv_crypt_sha256" = "no" || test "$ac_cv_func_crypt_r" != "yes" || test "$PHP_EXTERNAL_LIBCRYPT" = "no"; then - if test "$PHP_EXTERNAL_LIBCRYPT" = "no"; then - AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r]) - - PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c) - else + if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "$ac_cv_crypt_md5" = "no" || test "$ac_cv_crypt_sha512" = "no" || test "$ac_cv_crypt_sha256" = "no" || test "$ac_cv_func_crypt_r" != "yes"; then AC_MSG_ERROR([Cannot use external libcrypt as some algo are missing]) - fi -else + fi + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 0, [Whether PHP has to use its own crypt_r]) +else + AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r]) + + PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c) fi dnl From 6b2b4bb174b0f179fd9e618146f1e6b5258573c3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 19 Oct 2021 17:30:52 +0200 Subject: [PATCH 0174/1346] Remove unused scope argument --- ext/opcache/zend_persist.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index c2dbd5c19cc4c..4a8c3fa47bc6e 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -345,7 +345,7 @@ static HashTable *zend_persist_backed_enum_table(HashTable *backed_enum_table) return ptr; } -static void zend_persist_type(zend_type *type, zend_class_entry *scope) { +static void zend_persist_type(zend_type *type) { if (ZEND_TYPE_HAS_LIST(*type)) { zend_type_list *list = ZEND_TYPE_LIST(*type); if (ZEND_TYPE_USES_ARENA(*type)) { @@ -627,7 +627,7 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc if (arg_info[i].name) { zend_accel_store_interned_string(arg_info[i].name); } - zend_persist_type(&arg_info[i].type, op_array->scope); + zend_persist_type(&arg_info[i].type); } if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { arg_info++; @@ -798,7 +798,7 @@ static zend_property_info *zend_persist_property_info(zend_property_info *prop) if (prop->attributes) { prop->attributes = zend_persist_attributes(prop->attributes); } - zend_persist_type(&prop->type, ce); + zend_persist_type(&prop->type); return prop; } From da0d246e19ee4ce4ff0704b261bca8a7097b148f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 19 Oct 2021 12:24:03 +0200 Subject: [PATCH 0175/1346] Drop FREE_OP_VAR_PTR() distinction FREE_OP_VAR_PTR() is like FREE_OP(), but only frees VAR, rather than VARs and TMPs. I don't think this distinction makes sense anymore, as opcodes using FREE_OP_VAR_PTR() generally only accept VAR or CV. For the cases where other op types are accepted and only freeing VAR is desired we already have FREE_OP_IF_VAR(). This drops FREE_OP_VAR_PTR(), leaving only FREE_OP() and FREE_OP_IF_VAR(). --- Zend/zend_execute.c | 3 -- Zend/zend_vm_def.h | 73 ++++++++++++++------------------ Zend/zend_vm_execute.h | 96 ++++++++++++------------------------------ Zend/zend_vm_gen.php | 40 +----------------- 4 files changed, 60 insertions(+), 152 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7879f0ad98465..aaa2bf8f47254 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -168,9 +168,6 @@ ZEND_API const zend_internal_function zend_pass_function = { zval_ptr_dtor_nogc(EX_VAR(var)); \ } -#define FREE_OP_VAR_PTR(type, var) \ - FREE_OP(type, var) - #define CV_DEF_OF(i) (EX(func)->op_array.vars[i]) #define ZEND_VM_STACK_PAGE_SLOTS (16 * 1024) /* should be a power of 2 */ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e140f6f23e51a..17b3aee6e92ba 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1093,7 +1093,7 @@ ZEND_VM_C_LABEL(assign_op_object): FREE_OP_DATA(); FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -1229,7 +1229,7 @@ ZEND_VM_C_LABEL(assign_dim_op_ret_null): } FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -1260,7 +1260,7 @@ ZEND_VM_HANDLER(26, ZEND_ASSIGN_OP, VAR|CV, CONST|TMPVAR|CV, OP) } FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1328,7 +1328,7 @@ ZEND_VM_C_LABEL(pre_incdec_object): } while (0); FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1400,7 +1400,7 @@ ZEND_VM_C_LABEL(post_incdec_object): } while (0); FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1490,7 +1490,7 @@ ZEND_VM_HELPER(zend_pre_inc_helper, VAR|CV, ANY) ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1542,7 +1542,7 @@ ZEND_VM_HELPER(zend_pre_dec_helper, VAR|CV, ANY) ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1592,7 +1592,7 @@ ZEND_VM_HELPER(zend_post_inc_helper, VAR|CV, ANY) increment_function(var_ptr); } while (0); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1640,7 +1640,7 @@ ZEND_VM_HELPER(zend_post_dec_helper, VAR|CV, ANY) decrement_function(var_ptr); } while (0); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -2485,7 +2485,7 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj): FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); /* assign_obj has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -2634,7 +2634,7 @@ ZEND_VM_C_LABEL(assign_dim_error): if (OP2_TYPE != IS_UNUSED) { FREE_OP2(); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); /* assign_dim has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -2653,7 +2653,7 @@ ZEND_VM_HANDLER(22, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL)) if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); /* zend_assign_to_variable() always takes care of op2, never free it! */ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -2688,8 +2688,8 @@ ZEND_VM_HANDLER(30, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - FREE_OP2_VAR_PTR(); - FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -2723,9 +2723,9 @@ ZEND_VM_HANDLER(32, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CA zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); + FREE_OP_DATA(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -2760,7 +2760,7 @@ ZEND_VM_HANDLER(33, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC) ZVAL_COPY(EX_VAR(opline->result.var), prop); } - FREE_OP_DATA_VAR_PTR(); + FREE_OP_DATA(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -4374,7 +4374,7 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, if (return_value) { ZVAL_NEW_REF(return_value, retval_ptr); } else { - FREE_OP1_VAR_PTR(); + FREE_OP1(); } break; } @@ -4389,7 +4389,7 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); } while (0); ZEND_OBSERVER_FCALL_END(execute_data, return_value); @@ -4854,7 +4854,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, CONST|UNUSED|NUM) } ZVAL_REF(arg, Z_REF_P(varptr)); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE(); } @@ -4891,7 +4891,7 @@ ZEND_VM_C_LABEL(send_var_by_ref): } ZVAL_REF(arg, Z_REF_P(varptr)); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE(); } @@ -4984,7 +4984,7 @@ ZEND_VM_HOT_HANDLER(185, ZEND_SEND_FUNC_ARG, VAR, CONST|UNUSED|NUM) } ZVAL_REF(arg, Z_REF_P(varptr)); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE(); } @@ -5910,7 +5910,7 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); } - FREE_OP1_VAR_PTR(); + FREE_OP1(); } else { expr_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE == IS_TMP_VAR) { @@ -6496,7 +6496,7 @@ ZEND_VM_C_LABEL(num_index_dim): } while (0); FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -6541,7 +6541,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_S } while (0); FREE_OP2(); - FREE_OP1_VAR_PTR(); + FREE_OP1(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -6650,9 +6650,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0); - if (OP1_TYPE == IS_VAR) { - FREE_OP1_VAR_PTR(); - } + FREE_OP1_IF_VAR(); 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) { @@ -6679,21 +6677,16 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) properties = Z_OBJPROP_P(array_ptr); if (zend_hash_num_elements(properties) == 0) { Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t) -1; - FREE_OP1_VAR_PTR(); + FREE_OP1_IF_VAR(); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0); - FREE_OP1_VAR_PTR(); + FREE_OP1_IF_VAR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC); - - if (OP1_TYPE == IS_VAR) { - FREE_OP1_VAR_PTR(); - } else { - FREE_OP1(); - } + FREE_OP1(); if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } else if (is_empty) { @@ -6706,11 +6699,7 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr)); ZVAL_UNDEF(EX_VAR(opline->result.var)); Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1; - if (OP1_TYPE == IS_VAR) { - FREE_OP1_VAR_PTR(); - } else { - FREE_OP1(); - } + FREE_OP1(); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } } @@ -8033,7 +8022,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMPVAR|CV|UNUSED ZVAL_REF(&generator->value, Z_REF_P(value_ptr)); } while (0); - FREE_OP1_VAR_PTR(); + FREE_OP1(); } } else { zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 63a3112405b57..8446d9ea58465 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1076,7 +1076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HA ZVAL_COPY(EX_VAR(opline->result.var), prop); } - if ((opline+1)->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));}; + FREE_OP((opline+1)->op1_type, (opline+1)->op1.var); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -4425,7 +4425,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE if (return_value) { ZVAL_NEW_REF(return_value, retval_ptr); } else { - if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));}; + FREE_OP(opline->op1_type, opline->op1.var); } break; } @@ -4440,7 +4440,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } - if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));}; + FREE_OP(opline->op1_type, opline->op1.var); } while (0); zend_observer_fcall_end(execute_data, return_value); @@ -5068,9 +5068,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_ } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0); - if (IS_CONST == IS_VAR) { - - } 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) { @@ -5107,11 +5104,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_ } else { bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC); - if (IS_CONST == IS_VAR) { - - } else { - - } if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } else if (is_empty) { @@ -5124,11 +5116,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_ zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr)); ZVAL_UNDEF(EX_VAR(opline->result.var)); Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1; - if (IS_CONST == IS_VAR) { - - } else { - } ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } } @@ -18938,7 +18926,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER if (return_value) { ZVAL_NEW_REF(return_value, retval_ptr); } else { - + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } break; } @@ -18953,6 +18941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER ZVAL_REF(return_value, Z_REF_P(retval_ptr)); } + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } while (0); @@ -19221,9 +19210,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0); - if (IS_TMP_VAR == IS_VAR) { - - } 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) { @@ -19259,12 +19245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC); - - if (IS_TMP_VAR == IS_VAR) { - - } else { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } else if (is_empty) { @@ -19277,11 +19258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr)); ZVAL_UNDEF(EX_VAR(opline->result.var)); Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1; - if (IS_TMP_VAR == IS_VAR) { - - } else { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } } @@ -19645,7 +19622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); } - + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -19805,6 +19782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z ZVAL_REF(&generator->value, Z_REF_P(value_ptr)); } while (0); + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } } else { zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); @@ -20084,7 +20062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); } - + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -20244,6 +20222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMPVAR_HANDLER( ZVAL_REF(&generator->value, Z_REF_P(value_ptr)); } while (0); + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } } else { zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); @@ -20544,7 +20523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNU } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); } - + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -20704,6 +20683,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER( ZVAL_REF(&generator->value, Z_REF_P(value_ptr)); } while (0); + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } } else { zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); @@ -20943,7 +20923,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_ } else { ZVAL_MAKE_REF_EX(expr_ptr, 2); } - + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } else { expr_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); if (IS_TMP_VAR == IS_TMP_VAR) { @@ -21103,6 +21083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND ZVAL_REF(&generator->value, Z_REF_P(value_ptr)); } while (0); + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); } } else { zval *value = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC); @@ -21840,9 +21821,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0); - if (IS_VAR == IS_VAR) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); 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) { @@ -21878,12 +21857,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else { bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } else { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } else if (is_empty) { @@ -21896,11 +21870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr)); ZVAL_UNDEF(EX_VAR(opline->result.var)); Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1; - if (IS_VAR == IS_VAR) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } else { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - } + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } } @@ -23898,7 +23868,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -26416,7 +26386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -30414,7 +30384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -32283,7 +32253,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -34145,7 +34115,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -36624,7 +36594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -38320,9 +38290,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE } Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0); - if (IS_CV == IS_VAR) { - - } 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) { @@ -38359,11 +38326,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE } else { bool is_empty = zend_fe_reset_iterator(array_ptr, 1 OPLINE_CC EXECUTE_DATA_CC); - if (IS_CV == IS_VAR) { - - } else { - - } if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } else if (is_empty) { @@ -38376,11 +38338,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_error(E_WARNING, "foreach() argument must be of type array|object, %s given", zend_zval_type_name(array_ptr)); ZVAL_UNDEF(EX_VAR(opline->result.var)); Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1; - if (IS_CV == IS_VAR) { - - } else { - } ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); } } @@ -41285,7 +41243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -44885,7 +44843,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -50000,7 +49958,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));; + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); ZEND_VM_NEXT_OPCODE_EX(1, 2); } diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index ae1609021912a..29e58fe7f357c 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -472,28 +472,6 @@ "TMPVARCV" => "???", ); -$op1_free_op_var_ptr = array( - "ANY" => "if (opline->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));}", - "TMP" => "", - "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op1.var))", - "CONST" => "", - "UNUSED" => "", - "CV" => "", - "TMPVAR" => "???", - "TMPVARCV" => "???", -); - -$op2_free_op_var_ptr = array( - "ANY" => "if (opline->op2_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));}", - "TMP" => "", - "VAR" => "zval_ptr_dtor_nogc(EX_VAR(opline->op2.var))", - "CONST" => "", - "UNUSED" => "", - "CV" => "", - "TMPVAR" => "???", - "TMPVARCV" => "???", -); - $op_data_type = array( "ANY" => "(opline+1)->op1_type", "TMP" => "IS_TMP_VAR", @@ -549,17 +527,6 @@ "TMPVARCV" => "???", ); -$op_data_free_op_var_ptr = array( - "ANY" => "if ((opline+1)->op1_type == IS_VAR) {zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));}", - "TMP" => "", - "VAR" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));", - "CONST" => "", - "UNUSED" => "", - "CV" => "", - "TMPVAR" => "???", - "TMPVARCV" => "???", -); - $list = array(); // list of opcode handlers and helpers in original order $opcodes = array(); // opcode handlers by code $helpers = array(); // opcode helpers by name @@ -719,10 +686,10 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) $op1_get_obj_zval_ptr_ptr, $op2_get_obj_zval_ptr_ptr, $op1_get_obj_zval_ptr_ptr_undef, $op2_get_obj_zval_ptr_ptr_undef, $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var, - $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, + $prefix, $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr, - $op_data_free_op, $op_data_free_op_var_ptr; + $op_data_free_op; // Specializing $specialized_replacements = array( @@ -752,8 +719,6 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) "/FREE_OP2\(\)/" => $op2_free_op[$op2], "/FREE_OP1_IF_VAR\(\)/" => $op1_free_op_if_var[$op1], "/FREE_OP2_IF_VAR\(\)/" => $op2_free_op_if_var[$op2], - "/FREE_OP1_VAR_PTR\(\)/" => $op1_free_op_var_ptr[$op1], - "/FREE_OP2_VAR_PTR\(\)/" => $op2_free_op_var_ptr[$op2], "/\!ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"0":"1", "/ZEND_VM_SPEC/m" => ($op1!="ANY"||$op2!="ANY")?"1":"0", "/ZEND_VM_C_LABEL\(\s*([A-Za-z_]*)\s*\)/m" => "\\1".(($spec && $kind != ZEND_VM_KIND_CALL)?("_SPEC".$prefix[$op1].$prefix[$op2].extra_spec_name($extra_spec)):""), @@ -767,7 +732,6 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null) "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/" => $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/" => $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/FREE_OP_DATA\(\)/" => $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], - "/FREE_OP_DATA_VAR_PTR\(\)/" => $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], "/RETURN_VALUE_USED\(opline\)/" => isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)", "/arg_num <= MAX_ARG_FLAG_NUM/" => isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM", "/ZEND_VM_SMART_BRANCH\(\s*([^,)]*)\s*,\s*([^)]*)\s*\)/" => isset($extra_spec['SMART_BRANCH']) ? From 3ce472d1a6c4d1df61db0cdd79e656f20f4fbf0d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Oct 2021 12:42:21 +0200 Subject: [PATCH 0176/1346] Fix message for some string offset uses as object Even if the object property is incremented afterwards, the immediate error is the use as object, not the increment. Also consolidate tests for this error message. Previously they were spread across a number of bug-specific tests. --- Zend/tests/bug41813.phpt | 15 --------------- Zend/tests/bug41919.phpt | 14 -------------- Zend/tests/bug47704.phpt | 12 ------------ Zend/tests/bug79779.phpt | 12 ------------ Zend/zend_execute.c | 10 +++++----- 5 files changed, 5 insertions(+), 58 deletions(-) delete mode 100644 Zend/tests/bug41813.phpt delete mode 100644 Zend/tests/bug41919.phpt delete mode 100644 Zend/tests/bug47704.phpt delete mode 100644 Zend/tests/bug79779.phpt diff --git a/Zend/tests/bug41813.phpt b/Zend/tests/bug41813.phpt deleted file mode 100644 index af73344f5df9d..0000000000000 --- a/Zend/tests/bug41813.phpt +++ /dev/null @@ -1,15 +0,0 @@ ---TEST-- -Bug #41813 (segmentation fault when using string offset as an object) ---FILE-- -bar = "xyz"; - -echo "Done\n"; -?> ---EXPECTF-- -Fatal error: Uncaught Error: Cannot use string offset as an object in %s:%d -Stack trace: -#0 {main} - thrown in %s on line %d diff --git a/Zend/tests/bug41919.phpt b/Zend/tests/bug41919.phpt deleted file mode 100644 index 2af13acdc9477..0000000000000 --- a/Zend/tests/bug41919.phpt +++ /dev/null @@ -1,14 +0,0 @@ ---TEST-- -Bug #41919 (crash in string to array conversion) ---FILE-- -bar[1] = "bang"; - -echo "ok\n"; -?> ---EXPECTF-- -Fatal error: Uncaught Error: Cannot use string offset as an object in %sbug41919.php:%d -Stack trace: -#0 {main} - thrown in %sbug41919.php on line %d diff --git a/Zend/tests/bug47704.phpt b/Zend/tests/bug47704.phpt deleted file mode 100644 index 4fdaba80923e7..0000000000000 --- a/Zend/tests/bug47704.phpt +++ /dev/null @@ -1,12 +0,0 @@ ---TEST-- -Bug #47704 (crashes on some "bad" operations with string offsets) ---FILE-- -a += 1; -?> ---EXPECTF-- -Fatal error: Uncaught Error: Cannot use string offset as an object in %sbug47704.php:%d -Stack trace: -#0 {main} - thrown in %sbug47704.php on line %d diff --git a/Zend/tests/bug79779.phpt b/Zend/tests/bug79779.phpt deleted file mode 100644 index fe11ed76cc9f7..0000000000000 --- a/Zend/tests/bug79779.phpt +++ /dev/null @@ -1,12 +0,0 @@ ---TEST-- -Bug #79779: Assertion failure when assigning property of string offset by reference ---FILE-- -a = &$b; -?> ---EXPECTF-- -Fatal error: Uncaught Error: Cannot use string offset as an object in %s:%d -Stack trace: -#0 {main} - thrown in %s on line %d diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index aaa2bf8f47254..353f9b07140c0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1562,6 +1562,11 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_ASSIGN_OBJ: case ZEND_ASSIGN_OBJ_OP: case ZEND_ASSIGN_OBJ_REF: + case ZEND_PRE_INC_OBJ: + case ZEND_PRE_DEC_OBJ: + case ZEND_POST_INC_OBJ: + case ZEND_POST_DEC_OBJ: + case ZEND_UNSET_OBJ: msg = "Cannot use string offset as an object"; break; case ZEND_FETCH_DIM_W: @@ -1577,10 +1582,6 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_ASSIGN_OP: msg = "Cannot use assign-op operators with string offsets"; break; - case ZEND_PRE_INC_OBJ: - case ZEND_PRE_DEC_OBJ: - case ZEND_POST_INC_OBJ: - case ZEND_POST_DEC_OBJ: case ZEND_PRE_INC: case ZEND_PRE_DEC: case ZEND_POST_INC: @@ -1598,7 +1599,6 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) msg = "Cannot return string offsets by reference"; break; case ZEND_UNSET_DIM: - case ZEND_UNSET_OBJ: msg = "Cannot unset string offsets"; break; case ZEND_YIELD: From a58201369c79b937036cbaf6c6be94fd1236ac35 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Oct 2021 12:51:42 +0200 Subject: [PATCH 0177/1346] Remove impossible cases from string offset error handling As far as I can see, these cases should not be reachable. --- Zend/zend_execute.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 353f9b07140c0..e770fb1bd87ab 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1537,10 +1537,7 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) } switch (opline->opcode) { - case ZEND_ASSIGN_OP: case ZEND_ASSIGN_DIM_OP: - case ZEND_ASSIGN_OBJ_OP: - case ZEND_ASSIGN_STATIC_PROP_OP: msg = "Cannot use assign-op operators with string offsets"; break; case ZEND_FETCH_DIM_W: @@ -1578,10 +1575,6 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_ASSIGN_DIM_OP: msg = "Cannot use string offset as an array"; break; - case ZEND_ASSIGN_STATIC_PROP_OP: - case ZEND_ASSIGN_OP: - msg = "Cannot use assign-op operators with string offsets"; - break; case ZEND_PRE_INC: case ZEND_PRE_DEC: case ZEND_POST_INC: From ca7a11c9cf72908b5b81bbda54cd6b547e18aaf4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Oct 2021 13:00:48 +0200 Subject: [PATCH 0178/1346] Consolidate string offset by reference errors Use the same error message for all scenarios where a reference to a string offset is acquired. --- Zend/tests/bug70089.phpt | 2 +- Zend/tests/bug73792.phpt | 2 +- Zend/tests/string_offset_errors.phpt | 14 +++++++++++++- Zend/zend_execute.c | 16 ++++------------ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Zend/tests/bug70089.phpt b/Zend/tests/bug70089.phpt index d2bf14fb7eca9..ea089c820fef3 100644 --- a/Zend/tests/bug70089.phpt +++ b/Zend/tests/bug70089.phpt @@ -31,5 +31,5 @@ try { --EXPECT-- string(36) "Cannot use string offset as an array" string(27) "Cannot unset string offsets" -string(41) "Only variables can be passed by reference" +string(47) "Cannot create references to/from string offsets" string(41) "Cannot increment/decrement string offsets" diff --git a/Zend/tests/bug73792.phpt b/Zend/tests/bug73792.phpt index 39e45f1367fda..e7faace90ab12 100644 --- a/Zend/tests/bug73792.phpt +++ b/Zend/tests/bug73792.phpt @@ -14,7 +14,7 @@ echo 'done'; --EXPECTF-- Warning: Illegal string offset "2bbb" in %s on line %d -Fatal error: Uncaught Error: Cannot iterate on string offsets by reference in %sbug73792.php:4 +Fatal error: Uncaught Error: Cannot create references to/from string offsets in %s:%d Stack trace: #0 {main} thrown in %sbug73792.php on line 4 diff --git a/Zend/tests/string_offset_errors.phpt b/Zend/tests/string_offset_errors.phpt index b709408c352f0..726dc41f06536 100644 --- a/Zend/tests/string_offset_errors.phpt +++ b/Zend/tests/string_offset_errors.phpt @@ -8,6 +8,11 @@ function &test() : string { return $str[0]; } +function &gen() { + $str = "foo"; + yield $str[0]; +} + try { test(); } catch (Error $e) { @@ -21,7 +26,14 @@ try { echo $e->getMessage(), "\n"; } +try { + foreach (gen() as $v) {} +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + ?> --EXPECT-- -Cannot return string offsets by reference +Cannot create references to/from string offsets +Cannot create references to/from string offsets Cannot create references to/from string offsets diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e770fb1bd87ab..0fa897de834c9 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1585,25 +1585,17 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_ADD_ARRAY_ELEMENT: case ZEND_INIT_ARRAY: case ZEND_MAKE_REF: - msg = "Cannot create references to/from string offsets"; - break; case ZEND_RETURN_BY_REF: case ZEND_VERIFY_RETURN_TYPE: - msg = "Cannot return string offsets by reference"; - break; - case ZEND_UNSET_DIM: - msg = "Cannot unset string offsets"; - break; case ZEND_YIELD: - msg = "Cannot yield string offsets by reference"; - break; case ZEND_SEND_REF: case ZEND_SEND_VAR_EX: case ZEND_SEND_FUNC_ARG: - msg = "Only variables can be passed by reference"; - break; case ZEND_FE_RESET_RW: - msg = "Cannot iterate on string offsets by reference"; + msg = "Cannot create references to/from string offsets"; + break; + case ZEND_UNSET_DIM: + msg = "Cannot unset string offsets"; break; EMPTY_SWITCH_DEFAULT_CASE(); } From a38bad87d501fbaca81f947e7e8861f3ae08948d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Oct 2021 13:05:38 +0200 Subject: [PATCH 0179/1346] Consolidate UNSET_DIM handling for string offset error The immediate error here is the nested indexing in write context, the fact that it's ultimately wrapped in an unset() doesn't matter. Same as $str[0][0] += 1 will throw "Cannot use string offset as an array", so should this case. --- Zend/tests/bug70089.phpt | 2 +- Zend/tests/unset_non_array.phpt | 2 +- Zend/zend_execute.c | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Zend/tests/bug70089.phpt b/Zend/tests/bug70089.phpt index ea089c820fef3..3a8e7d8e783e1 100644 --- a/Zend/tests/bug70089.phpt +++ b/Zend/tests/bug70089.phpt @@ -30,6 +30,6 @@ try { ?> --EXPECT-- string(36) "Cannot use string offset as an array" -string(27) "Cannot unset string offsets" +string(36) "Cannot use string offset as an array" string(47) "Cannot create references to/from string offsets" string(41) "Cannot increment/decrement string offsets" diff --git a/Zend/tests/unset_non_array.phpt b/Zend/tests/unset_non_array.phpt index cef7f9a765805..5d7ad4d44b879 100644 --- a/Zend/tests/unset_non_array.phpt +++ b/Zend/tests/unset_non_array.phpt @@ -109,5 +109,5 @@ Deprecated: Automatic conversion of false to array is deprecated in %s Cannot unset offset in a non-array variable Cannot unset offset in a non-array variable Cannot unset offset in a non-array variable -Cannot unset string offsets +Cannot use string offset as an array Cannot use object of type stdClass as array diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 0fa897de834c9..5713473067322 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1573,6 +1573,7 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_FETCH_LIST_W: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_DIM_OP: + case ZEND_UNSET_DIM: msg = "Cannot use string offset as an array"; break; case ZEND_PRE_INC: @@ -1594,9 +1595,6 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_FE_RESET_RW: msg = "Cannot create references to/from string offsets"; break; - case ZEND_UNSET_DIM: - msg = "Cannot unset string offsets"; - break; EMPTY_SWITCH_DEFAULT_CASE(); } break; From 16e9e666ba37ff9c9d1543c85674d799772e97b2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Oct 2021 16:28:26 +0200 Subject: [PATCH 0180/1346] Encode string offset error reason in extended_value For FETCH_DIM_W etc encode the context it is being used in (dim, obj, ref or incdec) so we can throw an appropriate error message for invalid string offset use, in a way that does not require inspecting neighboring opcodes. The implementation is similar to the flags used for FETCH_OBJ. This means that we do not have to be careful about preserving following opcodes during optimization. Closes GH-7599. --- Zend/zend_compile.c | 50 ++++++++++++++++++++--------- Zend/zend_compile.h | 7 +++++ Zend/zend_execute.c | 77 ++++++++++----------------------------------- 3 files changed, 60 insertions(+), 74 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1cc2f9e211d91..640dbe55de5d8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2723,7 +2723,7 @@ static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) } /* }}} */ -static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t type, bool by_ref) { if (ast->attr == ZEND_DIM_ALTERNATIVE_SYNTAX) { zend_error(E_COMPILE_ERROR, "Array and string offset access syntax with curly braces is no longer supported"); @@ -2751,8 +2751,15 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t } else { zend_short_circuiting_mark_inner(var_ast); opline = zend_delayed_compile_var(&var_node, var_ast, type, 0); - if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) { - opline->extended_value |= ZEND_FETCH_DIM_WRITE; + if (opline) { + if (type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) { + opline->extended_value |= ZEND_FETCH_DIM_WRITE; + } else if (opline->opcode == ZEND_FETCH_DIM_W + || opline->opcode == ZEND_FETCH_DIM_RW + || opline->opcode == ZEND_FETCH_DIM_FUNC_ARG + || opline->opcode == ZEND_FETCH_DIM_UNSET) { + opline->extended_value = ZEND_FETCH_DIM_DIM; + } } } @@ -2772,18 +2779,20 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t opline = zend_delayed_emit_op(result, ZEND_FETCH_DIM_R, &var_node, &dim_node); zend_adjust_for_fetch_type(opline, result, type); + if (by_ref) { + opline->extended_value = ZEND_FETCH_DIM_REF; + } if (dim_node.op_type == IS_CONST) { zend_handle_numeric_dim(opline, &dim_node); } return opline; } -/* }}} */ -static zend_op *zend_compile_dim(znode *result, zend_ast *ast, uint32_t type) /* {{{ */ +static zend_op *zend_compile_dim(znode *result, zend_ast *ast, uint32_t type, bool by_ref) /* {{{ */ { uint32_t offset = zend_delayed_compile_begin(); - zend_delayed_compile_dim(result, ast, type); + zend_delayed_compile_dim(result, ast, type, by_ref); return zend_delayed_compile_end(offset); } /* }}} */ @@ -2810,6 +2819,13 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t } else { zend_short_circuiting_mark_inner(obj_ast); opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0); + if (opline && (opline->opcode == ZEND_FETCH_DIM_W + || opline->opcode == ZEND_FETCH_DIM_RW + || opline->opcode == ZEND_FETCH_DIM_FUNC_ARG + || opline->opcode == ZEND_FETCH_DIM_UNSET)) { + opline->extended_value = ZEND_FETCH_DIM_OBJ; + } + zend_separate_if_call_and_write(&obj_node, obj_ast, type); if (nullsafe) { /* We will push to the short_circuiting_opnums stack in zend_delayed_compile_end(). */ @@ -3113,7 +3129,7 @@ static void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ return; case ZEND_AST_DIM: offset = zend_delayed_compile_begin(); - zend_delayed_compile_dim(result, var_ast, BP_VAR_W); + zend_delayed_compile_dim(result, var_ast, BP_VAR_W, /* by_ref */ false); if (zend_is_assign_to_self(var_ast, expr_ast) && !is_this_fetch(expr_ast)) { @@ -3296,7 +3312,7 @@ static void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ return; case ZEND_AST_DIM: offset = zend_delayed_compile_begin(); - zend_delayed_compile_dim(result, var_ast, BP_VAR_RW); + zend_delayed_compile_dim(result, var_ast, BP_VAR_RW, /* by_ref */ false); zend_compile_expr(&expr_node, expr_ast); opline = zend_delayed_compile_end(offset); @@ -4709,7 +4725,7 @@ static void zend_compile_unset(zend_ast *ast) /* {{{ */ } return; case ZEND_AST_DIM: - opline = zend_compile_dim(NULL, var_ast, BP_VAR_UNSET); + opline = zend_compile_dim(NULL, var_ast, BP_VAR_UNSET, /* by_ref */ false); opline->opcode = ZEND_UNSET_DIM; return; case ZEND_AST_PROP: @@ -8681,7 +8697,10 @@ static void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_make_tmp_result(result, opline); } else { znode var_node; - zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); + zend_op *opline = zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); + if (opline && opline->opcode == ZEND_FETCH_DIM_RW) { + opline->extended_value = ZEND_FETCH_DIM_INCDEC; + } zend_emit_op_tmp(result, ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC : ZEND_POST_DEC, &var_node, NULL); } @@ -8707,7 +8726,10 @@ static void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ result->op_type = IS_TMP_VAR; } else { znode var_node; - zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); + zend_op *opline = zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); + if (opline && opline->opcode == ZEND_FETCH_DIM_RW) { + opline->extended_value = ZEND_FETCH_DIM_INCDEC; + } zend_emit_op_tmp(result, ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC : ZEND_PRE_DEC, &var_node, NULL); } @@ -9154,7 +9176,7 @@ static void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */ } break; case ZEND_AST_DIM: - opline = zend_compile_dim(result, var_ast, BP_VAR_IS); + opline = zend_compile_dim(result, var_ast, BP_VAR_IS, /* by_ref */ false); opline->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ; break; case ZEND_AST_PROP: @@ -10114,7 +10136,7 @@ static zend_op *zend_compile_var_inner(znode *result, zend_ast *ast, uint32_t ty case ZEND_AST_VAR: return zend_compile_simple_var(result, ast, type, 0); case ZEND_AST_DIM: - return zend_compile_dim(result, ast, type); + return zend_compile_dim(result, ast, type, by_ref); case ZEND_AST_PROP: case ZEND_AST_NULLSAFE_PROP: return zend_compile_prop(result, ast, type, by_ref); @@ -10158,7 +10180,7 @@ static zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t case ZEND_AST_VAR: return zend_compile_simple_var(result, ast, type, 1); case ZEND_AST_DIM: - return zend_delayed_compile_dim(result, ast, type); + return zend_delayed_compile_dim(result, ast, type, by_ref); case ZEND_AST_PROP: case ZEND_AST_NULLSAFE_PROP: { diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 50d14d4ec7197..531a072cf7b4a 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -961,6 +961,13 @@ ZEND_API zend_string *zend_type_to_string(zend_type type); #define ZEND_FETCH_DIM_WRITE 2 #define ZEND_FETCH_OBJ_FLAGS 3 +/* Used to mark what kind of operation a writing FETCH_DIM is used in, + * to produce a more precise error on incorrect string offset use. */ +#define ZEND_FETCH_DIM_REF 1 +#define ZEND_FETCH_DIM_DIM 2 +#define ZEND_FETCH_DIM_OBJ 3 +#define ZEND_FETCH_DIM_INCDEC 4 + #define ZEND_ISEMPTY (1<<0) #define ZEND_LAST_CATCH (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5713473067322..dce0f32e835ff 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1530,7 +1530,6 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) const char *msg = NULL; const zend_execute_data *execute_data = EG(current_execute_data); const zend_op *opline = execute_data->opline; - uint32_t var; if (UNEXPECTED(EG(exception) != NULL)) { return; @@ -1540,69 +1539,27 @@ ZEND_API ZEND_COLD void zend_wrong_string_offset_error(void) case ZEND_ASSIGN_DIM_OP: msg = "Cannot use assign-op operators with string offsets"; break; + case ZEND_FETCH_LIST_W: + msg = "Cannot create references to/from string offsets"; + break; case ZEND_FETCH_DIM_W: case ZEND_FETCH_DIM_RW: case ZEND_FETCH_DIM_FUNC_ARG: case ZEND_FETCH_DIM_UNSET: - case ZEND_FETCH_LIST_W: - /* TODO: Encode the "reason" into opline->extended_value??? */ - var = opline->result.var; - opline++; - ZEND_ASSERT(opline < execute_data->func->op_array.opcodes + - execute_data->func->op_array.last); - if (opline->op1_type == IS_VAR && opline->op1.var == var) { - switch (opline->opcode) { - case ZEND_FETCH_OBJ_W: - case ZEND_FETCH_OBJ_RW: - case ZEND_FETCH_OBJ_FUNC_ARG: - case ZEND_FETCH_OBJ_UNSET: - case ZEND_ASSIGN_OBJ: - case ZEND_ASSIGN_OBJ_OP: - case ZEND_ASSIGN_OBJ_REF: - case ZEND_PRE_INC_OBJ: - case ZEND_PRE_DEC_OBJ: - case ZEND_POST_INC_OBJ: - case ZEND_POST_DEC_OBJ: - case ZEND_UNSET_OBJ: - msg = "Cannot use string offset as an object"; - break; - case ZEND_FETCH_DIM_W: - case ZEND_FETCH_DIM_RW: - case ZEND_FETCH_DIM_FUNC_ARG: - case ZEND_FETCH_DIM_UNSET: - case ZEND_FETCH_LIST_W: - case ZEND_ASSIGN_DIM: - case ZEND_ASSIGN_DIM_OP: - case ZEND_UNSET_DIM: - msg = "Cannot use string offset as an array"; - break; - case ZEND_PRE_INC: - case ZEND_PRE_DEC: - case ZEND_POST_INC: - case ZEND_POST_DEC: - msg = "Cannot increment/decrement string offsets"; - break; - case ZEND_ASSIGN_REF: - case ZEND_ADD_ARRAY_ELEMENT: - case ZEND_INIT_ARRAY: - case ZEND_MAKE_REF: - case ZEND_RETURN_BY_REF: - case ZEND_VERIFY_RETURN_TYPE: - case ZEND_YIELD: - case ZEND_SEND_REF: - case ZEND_SEND_VAR_EX: - case ZEND_SEND_FUNC_ARG: - case ZEND_FE_RESET_RW: - msg = "Cannot create references to/from string offsets"; - break; - EMPTY_SWITCH_DEFAULT_CASE(); - } - break; - } - if (opline->op2_type == IS_VAR && opline->op2.var == var) { - ZEND_ASSERT(opline->opcode == ZEND_ASSIGN_REF); - msg = "Cannot create references to/from string offsets"; - break; + switch (opline->extended_value) { + case ZEND_FETCH_DIM_REF: + msg = "Cannot create references to/from string offsets"; + break; + case ZEND_FETCH_DIM_DIM: + msg = "Cannot use string offset as an array"; + break; + case ZEND_FETCH_DIM_OBJ: + msg = "Cannot use string offset as an object"; + break; + case ZEND_FETCH_DIM_INCDEC: + msg = "Cannot increment/decrement string offsets"; + break; + EMPTY_SWITCH_DEFAULT_CASE(); } break; EMPTY_SWITCH_DEFAULT_CASE(); From b743cd72d0d2e016133f3b16035eba88fdf07cc2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Oct 2021 09:58:07 +0200 Subject: [PATCH 0181/1346] Fix inference if FETCH_DIM_W user optimized away In this case the user may be a FREE. Also add the test file that I forgot in 3ce472d1a6c4d1df61db0cdd79e656f20f4fbf0d. --- Zend/Optimizer/zend_inference.c | 3 ++ Zend/tests/string_offset_as_object.phpt | 63 ++++++++++++++++++++++ Zend/tests/string_offset_optimization.phpt | 16 ++++++ 3 files changed, 82 insertions(+) create mode 100644 Zend/tests/string_offset_as_object.phpt create mode 100644 Zend/tests/string_offset_optimization.phpt diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 43ba6c2e881c9..7a3ec1a27b409 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3456,6 +3456,9 @@ static zend_always_inline zend_result _zend_update_type_info( /* This can occur if a DIM_FETCH_FUNC_ARG with UNUSED op2 is left * behind, because it can't be converted to DIM_FETCH_R. */ break; + case ZEND_FREE: + /* This may happen if the using opcode is DCEd. */ + break; EMPTY_SWITCH_DEFAULT_CASE() } j = zend_ssa_next_use(ssa->ops, ssa_op->result_def, j); diff --git a/Zend/tests/string_offset_as_object.phpt b/Zend/tests/string_offset_as_object.phpt new file mode 100644 index 0000000000000..6fdebe936088f --- /dev/null +++ b/Zend/tests/string_offset_as_object.phpt @@ -0,0 +1,63 @@ +--TEST-- +Using string offset as object +--FILE-- +bar = "xyz"; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + $str[0]->bar[1] = "bang"; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + $str[0]->bar += 1; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + $str[0]->bar = &$b; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + ++$str[0]->bar; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + --$str[0]->bar; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + $str[0]->bar++; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + $str[0]->bar--; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} +try { + unset($str[0]->bar); +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECT-- +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object +Cannot use string offset as an object diff --git a/Zend/tests/string_offset_optimization.phpt b/Zend/tests/string_offset_optimization.phpt new file mode 100644 index 0000000000000..7ccef86009994 --- /dev/null +++ b/Zend/tests/string_offset_optimization.phpt @@ -0,0 +1,16 @@ +--TEST-- +Invalid string offset use where the actual use may be optimized away +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Error: Cannot create references to/from string offsets in %s:%d +Stack trace: +#0 %s(%d): test() +#1 {main} + thrown in %s on line %d From d23e36da81fb929242fb6762c649211e51dd1eb3 Mon Sep 17 00:00:00 2001 From: Ayesh Karunaratne Date: Wed, 20 Oct 2021 02:50:16 +0530 Subject: [PATCH 0182/1346] Add `CURLINFO_EFFECTIVE_METHOD` Since Curl 7.72.0, it supports a new parameter called `CURLINFO_EFFECTIVE_METHOD`, which returns the effect method in HTTP(s) requests. This is similar to `CURLINFO_EFFECTIVE_URL`. - https://curl.se/libcurl/c/CURLINFO_EFFECTIVE_METHOD.html This adds support for CURLINFO_EFFECTIVE_URL if ext/curl is built with libcurl >= 7.72.0 (0x074800). Closes GH-7595. --- UPGRADING | 4 ++++ ext/curl/interface.c | 8 ++++++++ ext/curl/tests/curl_basic_025.phpt | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 ext/curl/tests/curl_basic_025.phpt diff --git a/UPGRADING b/UPGRADING index b04ab68fc6e9c..699aa55c8034d 100644 --- a/UPGRADING +++ b/UPGRADING @@ -23,6 +23,10 @@ PHP 8.2 UPGRADE NOTES 2. New Features ======================================== +- Curl: + . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective + HTTP method in curl_getinfo() return value. + ======================================== 3. Changes in SAPI modules ======================================== diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 459bfbab0bbe4..3292458d63554 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -552,6 +552,9 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLINFO_SSL_VERIFYRESULT); REGISTER_CURL_CONSTANT(CURLINFO_STARTTRANSFER_TIME); REGISTER_CURL_CONSTANT(CURLINFO_TOTAL_TIME); +#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ + REGISTER_CURL_CONSTANT(CURLINFO_EFFECTIVE_METHOD); +#endif /* Other */ REGISTER_CURL_CONSTANT(CURLMSG_DONE); @@ -3257,6 +3260,11 @@ PHP_FUNCTION(curl_getinfo) if (ch->header.str) { CAASTR("request_header", ch->header.str); } +#if LIBCURL_VERSION_NUM >= 0x074800 /* Available since 7.72.0 */ + if (curl_easy_getinfo(ch->cp, CURLINFO_EFFECTIVE_METHOD, &s_code) == CURLE_OK) { + CAAS("effective_method", s_code); + } +#endif } else { switch (option) { case CURLINFO_HEADER_OUT: diff --git a/ext/curl/tests/curl_basic_025.phpt b/ext/curl/tests/curl_basic_025.phpt new file mode 100644 index 0000000000000..d190d30a067dc --- /dev/null +++ b/ext/curl/tests/curl_basic_025.phpt @@ -0,0 +1,28 @@ +--TEST-- +Test curl_getinfo() function with CURLINFO_* from curl >= 7.72.0 +--EXTENSIONS-- +curl +--SKIPIF-- += 7.72.0"); +} +?> +--FILE-- + +--EXPECT-- +string(4) "POST" From 1afe89f8c3153dc371d17ea8f979541ce57b5dfa Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 21 Oct 2021 22:54:41 +0100 Subject: [PATCH 0183/1346] Remove (ZEND_)WRONG_PARAM_COUNT_WITH_RETVAL macros A TypeError is always emitted therefore assigning a retval is pointless and incorrect. --- UPGRADING.INTERNALS | 1 + Zend/zend_API.h | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index b5d6f0be53d90..7feaee74ef705 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -14,6 +14,7 @@ PHP 8.2 INTERNALS UPGRADE NOTES around zend_binary_str(n)casecmp_l() -- rather than zend_binary_str(n)casecmp() as one would expect. Call the appropriate wrapped function directly instead. +* Removed the (ZEND_)WRONG_PARAM_COUNT_WITH_RETVAL() macros. ======================== 2. Build system changes diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 1931c3a75c46b..a0d5ebee10282 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -472,10 +472,8 @@ ZEND_API const char *zend_get_type_by_const(int type); #define ZEND_IS_METHOD_CALL() (EX(func)->common.scope != NULL) #define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT() -#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret) #define ZEND_NUM_ARGS() EX_NUM_ARGS() #define ZEND_WRONG_PARAM_COUNT() { zend_wrong_param_count(); return; } -#define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret) { zend_wrong_param_count(); return ret; } #ifndef ZEND_WIN32 #define DLEXPORT From ee510eed685cee62cd99a210e27bdee6892861e3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 1 Sep 2021 16:54:17 +0200 Subject: [PATCH 0184/1346] Deprecate partially supported callables This deprecates all callables that are accepted by call_user_func($callable) but not by $callable(). In particular: "self::method" "parent::method" "static::method" ["self", "method"] ["parent", "method"] ["static", "method"] ["Foo", "Bar::method"] [new Foo, "Bar::method"] RFC: https://wiki.php.net/rfc/deprecate_partially_supported_callables Closes GH-7446. --- UPGRADING | 20 ++++++ Zend/tests/bug37138.phpt | 6 +- Zend/tests/bug41026.phpt | 3 +- Zend/tests/bug45186.phpt | 6 +- Zend/tests/bug45186_2.phpt | 6 +- Zend/tests/bug48770.phpt | 3 +- Zend/tests/bug48770_2.phpt | 9 ++- Zend/tests/bug48770_3.phpt | 7 +- Zend/tests/bug66719.phpt | 6 +- Zend/tests/bug78770.phpt | 3 +- Zend/tests/bug78898.phpt | 8 ++- ...llable_self_parent_static_deprecation.phpt | 69 +++++++++++++++++++ .../closures/closure_from_callable_basic.phpt | 18 +++-- .../closures/closure_from_callable_error.phpt | 4 +- Zend/tests/lsb_011.phpt | 3 +- Zend/tests/lsb_012.phpt | 3 +- Zend/tests/lsb_021.phpt | 10 ++- Zend/tests/lsb_022.phpt | 17 ++++- Zend/zend_API.c | 20 +++++- ext/pdo_mysql/tests/pdo_mysql_subclass.phpt | 2 + ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt | 2 + ext/spl/tests/bug65006.phpt | 5 +- .../class_object/forward_static_call_001.phpt | 12 +++- .../class_object/forward_static_call_003.phpt | 6 +- .../tests/general_functions/bug40398.phpt | 9 ++- .../general_functions/callbacks_001.phpt | 16 ++++- tests/classes/abstract_user_call.phpt | 4 +- 27 files changed, 247 insertions(+), 30 deletions(-) create mode 100644 Zend/tests/callable_self_parent_static_deprecation.phpt diff --git a/UPGRADING b/UPGRADING index 699aa55c8034d..6b2efba9fd3f3 100644 --- a/UPGRADING +++ b/UPGRADING @@ -35,6 +35,26 @@ PHP 8.2 UPGRADE NOTES 4. Deprecated Functionality ======================================== +- Core: + . Callables that are not accepted by the $callable() syntax (but are accepted + by call_user_func) are deprecated. In particular: + + "self::method" + "parent::method" + "static::method" + ["self", "method"] + ["parent", "method"] + ["static", "method"] + ["Foo", "Bar::method"] + [new Foo, "Bar::method"] + + This does not affect normal method callables like "A::method" or + ["A", "method"]. A deprecation notice is only emitted on call. Both + is_callable() and the callable type will silently accept these callables + until support for them is removed entirely. + + RFC: https://wiki.php.net/rfc/deprecate_partially_supported_callables + ======================================== 5. Changed Functions ======================================== diff --git a/Zend/tests/bug37138.phpt b/Zend/tests/bug37138.phpt index 67dfa987daabb..ce0a23e3205d5 100644 --- a/Zend/tests/bug37138.phpt +++ b/Zend/tests/bug37138.phpt @@ -14,7 +14,11 @@ st::e (); st::e2 (); stch::g (); ?> ---EXPECT-- +--EXPECTF-- EHLO + +Deprecated: Use of "self" in callables is deprecated in %s on line %d EHLO + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d EHLO diff --git a/Zend/tests/bug41026.phpt b/Zend/tests/bug41026.phpt index 36d8ba4c634cb..ae297e4e4ba51 100644 --- a/Zend/tests/bug41026.phpt +++ b/Zend/tests/bug41026.phpt @@ -20,6 +20,7 @@ try_class::main (); echo "Done\n"; ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Use of "self" in callables is deprecated in %s on line %d Done CHECKPOINT diff --git a/Zend/tests/bug45186.phpt b/Zend/tests/bug45186.phpt index 46ec78ee1b41b..9e0078d770027 100644 --- a/Zend/tests/bug45186.phpt +++ b/Zend/tests/bug45186.phpt @@ -38,7 +38,7 @@ try { } ?> ---EXPECT-- +--EXPECTF-- __call: string(3) "ABC" __call: @@ -47,8 +47,12 @@ __call: string(3) "xyz" __call: string(3) "www" + +Deprecated: Use of "self" in callables is deprecated in %s on line %d __call: string(1) "y" + +Deprecated: Use of "self" in callables is deprecated in %s on line %d __call: string(1) "y" ok diff --git a/Zend/tests/bug45186_2.phpt b/Zend/tests/bug45186_2.phpt index 18a0799716b44..e85528ce8b00b 100644 --- a/Zend/tests/bug45186_2.phpt +++ b/Zend/tests/bug45186_2.phpt @@ -38,7 +38,7 @@ try { } ?> ---EXPECT-- +--EXPECTF-- __call: string(3) "ABC" __call: @@ -47,8 +47,12 @@ __call: string(3) "xyz" __call: string(3) "www" + +Deprecated: Use of "self" in callables is deprecated in %s on line %d __call: string(1) "y" + +Deprecated: Use of "self" in callables is deprecated in %s on line %d __call: string(1) "y" ok diff --git a/Zend/tests/bug48770.phpt b/Zend/tests/bug48770.phpt index 13ff963d0677e..f6188c60953d5 100644 --- a/Zend/tests/bug48770.phpt +++ b/Zend/tests/bug48770.phpt @@ -30,5 +30,6 @@ $c = new C; $c->callFuncInParent('Which function will be called??'); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Callables of the form ["C", "parent::func"] are deprecated in %s on line %d B::func called diff --git a/Zend/tests/bug48770_2.phpt b/Zend/tests/bug48770_2.phpt index 9ba6776a5a03a..14fe28cca23e4 100644 --- a/Zend/tests/bug48770_2.phpt +++ b/Zend/tests/bug48770_2.phpt @@ -53,8 +53,15 @@ $c = new C; $c->func('This should work!'); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Callables of the form ["C", "parent::func2"] are deprecated in %s on line %d string(27) "B::func2: This should work!" + +Deprecated: Callables of the form ["C", "parent::func3"] are deprecated in %s on line %d string(27) "B::func3: This should work!" + +Deprecated: Callables of the form ["C", "parent::func22"] are deprecated in %s on line %d call_user_func_array(): Argument #1 ($callback) must be a valid callback, cannot access private method B::func22() + +Deprecated: Callables of the form ["C", "parent::inexistent"] are deprecated in %s on line %d call_user_func_array(): Argument #1 ($callback) must be a valid callback, class B does not have a method "inexistent" diff --git a/Zend/tests/bug48770_3.phpt b/Zend/tests/bug48770_3.phpt index 8e5d6033572bf..98311eb8ece6d 100644 --- a/Zend/tests/bug48770_3.phpt +++ b/Zend/tests/bug48770_3.phpt @@ -44,7 +44,12 @@ $c = new C; $c->func('This should work!'); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Callables of the form ["C", "self::func2"] are deprecated in %s on line %d string(27) "B::func2: This should work!" + +Deprecated: Callables of the form ["C", "self::func3"] are deprecated in %s on line %d string(27) "B::func3: This should work!" + +Deprecated: Callables of the form ["C", "self::inexistent"] are deprecated in %s on line %d call_user_func_array(): Argument #1 ($callback) must be a valid callback, class C does not have a method "inexistent" diff --git a/Zend/tests/bug66719.phpt b/Zend/tests/bug66719.phpt index 70785b4a7845f..3acff69ad4845 100644 --- a/Zend/tests/bug66719.phpt +++ b/Zend/tests/bug66719.phpt @@ -34,10 +34,14 @@ call_user_func(array(B::class, 'parent::who')); C::test(); ?> ---EXPECT-- +--EXPECTF-- string(1) "B" string(1) "A" + +Deprecated: Callables of the form ["B", "parent::who"] are deprecated in %s on line %d string(1) "A" string(1) "B" string(1) "A" + +Deprecated: Callables of the form ["B", "parent::who"] are deprecated in %s on line %d string(1) "A" diff --git a/Zend/tests/bug78770.phpt b/Zend/tests/bug78770.phpt index 0c051cd59b84d..dc8255c05ab4a 100644 --- a/Zend/tests/bug78770.phpt +++ b/Zend/tests/bug78770.phpt @@ -19,5 +19,6 @@ class Test { ?> ===DONE=== ---EXPECT-- +--EXPECTF-- +Deprecated: Use of "self" in callables is deprecated in %s on line %d ===DONE=== diff --git a/Zend/tests/bug78898.phpt b/Zend/tests/bug78898.phpt index 248195e551ecf..f640c5687c79f 100644 --- a/Zend/tests/bug78898.phpt +++ b/Zend/tests/bug78898.phpt @@ -30,5 +30,9 @@ $b = new B; $b->x(); ?> ---EXPECT-- -aaa +--EXPECTF-- +a +Deprecated: Use of "parent" in callables is deprecated in %s on line %d +a +Deprecated: Use of "parent" in callables is deprecated in %s on line %d +a diff --git a/Zend/tests/callable_self_parent_static_deprecation.phpt b/Zend/tests/callable_self_parent_static_deprecation.phpt new file mode 100644 index 0000000000000..a6696d234bc50 --- /dev/null +++ b/Zend/tests/callable_self_parent_static_deprecation.phpt @@ -0,0 +1,69 @@ +--TEST-- +Deprecation of self/parent/static in callables +--FILE-- +callableTypeHint("self::foo"); + } + + public function callableTypeHint(callable $c) {} +} + +$b = new B; +$b->test(); + +?> +--EXPECTF-- +Test different callables + +Deprecated: Use of "self" in callables is deprecated in %s on line %d + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d + +Deprecated: Use of "static" in callables is deprecated in %s on line %d + +Deprecated: Use of "self" in callables is deprecated in %s on line %d + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d + +Deprecated: Use of "static" in callables is deprecated in %s on line %d + +Deprecated: Callables of the form ["B", "self::foo"] are deprecated in %s on line %d + +Deprecated: Callables of the form ["B", "parent::foo"] are deprecated in %s on line %d + +Deprecated: Callables of the form ["B", "static::foo"] are deprecated in %s on line %d + +Deprecated: Callables of the form ["B", "A::foo"] are deprecated in %s on line %d +Test array_map() + +Deprecated: Use of "self" in callables is deprecated in %s on line %d +Test is_callable() -- should be silent +bool(true) +Test callable type hint -- should be silent diff --git a/Zend/tests/closures/closure_from_callable_basic.phpt b/Zend/tests/closures/closure_from_callable_basic.phpt index 88a27c7e7032f..7c7fdf5a288b3 100644 --- a/Zend/tests/closures/closure_from_callable_basic.phpt +++ b/Zend/tests/closures/closure_from_callable_basic.phpt @@ -96,7 +96,7 @@ echo $fn(" OK".PHP_EOL); ?> ---EXPECT-- +--EXPECTF-- Access public static function OK Access public static function with different case OK Access public static function with colon scheme OK @@ -111,9 +111,17 @@ Instance return private static method as callable OK Instance return protected static method as callable OK Subclass closure over parent class protected method OK Subclass closure over parent class static protected method OK -Access public instance method of parent object through "parent::" OK -Access public instance method of self object through "self::" OK -Access public instance method of parent object through "self::" to parent method OK -Access protected instance method of parent object through "self::" to parent method OK +Access public instance method of parent object through "parent::" +Deprecated: Use of "parent" in callables is deprecated in %s on line %d + OK +Access public instance method of self object through "self::" +Deprecated: Use of "self" in callables is deprecated in %s on line %d + OK +Access public instance method of parent object through "self::" to parent method +Deprecated: Use of "self" in callables is deprecated in %s on line %d + OK +Access protected instance method of parent object through "self::" to parent method +Deprecated: Use of "self" in callables is deprecated in %s on line %d + OK MagicCall __call instance method __call,nonExistentMethod, OK MagicCall __callStatic static method __callStatic,nonExistentMethod, OK diff --git a/Zend/tests/closures/closure_from_callable_error.phpt b/Zend/tests/closures/closure_from_callable_error.phpt index 5d1e078c1ee26..d30e4fcfa2810 100644 --- a/Zend/tests/closures/closure_from_callable_error.phpt +++ b/Zend/tests/closures/closure_from_callable_error.phpt @@ -193,7 +193,7 @@ catch (\Throwable $t) { echo "OK\n"; ?> ---EXPECT-- +--EXPECTF-- Cannot access privateInstance method statically Cannot access privateInstance method statically with colon scheme Cannot access privateInstance method @@ -209,4 +209,6 @@ Subclass cannot closure over parant 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 + +Deprecated: Use of "self" in callables is deprecated in %s on line %d OK diff --git a/Zend/tests/lsb_011.phpt b/Zend/tests/lsb_011.phpt index 206f0cb9d04b8..0d0faeda803ce 100644 --- a/Zend/tests/lsb_011.phpt +++ b/Zend/tests/lsb_011.phpt @@ -19,5 +19,6 @@ class Test2 extends Test1 { } Test2::test(); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Use of "static" in callables is deprecated in %s on line %d ok diff --git a/Zend/tests/lsb_012.phpt b/Zend/tests/lsb_012.phpt index 21ddff3524f4d..bf959a30fcb5f 100644 --- a/Zend/tests/lsb_012.phpt +++ b/Zend/tests/lsb_012.phpt @@ -19,5 +19,6 @@ class Test2 extends Test1 { } Test2::test(); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Use of "static" in callables is deprecated in %s on line %d ok diff --git a/Zend/tests/lsb_021.phpt b/Zend/tests/lsb_021.phpt index 5694537a04110..5583a9de1f568 100644 --- a/Zend/tests/lsb_021.phpt +++ b/Zend/tests/lsb_021.phpt @@ -39,12 +39,20 @@ C::testForward(); C::testNoForward(); ?> ---EXPECT-- +--EXPECTF-- C + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d C + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d C C + +Deprecated: Use of "self" in callables is deprecated in %s on line %d C + +Deprecated: Use of "self" in callables is deprecated in %s on line %d C A A diff --git a/Zend/tests/lsb_022.phpt b/Zend/tests/lsb_022.phpt index e2a405c53e45b..6053c94f7460b 100644 --- a/Zend/tests/lsb_022.phpt +++ b/Zend/tests/lsb_022.phpt @@ -24,9 +24,24 @@ class B extends A { } B::foo(); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Use of "static" in callables is deprecated in %s on line %d B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d + +Deprecated: Use of "static" in callables is deprecated in %s on line %d B + +Deprecated: Use of "static" in callables is deprecated in %s on line %d B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d + +Deprecated: Use of "static" in callables is deprecated in %s on line %d B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d + +Deprecated: Use of "static" in callables is deprecated in %s on line %d B diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 12453a53e8ded..245967d678883 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3291,7 +3291,7 @@ static zend_always_inline zend_class_entry *get_scope(zend_execute_data *frame) return frame && frame->func ? frame->func->common.scope : NULL; } -static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *scope, zend_execute_data *frame, zend_fcall_info_cache *fcc, bool *strict_class, char **error) /* {{{ */ +static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *scope, zend_execute_data *frame, zend_fcall_info_cache *fcc, bool *strict_class, char **error, bool suppress_deprecation) /* {{{ */ { bool ret = 0; zend_class_entry *ce; @@ -3307,6 +3307,9 @@ static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *sc if (!scope) { if (error) *error = estrdup("cannot access \"self\" when no class scope is active"); } else { + if (error && !suppress_deprecation) { + zend_error(E_DEPRECATED, "Use of \"self\" in callables is deprecated"); + } fcc->called_scope = zend_get_called_scope(frame); if (!fcc->called_scope || !instanceof_function(fcc->called_scope, scope)) { fcc->called_scope = scope; @@ -3323,6 +3326,9 @@ static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *sc } else if (!scope->parent) { if (error) *error = estrdup("cannot access \"parent\" when current class scope has no parent"); } else { + if (error && !suppress_deprecation) { + zend_error(E_DEPRECATED, "Use of \"parent\" in callables is deprecated"); + } fcc->called_scope = zend_get_called_scope(frame); if (!fcc->called_scope || !instanceof_function(fcc->called_scope, scope->parent)) { fcc->called_scope = scope->parent; @@ -3340,6 +3346,9 @@ static bool zend_is_callable_check_class(zend_string *name, zend_class_entry *sc if (!called_scope) { if (error) *error = estrdup("cannot access \"static\" when no class scope is active"); } else { + if (error && !suppress_deprecation) { + zend_error(E_DEPRECATED, "Use of \"static\" in callables is deprecated"); + } fcc->called_scope = called_scope; fcc->calling_scope = called_scope; if (!fcc->object) { @@ -3472,7 +3481,7 @@ static zend_always_inline bool zend_is_callable_check_func(int check_flags, zval fcc->called_scope = fcc->object ? fcc->object->ce : fcc->calling_scope; } strict_class = 1; - } else if (!zend_is_callable_check_class(cname, scope, frame, fcc, &strict_class, error)) { + } else if (!zend_is_callable_check_class(cname, scope, frame, fcc, &strict_class, error, ce_org != NULL)) { zend_string_release_ex(cname, 0); return 0; } @@ -3483,6 +3492,11 @@ static zend_always_inline bool zend_is_callable_check_func(int check_flags, zval if (error) zend_spprintf(error, 0, "class %s is not a subclass of %s", ZSTR_VAL(ce_org->name), ZSTR_VAL(fcc->calling_scope->name)); return 0; } + if (ce_org && error) { + zend_error(E_DEPRECATED, + "Callables of the form [\"%s\", \"%s\"] are deprecated", + ZSTR_VAL(ce_org->name), Z_STRVAL_P(callable)); + } mname = zend_string_init(Z_STRVAL_P(callable) + clen + 2, mlen, 0); } else if (ce_org) { /* Try to fetch find static method of given class. */ @@ -3756,7 +3770,7 @@ ZEND_API bool zend_is_callable_at_frame( return 1; } - if (!zend_is_callable_check_class(Z_STR_P(obj), get_scope(frame), frame, fcc, &strict_class, error)) { + if (!zend_is_callable_check_class(Z_STR_P(obj), get_scope(frame), frame, fcc, &strict_class, error, false)) { return 0; } } else { diff --git a/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt b/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt index 3bc6faf33fbc6..8ac1220e9e250 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_subclass.phpt @@ -78,6 +78,8 @@ $db->exec('DROP TABLE IF EXISTS test'); ?> --EXPECTF-- __construct('%S', '%S', %s) + +Deprecated: Callables of the form ["MyPDO", "parent::__construct"] are deprecated in %s on line %d exec('DROP TABLE IF EXISTS test') exec('CREATE TABLE test(id INT)') exec('INSERT INTO test(id) VALUES (1), (2)') diff --git a/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt b/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt index e16ac67c6bc35..5a5b728a5e62b 100644 --- a/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt +++ b/ext/pdo_sqlite/tests/pdo_fetch_func_001.phpt @@ -126,6 +126,8 @@ function "" not found or invalid function name PDOStatement::fetchAll(): Argument #2 must be a callable, null given no array or string given cannot access "self" when no class scope is active + +Deprecated: Callables of the form ["bar", "parent::method"] are deprecated in %s on line %d array(2) { [0]=> string(9) "--- 1 ---" diff --git a/ext/spl/tests/bug65006.phpt b/ext/spl/tests/bug65006.phpt index 954811a784898..27d150383a297 100644 --- a/ext/spl/tests/bug65006.phpt +++ b/ext/spl/tests/bug65006.phpt @@ -22,7 +22,10 @@ second::init(); var_dump(spl_autoload_functions()); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Use of "self" in callables is deprecated in %s on line %d + +Deprecated: Use of "self" in callables is deprecated in %s on line %d array(2) { [0]=> array(2) { diff --git a/ext/standard/tests/class_object/forward_static_call_001.phpt b/ext/standard/tests/class_object/forward_static_call_001.phpt index 30459f0c435bb..aa1f34413a828 100644 --- a/ext/standard/tests/class_object/forward_static_call_001.phpt +++ b/ext/standard/tests/class_object/forward_static_call_001.phpt @@ -57,14 +57,20 @@ echo "-\n"; C::test3(); ?> ---EXPECT-- +--EXPECTF-- A - B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d B - B + +Deprecated: Use of "self" in callables is deprecated in %s on line %d B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d B - B @@ -74,7 +80,11 @@ C C - B + +Deprecated: Use of "self" in callables is deprecated in %s on line %d B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d C - B diff --git a/ext/standard/tests/class_object/forward_static_call_003.phpt b/ext/standard/tests/class_object/forward_static_call_003.phpt index c2c0035f6bb83..47f6b2403964b 100644 --- a/ext/standard/tests/class_object/forward_static_call_003.phpt +++ b/ext/standard/tests/class_object/forward_static_call_003.phpt @@ -38,12 +38,16 @@ echo "-\n"; C::test(); ?> ---EXPECT-- +--EXPECTF-- A - B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d B - C B + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d B diff --git a/ext/standard/tests/general_functions/bug40398.phpt b/ext/standard/tests/general_functions/bug40398.phpt index 274faf83086b9..a2fca18eb36e9 100644 --- a/ext/standard/tests/general_functions/bug40398.phpt +++ b/ext/standard/tests/general_functions/bug40398.phpt @@ -73,10 +73,17 @@ new Derived_5('5'); new Derived_6('6'); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Callables of the form ["Derived_1", "Base::__construct"] are deprecated in %s on line %d Base::__construct(1) + +Deprecated: Callables of the form ["Derived_2", "parent::__construct"] are deprecated in %s on line %d Base::__construct(2) Base::__construct(3) + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d Base::__construct(4) Base::__construct(5) + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d Base::__construct(6) diff --git a/ext/standard/tests/general_functions/callbacks_001.phpt b/ext/standard/tests/general_functions/callbacks_001.phpt index 53e7dd914de76..f173ca851613f 100644 --- a/ext/standard/tests/general_functions/callbacks_001.phpt +++ b/ext/standard/tests/general_functions/callbacks_001.phpt @@ -83,14 +83,22 @@ $o = new P; $o->test(); ?> ---EXPECT-- +--EXPECTF-- parent|who + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d B C|parent::who + +Deprecated: Callables of the form ["C", "parent::who"] are deprecated in %s on line %d B B|parent::who + +Deprecated: Callables of the form ["B", "parent::who"] are deprecated in %s on line %d A E|parent::who + +Deprecated: Callables of the form ["E", "parent::who"] are deprecated in %s on line %d D A|who A @@ -100,10 +108,16 @@ B|who2 A ===FOREIGN=== parent|who + +Deprecated: Use of "parent" in callables is deprecated in %s on line %d O P|parent::who + +Deprecated: Callables of the form ["P", "parent::who"] are deprecated in %s on line %d O $this|O::who + +Deprecated: Callables of the form ["P", "O::who"] are deprecated in %s on line %d O $this|B::who call_user_func(): Argument #1 ($callback) must be a valid callback, class P is not a subclass of B diff --git a/tests/classes/abstract_user_call.phpt b/tests/classes/abstract_user_call.phpt index 312b43d4e46be..a3e91967dff80 100644 --- a/tests/classes/abstract_user_call.phpt +++ b/tests/classes/abstract_user_call.phpt @@ -27,6 +27,8 @@ try { } ?> ---EXPECT-- +--EXPECTF-- test::func() + +Deprecated: Callables of the form ["test", "test_base::func"] are deprecated in %s on line %d call_user_func(): Argument #1 ($callback) must be a valid callback, cannot call abstract method test_base::func() From 45607225ea987b9b2660668313a1f8323fc0acf8 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 21 Oct 2021 22:24:59 +0100 Subject: [PATCH 0185/1346] pfc & vio init methods cannot fail These methods cannot fail the way they are currently designed. They only call set_client_option which could fail only with wrong arguments. Since this is an internal call, the arguments should never change. Either way set_client_option should not cause init to fail. --- ext/mysqlnd/mysqlnd_driver.c | 10 ++-------- ext/mysqlnd/mysqlnd_protocol_frame_codec.c | 4 ++-- ext/mysqlnd/mysqlnd_structs.h | 4 ++-- ext/mysqlnd/mysqlnd_vio.c | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_driver.c b/ext/mysqlnd/mysqlnd_driver.c index 874e9f6f98a16..b85979bfdf5dd 100644 --- a/ext/mysqlnd/mysqlnd_driver.c +++ b/ext/mysqlnd/mysqlnd_driver.c @@ -230,10 +230,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_pfc)(const bool persistent, MYSQLND_S pfc->persistent = pfc->data->persistent = persistent; pfc->data->m = *mysqlnd_pfc_get_methods(); - if (PASS != pfc->data->m.init(pfc, stats, error_info)) { - pfc->data->m.dtor(pfc, stats, error_info); - pfc = NULL; - } + pfc->data->m.init(pfc, stats, error_info); } DBG_RETURN(pfc); } @@ -255,10 +252,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_vio)(const bool persistent, MYSQLND_S vio->persistent = vio->data->persistent = persistent; vio->data->m = *mysqlnd_vio_get_methods(); - if (PASS != vio->data->m.init(vio, stats, error_info)) { - vio->data->m.dtor(vio, stats, error_info); - vio = NULL; - } + vio->data->m.init(vio, stats, error_info); } DBG_RETURN(vio); } diff --git a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c index ca34108d72668..52e7873c2d1f1 100644 --- a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c +++ b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c @@ -438,7 +438,7 @@ MYSQLND_METHOD(mysqlnd_pfc, free_contents)(MYSQLND_PFC * pfc) /* {{{ mysqlnd_pfc::init */ -static enum_func_status +static void MYSQLND_METHOD(mysqlnd_pfc, init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) { unsigned int buf_size; @@ -447,7 +447,7 @@ MYSQLND_METHOD(mysqlnd_pfc, init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const buf_size = MYSQLND_G(net_cmd_buffer_size); /* this is long, cast to unsigned int*/ pfc->data->m.set_client_option(pfc, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, (char *) &buf_size); - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 644204655f254..194382fbf42e3 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -352,7 +352,7 @@ MYSQLND_CLASS_METHODS_TYPE(mysqlnd_command) -typedef enum_func_status (*func_mysqlnd_vio__init)(MYSQLND_VIO * const vio, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); +typedef void (*func_mysqlnd_vio__init)(MYSQLND_VIO * const vio, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); typedef void (*func_mysqlnd_vio__dtor)(MYSQLND_VIO * const vio, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); typedef enum_func_status (*func_mysqlnd_vio__connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); @@ -1085,7 +1085,7 @@ typedef struct st_mysqlnd_read_buffer { -typedef enum_func_status (*func_mysqlnd_pfc__init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); +typedef void (*func_mysqlnd_pfc__init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); typedef void (*func_mysqlnd_pfc__dtor)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); typedef enum_func_status (*func_mysqlnd_pfc__reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); typedef enum_func_status (*func_mysqlnd_pfc__set_client_option)(MYSQLND_PFC * const pfc, enum_mysqlnd_client_option option, const char * const value); diff --git a/ext/mysqlnd/mysqlnd_vio.c b/ext/mysqlnd/mysqlnd_vio.c index e2194bca136a1..65f6e54d84283 100644 --- a/ext/mysqlnd/mysqlnd_vio.c +++ b/ext/mysqlnd/mysqlnd_vio.c @@ -669,7 +669,7 @@ MYSQLND_METHOD(mysqlnd_vio, close_stream)(MYSQLND_VIO * const net, MYSQLND_STATS /* {{{ mysqlnd_vio::init */ -static enum_func_status +static void MYSQLND_METHOD(mysqlnd_vio, init)(MYSQLND_VIO * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info) { unsigned int buf_size; @@ -681,7 +681,7 @@ MYSQLND_METHOD(mysqlnd_vio, init)(MYSQLND_VIO * const net, MYSQLND_STATS * const buf_size = MYSQLND_G(net_read_timeout); /* this is long, cast to unsigned int*/ net->data->m.set_client_option(net, MYSQL_OPT_READ_TIMEOUT, (char *)&buf_size); - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ From e7a815d19b319132326b9c5f1c7b622a52df3511 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 21 Oct 2021 22:45:07 +0100 Subject: [PATCH 0186/1346] (mysqlnd_conn_data, end_psession) never fails --- ext/mysqlnd/mysqlnd_connection.c | 4 ++-- ext/mysqlnd/mysqlnd_structs.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index ce68e1f70480d..57f8d22dc91a0 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -374,7 +374,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, restart_psession)(MYSQLND_CONN_DATA * conn) /* {{{ mysqlnd_conn_data::end_psession */ -static enum_func_status +static void MYSQLND_METHOD(mysqlnd_conn_data, end_psession)(MYSQLND_CONN_DATA * conn) { DBG_ENTER("mysqlnd_conn_data::end_psession"); @@ -385,7 +385,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, end_psession)(MYSQLND_CONN_DATA * conn) } mysqlnd_set_string(&conn->last_message, NULL, 0); conn->error_info = &conn->error_info_impl; - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 194382fbf42e3..d3f8b8c7a7c52 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -487,7 +487,7 @@ typedef enum_func_status (*func_mysqlnd_conn_data__send_command_do_request)(MYSQ typedef enum_func_status (*func_mysqlnd_conn_data__send_command_handle_response)(MYSQLND_CONN_DATA * const conn, const enum mysqlnd_packet_type ok_packet, const bool silent, const enum php_mysqlnd_server_command command, const bool ignore_upsert_status); typedef enum_func_status (*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn); -typedef enum_func_status (*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn); +typedef void (*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn); typedef enum_func_status (*func_mysqlnd_conn_data__send_close)(MYSQLND_CONN_DATA * conn); typedef enum_func_status (*func_mysqlnd_conn_data__ssl_set)(MYSQLND_CONN_DATA * const conn, const char * key, const char * const cert, const char * const ca, const char * const capath, const char * const cipher); From 6be1790651dc4e92333f099a41eecb22c3691abe Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 21 Oct 2021 22:58:41 +0100 Subject: [PATCH 0187/1346] Reset cannot fail. It was used in a condition, but it doesn't have to be. --- ext/mysqlnd/mysqlnd_connection.c | 5 ++--- ext/mysqlnd/mysqlnd_protocol_frame_codec.c | 4 ++-- ext/mysqlnd/mysqlnd_structs.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 57f8d22dc91a0..9bfc606eea2e9 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -503,9 +503,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect_handshake)(MYSQLND_CONN_DATA * conn, enum_func_status ret = FAIL; DBG_ENTER("mysqlnd_conn_data::connect_handshake"); - if (PASS == conn->vio->data->m.connect(conn->vio, *scheme, conn->persistent, conn->stats, conn->error_info) && - PASS == conn->protocol_frame_codec->data->m.reset(conn->protocol_frame_codec, conn->stats, conn->error_info)) - { + if (PASS == conn->vio->data->m.connect(conn->vio, *scheme, conn->persistent, conn->stats, conn->error_info)) { + conn->protocol_frame_codec->data->m.reset(conn->protocol_frame_codec, conn->stats, conn->error_info); size_t client_flags = mysql_flags; ret = conn->command->handshake(conn, *username, *password, *database, client_flags); diff --git a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c index 52e7873c2d1f1..1f989a4a989a4 100644 --- a/ext/mysqlnd/mysqlnd_protocol_frame_codec.c +++ b/ext/mysqlnd/mysqlnd_protocol_frame_codec.c @@ -29,12 +29,12 @@ /* {{{ mysqlnd_pfc::reset */ -static enum_func_status +static void MYSQLND_METHOD(mysqlnd_pfc, reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info) { DBG_ENTER("mysqlnd_pfc::reset"); pfc->data->packet_no = pfc->data->compressed_envelope_packet_no = 0; - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index d3f8b8c7a7c52..39cc2e914c972 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -1087,7 +1087,7 @@ typedef struct st_mysqlnd_read_buffer { typedef void (*func_mysqlnd_pfc__init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); typedef void (*func_mysqlnd_pfc__dtor)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); -typedef enum_func_status (*func_mysqlnd_pfc__reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); +typedef void (*func_mysqlnd_pfc__reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); typedef enum_func_status (*func_mysqlnd_pfc__set_client_option)(MYSQLND_PFC * const pfc, enum_mysqlnd_client_option option, const char * const value); typedef enum_func_status (*func_mysqlnd_pfc__decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, const zend_uchar * const compressed_data, const size_t compressed_data_len); typedef enum_func_status (*func_mysqlnd_pfc__encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len); From ad5f4715a640e8ad37bb9e60fc67c603860c1e42 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 21 Oct 2021 23:06:11 +0100 Subject: [PATCH 0188/1346] (mysqlnd_conn_data, restart_psession) never fails --- ext/mysqlnd/mysqlnd_connection.c | 4 ++-- ext/mysqlnd/mysqlnd_structs.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_connection.c b/ext/mysqlnd/mysqlnd_connection.c index 9bfc606eea2e9..05e3473a9e4fe 100644 --- a/ext/mysqlnd/mysqlnd_connection.c +++ b/ext/mysqlnd/mysqlnd_connection.c @@ -361,14 +361,14 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_server_option)(MYSQLND_CONN_DATA * const c /* {{{ mysqlnd_conn_data::restart_psession */ -static enum_func_status +static void MYSQLND_METHOD(mysqlnd_conn_data, restart_psession)(MYSQLND_CONN_DATA * conn) { DBG_ENTER("mysqlnd_conn_data::restart_psession"); MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CONNECT_REUSED); conn->current_result = NULL; conn->last_message.s = NULL; - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 39cc2e914c972..4bdfde7a10fe0 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -486,7 +486,7 @@ typedef enum_func_status (*func_mysqlnd_conn_data__free_reference)(MYSQLND_CONN_ typedef enum_func_status (*func_mysqlnd_conn_data__send_command_do_request)(MYSQLND_CONN_DATA * const conn, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const bool silent, const bool ignore_upsert_status); typedef enum_func_status (*func_mysqlnd_conn_data__send_command_handle_response)(MYSQLND_CONN_DATA * const conn, const enum mysqlnd_packet_type ok_packet, const bool silent, const enum php_mysqlnd_server_command command, const bool ignore_upsert_status); -typedef enum_func_status (*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn); +typedef void (*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn); typedef void (*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn); typedef enum_func_status (*func_mysqlnd_conn_data__send_close)(MYSQLND_CONN_DATA * conn); From 885dca3762cfdb3b14a67ce2f6e439317f17dd48 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 21 Oct 2021 23:12:26 +0100 Subject: [PATCH 0189/1346] Remove mysqlnd_unbuffered_skip_result and voidify skip_result --- ext/mysqlnd/mysqlnd.h | 1 - ext/mysqlnd/mysqlnd_result.c | 4 ++-- ext/mysqlnd/mysqlnd_structs.h | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index 734001ed3f1bb..840d219248ae3 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -109,7 +109,6 @@ PHPAPI void mysqlnd_debug(const char *mode); #define mysqlnd_query(conn, query_str, query_len) ((conn)->data)->m->query((conn)->data, (query_str), (query_len)) #define mysqlnd_async_query(conn, query_str, query_len) ((conn)->data)->m->send_query((conn)->data, (query_str), (query_len), NULL, NULL) #define mysqlnd_reap_async_query(conn) ((conn)->data)->m->reap_query((conn)->data) -#define mysqlnd_unbuffered_skip_result(result) (result)->m.skip_result((result)) PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num); diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index f2b98a2bc2354..9cad5247a7d39 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -781,7 +781,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, /* {{{ mysqlnd_res::skip_result */ -static enum_func_status +static void MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result) { bool fetched_anything; @@ -806,7 +806,7 @@ MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result) ? STAT_ROWS_SKIPPED_NORMAL : STAT_ROWS_SKIPPED_PS); } } - DBG_RETURN(PASS); + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 4bdfde7a10fe0..57ab51b8c3b58 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -632,7 +632,7 @@ typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, const unsi typedef MYSQLND_ROW_C (*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result); typedef uint64_t (*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result); typedef unsigned int (*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result); -typedef enum_func_status (*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result); +typedef void (*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result); typedef enum_func_status (*func_mysqlnd_res__seek_data)(MYSQLND_RES * const result, const uint64_t row); typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__seek_field)(MYSQLND_RES * const result, const MYSQLND_FIELD_OFFSET field_offset); typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__field_tell)(const MYSQLND_RES * const result); From b8327cff0bc712ba8a4e2972f5499d44bf269a2d Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 10:13:57 +0100 Subject: [PATCH 0190/1346] Inline DBA_ID_GET2(_3) Macro --- ext/dba/dba.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 57bfb5e4f8506..e51ca4e0c569e 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -187,9 +187,6 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free) RETURN_THROWS(); \ } -#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_FETCH_RESOURCE_WITH_ID(info, id) -#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE_WITH_ID(info, id) - #define DBA_ID_DONE \ if (key_free) efree(key_free) /* a DBA handler must have specific routines */ @@ -941,7 +938,9 @@ PHP_FUNCTION(dba_close) /* {{{ Checks, if the specified key exists */ PHP_FUNCTION(dba_exists) { - DBA_ID_GET2; + DBA_ID_PARS; + DBA_GET2; + DBA_FETCH_RESOURCE_WITH_ID(info, id); if(info->hnd->exists(info, key_str, key_len) == SUCCESS) { DBA_ID_DONE; @@ -957,7 +956,9 @@ PHP_FUNCTION(dba_fetch) { char *val; size_t len = 0; - DBA_ID_GET2_3; + DBA_ID_PARS; + DBA_GET2_3; + DBA_FETCH_RESOURCE_WITH_ID(info, id); if (ac==3) { if (!strcmp(info->hnd->name, "cdb")) { @@ -1079,7 +1080,9 @@ PHP_FUNCTION(dba_nextkey) If inifile: remove all other key lines */ PHP_FUNCTION(dba_delete) { - DBA_ID_GET2; + DBA_ID_PARS; + DBA_GET2; + DBA_FETCH_RESOURCE_WITH_ID(info, id); DBA_WRITE_CHECK_WITH_ID; From 84e17d8f90d620e3abdd9238c7830163b7ab7e2a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 10:18:26 +0100 Subject: [PATCH 0191/1346] Inline DBA_GET2_3 macro It is only used once --- ext/dba/dba.c | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index e51ca4e0c569e..f00df264c6fbc 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -152,30 +152,6 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free) RETURN_FALSE; \ } -#define DBA_GET2_3 \ - zval *key; \ - char *key_str, *key_free; \ - size_t key_len; \ - zend_long skip = 0; \ - switch(ac) { \ - case 2: \ - if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { \ - RETURN_THROWS(); \ - } \ - break; \ - case 3: \ - if (zend_parse_parameters(ac, "zlr", &key, &skip, &id) == FAILURE) { \ - RETURN_THROWS(); \ - } \ - break; \ - default: \ - WRONG_PARAM_COUNT; \ - } \ - if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) {\ - RETURN_FALSE; \ - } - - #define DBA_FETCH_RESOURCE(info, id) \ if ((info = (dba_info *)zend_fetch_resource2(Z_RES_P(id), "DBA identifier", le_db, le_pdb)) == NULL) { \ RETURN_THROWS(); \ @@ -957,7 +933,29 @@ PHP_FUNCTION(dba_fetch) char *val; size_t len = 0; DBA_ID_PARS; - DBA_GET2_3; + zval *key; + char *key_str, *key_free; + size_t key_len; + zend_long skip = 0; + + switch(ac) { + case 2: + if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { + RETURN_THROWS(); + } + break; + case 3: + if (zend_parse_parameters(ac, "zlr", &key, &skip, &id) == FAILURE) { + RETURN_THROWS(); + } + break; + default: + WRONG_PARAM_COUNT; + } + if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { + RETURN_FALSE; + } + DBA_FETCH_RESOURCE_WITH_ID(info, id); if (ac==3) { From 29ef6523dd14df9709a64fe1b9037e130f9eed1e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 10:22:01 +0100 Subject: [PATCH 0192/1346] Inline DBA_ID_PARS macro It is used only 3 times and provides variable declarations which one shouldn't need to grep to see what is declared --- ext/dba/dba.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index f00df264c6fbc..f2fb771e1ced4 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -89,13 +89,6 @@ ZEND_TSRMLS_CACHE_DEFINE() ZEND_GET_MODULE(dba) #endif -/* {{{ macromania */ - -#define DBA_ID_PARS \ - zval *id; \ - dba_info *info = NULL; \ - int ac = ZEND_NUM_ARGS() - /* these are used to get the standard arguments */ /* {{{ php_dba_myke_key */ @@ -914,7 +907,9 @@ PHP_FUNCTION(dba_close) /* {{{ Checks, if the specified key exists */ PHP_FUNCTION(dba_exists) { - DBA_ID_PARS; + zval *id; + dba_info *info = NULL; + int ac = ZEND_NUM_ARGS(); DBA_GET2; DBA_FETCH_RESOURCE_WITH_ID(info, id); @@ -932,7 +927,9 @@ PHP_FUNCTION(dba_fetch) { char *val; size_t len = 0; - DBA_ID_PARS; + zval *id; + dba_info *info = NULL; + int ac = ZEND_NUM_ARGS(); zval *key; char *key_str, *key_free; size_t key_len; @@ -1078,7 +1075,9 @@ PHP_FUNCTION(dba_nextkey) If inifile: remove all other key lines */ PHP_FUNCTION(dba_delete) { - DBA_ID_PARS; + zval *id; + dba_info *info = NULL; + int ac = ZEND_NUM_ARGS(); DBA_GET2; DBA_FETCH_RESOURCE_WITH_ID(info, id); From c6862d0ed5569d43a775bfde3170673ee698eba4 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 10:25:11 +0100 Subject: [PATCH 0193/1346] Inline DBA_GET2 macro It was used only twice --- ext/dba/dba.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index f2fb771e1ced4..06330a01fff23 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -89,8 +89,6 @@ ZEND_TSRMLS_CACHE_DEFINE() ZEND_GET_MODULE(dba) #endif -/* these are used to get the standard arguments */ - /* {{{ php_dba_myke_key */ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free) { @@ -134,17 +132,6 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free) } /* }}} */ -#define DBA_GET2 \ - zval *key; \ - char *key_str, *key_free; \ - size_t key_len; \ - if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { \ - RETURN_THROWS(); \ - } \ - if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) {\ - RETURN_FALSE; \ - } - #define DBA_FETCH_RESOURCE(info, id) \ if ((info = (dba_info *)zend_fetch_resource2(Z_RES_P(id), "DBA identifier", le_db, le_pdb)) == NULL) { \ RETURN_THROWS(); \ @@ -910,7 +897,16 @@ PHP_FUNCTION(dba_exists) zval *id; dba_info *info = NULL; int ac = ZEND_NUM_ARGS(); - DBA_GET2; + zval *key; + char *key_str, *key_free; + size_t key_len; + + if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { + RETURN_THROWS(); + } + if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { + RETURN_FALSE; + } DBA_FETCH_RESOURCE_WITH_ID(info, id); if(info->hnd->exists(info, key_str, key_len) == SUCCESS) { @@ -1078,7 +1074,16 @@ PHP_FUNCTION(dba_delete) zval *id; dba_info *info = NULL; int ac = ZEND_NUM_ARGS(); - DBA_GET2; + zval *key; + char *key_str, *key_free; + size_t key_len; + + if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { + RETURN_THROWS(); + } + if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { + RETURN_FALSE; + } DBA_FETCH_RESOURCE_WITH_ID(info, id); DBA_WRITE_CHECK_WITH_ID; From e21d02a62a0086a0ee44608a18bfe943d672d7ff Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 10:28:39 +0100 Subject: [PATCH 0194/1346] Drop confusing ac local variable for ZEND_NUM_ARGS() --- ext/dba/dba.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 06330a01fff23..89bf583455944 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -423,13 +423,12 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode) size_t val_len; zval *id; dba_info *info = NULL; - int ac = ZEND_NUM_ARGS(); zval *key; char *val; char *key_str, *key_free; size_t key_len; - if (zend_parse_parameters(ac, "zsr", &key, &val, &val_len, &id) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zsr", &key, &val, &val_len, &id) == FAILURE) { RETURN_THROWS(); } @@ -896,12 +895,11 @@ PHP_FUNCTION(dba_exists) { zval *id; dba_info *info = NULL; - int ac = ZEND_NUM_ARGS(); zval *key; char *key_str, *key_free; size_t key_len; - if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zr", &key, &id) == FAILURE) { RETURN_THROWS(); } if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { @@ -925,20 +923,19 @@ PHP_FUNCTION(dba_fetch) size_t len = 0; zval *id; dba_info *info = NULL; - int ac = ZEND_NUM_ARGS(); zval *key; char *key_str, *key_free; size_t key_len; zend_long skip = 0; - switch(ac) { + switch(ZEND_NUM_ARGS()) { case 2: - if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zr", &key, &id) == FAILURE) { RETURN_THROWS(); } break; case 3: - if (zend_parse_parameters(ac, "zlr", &key, &skip, &id) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zlr", &key, &skip, &id) == FAILURE) { RETURN_THROWS(); } break; @@ -951,7 +948,7 @@ PHP_FUNCTION(dba_fetch) DBA_FETCH_RESOURCE_WITH_ID(info, id); - if (ac==3) { + if (ZEND_NUM_ARGS() == 3) { if (!strcmp(info->hnd->name, "cdb")) { if (skip < 0) { php_error_docref(NULL, E_NOTICE, "Handler %s accepts only skip values greater than or equal to zero, using skip=0", info->hnd->name); @@ -1073,12 +1070,11 @@ PHP_FUNCTION(dba_delete) { zval *id; dba_info *info = NULL; - int ac = ZEND_NUM_ARGS(); zval *key; char *key_str, *key_free; size_t key_len; - if (zend_parse_parameters(ac, "zr", &key, &id) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zr", &key, &id) == FAILURE) { RETURN_THROWS(); } if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { From e56c5060200afff52de776259e4727cf0adc0f5b Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 12:04:23 +0100 Subject: [PATCH 0195/1346] Refactor DBA Use proper ZPP union types Use standard function signature semantics for dba_fetch() Re-ordering of checks --- UPGRADING | 8 + ext/dba/dba.c | 265 ++++++++---------- ext/dba/dba.stub.php | 35 +-- ext/dba/dba_arginfo.h | 10 +- ext/dba/tests/dba_fetch_legacy_signature.phpt | 30 ++ 5 files changed, 174 insertions(+), 174 deletions(-) create mode 100644 ext/dba/tests/dba_fetch_legacy_signature.phpt diff --git a/UPGRADING b/UPGRADING index 6b2efba9fd3f3..2faa7b2f1a59a 100644 --- a/UPGRADING +++ b/UPGRADING @@ -59,6 +59,14 @@ PHP 8.2 UPGRADE NOTES 5. Changed Functions ======================================== +- DBA + . dba_fetch()'s optional skip argument is now at the end in line with + PHP userland semantics its signature now is: + dba_fetch(string|array $key, $dba, int $skip = 0): string|false + The overloaded signature + dba_fetch(string|array $key, $skip, $dba): string|false + is still accepted, but it is recommended to use the new standard variant. + ======================================== 6. New Functions ======================================== diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 89bf583455944..3d2b3b81b24a5 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -90,61 +90,45 @@ ZEND_GET_MODULE(dba) #endif /* {{{ php_dba_myke_key */ -static size_t php_dba_make_key(zval *key, char **key_str, char **key_free) +static zend_string* php_dba_make_key(HashTable *key) { - if (Z_TYPE_P(key) == IS_ARRAY) { - zval *group, *name; - HashPosition pos; - size_t len; - - if (zend_hash_num_elements(Z_ARRVAL_P(key)) != 2) { - zend_argument_error(NULL, 1, "must have exactly two elements: \"key\" and \"name\""); - return 0; - } - zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(key), &pos); - group = zend_hash_get_current_data_ex(Z_ARRVAL_P(key), &pos); - zend_hash_move_forward_ex(Z_ARRVAL_P(key), &pos); - name = zend_hash_get_current_data_ex(Z_ARRVAL_P(key), &pos); - convert_to_string(group); - convert_to_string(name); - if (Z_STRLEN_P(group) == 0) { - *key_str = Z_STRVAL_P(name); - *key_free = NULL; - return Z_STRLEN_P(name); - } - len = spprintf(key_str, 0, "[%s]%s", Z_STRVAL_P(group), Z_STRVAL_P(name)); - *key_free = *key_str; - return len; - } else { - zval tmp; - size_t len; - - ZVAL_COPY(&tmp, key); - convert_to_string(&tmp); - - len = Z_STRLEN(tmp); - if (len) { - *key_free = *key_str = estrndup(Z_STRVAL(tmp), Z_STRLEN(tmp)); - } - zval_ptr_dtor(&tmp); - return len; - } + zval *group, *name; + HashPosition pos; + + if (zend_hash_num_elements(key) != 2) { + zend_argument_error(NULL, 1, "must have exactly two elements: \"key\" and \"name\""); + return NULL; + } + + // TODO: Use ZEND_HASH_FOREACH_VAL() API? + zend_hash_internal_pointer_reset_ex(key, &pos); + group = zend_hash_get_current_data_ex(key, &pos); + zend_hash_move_forward_ex(key, &pos); + name = zend_hash_get_current_data_ex(key, &pos); + // TODO: Use zval_try_get_string() or try_convert_to_string() instead? + convert_to_string(group); + convert_to_string(name); + if (Z_STRLEN_P(group) == 0) { + return Z_STR_P(name); + } + return zend_strpprintf(0, "[%s]%s", Z_STRVAL_P(group), Z_STRVAL_P(name)); } /* }}} */ +#define DBA_RELEASE_HT_KEY_CREATION() if (key_ht) {zend_string_release_ex(key_str, false);} + #define DBA_FETCH_RESOURCE(info, id) \ if ((info = (dba_info *)zend_fetch_resource2(Z_RES_P(id), "DBA identifier", le_db, le_pdb)) == NULL) { \ RETURN_THROWS(); \ } -#define DBA_FETCH_RESOURCE_WITH_ID(info, id) \ - if ((info = (dba_info *)zend_fetch_resource2(Z_RES_P(id), "DBA identifier", le_db, le_pdb)) == NULL) { \ - DBA_ID_DONE; \ - RETURN_THROWS(); \ +/* check whether the user has write access */ +#define DBA_WRITE_CHECK(info) \ + if((info)->mode != DBA_WRITER && (info)->mode != DBA_TRUNC && (info)->mode != DBA_CREAT) { \ + php_error_docref(NULL, E_WARNING, "You cannot perform a modification to a database without proper access"); \ + RETURN_FALSE; \ } -#define DBA_ID_DONE \ - if (key_free) efree(key_free) /* a DBA handler must have specific routines */ #define DBA_NAMED_HND(alias, name, flags) \ @@ -156,21 +140,6 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free) #define DBA_HND(name, flags) DBA_NAMED_HND(name, name, flags) -/* check whether the user has write access */ -#define DBA_WRITE_CHECK \ - if(info->mode != DBA_WRITER && info->mode != DBA_TRUNC && info->mode != DBA_CREAT) { \ - php_error_docref(NULL, E_WARNING, "You cannot perform a modification to a database without proper access"); \ - RETURN_FALSE; \ - } - -/* the same check, but with a call to DBA_ID_DONE before returning */ -#define DBA_WRITE_CHECK_WITH_ID \ - if(info->mode != DBA_WRITER && info->mode != DBA_TRUNC && info->mode != DBA_CREAT) { \ - php_error_docref(NULL, E_WARNING, "You cannot perform a modification to a database without proper access"); \ - DBA_ID_DONE; \ - RETURN_FALSE; \ - } - /* }}} */ /* {{{ globals */ @@ -420,33 +389,32 @@ PHP_MINFO_FUNCTION(dba) /* {{{ php_dba_update */ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode) { - size_t val_len; zval *id; dba_info *info = NULL; - zval *key; - char *val; - char *key_str, *key_free; - size_t key_len; + HashTable *key_ht = NULL; + zend_string *key_str = NULL; + zend_string *value; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zsr", &key, &val, &val_len, &id) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(3, 3) + Z_PARAM_ARRAY_HT_OR_STR(key_ht, key_str) + Z_PARAM_STR(value) + Z_PARAM_RESOURCE(id); + ZEND_PARSE_PARAMETERS_END(); - if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { - RETURN_FALSE; - } - - DBA_FETCH_RESOURCE_WITH_ID(info, id); - - DBA_WRITE_CHECK_WITH_ID; + DBA_FETCH_RESOURCE(info, id); + DBA_WRITE_CHECK(info); - if (info->hnd->update(info, key_str, key_len, val, val_len, mode) == SUCCESS) { - DBA_ID_DONE; - RETURN_TRUE; + if (key_ht) { + key_str = php_dba_make_key(key_ht); + if (!key_str) { + // TODO ValueError? + RETURN_FALSE; + } } - DBA_ID_DONE; - RETURN_FALSE; + RETVAL_BOOL(info->hnd->update(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str), + ZSTR_VAL(value), ZSTR_LEN(value), mode) == SUCCESS); + DBA_RELEASE_HT_KEY_CREATION(); } /* }}} */ @@ -895,61 +863,68 @@ PHP_FUNCTION(dba_exists) { zval *id; dba_info *info = NULL; - zval *key; - char *key_str, *key_free; - size_t key_len; + HashTable *key_ht = NULL; + zend_string *key_str = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zr", &key, &id) == FAILURE) { - RETURN_THROWS(); - } - if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { - RETURN_FALSE; - } - DBA_FETCH_RESOURCE_WITH_ID(info, id); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_ARRAY_HT_OR_STR(key_ht, key_str) + Z_PARAM_RESOURCE(id); + ZEND_PARSE_PARAMETERS_END(); - if(info->hnd->exists(info, key_str, key_len) == SUCCESS) { - DBA_ID_DONE; - RETURN_TRUE; + DBA_FETCH_RESOURCE(info, id); + + if (key_ht) { + key_str = php_dba_make_key(key_ht); + if (!key_str) { + // TODO ValueError? + RETURN_FALSE; + } } - DBA_ID_DONE; - RETURN_FALSE; + + RETVAL_BOOL(info->hnd->exists(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str)) == SUCCESS); + DBA_RELEASE_HT_KEY_CREATION(); } /* }}} */ /* {{{ Fetches the data associated with key */ PHP_FUNCTION(dba_fetch) { - char *val; - size_t len = 0; zval *id; dba_info *info = NULL; - zval *key; - char *key_str, *key_free; - size_t key_len; + HashTable *key_ht = NULL; + zend_string *key_str = NULL; zend_long skip = 0; - switch(ZEND_NUM_ARGS()) { - case 2: - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zr", &key, &id) == FAILURE) { - RETURN_THROWS(); - } - break; - case 3: - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zlr", &key, &skip, &id) == FAILURE) { - RETURN_THROWS(); - } - break; - default: - WRONG_PARAM_COUNT; - } - if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { - RETURN_FALSE; + /* Check for legacy signature */ + if (ZEND_NUM_ARGS() == 3) { + ZEND_PARSE_PARAMETERS_START_EX(ZEND_PARSE_PARAMS_QUIET, 3, 3) + Z_PARAM_ARRAY_HT_OR_STR(key_ht, key_str) + Z_PARAM_LONG(skip) + Z_PARAM_RESOURCE(id); + ZEND_PARSE_PARAMETERS_END_EX(goto standard;); + } else { + standard: + ZEND_PARSE_PARAMETERS_START(2, 3) + Z_PARAM_ARRAY_HT_OR_STR(key_ht, key_str) + Z_PARAM_RESOURCE(id); + Z_PARAM_OPTIONAL + Z_PARAM_LONG(skip) + ZEND_PARSE_PARAMETERS_END(); } - DBA_FETCH_RESOURCE_WITH_ID(info, id); + DBA_FETCH_RESOURCE(info, id); - if (ZEND_NUM_ARGS() == 3) { + if (key_ht) { + key_str = php_dba_make_key(key_ht); + if (!key_str) { + // TODO ValueError? + RETURN_FALSE; + } + } + + if (skip != 0) { if (!strcmp(info->hnd->name, "cdb")) { + // TODO ValueError? if (skip < 0) { php_error_docref(NULL, E_NOTICE, "Handler %s accepts only skip values greater than or equal to zero, using skip=0", info->hnd->name); skip = 0; @@ -962,6 +937,7 @@ PHP_FUNCTION(dba_fetch) * value to 0 ensures the first value. */ if (skip < -1) { + // TODO ValueError? php_error_docref(NULL, E_NOTICE, "Handler %s accepts only skip value -1 and greater, using skip=0", info->hnd->name); skip = 0; } @@ -969,17 +945,17 @@ PHP_FUNCTION(dba_fetch) php_error_docref(NULL, E_NOTICE, "Handler %s does not support optional skip parameter, the value will be ignored", info->hnd->name); skip = 0; } - } else { - skip = 0; } - if((val = info->hnd->fetch(info, key_str, key_len, skip, &len)) != NULL) { - DBA_ID_DONE; - RETVAL_STRINGL(val, len); - efree(val); - return; + + char *val; + size_t len = 0; + if ((val = info->hnd->fetch(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str), skip, &len)) == NULL) { + DBA_RELEASE_HT_KEY_CREATION(); + RETURN_FALSE; } - DBA_ID_DONE; - RETURN_FALSE; + DBA_RELEASE_HT_KEY_CREATION(); + RETVAL_STRINGL(val, len); + efree(val); } /* }}} */ @@ -1070,27 +1046,27 @@ PHP_FUNCTION(dba_delete) { zval *id; dba_info *info = NULL; - zval *key; - char *key_str, *key_free; - size_t key_len; + HashTable *key_ht = NULL; + zend_string *key_str = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zr", &key, &id) == FAILURE) { - RETURN_THROWS(); - } - if ((key_len = php_dba_make_key(key, &key_str, &key_free)) == 0) { - RETURN_FALSE; - } - DBA_FETCH_RESOURCE_WITH_ID(info, id); + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_ARRAY_HT_OR_STR(key_ht, key_str) + Z_PARAM_RESOURCE(id); + ZEND_PARSE_PARAMETERS_END(); - DBA_WRITE_CHECK_WITH_ID; + DBA_FETCH_RESOURCE(info, id); + DBA_WRITE_CHECK(info); - if(info->hnd->delete(info, key_str, key_len) == SUCCESS) - { - DBA_ID_DONE; - RETURN_TRUE; + if (key_ht) { + key_str = php_dba_make_key(key_ht); + if (!key_str) { + // TODO ValueError? + RETURN_FALSE; + } } - DBA_ID_DONE; - RETURN_FALSE; + + RETVAL_BOOL(info->hnd->delete(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str)) == SUCCESS); + DBA_RELEASE_HT_KEY_CREATION(); } /* }}} */ @@ -1121,8 +1097,7 @@ PHP_FUNCTION(dba_optimize) } DBA_FETCH_RESOURCE(info, id); - - DBA_WRITE_CHECK; + DBA_WRITE_CHECK(info); if (info->hnd->optimize(info) == SUCCESS) { RETURN_TRUE; diff --git a/ext/dba/dba.stub.php b/ext/dba/dba.stub.php index e9da43da18809..0ad373abf6f94 100644 --- a/ext/dba/dba.stub.php +++ b/ext/dba/dba.stub.php @@ -23,18 +23,14 @@ function dba_open($path, $mode, $handler = UNKNOWN, ...$handler_params) {} /** @param resource $dba */ function dba_close($dba): void {} -/** - * @param string|array $key - * @param resource $dba - */ -function dba_exists($key, $dba): bool {} +/** @param resource $dba */ +function dba_exists(string|array $key, $dba): bool {} /** - * @param string|array $key - * @param int|resource $skip actually this parameter is optional, not $dba - * @param resource $dba + * @param resource|int $dba overloaded legacy signature has params flipped + * @param resource|int $skip overloaded legacy signature has params flipped */ -function dba_fetch($key, $skip, $dba = UNKNOWN): string|false {} +function dba_fetch(string|array $key, $dba, $skip = 0): string|false {} function dba_key_split(string|false|null $key): array|false {} @@ -44,23 +40,14 @@ function dba_firstkey($dba): string|false {} /** @param resource $dba */ function dba_nextkey($dba): string|false {} -/** - * @param string|array $key - * @param resource $dba - */ -function dba_delete($key, $dba): bool {} +/** @param resource $dba */ +function dba_delete(string|array $key, $dba): bool {} -/** - * @param string|array $key - * @param resource $dba - */ -function dba_insert($key, string $value, $dba): bool {} +/** @param resource $dba */ +function dba_insert(string|array $key, string $value, $dba): bool {} -/** - * @param string|array $key - * @param resource $dba - */ -function dba_replace($key, string $value, $dba): bool {} +/** @param resource $dba */ +function dba_replace(string|array $key, string $value, $dba): bool {} /** @param resource $dba */ function dba_optimize($dba): bool {} diff --git a/ext/dba/dba_arginfo.h b/ext/dba/dba_arginfo.h index 17cb1152df628..35a70c0a01a11 100644 --- a/ext/dba/dba_arginfo.h +++ b/ext/dba/dba_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 092664d2d3fa28578e6c8e82160319678c211f0f */ + * Stub hash: b5e8100725ae7e93f3ae4a599d88e6578884d0d4 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2) ZEND_ARG_INFO(0, path) @@ -15,14 +15,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dba_close, 0, 1, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dba_exists, 0, 2, _IS_BOOL, 0) - ZEND_ARG_INFO(0, key) + ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, NULL) ZEND_ARG_INFO(0, dba) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dba_fetch, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_INFO(0, key) - ZEND_ARG_INFO(0, skip) + ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, NULL) ZEND_ARG_INFO(0, dba) + ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, skip, "0") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dba_key_split, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) @@ -38,7 +38,7 @@ ZEND_END_ARG_INFO() #define arginfo_dba_delete arginfo_dba_exists ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dba_insert, 0, 3, _IS_BOOL, 0) - ZEND_ARG_INFO(0, key) + ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, NULL) ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0) ZEND_ARG_INFO(0, dba) ZEND_END_ARG_INFO() diff --git a/ext/dba/tests/dba_fetch_legacy_signature.phpt b/ext/dba/tests/dba_fetch_legacy_signature.phpt new file mode 100644 index 0000000000000..847c191612c73 --- /dev/null +++ b/ext/dba/tests/dba_fetch_legacy_signature.phpt @@ -0,0 +1,30 @@ +--TEST-- +dba_fetch() legacy signature +--EXTENSIONS-- +dba +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +This is a test insert +This is a test insert From b50dc1e3a690b27df18540ce9b8f51e60a9a1539 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Oct 2021 20:53:11 +0100 Subject: [PATCH 0196/1346] Fix DBA on MacOS (#7611) The name zend_string* must be copied instead of returned directly in case the group part of the array is empty. --- ext/dba/dba.c | 3 ++- ext/dba/tests/dba_array_keys.phpt | 42 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 ext/dba/tests/dba_array_keys.phpt diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 3d2b3b81b24a5..bccf6da63792b 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -108,8 +108,9 @@ static zend_string* php_dba_make_key(HashTable *key) // TODO: Use zval_try_get_string() or try_convert_to_string() instead? convert_to_string(group); convert_to_string(name); + // TODO: Check ZSTR_LEN(name) != 0 if (Z_STRLEN_P(group) == 0) { - return Z_STR_P(name); + return zend_string_copy(Z_STR_P(name)); } return zend_strpprintf(0, "[%s]%s", Z_STRVAL_P(group), Z_STRVAL_P(name)); } diff --git a/ext/dba/tests/dba_array_keys.phpt b/ext/dba/tests/dba_array_keys.phpt new file mode 100644 index 0000000000000..7f2654186e209 --- /dev/null +++ b/ext/dba/tests/dba_array_keys.phpt @@ -0,0 +1,42 @@ +--TEST-- +DBA check behaviour of array keys +--EXTENSIONS-- +dba +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +string(12) "Normal group" +string(10) "Empty name" +string(11) "Empty group" +string(10) "Empty keys" From 8db5e70866df7b464e70d0a8331a41a90339ae82 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 24 Oct 2021 22:41:22 +0100 Subject: [PATCH 0197/1346] DBA should not convert elements in-place if the key param is an array Also check that the value can actually be converted to string --- ext/dba/dba.c | 28 +++++++--- ...dba_array_keys_not_string_convertable.phpt | 41 ++++++++++++++ .../tests/dba_array_keys_var_non_string.phpt | 54 +++++++++++++++++++ 3 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 ext/dba/tests/dba_array_keys_not_string_convertable.phpt create mode 100644 ext/dba/tests/dba_array_keys_var_non_string.phpt diff --git a/ext/dba/dba.c b/ext/dba/dba.c index bccf6da63792b..a7a83bae2d4b2 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -89,10 +89,11 @@ ZEND_TSRMLS_CACHE_DEFINE() ZEND_GET_MODULE(dba) #endif -/* {{{ php_dba_myke_key */ +/* {{{ php_dba_make_key */ static zend_string* php_dba_make_key(HashTable *key) { zval *group, *name; + zend_string *group_str, *name_str; HashPosition pos; if (zend_hash_num_elements(key) != 2) { @@ -103,16 +104,29 @@ static zend_string* php_dba_make_key(HashTable *key) // TODO: Use ZEND_HASH_FOREACH_VAL() API? zend_hash_internal_pointer_reset_ex(key, &pos); group = zend_hash_get_current_data_ex(key, &pos); + group_str = zval_try_get_string(group); + if (!group_str) { + return NULL; + } + zend_hash_move_forward_ex(key, &pos); name = zend_hash_get_current_data_ex(key, &pos); - // TODO: Use zval_try_get_string() or try_convert_to_string() instead? - convert_to_string(group); - convert_to_string(name); + name_str = zval_try_get_string(name); + if (!name_str) { + zend_string_release_ex(group_str, false); + return NULL; + } + // TODO: Check ZSTR_LEN(name) != 0 - if (Z_STRLEN_P(group) == 0) { - return zend_string_copy(Z_STR_P(name)); + if (ZSTR_LEN(group_str) == 0) { + zend_string_release_ex(group_str, false); + return name_str; } - return zend_strpprintf(0, "[%s]%s", Z_STRVAL_P(group), Z_STRVAL_P(name)); + + zend_string *key_str = zend_strpprintf(0, "[%s]%s", ZSTR_VAL(group_str), ZSTR_VAL(name_str)); + zend_string_release_ex(group_str, false); + zend_string_release_ex(name_str, false); + return key_str; } /* }}} */ diff --git a/ext/dba/tests/dba_array_keys_not_string_convertable.phpt b/ext/dba/tests/dba_array_keys_not_string_convertable.phpt new file mode 100644 index 0000000000000..e89eed33d1d9c --- /dev/null +++ b/ext/dba/tests/dba_array_keys_not_string_convertable.phpt @@ -0,0 +1,41 @@ +--TEST-- +DBA check behaviour of key as an array with elements not convertable to string +--EXTENSIONS-- +dba +--SKIPIF-- + +--FILE-- +getMessage(), \PHP_EOL; +} +try { + var_dump(dba_insert(['group', $o], 'Test', $db_file)); +} catch (\Error $e) { + echo $e::class, ': ', $e->getMessage(), \PHP_EOL; +} + +dba_close($db_file); + +?> +--CLEAN-- + +--EXPECT-- +Error: Object of class stdClass could not be converted to string +Error: Object of class stdClass could not be converted to string diff --git a/ext/dba/tests/dba_array_keys_var_non_string.phpt b/ext/dba/tests/dba_array_keys_var_non_string.phpt new file mode 100644 index 0000000000000..f6a92cc74f6cb --- /dev/null +++ b/ext/dba/tests/dba_array_keys_var_non_string.phpt @@ -0,0 +1,54 @@ +--TEST-- +DBA check behaviour of key as an array with non string elements +--EXTENSIONS-- +dba +--SKIPIF-- + +--FILE-- + +--CLEAN-- + +--EXPECT-- +array(2) { + [0]=> + int(5) + [1]=> + float(5.21) +} +bool(true) +array(2) { + [0]=> + int(5) + [1]=> + float(5.21) +} +string(4) "Test" +array(2) { + [0]=> + int(5) + [1]=> + float(5.21) +} From 7ba23a6a13f3b0c5fc9620d7e1b8d8679399aaea Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 25 Oct 2021 14:40:41 +1100 Subject: [PATCH 0198/1346] Remove test for obsolete Oracle DB version --- ext/oci8/package.xml | 1 - ext/oci8/tests/bind_sqltnum_11g.phpt | 277 --------------------------- 2 files changed, 278 deletions(-) delete mode 100644 ext/oci8/tests/bind_sqltnum_11g.phpt diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 58e8fa6226b97..d225d8008b61b 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -125,7 +125,6 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin - diff --git a/ext/oci8/tests/bind_sqltnum_11g.phpt b/ext/oci8/tests/bind_sqltnum_11g.phpt deleted file mode 100644 index 45bb25eda0268..0000000000000 --- a/ext/oci8/tests/bind_sqltnum_11g.phpt +++ /dev/null @@ -1,277 +0,0 @@ ---TEST-- -Bind with SQLT_NUM ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -Test 1 - baseline test -array(2) { - ["ID"]=> - array(1) { - [0]=> - string(3) "100" - } - ["VARCHAR2_T10"]=> - array(1) { - [0]=> - string(4) "Hood" - } -} -Test 2 - SQLT_NUM to a VARCHAR2 column - -Warning: oci_execute(): ORA-12899: %s (%s: 40, %s: 10) in %sbind_sqltnum_11g.php on line %d -string(%d) "ORA-12899: %s" - -TEST41 wrong bind type SQLT_NUM - -Warning: oci_execute(): ORA-12899: %s "%s"."BIND_SQLTNUM_TAB"."VARCHAR2_T10" (%s: 40, %s: 10) in %sbind_sqltnum_11g.php on line %d - -TEST42 insert numbers SQLT_NUM -array(1) { - ["NUMBER_T"]=> - array(1) { - [0]=> - NULL - } -} - -TEST43 insert numbers SQLT_NUM -array(1) { - ["NUMBER_T"]=> - array(1) { - [0]=> - NULL - } -} - -TEST44 -array(1) { - ["NUMBER_T"]=> - array(1) { - [0]=> - string(127) "-000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - } -} - -TEST45 -array(1) { - ["NUMBER_T"]=> - array(1) { - [0]=> - NULL - } -} - -TEST46 insert numbers -array(1) { - ["NUMBER_T"]=> - array(1) { - [0]=> - NULL - } -} - -TEST47 -array(1) { - ["NUMBER_T"]=> - array(1) { - [0]=> - NULL - } -} - -TEST48 -array(1) { - ["NUMBER_T92"]=> - array(1) { - [0]=> - string(1) "0" - } -} - -TEST49 -array(1) { - ["NUMBER_T92"]=> - array(1) { - [0]=> - string(1) "0" - } -} - -TEST50 - -Warning: oci_execute(): ORA-01438: %s in %sbind_sqltnum_11g.php on line %d -array(1) { - ["NUMBER_T92"]=> - array(0) { - } -} From ca871304e060878b538651f6b23d3b1e10d74c47 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Mon, 25 Oct 2021 14:45:20 +1100 Subject: [PATCH 0199/1346] Remove tests for obsolete Oracle DB version --- ext/oci8/package.xml | 7 - ext/oci8/tests/bind_char_1_11gR1.phpt | 294 ---------------------- ext/oci8/tests/bind_char_2_11gR1.phpt | 118 --------- ext/oci8/tests/bind_char_3_11gR1.phpt | 337 ------------------------- ext/oci8/tests/bind_char_4_11gR1.phpt | 339 -------------------------- ext/oci8/tests/bug27303_1_11gR1.phpt | 255 ------------------- ext/oci8/tests/bug27303_2_11gR1.phpt | 259 -------------------- ext/oci8/tests/bug27303_4_11gR1.phpt | 253 ------------------- 8 files changed, 1862 deletions(-) delete mode 100644 ext/oci8/tests/bind_char_1_11gR1.phpt delete mode 100644 ext/oci8/tests/bind_char_2_11gR1.phpt delete mode 100644 ext/oci8/tests/bind_char_3_11gR1.phpt delete mode 100644 ext/oci8/tests/bind_char_4_11gR1.phpt delete mode 100644 ext/oci8/tests/bug27303_1_11gR1.phpt delete mode 100644 ext/oci8/tests/bug27303_2_11gR1.phpt delete mode 100644 ext/oci8/tests/bug27303_4_11gR1.phpt diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index d225d8008b61b..9134a2a655baa 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -103,13 +103,9 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin - - - - @@ -130,12 +126,9 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin - - - diff --git a/ext/oci8/tests/bind_char_1_11gR1.phpt b/ext/oci8/tests/bind_char_1_11gR1.phpt deleted file mode 100644 index 2fea521b70944..0000000000000 --- a/ext/oci8/tests/bind_char_1_11gR1.phpt +++ /dev/null @@ -1,294 +0,0 @@ ---TEST-- -SELECT oci_bind_by_name with SQLT_AFC aka CHAR ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---ENV-- -NLS_LANG=.AL32UTF8 ---FILE-- - ---EXPECT-- -*** Non-null Data Tests against CHAR*** -Test 1.1: Type: default. Length: default - Querying: -Test 1.2: Type: AFC. Length: default - Querying: - :1: - :abc : - :: -Test 1.3: Type: AFC: Length: 0 - Querying: - :1: - :abc : - :: -Test 1.4: Type: AFC: Length: strlen - Querying: - :1: - :abc : - :: -Test 1.5: Type: AFC. Length: strlen-1 - Querying: -Test 1.6: Type: AFC. Length: strlen+1 - Querying: - :1: - :abc : - :: - - -*** NULL data tests against CHAR *** -Test 2.1: Type: default. Length: default - Querying: -Test 2.2: Type: AFC. Length: default - Querying: -Test 2.3: Type: AFC: Length: 0 - Querying: -Test 2.4: Type: AFC: Length: strlen - Querying: -Test 2.5: Type: AFC. Length: strlen-1 - Querying: -Test 2.6: Type: AFC. Length: strlen+1 - Querying: - - -*** Non-null Data Tests against VARCHAR2*** -Test 3.1: Type: default. Length: default - Querying: - :2: - :: - :abc: -Test 3.2: Type: AFC. Length: default - Querying: - :2: - :: - :abc: -Test 3.3: Type: AFC: Length: 0 - Querying: - :2: - :: - :abc: -Test 3.4: Type: AFC: Length: strlen - Querying: - :2: - :: - :abc: -Test 3.5: Type: AFC. Length: strlen-1 - Querying: -Test 3.6: Type: AFC. Length: strlen+1 - Querying: - :2: - :: - :abc: - - -*** NULL data tests against VARCHAR2 *** -Test 4.1: Type: default. Length: default - Querying: -Test 4.2: Type: AFC. Length: default - Querying: -Test 4.3: Type: AFC: Length: 0 - Querying: -Test 4.4: Type: AFC: Length: strlen - Querying: -Test 4.5: Type: AFC. Length: strlen-1 - Querying: -Test 4.6: Type: AFC. Length: strlen+1 - Querying: -Done diff --git a/ext/oci8/tests/bind_char_2_11gR1.phpt b/ext/oci8/tests/bind_char_2_11gR1.phpt deleted file mode 100644 index 0f7c1634ddef8..0000000000000 --- a/ext/oci8/tests/bind_char_2_11gR1.phpt +++ /dev/null @@ -1,118 +0,0 @@ ---TEST-- -SELECT oci_bind_by_name with SQLT_AFC aka CHAR and dates ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---ENV-- -NLS_LANG=.AL32UTF8 ---FILE-- - ---EXPECT-- -Test 1.1: Type: default. Length: default - Querying: - :1: - :2008-04-20: -Test 1.2: Type: AFC. Length: default - Querying: - :1: - :2008-04-20: -Test 1.3: Type: AFC: Length: 0 - Querying: - :1: - :2008-04-20: -Test 1.4: Type: AFC: Length: strlen - Querying: - :1: - :2008-04-20: -Test 1.5: Type: AFC. Length: strlen-1 - Querying: -Test 1.6: Type: AFC. Length: strlen+1 - Querying: - :1: - :2008-04-20: -Done diff --git a/ext/oci8/tests/bind_char_3_11gR1.phpt b/ext/oci8/tests/bind_char_3_11gR1.phpt deleted file mode 100644 index ab7f97b4dadf2..0000000000000 --- a/ext/oci8/tests/bind_char_3_11gR1.phpt +++ /dev/null @@ -1,337 +0,0 @@ ---TEST-- -PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to CHAR parameter ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---ENV-- -NLS_LANG=.AL32UTF8 ---FILE-- - ---EXPECT-- -Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default - Executing: - Oci_execute error ORA-6502 -string(3) "abc" -NULL -Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default - Executing: -string(3) "abc" -string(3) "abc" -Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default - Executing: -string(3) "abc" -string(3) "abc" -Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -string(3) "abc" -string(10) "abc " -Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC - Executing: -string(3) "abc" -string(3) "abc" -Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC - Executing: - Oci_execute error ORA-6502 -string(3) "abc" -string(3) "abc" -Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC - Executing: -string(3) "abc" -string(4) "abc " - - -Tests with '' - -Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default - Executing: -string(0) "" -NULL -Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default - Executing: -string(0) "" -NULL -Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC - Executing: -string(0) "" -NULL - - -Tests with NULL -Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -NULL -NULL -Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default - Executing: -NULL -NULL -Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default - Executing: -NULL -NULL -Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -NULL -NULL -Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC - Executing: -NULL -NULL -Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC - Executing: -NULL -NULL -Done diff --git a/ext/oci8/tests/bind_char_4_11gR1.phpt b/ext/oci8/tests/bind_char_4_11gR1.phpt deleted file mode 100644 index 37afa0e0673ad..0000000000000 --- a/ext/oci8/tests/bind_char_4_11gR1.phpt +++ /dev/null @@ -1,339 +0,0 @@ ---TEST-- -PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---ENV-- -NLS_LANG=.AL32UTF8 ---FILE-- - ---EXPECT-- -Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default - Executing: - Oci_execute error ORA-6502 -string(3) "abc" -NULL -Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default - Executing: -string(3) "abc" -string(3) "abc" -Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default - Executing: -string(3) "abc" -string(3) "abc" -Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -string(3) "abc" -string(10) "abc " -Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC - Executing: -string(3) "abc" -string(3) "abc" -Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC - Executing: - Oci_execute error ORA-6502 -string(3) "abc" -string(3) "abc" -Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC - Executing: -string(3) "abc" -string(4) "abc " - - -Tests with '' - -Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default - Executing: -string(0) "" -NULL -Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default - Executing: -string(0) "" -NULL -Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC - Executing: -string(0) "" -NULL -Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC - Executing: -string(0) "" -NULL - - -Tests with NULL -Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -NULL -NULL -Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default - Executing: -NULL -NULL -Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default - Executing: -NULL -NULL -Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC - Executing: -NULL -NULL -Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC - Executing: -NULL -NULL -Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC - Executing: -NULL -NULL -Done diff --git a/ext/oci8/tests/bug27303_1_11gR1.phpt b/ext/oci8/tests/bug27303_1_11gR1.phpt deleted file mode 100644 index bbc682b942e99..0000000000000 --- a/ext/oci8/tests/bug27303_1_11gR1.phpt +++ /dev/null @@ -1,255 +0,0 @@ ---TEST-- -Bug #27303 (OCIBindByName binds numeric PHP values as characters) ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---FILE-- - ---EXPECT-- -string(1) "1" -string(1) "2" -string(1) "3" -string(1) "4" -string(1) "5" -string(1) "6" -string(1) "7" -string(1) "8" -string(1) "9" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -Done diff --git a/ext/oci8/tests/bug27303_2_11gR1.phpt b/ext/oci8/tests/bug27303_2_11gR1.phpt deleted file mode 100644 index e1abab195f114..0000000000000 --- a/ext/oci8/tests/bug27303_2_11gR1.phpt +++ /dev/null @@ -1,259 +0,0 @@ ---TEST-- -Bug #27303 (OCIBindByName binds numeric PHP values as characters) ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---ENV-- -NLS_LANG= ---FILE-- - ---EXPECT-- -string(1) "1" -string(1) "2" -string(1) "3" -string(1) "4" -string(1) "5" -string(1) "6" -string(1) "7" -string(1) "8" -string(1) "9" -string(2) "10" -string(2) "11" -string(2) "12" -string(2) "13" -string(2) "14" -string(2) "15" -string(2) "16" -string(2) "17" -string(2) "18" -string(2) "19" -string(2) "20" -string(2) "21" -string(2) "22" -string(2) "23" -string(2) "24" -string(2) "25" -string(2) "26" -string(2) "27" -string(2) "28" -string(2) "29" -string(2) "30" -string(2) "31" -string(2) "32" -string(2) "33" -string(2) "34" -string(2) "35" -string(2) "36" -string(2) "37" -string(2) "38" -string(2) "39" -string(2) "40" -string(2) "41" -string(2) "42" -string(2) "43" -string(2) "44" -string(2) "45" -string(2) "46" -string(2) "47" -string(2) "48" -string(2) "49" -string(2) "50" -string(2) "51" -string(2) "52" -string(2) "53" -string(2) "54" -string(2) "55" -string(2) "56" -string(2) "57" -string(2) "58" -string(2) "59" -string(2) "60" -string(2) "61" -string(2) "62" -string(2) "63" -string(2) "64" -string(2) "65" -string(2) "66" -string(2) "67" -string(2) "68" -string(2) "69" -string(2) "70" -string(2) "71" -string(2) "72" -string(2) "73" -string(2) "74" -string(2) "75" -string(2) "76" -string(2) "77" -string(2) "78" -string(2) "79" -string(2) "80" -string(2) "81" -string(2) "82" -string(2) "83" -string(2) "84" -string(2) "85" -string(2) "86" -string(2) "87" -string(2) "88" -string(2) "89" -string(2) "90" -string(2) "91" -string(2) "92" -string(2) "93" -string(2) "94" -string(2) "95" -string(2) "96" -string(2) "97" -string(2) "98" -string(2) "99" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "10" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "11" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "12" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "13" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "14" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "15" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "16" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "17" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "18" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -string(2) "19" -Done diff --git a/ext/oci8/tests/bug27303_4_11gR1.phpt b/ext/oci8/tests/bug27303_4_11gR1.phpt deleted file mode 100644 index 98dc7005f57df..0000000000000 --- a/ext/oci8/tests/bug27303_4_11gR1.phpt +++ /dev/null @@ -1,253 +0,0 @@ ---TEST-- -Bug #27303 (OCIBindByName binds numeric PHP values as characters) ---EXTENSIONS-- -oci8 ---SKIPIF-- - ---FILE-- - ---EXPECT-- -string(1) "1" -string(1) "2" -string(1) "3" -string(1) "4" -string(1) "5" -string(1) "6" -string(1) "7" -string(1) "8" -string(1) "9" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "2" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "3" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "4" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "5" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "6" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "7" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "8" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "9" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -string(1) "1" -Done From 92ad90af2348d275f5efd29b4641d3ad3bfab416 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 25 Oct 2021 23:29:51 +0300 Subject: [PATCH 0200/1346] JIT: Avoid ZEND_CALL_RELEASE_THIS checks --- ext/opcache/jit/zend_jit_arm64.dasc | 8 +++++--- ext/opcache/jit/zend_jit_internal.h | 6 ++++++ ext/opcache/jit/zend_jit_trace.c | 29 +++++++++++++++++++---------- ext/opcache/jit/zend_jit_x86.dasc | 8 +++++--- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 1c1c98ec77edb..e2686f8d599bc 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -10670,9 +10670,11 @@ static int zend_jit_leave_func(dasm_State **Dst, return 0; } } - | // if (call_info & ZEND_CALL_RELEASE_THIS) - | TST_32_WITH_CONST FCARG1w, ZEND_CALL_RELEASE_THIS, TMP1w - | beq >4 + if (!JIT_G(current_frame) || !TRACE_FRAME_ALWAYS_RELEASE_THIS(JIT_G(current_frame))) { + | // if (call_info & ZEND_CALL_RELEASE_THIS) + | TST_32_WITH_CONST FCARG1w, ZEND_CALL_RELEASE_THIS, TMP1w + | beq >4 + } | // zend_object *object = Z_OBJ(execute_data->This); | ldr FCARG1x, EX->This.value.obj | // OBJ_RELEASE(object); diff --git a/ext/opcache/jit/zend_jit_internal.h b/ext/opcache/jit/zend_jit_internal.h index 6ebc1c63a3691..1b6f88ead0197 100644 --- a/ext/opcache/jit/zend_jit_internal.h +++ b/ext/opcache/jit/zend_jit_internal.h @@ -614,6 +614,7 @@ struct _zend_jit_trace_stack_frame { #define TRACE_FRAME_MASK_NO_NEED_RELEASE_THIS 0x00000080 #define TRACE_FRAME_MASK_THIS_CLASS_CHECKED 0x00000100 #define TRACE_FRAME_MASK_CLOSURE_CALL 0x00000200 +#define TRACE_FRAME_MASK_ALWAYS_RELEASE_THIS 0x00000400 #define TRACE_FRAME_INIT(frame, _func, _flags, num_args) do { \ @@ -651,6 +652,8 @@ struct _zend_jit_trace_stack_frame { ((frame)->_info & TRACE_FRAME_MASK_THIS_CLASS_CHECKED) #define TRACE_FRAME_IS_CLOSURE_CALL(frame) \ ((frame)->_info & TRACE_FRAME_MASK_CLOSURE_CALL) +#define TRACE_FRAME_ALWAYS_RELEASE_THIS(frame) \ + ((frame)->_info & TRACE_FRAME_MASK_ALWAYS_RELEASE_THIS) #define TRACE_FRAME_SET_UNKNOWN_NUM_ARGS(frame) do { \ (frame)->_info |= (0xffffu << TRACE_FRAME_SHIFT_NUM_ARGS); \ @@ -690,6 +693,9 @@ struct _zend_jit_trace_stack_frame { #define TRACE_FRAME_SET_CLOSURE_CALL(frame) do { \ (frame)->_info |= TRACE_FRAME_MASK_CLOSURE_CALL; \ } while (0) +#define TRACE_FRAME_SET_ALWAYS_RELEASE_THIS(frame) do { \ + (frame)->_info |= TRACE_FRAME_MASK_ALWAYS_RELEASE_THIS; \ + } while (0) ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_func_trace_helper(ZEND_OPCODE_HANDLER_ARGS); ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_ret_trace_helper(ZEND_OPCODE_HANDLER_ARGS); diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index bdb98d96998c2..7faa7dbb817ad 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6498,16 +6498,25 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par TRACE_FRAME_SET_CLOSURE_CALL(call); } } - if (init_opline - && init_opline->opcode != ZEND_NEW - && (init_opline->opcode != ZEND_INIT_METHOD_CALL - || init_opline->op1_type == IS_UNDEF) - && (init_opline->opcode != ZEND_INIT_USER_CALL - || (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC)))) - && (init_opline->opcode != ZEND_INIT_DYNAMIC_CALL - || (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC)))) - ) { - TRACE_FRAME_SET_NO_NEED_RELEASE_THIS(call); + if (init_opline) { + if (init_opline->opcode != ZEND_NEW + && (init_opline->opcode != ZEND_INIT_METHOD_CALL + || init_opline->op1_type == IS_UNDEF + || (!(p->info & ZEND_JIT_TRACE_FAKE_INIT_CALL) + && (ssa_op-1)->op1_use >=0 + && ssa->var_info[(ssa_op-1)->op1_use].delayed_fetch_this)) + && (init_opline->opcode != ZEND_INIT_USER_CALL + || (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC)))) + && (init_opline->opcode != ZEND_INIT_DYNAMIC_CALL + || (p->func && (!p->func->common.scope || (p->func->common.fn_flags & ZEND_ACC_STATIC)))) + ) { + TRACE_FRAME_SET_NO_NEED_RELEASE_THIS(call); + } else if (init_opline->opcode == ZEND_NEW + || (init_opline->opcode == ZEND_INIT_METHOD_CALL + && init_opline->op1_type != IS_UNDEF + && p->func && p->func->common.scope && !(p->func->common.fn_flags & ZEND_ACC_STATIC))) { + TRACE_FRAME_SET_ALWAYS_RELEASE_THIS(call); + } } frame->call = call; top = zend_jit_trace_call_frame(top, p->op_array); diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 230f309c2134f..34bb5ca6f1c92 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -11298,9 +11298,11 @@ static int zend_jit_leave_func(dasm_State **Dst, return 0; } } - | // if (call_info & ZEND_CALL_RELEASE_THIS) - | test FCARG1d, ZEND_CALL_RELEASE_THIS - | je >4 + if (!JIT_G(current_frame) || !TRACE_FRAME_ALWAYS_RELEASE_THIS(JIT_G(current_frame))) { + | // if (call_info & ZEND_CALL_RELEASE_THIS) + | test FCARG1d, ZEND_CALL_RELEASE_THIS + | je >4 + } | // zend_object *object = Z_OBJ(execute_data->This); | mov FCARG1a, EX->This.value.obj | // OBJ_RELEASE(object); From 1086b22608c112ce3b0e6893526f760eb9e0d1d3 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 25 Oct 2021 20:35:15 +0100 Subject: [PATCH 0201/1346] Use zend_result as return value for DBA handler --- ext/dba/php_dba.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index 07faf6979f341..d3f79794ea306 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -73,16 +73,16 @@ extern zend_module_entry dba_module_entry; typedef struct dba_handler { char *name; /* handler name */ int flags; /* whether and how dba does locking and other flags*/ - int (*open)(dba_info *, char **error); + zend_result (*open)(dba_info *, char **error); void (*close)(dba_info *); char* (*fetch)(dba_info *, char *, size_t, int, size_t *); - int (*update)(dba_info *, char *, size_t, char *, size_t, int); - int (*exists)(dba_info *, char *, size_t); - int (*delete)(dba_info *, char *, size_t); + zend_result (*update)(dba_info *, char *, size_t, char *, size_t, int); + zend_result (*exists)(dba_info *, char *, size_t); + zend_result (*delete)(dba_info *, char *, size_t); char* (*firstkey)(dba_info *, size_t *); char* (*nextkey)(dba_info *, size_t *); - int (*optimize)(dba_info *); - int (*sync)(dba_info *); + zend_result (*optimize)(dba_info *); + zend_result (*sync)(dba_info *); char* (*info)(struct dba_handler *hnd, dba_info *); /* dba_info==NULL: Handler info, dba_info!=NULL: Database info */ } dba_handler; @@ -90,25 +90,25 @@ typedef struct dba_handler { /* common prototypes which must be supplied by modules */ #define DBA_OPEN_FUNC(x) \ - int dba_open_##x(dba_info *info, char **error) + zend_result dba_open_##x(dba_info *info, char **error) #define DBA_CLOSE_FUNC(x) \ void dba_close_##x(dba_info *info) #define DBA_FETCH_FUNC(x) \ char *dba_fetch_##x(dba_info *info, char *key, size_t keylen, int skip, size_t *newlen) #define DBA_UPDATE_FUNC(x) \ - int dba_update_##x(dba_info *info, char *key, size_t keylen, char *val, size_t vallen, int mode) + zend_result dba_update_##x(dba_info *info, char *key, size_t keylen, char *val, size_t vallen, int mode) #define DBA_EXISTS_FUNC(x) \ - int dba_exists_##x(dba_info *info, char *key, size_t keylen) + zend_result dba_exists_##x(dba_info *info, char *key, size_t keylen) #define DBA_DELETE_FUNC(x) \ - int dba_delete_##x(dba_info *info, char *key, size_t keylen) + zend_result dba_delete_##x(dba_info *info, char *key, size_t keylen) #define DBA_FIRSTKEY_FUNC(x) \ char *dba_firstkey_##x(dba_info *info, size_t *newlen) #define DBA_NEXTKEY_FUNC(x) \ char *dba_nextkey_##x(dba_info *info, size_t *newlen) #define DBA_OPTIMIZE_FUNC(x) \ - int dba_optimize_##x(dba_info *info) + zend_result dba_optimize_##x(dba_info *info) #define DBA_SYNC_FUNC(x) \ - int dba_sync_##x(dba_info *info) + zend_result dba_sync_##x(dba_info *info) #define DBA_INFO_FUNC(x) \ char *dba_info_##x(dba_handler *hnd, dba_info *info) From 927cdd0a390a6e9510bf7a8d5cc089d292d2d8e3 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 25 Oct 2021 21:26:03 +0100 Subject: [PATCH 0202/1346] Inline "helper" macros They just make refactoring harder --- ext/dba/dba_db1.c | 37 +++++++++++++++--------- ext/dba/dba_db2.c | 42 +++++++++++++++------------ ext/dba/dba_db3.c | 42 +++++++++++++++------------ ext/dba/dba_db4.c | 46 ++++++++++++++++++------------ ext/dba/dba_dbm.c | 25 +++++++++++------ ext/dba/dba_flatfile.c | 34 +++++++++++++--------- ext/dba/dba_gdbm.c | 40 +++++++++++++++----------- ext/dba/dba_inifile.c | 64 +++++++++++++++++++++++------------------- ext/dba/dba_ndbm.c | 20 +++++++++---- ext/dba/dba_qdbm.c | 20 ++++++------- ext/dba/dba_tcadb.c | 20 ++++++------- 11 files changed, 226 insertions(+), 164 deletions(-) diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 202c05abbb5bd..94ba4f49ead2d 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -31,9 +31,6 @@ #include #include -#define DB1_DATA dba_db1_data *dba = info->dbf -#define DB1_GKEY DBT gkey; gkey.data = (char *) key; gkey.size = keylen - typedef struct { DB *dbp; } dba_db1_data; @@ -84,16 +81,19 @@ DBA_OPEN_FUNC(db1) DBA_CLOSE_FUNC(db1) { - DB1_DATA; + dba_db1_data *dba = info->dbf; dba->dbp->close(dba->dbp); pefree(info->dbf, info->flags&DBA_PERSISTENT); } DBA_FETCH_FUNC(db1) { + dba_db1_data *dba = info->dbf; DBT gval; - DB1_DATA; - DB1_GKEY; + DBT gkey; + + gkey.data = (char *) key; + gkey.size = keylen; memset(&gval, 0, sizeof(gval)); if (dba->dbp->get(dba->dbp, &gkey, &gval, 0) == RET_SUCCESS) { @@ -105,9 +105,12 @@ DBA_FETCH_FUNC(db1) DBA_UPDATE_FUNC(db1) { + dba_db1_data *dba = info->dbf; DBT gval; - DB1_DATA; - DB1_GKEY; + DBT gkey; + + gkey.data = (char *) key; + gkey.size = keylen; gval.data = (char *) val; gval.size = vallen; @@ -117,26 +120,32 @@ DBA_UPDATE_FUNC(db1) DBA_EXISTS_FUNC(db1) { + dba_db1_data *dba = info->dbf; DBT gval; - DB1_DATA; - DB1_GKEY; + DBT gkey; + + gkey.data = (char *) key; + gkey.size = keylen; return dba->dbp->get(dba->dbp, &gkey, &gval, 0) != RET_SUCCESS ? FAILURE : SUCCESS; } DBA_DELETE_FUNC(db1) { - DB1_DATA; - DB1_GKEY; + dba_db1_data *dba = info->dbf; + DBT gkey; + + gkey.data = (char *) key; + gkey.size = keylen; return dba->dbp->del(dba->dbp, &gkey, 0) != RET_SUCCESS ? FAILURE : SUCCESS; } DBA_FIRSTKEY_FUNC(db1) { + dba_db1_data *dba = info->dbf; DBT gkey; DBT gval; - DB1_DATA; memset(&gkey, 0, sizeof(gkey)); memset(&gval, 0, sizeof(gval)); @@ -150,9 +159,9 @@ DBA_FIRSTKEY_FUNC(db1) DBA_NEXTKEY_FUNC(db1) { + dba_db1_data *dba = info->dbf; DBT gkey; DBT gval; - DB1_DATA; memset(&gkey, 0, sizeof(gkey)); memset(&gval, 0, sizeof(gval)); diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index 2c1cb43b0cf18..87ef98caabdec 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -29,12 +29,6 @@ #include DB2_INCLUDE_FILE #endif -#define DB2_DATA dba_db2_data *dba = info->dbf -#define DB2_GKEY \ - DBT gkey = {0}; \ - gkey.data = (char *) key; \ - gkey.size = keylen - typedef struct { DB *dbp; DBC *cursor; @@ -83,7 +77,7 @@ DBA_OPEN_FUNC(db2) DBA_CLOSE_FUNC(db2) { - DB2_DATA; + dba_db2_data *dba = info->dbf; if (dba->cursor) dba->cursor->c_close(dba->cursor); @@ -93,9 +87,12 @@ DBA_CLOSE_FUNC(db2) DBA_FETCH_FUNC(db2) { + dba_db2_data *dba = info->dbf; DBT gval = {0}; - DB2_DATA; - DB2_GKEY; + DBT gkey = {0}; + + gkey.data = (char *) key; + gkey.size = keylen; if (dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { return NULL; @@ -107,9 +104,12 @@ DBA_FETCH_FUNC(db2) DBA_UPDATE_FUNC(db2) { + dba_db2_data *dba = info->dbf; DBT gval = {0}; - DB2_DATA; - DB2_GKEY; + DBT gkey = {0}; + + gkey.data = (char *) key; + gkey.size = keylen; gval.data = (char *) val; gval.size = vallen; @@ -123,9 +123,12 @@ DBA_UPDATE_FUNC(db2) DBA_EXISTS_FUNC(db2) { + dba_db2_data *dba = info->dbf; DBT gval = {0}; - DB2_DATA; - DB2_GKEY; + DBT gkey = {0}; + + gkey.data = (char *) key; + gkey.size = keylen; if (dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { return FAILURE; @@ -135,15 +138,18 @@ DBA_EXISTS_FUNC(db2) DBA_DELETE_FUNC(db2) { - DB2_DATA; - DB2_GKEY; + dba_db2_data *dba = info->dbf; + DBT gkey = {0}; + + gkey.data = (char *) key; + gkey.size = keylen; return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS; } DBA_FIRSTKEY_FUNC(db2) { - DB2_DATA; + dba_db2_data *dba = info->dbf; if (dba->cursor) { dba->cursor->c_close(dba->cursor); @@ -164,7 +170,7 @@ DBA_FIRSTKEY_FUNC(db2) DBA_NEXTKEY_FUNC(db2) { - DB2_DATA; + dba_db2_data *dba = info->dbf; DBT gkey = {0}, gval = {0}; if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) @@ -182,7 +188,7 @@ DBA_OPTIMIZE_FUNC(db2) DBA_SYNC_FUNC(db2) { - DB2_DATA; + dba_db2_data *dba = info->dbf; return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 2f05901be3a9c..5d7538d13bf8e 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -41,12 +41,6 @@ static void php_dba_db3_errcall_fcn( php_error_docref(NULL, E_NOTICE, "%s%s", errpfx?errpfx:"", msg); } -#define DB3_DATA dba_db3_data *dba = info->dbf -#define DB3_GKEY \ - DBT gkey; \ - memset(&gkey, 0, sizeof(gkey)); \ - gkey.data = (char *) key; gkey.size = keylen - typedef struct { DB *dbp; DBC *cursor; @@ -116,7 +110,7 @@ DBA_OPEN_FUNC(db3) DBA_CLOSE_FUNC(db3) { - DB3_DATA; + dba_db3_data *dba = info->dbf; if (dba->cursor) dba->cursor->c_close(dba->cursor); dba->dbp->close(dba->dbp, 0); @@ -125,10 +119,13 @@ DBA_CLOSE_FUNC(db3) DBA_FETCH_FUNC(db3) { + dba_db3_data *dba = info->dbf; DBT gval; char *new = NULL; - DB3_DATA; - DB3_GKEY; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; gkey.size = keylen; memset(&gval, 0, sizeof(gval)); if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { @@ -140,9 +137,12 @@ DBA_FETCH_FUNC(db3) DBA_UPDATE_FUNC(db3) { + dba_db3_data *dba = info->dbf; DBT gval; - DB3_DATA; - DB3_GKEY; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; gkey.size = keylen; memset(&gval, 0, sizeof(gval)); gval.data = (char *) val; @@ -157,9 +157,12 @@ DBA_UPDATE_FUNC(db3) DBA_EXISTS_FUNC(db3) { + dba_db3_data *dba = info->dbf; DBT gval; - DB3_DATA; - DB3_GKEY; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; gkey.size = keylen; memset(&gval, 0, sizeof(gval)); if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { @@ -170,15 +173,18 @@ DBA_EXISTS_FUNC(db3) DBA_DELETE_FUNC(db3) { - DB3_DATA; - DB3_GKEY; + dba_db3_data *dba = info->dbf; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; gkey.size = keylen; return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS; } DBA_FIRSTKEY_FUNC(db3) { - DB3_DATA; + dba_db3_data *dba = info->dbf; if (dba->cursor) { dba->cursor->c_close(dba->cursor); @@ -195,7 +201,7 @@ DBA_FIRSTKEY_FUNC(db3) DBA_NEXTKEY_FUNC(db3) { - DB3_DATA; + dba_db3_data *dba = info->dbf; DBT gkey, gval; char *nkey = NULL; @@ -219,7 +225,7 @@ DBA_OPTIMIZE_FUNC(db3) DBA_SYNC_FUNC(db3) { - DB3_DATA; + dba_db3_data *dba = info->dbf; return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index 93dd36d5be327..da9e6236dab20 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -55,12 +55,6 @@ static void php_dba_db4_errcall_fcn( php_error_docref(NULL, E_NOTICE, "%s%s", errpfx?errpfx:"", msg); } -#define DB4_DATA dba_db4_data *dba = info->dbf -#define DB4_GKEY \ - DBT gkey; \ - memset(&gkey, 0, sizeof(gkey)); \ - gkey.data = (char *) key; gkey.size = keylen - typedef struct { DB *dbp; DBC *cursor; @@ -145,7 +139,7 @@ DBA_OPEN_FUNC(db4) DBA_CLOSE_FUNC(db4) { - DB4_DATA; + dba_db4_data *dba = info->dbf; if (dba->cursor) dba->cursor->c_close(dba->cursor); dba->dbp->close(dba->dbp, 0); @@ -154,10 +148,14 @@ DBA_CLOSE_FUNC(db4) DBA_FETCH_FUNC(db4) { + dba_db4_data *dba = info->dbf; DBT gval; char *new = NULL; - DB4_DATA; - DB4_GKEY; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; + gkey.size = keylen; memset(&gval, 0, sizeof(gval)); if (info->flags & DBA_PERSISTENT) { @@ -175,9 +173,13 @@ DBA_FETCH_FUNC(db4) DBA_UPDATE_FUNC(db4) { + dba_db4_data *dba = info->dbf; DBT gval; - DB4_DATA; - DB4_GKEY; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; + gkey.size = keylen; memset(&gval, 0, sizeof(gval)); gval.data = (char *) val; @@ -192,9 +194,13 @@ DBA_UPDATE_FUNC(db4) DBA_EXISTS_FUNC(db4) { + dba_db4_data *dba = info->dbf; DBT gval; - DB4_DATA; - DB4_GKEY; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; + gkey.size = keylen; memset(&gval, 0, sizeof(gval)); @@ -213,15 +219,19 @@ DBA_EXISTS_FUNC(db4) DBA_DELETE_FUNC(db4) { - DB4_DATA; - DB4_GKEY; + dba_db4_data *dba = info->dbf; + DBT gkey; + + memset(&gkey, 0, sizeof(gkey)); + gkey.data = (char *) key; + gkey.size = keylen; return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS; } DBA_FIRSTKEY_FUNC(db4) { - DB4_DATA; + dba_db4_data *dba = info->dbf; if (dba->cursor) { dba->cursor->c_close(dba->cursor); @@ -238,7 +248,7 @@ DBA_FIRSTKEY_FUNC(db4) DBA_NEXTKEY_FUNC(db4) { - DB4_DATA; + dba_db4_data *dba = info->dbf; DBT gkey, gval; char *nkey = NULL; @@ -274,7 +284,7 @@ DBA_OPTIMIZE_FUNC(db4) DBA_SYNC_FUNC(db4) { - DB4_DATA; + dba_db4_data *dba = info->dbf; return dba->dbp->sync(dba->dbp, 0) ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 3412124cf9580..65512b75ef4d0 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -35,9 +35,6 @@ #include #include -#define DBM_DATA dba_dbm_data *dba = info->dbf -#define DBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen - #define TRUNC_IT(extension, mode) \ snprintf(buf, MAXPATHLEN, "%s" extension, info->path); \ buf[MAXPATHLEN-1] = '\0'; \ @@ -93,8 +90,10 @@ DBA_FETCH_FUNC(dbm) { datum gval; char *new = NULL; + datum gkey; - DBM_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = fetch(gkey); if(gval.dptr) { if(newlen) *newlen = gval.dsize; @@ -106,8 +105,10 @@ DBA_FETCH_FUNC(dbm) DBA_UPDATE_FUNC(dbm) { datum gval; + datum gkey; - DBM_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; if (mode == 1) { /* insert */ gval = fetch(gkey); @@ -125,7 +126,10 @@ DBA_UPDATE_FUNC(dbm) DBA_EXISTS_FUNC(dbm) { datum gval; - DBM_GKEY; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = fetch(gkey); if(gval.dptr) { @@ -136,13 +140,16 @@ DBA_EXISTS_FUNC(dbm) DBA_DELETE_FUNC(dbm) { - DBM_GKEY; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; return(delete(gkey) == -1 ? FAILURE : SUCCESS); } DBA_FIRSTKEY_FUNC(dbm) { - DBM_DATA; + dba_dbm_data *dba = info->dbf; datum gkey; char *key = NULL; @@ -158,7 +165,7 @@ DBA_FIRSTKEY_FUNC(dbm) DBA_NEXTKEY_FUNC(dbm) { - DBM_DATA; + dba_dbm_data *dba = info->dbf; datum gkey; char *nkey = NULL; diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index 246ba68c4b1e1..b9d43958ce0ba 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -32,9 +32,6 @@ #include #include -#define FLATFILE_DATA flatfile *dba = info->dbf -#define FLATFILE_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen - DBA_OPEN_FUNC(flatfile) { info->dbf = pemalloc(sizeof(flatfile), info->flags&DBA_PERSISTENT); @@ -47,7 +44,7 @@ DBA_OPEN_FUNC(flatfile) DBA_CLOSE_FUNC(flatfile) { - FLATFILE_DATA; + flatfile *dba = info->dbf; if (dba->nextkey.dptr) { efree(dba->nextkey.dptr); @@ -57,11 +54,13 @@ DBA_CLOSE_FUNC(flatfile) DBA_FETCH_FUNC(flatfile) { + flatfile *dba = info->dbf; datum gval; char *new = NULL; + datum gkey; - FLATFILE_DATA; - FLATFILE_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = flatfile_fetch(dba, gkey); if (gval.dptr) { @@ -76,10 +75,12 @@ DBA_FETCH_FUNC(flatfile) DBA_UPDATE_FUNC(flatfile) { + flatfile *dba = info->dbf; datum gval; + datum gkey; - FLATFILE_DATA; - FLATFILE_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval.dptr = (char *) val; gval.dsize = vallen; @@ -99,10 +100,12 @@ DBA_UPDATE_FUNC(flatfile) DBA_EXISTS_FUNC(flatfile) { + flatfile *dba = info->dbf; datum gval; - FLATFILE_DATA; - FLATFILE_GKEY; + datum gkey; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = flatfile_fetch(dba, gkey); if (gval.dptr) { efree(gval.dptr); @@ -113,14 +116,17 @@ DBA_EXISTS_FUNC(flatfile) DBA_DELETE_FUNC(flatfile) { - FLATFILE_DATA; - FLATFILE_GKEY; + flatfile *dba = info->dbf; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; return(flatfile_delete(dba, gkey) == -1 ? FAILURE : SUCCESS); } DBA_FIRSTKEY_FUNC(flatfile) { - FLATFILE_DATA; + flatfile *dba = info->dbf; if (dba->nextkey.dptr) { efree(dba->nextkey.dptr); @@ -137,7 +143,7 @@ DBA_FIRSTKEY_FUNC(flatfile) DBA_NEXTKEY_FUNC(flatfile) { - FLATFILE_DATA; + flatfile *dba = info->dbf; if (!dba->nextkey.dptr) { return NULL; diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index 2f98b8a97dc97..aa7e889967aba 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -27,9 +27,6 @@ #include GDBM_INCLUDE_FILE #endif -#define GDBM_DATA dba_gdbm_data *dba = info->dbf -#define GDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen - typedef struct { GDBM_FILE dbf; datum nextkey; @@ -67,7 +64,7 @@ DBA_OPEN_FUNC(gdbm) DBA_CLOSE_FUNC(gdbm) { - GDBM_DATA; + dba_gdbm_data *dba = info->dbf; if(dba->nextkey.dptr) free(dba->nextkey.dptr); gdbm_close(dba->dbf); @@ -76,11 +73,13 @@ DBA_CLOSE_FUNC(gdbm) DBA_FETCH_FUNC(gdbm) { - GDBM_DATA; + dba_gdbm_data *dba = info->dbf; datum gval; char *new = NULL; + datum gkey; - GDBM_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = gdbm_fetch(dba->dbf, gkey); if(gval.dptr) { if(newlen) *newlen = gval.dsize; @@ -92,10 +91,12 @@ DBA_FETCH_FUNC(gdbm) DBA_UPDATE_FUNC(gdbm) { + dba_gdbm_data *dba = info->dbf; datum gval; - GDBM_DATA; + datum gkey; - GDBM_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval.dptr = (char *) val; gval.dsize = vallen; @@ -115,23 +116,29 @@ DBA_UPDATE_FUNC(gdbm) DBA_EXISTS_FUNC(gdbm) { - GDBM_DATA; - GDBM_GKEY; + dba_gdbm_data *dba = info->dbf; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; return gdbm_exists(dba->dbf, gkey) ? SUCCESS : FAILURE; } DBA_DELETE_FUNC(gdbm) { - GDBM_DATA; - GDBM_GKEY; + dba_gdbm_data *dba = info->dbf; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; return gdbm_delete(dba->dbf, gkey) == -1 ? FAILURE : SUCCESS; } DBA_FIRSTKEY_FUNC(gdbm) { - GDBM_DATA; + dba_gdbm_data *dba = info->dbf; datum gkey; char *key = NULL; @@ -152,7 +159,7 @@ DBA_FIRSTKEY_FUNC(gdbm) DBA_NEXTKEY_FUNC(gdbm) { - GDBM_DATA; + dba_gdbm_data *dba = info->dbf; char *nkey = NULL; datum gkey; @@ -172,14 +179,15 @@ DBA_NEXTKEY_FUNC(gdbm) DBA_OPTIMIZE_FUNC(gdbm) { - GDBM_DATA; + dba_gdbm_data *dba = info->dbf; + gdbm_reorganize(dba->dbf); return SUCCESS; } DBA_SYNC_FUNC(gdbm) { - GDBM_DATA; + dba_gdbm_data *dba = info->dbf; gdbm_sync(dba->dbf); return SUCCESS; diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index 3d2f4c453e0e7..6f2bada077a10 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -32,20 +32,6 @@ #include #include -#define INIFILE_DATA \ - inifile *dba = info->dbf - -#define INIFILE_GKEY \ - key_type ini_key; \ - if (!key) { \ - php_error_docref(NULL, E_WARNING, "No key specified"); \ - return 0; \ - } \ - ini_key = inifile_key_split((char*)key) /* keylen not needed here */ - -#define INIFILE_DONE \ - inifile_key_free(&ini_key) - DBA_OPEN_FUNC(inifile) { info->dbf = inifile_alloc(info->fp, info->mode == DBA_READER, info->flags&DBA_PERSISTENT); @@ -55,31 +41,41 @@ DBA_OPEN_FUNC(inifile) DBA_CLOSE_FUNC(inifile) { - INIFILE_DATA; + inifile *dba = info->dbf; inifile_free(dba, info->flags&DBA_PERSISTENT); } DBA_FETCH_FUNC(inifile) { + inifile *dba = info->dbf; val_type ini_val; + key_type ini_key; - INIFILE_DATA; - INIFILE_GKEY; + if (!key) { + php_error_docref(NULL, E_WARNING, "No key specified"); + return 0; + } + ini_key = inifile_key_split((char*)key); /* keylen not needed here */ ini_val = inifile_fetch(dba, &ini_key, skip); *newlen = ini_val.value ? strlen(ini_val.value) : 0; - INIFILE_DONE; + inifile_key_free(&ini_key); return ini_val.value; } DBA_UPDATE_FUNC(inifile) { + inifile *dba = info->dbf; val_type ini_val; int res; + key_type ini_key; - INIFILE_DATA; - INIFILE_GKEY; + if (!key) { + php_error_docref(NULL, E_WARNING, "No key specified"); + return 0; + } + ini_key = inifile_key_split((char*)key); /* keylen not needed here */ ini_val.value = val; @@ -88,7 +84,7 @@ DBA_UPDATE_FUNC(inifile) } else { res = inifile_replace(dba, &ini_key, &ini_val); } - INIFILE_DONE; + inifile_key_free(&ini_key); switch(res) { case -1: php_error_docref1(NULL, key, E_WARNING, "Operation not possible"); @@ -103,13 +99,18 @@ DBA_UPDATE_FUNC(inifile) DBA_EXISTS_FUNC(inifile) { + inifile *dba = info->dbf; val_type ini_val; + key_type ini_key; - INIFILE_DATA; - INIFILE_GKEY; + if (!key) { + php_error_docref(NULL, E_WARNING, "No key specified"); + return 0; + } + ini_key = inifile_key_split((char*)key); /* keylen not needed here */ ini_val = inifile_fetch(dba, &ini_key, 0); - INIFILE_DONE; + inifile_key_free(&ini_key); if (ini_val.value) { inifile_val_free(&ini_val); return SUCCESS; @@ -119,21 +120,26 @@ DBA_EXISTS_FUNC(inifile) DBA_DELETE_FUNC(inifile) { + inifile *dba = info->dbf; int res; bool found = 0; + key_type ini_key; - INIFILE_DATA; - INIFILE_GKEY; + if (!key) { + php_error_docref(NULL, E_WARNING, "No key specified"); + return 0; + } + ini_key = inifile_key_split((char*)key); /* keylen not needed here */ res = inifile_delete_ex(dba, &ini_key, &found); - INIFILE_DONE; + inifile_key_free(&ini_key); return (res == -1 || !found ? FAILURE : SUCCESS); } DBA_FIRSTKEY_FUNC(inifile) { - INIFILE_DATA; + inifile *dba = info->dbf; if (inifile_firstkey(dba)) { char *result = inifile_key_string(&dba->curr.key); @@ -146,7 +152,7 @@ DBA_FIRSTKEY_FUNC(inifile) DBA_NEXTKEY_FUNC(inifile) { - INIFILE_DATA; + inifile *dba = info->dbf; if (!dba->curr.key.group && !dba->curr.key.name) { return NULL; diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index 20914b296995f..3fd5d20db192a 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -28,8 +28,6 @@ #include NDBM_INCLUDE_FILE #endif -#define NDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen - DBA_OPEN_FUNC(ndbm) { DBM *dbf; @@ -73,8 +71,10 @@ DBA_FETCH_FUNC(ndbm) { datum gval; char *new = NULL; + datum gkey; - NDBM_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = dbm_fetch(info->dbf, gkey); if(gval.dptr) { if(newlen) *newlen = gval.dsize; @@ -86,8 +86,10 @@ DBA_FETCH_FUNC(ndbm) DBA_UPDATE_FUNC(ndbm) { datum gval; + datum gkey; - NDBM_GKEY; + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval.dptr = (char *) val; gval.dsize = vallen; @@ -99,7 +101,10 @@ DBA_UPDATE_FUNC(ndbm) DBA_EXISTS_FUNC(ndbm) { datum gval; - NDBM_GKEY; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; gval = dbm_fetch(info->dbf, gkey); if(gval.dptr) { return SUCCESS; @@ -109,7 +114,10 @@ DBA_EXISTS_FUNC(ndbm) DBA_DELETE_FUNC(ndbm) { - NDBM_GKEY; + datum gkey; + + gkey.dptr = (char *) key; + gkey.dsize = keylen; return(dbm_delete(info->dbf, gkey) == -1 ? FAILURE : SUCCESS); } diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index d18108b3a8ea6..7a78662b65f36 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -27,8 +27,6 @@ #include QDBM_INCLUDE_FILE #endif -#define QDBM_DATA dba_qdbm_data *dba = info->dbf - typedef struct { DEPOT *dbf; } dba_qdbm_data; @@ -67,7 +65,7 @@ DBA_OPEN_FUNC(qdbm) DBA_CLOSE_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; dpclose(dba->dbf); pefree(dba, info->flags & DBA_PERSISTENT); @@ -75,7 +73,7 @@ DBA_CLOSE_FUNC(qdbm) DBA_FETCH_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; char *value, *new = NULL; int value_size; @@ -91,7 +89,7 @@ DBA_FETCH_FUNC(qdbm) DBA_UPDATE_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; if (dpput(dba->dbf, key, keylen, val, vallen, mode == 1 ? DP_DKEEP : DP_DOVER)) { return SUCCESS; @@ -106,7 +104,7 @@ DBA_UPDATE_FUNC(qdbm) DBA_EXISTS_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; char *value; value = dpget(dba->dbf, key, keylen, 0, -1, NULL); @@ -120,14 +118,14 @@ DBA_EXISTS_FUNC(qdbm) DBA_DELETE_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; return dpout(dba->dbf, key, keylen) ? SUCCESS : FAILURE; } DBA_FIRSTKEY_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; int value_size; char *value, *new = NULL; @@ -145,7 +143,7 @@ DBA_FIRSTKEY_FUNC(qdbm) DBA_NEXTKEY_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; int value_size; char *value, *new = NULL; @@ -161,7 +159,7 @@ DBA_NEXTKEY_FUNC(qdbm) DBA_OPTIMIZE_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; dpoptimize(dba->dbf, 0); return SUCCESS; @@ -169,7 +167,7 @@ DBA_OPTIMIZE_FUNC(qdbm) DBA_SYNC_FUNC(qdbm) { - QDBM_DATA; + dba_qdbm_data *dba = info->dbf; dpsync(dba->dbf); return SUCCESS; diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index f1432c988d82c..abdfdee3f9218 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -27,8 +27,6 @@ #include TCADB_INCLUDE_FILE #endif -#define TCADB_DATA dba_tcadb_data *dba = info->dbf - typedef struct { TCADB *tcadb; } dba_tcadb_data; @@ -76,7 +74,7 @@ DBA_OPEN_FUNC(tcadb) DBA_CLOSE_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; tcadbclose(dba->tcadb); pefree(dba, info->flags & DBA_PERSISTENT); @@ -84,7 +82,7 @@ DBA_CLOSE_FUNC(tcadb) DBA_FETCH_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; char *value, *new = NULL; int value_size; @@ -102,7 +100,7 @@ DBA_FETCH_FUNC(tcadb) DBA_UPDATE_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; int result; if (mode == 1) { @@ -124,7 +122,7 @@ DBA_UPDATE_FUNC(tcadb) DBA_EXISTS_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; char *value; int value_len; @@ -139,14 +137,14 @@ DBA_EXISTS_FUNC(tcadb) DBA_DELETE_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; return tcadbout(dba->tcadb, key, keylen) ? SUCCESS : FAILURE; } DBA_FIRSTKEY_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; int value_size; char *value, *new = NULL; @@ -166,7 +164,7 @@ DBA_FIRSTKEY_FUNC(tcadb) DBA_NEXTKEY_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; int value_size; char *value, *new = NULL; @@ -184,7 +182,7 @@ DBA_NEXTKEY_FUNC(tcadb) DBA_OPTIMIZE_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; #if _TC_LIBVER >= 811 return tcadboptimize(dba->tcadb, NULL) ? SUCCESS : FAILURE; @@ -195,7 +193,7 @@ DBA_OPTIMIZE_FUNC(tcadb) DBA_SYNC_FUNC(tcadb) { - TCADB_DATA; + dba_tcadb_data *dba = info->dbf; return tcadbsync(dba->tcadb) ? SUCCESS : FAILURE; } From 1e0fb14d81428425a9d2a7a838cc8fa5feb4b8b3 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 26 Oct 2021 10:42:03 +0300 Subject: [PATCH 0203/1346] JIT: Fixed use after free introduced in 92ad90af2348d275f5efd29b4641d3ad3bfab416 --- ext/opcache/jit/zend_jit_trace.c | 1 + ext/opcache/jit/zend_jit_x86.dasc | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 7faa7dbb817ad..35c702300adb5 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6514,6 +6514,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } else if (init_opline->opcode == ZEND_NEW || (init_opline->opcode == ZEND_INIT_METHOD_CALL && init_opline->op1_type != IS_UNDEF + && !(p->info & ZEND_JIT_TRACE_FAKE_INIT_CALL) && p->func && p->func->common.scope && !(p->func->common.fn_flags & ZEND_ACC_STATIC))) { TRACE_FRAME_SET_ALWAYS_RELEASE_THIS(call); } diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 34bb5ca6f1c92..7268a1a8ad7b0 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -11302,6 +11302,11 @@ static int zend_jit_leave_func(dasm_State **Dst, | // if (call_info & ZEND_CALL_RELEASE_THIS) | test FCARG1d, ZEND_CALL_RELEASE_THIS | je >4 + } else { + | test FCARG1d, ZEND_CALL_RELEASE_THIS + | jne >1 + | int3 + |1: } | // zend_object *object = Z_OBJ(execute_data->This); | mov FCARG1a, EX->This.value.obj From d2920df1de87e98381220af97636ac844d021540 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 26 Oct 2021 10:55:58 +0300 Subject: [PATCH 0204/1346] Removed debug code. --- ext/opcache/jit/zend_jit_x86.dasc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 7268a1a8ad7b0..34bb5ca6f1c92 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -11302,11 +11302,6 @@ static int zend_jit_leave_func(dasm_State **Dst, | // if (call_info & ZEND_CALL_RELEASE_THIS) | test FCARG1d, ZEND_CALL_RELEASE_THIS | je >4 - } else { - | test FCARG1d, ZEND_CALL_RELEASE_THIS - | jne >1 - | int3 - |1: } | // zend_object *object = Z_OBJ(execute_data->This); | mov FCARG1a, EX->This.value.obj From 5e7e654514636f3cf9a07938825f83fb13317535 Mon Sep 17 00:00:00 2001 From: Sergey Panteleev Date: Wed, 27 Oct 2021 14:02:10 +0300 Subject: [PATCH 0205/1346] Fix a method name `ZipArchive::clearError` typo Closes GH-7616. --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index 2faa7b2f1a59a..93814c892de68 100644 --- a/UPGRADING +++ b/UPGRADING @@ -85,7 +85,7 @@ PHP 8.2 UPGRADE NOTES - Zip: . extension updated to 1.20.0 with new methods: - ZipArchive::cleaError, getStreamName and getStreamIndex + ZipArchive::clearError, getStreamName and getStreamIndex ======================================== 10. New Global Constants From 9308974f8cc6c1046f228be5320fe067913ba987 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Mon, 18 Oct 2021 20:56:34 +0200 Subject: [PATCH 0206/1346] Deprecate use of mbstring to convert text to Base64/QPrint/HTML entities/etc The purpose of mbstring is for working with Unicode and legacy text encodings; but Base64, QPrint, etc. are not text encodings and don't really belong in mbstring. PHP already contains separate implementations of Base64, QPrint, and HTML entities. It will be better to eventually remove these non-encodings from mbstring. Regarding HTML entities... there is a bit more to say. mbstring's implementation of HTML entities is different from the other built-in implementation (htmlspecialchars and htmlentities). Those functions convert <, >, and & to HTML entities, but mbstring does not. It appears that the original author of mbstring intended for something to be done with <, >, and &. He used a table to identify which characters should be converted to HTML entities, and /& all have a special value in that table. However, nothing ever checks for that special value, so the characters are passed through unconverted. This seems like a very useless implementation of HTML entities. The most important characters which need to be expressed as entities in HTML documents are those three! --- UPGRADING | 10 ++++++ ext/mbstring/mbstring.c | 12 ++++++++ ext/mbstring/tests/bug45722.phpt | 3 +- ext/mbstring/tests/bug71606.phpt | 3 +- ext/mbstring/tests/mb_convert_encoding.phpt | 32 ++++++++++++++------ ext/mbstring/tests/mb_strlen_variation3.phpt | 6 +++- 6 files changed, 54 insertions(+), 12 deletions(-) diff --git a/UPGRADING b/UPGRADING index 93814c892de68..1bbdfbd67d84c 100644 --- a/UPGRADING +++ b/UPGRADING @@ -55,6 +55,16 @@ PHP 8.2 UPGRADE NOTES RFC: https://wiki.php.net/rfc/deprecate_partially_supported_callables +- Mbstring: + . Use of QPrint, Base64, Uuencode, and HTML-ENTITIES 'text encodings' is + deprecated for all Mbstring functions. Unlike all the other text + encodings supported by Mbstring, these do not encode a sequence of + Unicode codepoints, but rather a sequence of raw bytes. It is not + clear what the correct return values for most Mbstring functions should + be when one of these non-encodings is specified. Further, PHP has + separate, built-in implementations of all of them; for example, UUencoded + data can be handled using convert_uuencode/convert_uudecode. + ======================================== 5. Changed Functions ======================================== diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index a7dfcbe7d4c82..e463e692bf062 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -36,6 +36,8 @@ #include "libmbfl/mbfl/mbfilter_wchar.h" #include "libmbfl/filters/mbfilter_base64.h" #include "libmbfl/filters/mbfilter_qprint.h" +#include "libmbfl/filters/mbfilter_htmlent.h" +#include "libmbfl/filters/mbfilter_uuencode.h" #include "libmbfl/filters/mbfilter_ucs4.h" #include "libmbfl/filters/mbfilter_utf8.h" #include "libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.h" @@ -216,6 +218,16 @@ static const mbfl_encoding *php_mb_get_encoding(zend_string *encoding_name, uint if (!encoding) { zend_argument_value_error(arg_num, "must be a valid encoding, \"%s\" given", ZSTR_VAL(encoding_name)); return NULL; + } else if (encoding->no_encoding <= mbfl_no_encoding_qprint) { + if (encoding == &mbfl_encoding_base64) { + php_error_docref(NULL, E_DEPRECATED, "Handling Base64 via mbstring is deprecated; use base64_encode/base64_decode instead"); + } else if (encoding == &mbfl_encoding_qprint) { + php_error_docref(NULL, E_DEPRECATED, "Handling QPrint via mbstring is deprecated; use quoted_printable_encode/quoted_printable_decode instead"); + } else if (encoding == &mbfl_encoding_html_ent) { + php_error_docref(NULL, E_DEPRECATED, "Handling HTML entities via mbstring is deprecated; use htmlspecialchars, htmlentities, or mb_encode_numericentity/mb_decode_numericentity instead"); + } else if (encoding == &mbfl_encoding_uuencode) { + php_error_docref(NULL, E_DEPRECATED, "Handling Uuencode via mbstring is deprecated; use convert_uuencode/convert_uudecode instead"); + } } if (last_encoding_name) { diff --git a/ext/mbstring/tests/bug45722.phpt b/ext/mbstring/tests/bug45722.phpt index 08d3a62778ab8..c656982c8fd89 100644 --- a/ext/mbstring/tests/bug45722.phpt +++ b/ext/mbstring/tests/bug45722.phpt @@ -6,5 +6,6 @@ mbstring ---EXPECT-- +--EXPECTF-- +Deprecated: mb_check_encoding(): Handling HTML entities via mbstring is deprecated; use htmlspecialchars, htmlentities, or mb_encode_numericentity/mb_decode_numericentity instead in %s on line %d bool(true) diff --git a/ext/mbstring/tests/bug71606.phpt b/ext/mbstring/tests/bug71606.phpt index ece8d5d2bd0b5..50d1261a65e1d 100644 --- a/ext/mbstring/tests/bug71606.phpt +++ b/ext/mbstring/tests/bug71606.phpt @@ -7,5 +7,6 @@ mbstring echo mb_strcut('"', 0, 0, 'HTML-ENTITIES'); echo 'DONE', PHP_EOL; ?> ---EXPECT-- +--EXPECTF-- +Deprecated: mb_strcut(): Handling HTML entities via mbstring is deprecated; use htmlspecialchars, htmlentities, or mb_encode_numericentity/mb_decode_numericentity instead in %s on line %d DONE diff --git a/ext/mbstring/tests/mb_convert_encoding.phpt b/ext/mbstring/tests/mb_convert_encoding.phpt index 257873f313079..33bc50b613c10 100644 --- a/ext/mbstring/tests/mb_convert_encoding.phpt +++ b/ext/mbstring/tests/mb_convert_encoding.phpt @@ -14,7 +14,7 @@ $sjis = base64_decode('k/qWe4zqg2WDTINYg2eCxYK3gUIwMTIzNIJUglWCVoJXgliBQg=='); // JIS string (BASE64 encoded) $jis = base64_decode('GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg=='); // EUC-JP string -$euc_jp = '���ܸ�ƥ����ȤǤ���01234������������'; +$euc_jp = "\xC6\xFC\xCB\xDC\xB8\xEC\xA5\xC6\xA5\xAD\xA5\xB9\xA5\xC8\xA4\xC7\xA4\xB9\xA1\xA301234\xA3\xB5\xA3\xB6\xA3\xB7\xA3\xB8\xA3\xB9\xA1\xA3"; // Test with single "form encoding" // Note: For some reason it complains, results are different. Not researched. @@ -85,8 +85,6 @@ $s = $euc_jp; $s = mb_convert_encoding($s, 'JIS', 'auto'); print("JIS: ".base64_encode($s)."\n"); // JIS - -// Invalid Parameters echo "== INVALID PARAMETER ==\n"; $s = mb_convert_encoding(1234, 'EUC-JP'); @@ -95,15 +93,22 @@ print("INT: $s\n"); $s = mb_convert_encoding('', 'EUC-JP'); print("EUC-JP: $s\n"); // SJIS -$s = $euc_jp; -try { - var_dump(mb_convert_encoding($s, 'BAD')); -} catch (\ValueError $e) { - echo $e->getMessage() . \PHP_EOL; +function tryBadConversion($str, $encoding) { + try { + var_dump(mb_convert_encoding($str, $encoding)); + } catch (ValueError $e) { + echo $e->getMessage(), "\n"; + } } +tryBadConversion($euc_jp, 'BAD'); + +tryBadConversion('abc', 'Quoted-Printable'); +tryBadConversion('abc', 'BASE64'); +tryBadConversion('abc', 'HTML-ENTITIES'); + ?> ---EXPECT-- +--EXPECTF-- == BASIC TEST == EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 EUC-JP: c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 @@ -125,3 +130,12 @@ JIS: GyRCRnxLXDhsJUYlLSU5JUgkRyQ5ISMbKEIwMTIzNBskQiM1IzYjNyM4IzkhIxsoQg== INT: 1234 EUC-JP: mb_convert_encoding(): Argument #2 ($to_encoding) must be a valid encoding, "BAD" given + +Deprecated: mb_convert_encoding(): Handling QPrint via mbstring is deprecated; use quoted_printable_encode/quoted_printable_decode instead in %s on line %d +string(3) "abc" + +Deprecated: mb_convert_encoding(): Handling Base64 via mbstring is deprecated; use base64_encode/base64_decode instead in %s on line %d +string(4) "YWJj" + +Deprecated: mb_convert_encoding(): Handling HTML entities via mbstring is deprecated; use htmlspecialchars, htmlentities, or mb_encode_numericentity/mb_decode_numericentity instead in %s on line %d +string(3) "abc" diff --git a/ext/mbstring/tests/mb_strlen_variation3.phpt b/ext/mbstring/tests/mb_strlen_variation3.phpt index c0fd3972e0984..585613808ad8b 100644 --- a/ext/mbstring/tests/mb_strlen_variation3.phpt +++ b/ext/mbstring/tests/mb_strlen_variation3.phpt @@ -96,7 +96,7 @@ foreach($encoding as $enc) { echo "Done"; ?> ---EXPECT-- +--EXPECTF-- *** Testing mb_strlen() : usage variations *** -- Iteration 1: UCS-4 -- @@ -335,12 +335,16 @@ Encoding byte4le recognised -- Iteration 40: BASE64 -- -- ASCII String -- + +Deprecated: mb_strlen(): Handling Base64 via mbstring is deprecated; use base64_encode/base64_decode instead in %s on line %d Encoding BASE64 recognised -- Multibyte String -- Encoding BASE64 recognised -- Iteration 41: HTML-ENTITIES -- -- ASCII String -- + +Deprecated: mb_strlen(): Handling HTML entities via mbstring is deprecated; use htmlspecialchars, htmlentities, or mb_encode_numericentity/mb_decode_numericentity instead in %s on line %d Encoding HTML-ENTITIES recognised -- Multibyte String -- Encoding HTML-ENTITIES recognised From 90b7bde61507cee1c6b37f153909d72f5b203b8c Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 3 Nov 2021 15:18:26 +0300 Subject: [PATCH 0207/1346] Use more compact representation for packed arrays. - for packed arrays we store just an array of zvals without keys. - the elements of packed array are accessible throuf as ht->arPacked[i] instead of ht->arData[i] - in addition to general ZEND_HASH_FOREACH_* macros, we introduced similar familied for packed (ZEND_HASH_PACKED_FORECH_*) and real hashes (ZEND_HASH_MAP_FOREACH_*) - introduced an additional family of macros to access elements of array (packed or real hashes) ZEND_ARRAY_ELEMET_SIZE, ZEND_ARRAY_ELEMET_EX, ZEND_ARRAY_ELEMET, ZEND_ARRAY_NEXT_ELEMENT, ZEND_ARRAY_PREV_ELEMENT - zend_hash_minmax() prototype was changed to compare only values Because of smaller data set, this patch may show performance improvement on some apps and benchmarks that use packed arrays. (~1% on PHP-Parser) TODO: - sapi/phpdbg needs special support for packed arrays (WATCH_ON_BUCKET). - zend_hash_sort_ex() may require converting packed arrays to hash. --- Zend/Optimizer/sccp.c | 2 +- Zend/Optimizer/zend_optimizer.c | 10 +- Zend/zend_API.c | 33 +- Zend/zend_attributes.c | 6 +- Zend/zend_builtin_functions.c | 24 +- Zend/zend_closures.c | 2 +- Zend/zend_compile.c | 10 +- Zend/zend_enum.c | 4 +- Zend/zend_execute_API.c | 20 +- Zend/zend_gc.c | 370 ++++++--- Zend/zend_generators.c | 52 +- Zend/zend_hash.c | 1004 +++++++++++++++++-------- Zend/zend_hash.h | 517 ++++++++++--- Zend/zend_inheritance.c | 40 +- Zend/zend_ini.c | 4 +- Zend/zend_list.c | 9 +- Zend/zend_objects.c | 2 +- Zend/zend_opcode.c | 14 +- Zend/zend_types.h | 32 +- Zend/zend_vm_def.h | 196 +++-- Zend/zend_vm_execute.h | 267 ++++--- Zend/zend_vm_trace_handlers.h | 2 +- Zend/zend_vm_trace_map.h | 2 +- Zend/zend_weakrefs.c | 12 +- ext/dom/node.c | 4 +- ext/dom/php_dom.c | 2 +- ext/ffi/ffi.c | 68 +- ext/gd/gd.c | 20 +- ext/hash/hash.c | 6 +- ext/imap/php_imap.c | 16 +- ext/mysqli/mysqli.c | 2 +- ext/mysqlnd/mysqlnd_debug.c | 2 +- ext/mysqlnd/mysqlnd_plugin.c | 2 +- ext/mysqlnd/mysqlnd_reverse_api.c | 2 +- ext/mysqlnd/mysqlnd_wireprotocol.c | 4 +- ext/mysqlnd/php_mysqlnd.c | 4 +- ext/opcache/ZendAccelerator.c | 88 +-- ext/opcache/jit/zend_jit.c | 14 +- ext/opcache/jit/zend_jit_arm64.dasc | 226 ++++-- ext/opcache/jit/zend_jit_disasm.c | 2 +- ext/opcache/jit/zend_jit_trace.c | 15 + ext/opcache/jit/zend_jit_x86.dasc | 230 ++++-- ext/opcache/zend_accelerator_module.c | 4 +- ext/opcache/zend_file_cache.c | 68 +- ext/opcache/zend_persist.c | 84 ++- ext/opcache/zend_persist_calc.c | 67 +- ext/pcre/php_pcre.c | 2 +- ext/pdo/pdo.c | 4 +- ext/pdo/pdo_dbh.c | 2 +- ext/phar/phar.c | 14 +- ext/phar/phar_object.c | 6 +- ext/phar/stream.c | 8 +- ext/phar/util.c | 4 +- ext/reflection/php_reflection.c | 60 +- ext/session/session.c | 7 +- ext/snmp/snmp.c | 42 +- ext/soap/php_encoding.c | 2 +- ext/soap/php_http.c | 4 +- ext/soap/php_schema.c | 6 +- ext/soap/php_sdl.c | 46 +- ext/soap/soap.c | 44 +- ext/sockets/sockets.c | 4 +- ext/spl/php_spl.c | 11 +- ext/spl/spl_directory.c | 13 +- ext/standard/array.c | 772 ++++++++++++------- ext/standard/basic_functions.c | 2 +- ext/standard/info.c | 32 +- ext/standard/password.c | 2 +- ext/standard/streamsfuncs.c | 16 +- ext/standard/string.c | 100 ++- ext/standard/user_filters.c | 4 +- ext/tidy/tidy.c | 15 +- ext/xsl/xsltprocessor.c | 2 +- ext/zip/php_zip.c | 2 +- main/output.c | 2 +- main/php_ini.c | 4 +- main/rfc1867.c | 2 +- sapi/apache2handler/apache_config.c | 4 +- sapi/apache2handler/sapi_apache2.c | 2 +- sapi/cgi/cgi_main.c | 2 +- sapi/cli/php_cli.c | 2 +- sapi/cli/php_cli_server.c | 2 +- sapi/fpm/fpm/fpm_main.c | 2 +- sapi/phpdbg/phpdbg.c | 8 +- sapi/phpdbg/phpdbg_bp.c | 42 +- sapi/phpdbg/phpdbg_info.c | 18 +- sapi/phpdbg/phpdbg_print.c | 10 +- sapi/phpdbg/phpdbg_watch.c | 30 +- win32/registry.c | 4 +- 89 files changed, 3281 insertions(+), 1643 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 381220a11468b..71aefe04a821a 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -767,7 +767,7 @@ static inline zend_result ct_eval_in_array(zval *result, uint32_t extended_value zval key_tmp; res = 0; - ZEND_HASH_FOREACH_STR_KEY(ht, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { ZVAL_STR(&key_tmp, key); if (zend_compare(op1, &key_tmp) == 0) { res = 1; diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 83671106c8add..caab99c98b5f7 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -1360,15 +1360,15 @@ void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void zend_foreach_op_array_helper(&script->main_op_array, func, context); - ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&script->function_table, op_array) { zend_foreach_op_array_helper(op_array, func, context); } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) { if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) { continue; } - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->scope == ce && op_array->type == ZEND_USER_FUNCTION && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { @@ -1516,11 +1516,11 @@ ZEND_API void zend_optimize_script(zend_script *script, zend_long optimization_l } } - ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) { if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) { continue; } - ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) { if (op_array->scope != ce && op_array->type == ZEND_USER_FUNCTION) { zend_op_array *orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name); diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 245967d678883..36265ca9d4ab3 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1284,8 +1284,11 @@ ZEND_API void zend_merge_properties(zval *obj, HashTable *properties) /* {{{ */ zend_string *key; zval *value; + if (HT_IS_PACKED(properties)) { + return; + } EG(fake_scope) = Z_OBJCE_P(obj); - ZEND_HASH_FOREACH_STR_KEY_VAL(properties, key, value) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(properties, key, value) { if (key) { write_property(zobj, key, value, NULL); } @@ -1321,7 +1324,7 @@ ZEND_API HashTable *zend_separate_class_constants_table(zend_class_entry *class_ zend_hash_init(constants_table, zend_hash_num_elements(&class_type->constants_table), NULL, NULL, 0); zend_hash_extend(constants_table, zend_hash_num_elements(&class_type->constants_table), 0); - ZEND_HASH_FOREACH_STR_KEY_PTR(&class_type->constants_table, key, c) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&class_type->constants_table, key, c) { if (Z_TYPE(c->value) == IS_CONSTANT_AST) { new_c = zend_arena_alloc(&CG(arena), sizeof(zend_class_constant)); memcpy(new_c, c, sizeof(zend_class_constant)); @@ -1409,7 +1412,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) / } else { constants_table = &class_type->constants_table; } - ZEND_HASH_FOREACH_PTR(constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(constants_table, c) { if (Z_TYPE(c->value) == IS_CONSTANT_AST) { val = &c->value; if (UNEXPECTED(zval_update_constant_ex(val, c->ce) != SUCCESS)) { @@ -1461,7 +1464,7 @@ ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type) / } if (class_type->default_static_members_count) { - ZEND_HASH_FOREACH_PTR(&class_type->properties_info, prop_info) { + ZEND_HASH_MAP_FOREACH_PTR(&class_type->properties_info, prop_info) { if (prop_info->flags & ZEND_ACC_STATIC) { val = static_members_table + prop_info->offset; if (Z_TYPE_P(val) == IS_CONSTANT_AST @@ -1526,7 +1529,7 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti zend_string *key; zend_property_info *property_info; - ZEND_HASH_FOREACH_STR_KEY_VAL(properties, key, prop) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(properties, key, prop) { property_info = zend_get_property_info(object->ce, key, 1); if (property_info != ZEND_WRONG_PROPERTY_INFO && property_info && @@ -2243,7 +2246,7 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */ int class_count = 0; /* Collect extensions with request startup/shutdown handlers */ - ZEND_HASH_FOREACH_PTR(&module_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) { if (module->request_startup_func) { startup_count++; } @@ -2266,7 +2269,7 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */ module_post_deactivate_handlers[post_deactivate_count] = NULL; startup_count = 0; - ZEND_HASH_FOREACH_PTR(&module_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) { if (module->request_startup_func) { module_request_startup_handlers[startup_count++] = module; } @@ -2279,7 +2282,7 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */ } ZEND_HASH_FOREACH_END(); /* Collect internal classes with static members */ - ZEND_HASH_FOREACH_PTR(CG(class_table), ce) { + ZEND_HASH_MAP_FOREACH_PTR(CG(class_table), ce) { if (ce->type == ZEND_INTERNAL_CLASS && ce->default_static_members_count > 0) { class_count++; @@ -2292,7 +2295,7 @@ ZEND_API void zend_collect_module_handlers(void) /* {{{ */ class_cleanup_handlers[class_count] = NULL; if (class_count) { - ZEND_HASH_FOREACH_PTR(CG(class_table), ce) { + ZEND_HASH_MAP_FOREACH_PTR(CG(class_table), ce) { if (ce->type == ZEND_INTERNAL_CLASS && ce->default_static_members_count > 0) { class_cleanup_handlers[--class_count] = ce; @@ -2981,7 +2984,7 @@ ZEND_API void zend_deactivate_modules(void) /* {{{ */ if (EG(full_tables_cleanup)) { zend_module_entry *module; - ZEND_HASH_REVERSE_FOREACH_PTR(&module_registry, module) { + ZEND_HASH_MAP_REVERSE_FOREACH_PTR(&module_registry, module) { if (module->request_shutdown_func) { zend_try { module->request_shutdown_func(module->type, module->module_number); @@ -3009,12 +3012,12 @@ ZEND_API void zend_post_deactivate_modules(void) /* {{{ */ zval *zv; zend_string *key; - ZEND_HASH_FOREACH_PTR(&module_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) { if (module->post_deactivate_func) { module->post_deactivate_func(); } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(&module_registry, key, zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL(&module_registry, key, zv) { module = Z_PTR_P(zv); if (module->type != MODULE_TEMPORARY) { break; @@ -3022,7 +3025,7 @@ ZEND_API void zend_post_deactivate_modules(void) /* {{{ */ module_destructor(module); free(module); zend_string_release_ex(key, 0); - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); } else { zend_module_entry **p = module_post_deactivate_handlers; @@ -3267,14 +3270,14 @@ ZEND_API zend_result zend_disable_class(const char *class_name, size_t class_nam INIT_CLASS_ENTRY_INIT_METHODS((*disabled_class), disabled_class_new); disabled_class->create_object = display_disabled_class; - ZEND_HASH_FOREACH_PTR(&disabled_class->function_table, fn) { + ZEND_HASH_MAP_FOREACH_PTR(&disabled_class->function_table, fn) { if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) && fn->common.scope == disabled_class) { zend_free_internal_arg_info(&fn->internal_function); } } ZEND_HASH_FOREACH_END(); zend_hash_clean(&disabled_class->function_table); - ZEND_HASH_FOREACH_PTR(&disabled_class->properties_info, prop) { + ZEND_HASH_MAP_FOREACH_PTR(&disabled_class->properties_info, prop) { if (prop->ce == disabled_class) { zend_string_release(prop->name); zend_type_release(prop->type, /* persistent */ 1); diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index a9bf3811b3710..28c4a4483637b 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -78,7 +78,7 @@ static zend_attribute *get_attribute(HashTable *attributes, zend_string *lcname, if (attributes) { zend_attribute *attr; - ZEND_HASH_FOREACH_PTR(attributes, attr) { + ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { if (attr->offset == offset && zend_string_equals(attr->lcname, lcname)) { return attr; } @@ -93,7 +93,7 @@ static zend_attribute *get_attribute_str(HashTable *attributes, const char *str, if (attributes) { zend_attribute *attr; - ZEND_HASH_FOREACH_PTR(attributes, attr) { + ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { if (attr->offset == offset && ZSTR_LEN(attr->lcname) == len) { if (0 == memcmp(ZSTR_VAL(attr->lcname), str, len)) { return attr; @@ -173,7 +173,7 @@ ZEND_API bool zend_is_attribute_repeated(HashTable *attributes, zend_attribute * { zend_attribute *other; - ZEND_HASH_FOREACH_PTR(attributes, other) { + ZEND_HASH_PACKED_FOREACH_PTR(attributes, other) { if (other != attr && other->offset == attr->offset) { if (zend_string_equals(other->lcname, attr->lcname)) { return 1; diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 7e58639508d55..89475235d818e 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -669,7 +669,7 @@ static void add_class_vars(zend_class_entry *scope, zend_class_entry *ce, bool s zend_string *key; zval *default_properties_table = CE_DEFAULT_PROPERTIES_TABLE(ce); - ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { if (((prop_info->flags & ZEND_ACC_PROTECTED) && !zend_check_protected(prop_info->ce, scope)) || ((prop_info->flags & ZEND_ACC_PRIVATE) && @@ -758,7 +758,7 @@ ZEND_FUNCTION(get_object_vars) } else { array_init_size(return_value, zend_hash_num_elements(properties)); - ZEND_HASH_FOREACH_KEY_VAL(properties, num_key, key, value) { + ZEND_HASH_MAP_FOREACH_KEY_VAL(properties, num_key, key, value) { bool is_dynamic = 1; if (Z_TYPE_P(value) == IS_INDIRECT) { value = Z_INDIRECT_P(value); @@ -838,7 +838,7 @@ ZEND_FUNCTION(get_class_methods) array_init(return_value); scope = zend_get_executed_scope(); - ZEND_HASH_FOREACH_PTR(&ce->function_table, mptr) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, mptr) { if ((mptr->common.fn_flags & ZEND_ACC_PUBLIC) || (scope && (((mptr->common.fn_flags & ZEND_ACC_PROTECTED) && @@ -1094,7 +1094,7 @@ ZEND_FUNCTION(get_included_files) ZEND_PARSE_PARAMETERS_NONE(); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY(&EG(included_files), entry) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&EG(included_files), entry) { if (entry) { add_next_index_str(return_value, zend_string_copy(entry)); } @@ -1248,7 +1248,7 @@ static inline void get_declared_class_impl(INTERNAL_FUNCTION_PARAMETERS, int fla array_init(return_value); zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { - ZEND_HASH_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) { ce = Z_PTR_P(zv); if ((ce->ce_flags & (ZEND_ACC_LINKED|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT)) == flags && key @@ -1309,7 +1309,7 @@ ZEND_FUNCTION(get_defined_functions) array_init(&user); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(function_table), key, func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(function_table), key, func) { if (key && ZSTR_VAL(key)[0] != 0) { if (func->type == ZEND_INTERNAL_FUNCTION) { add_next_index_str(&internal, zend_string_copy(key)); @@ -1455,7 +1455,7 @@ ZEND_FUNCTION(get_loaded_extensions) } else { zend_module_entry *module; - ZEND_HASH_FOREACH_PTR(&module_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) { add_next_index_string(return_value, module->name); } ZEND_HASH_FOREACH_END(); } @@ -1485,13 +1485,13 @@ ZEND_FUNCTION(get_defined_constants) module_names = emalloc((zend_hash_num_elements(&module_registry) + 2) * sizeof(char *)); module_names[0] = "internal"; - ZEND_HASH_FOREACH_PTR(&module_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&module_registry, module) { module_names[module->module_number] = (char *)module->name; i++; } ZEND_HASH_FOREACH_END(); module_names[i] = "user"; - ZEND_HASH_FOREACH_PTR(EG(zend_constants), val) { + ZEND_HASH_MAP_FOREACH_PTR(EG(zend_constants), val) { if (!val->name) { /* skip special constants */ continue; @@ -1521,7 +1521,7 @@ ZEND_FUNCTION(get_defined_constants) zend_constant *constant; zval const_val; - ZEND_HASH_FOREACH_PTR(EG(zend_constants), constant) { + ZEND_HASH_MAP_FOREACH_PTR(EG(zend_constants), constant) { if (!constant->name) { /* skip special constants */ continue; @@ -1606,7 +1606,7 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / zend_string *name; zval *arg; SEPARATE_ARRAY(arg_array); - ZEND_HASH_FOREACH_STR_KEY_VAL(call->extra_named_params, name, arg) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(call->extra_named_params, name, arg) { ZVAL_DEREF(arg); Z_TRY_ADDREF_P(arg); zend_hash_add_new(Z_ARRVAL_P(arg_array), name, arg); @@ -1902,7 +1902,7 @@ ZEND_FUNCTION(get_extension_funcs) array = 0; } - ZEND_HASH_FOREACH_PTR(CG(function_table), zif) { + ZEND_HASH_MAP_FOREACH_PTR(CG(function_table), zif) { if (zif->common.type == ZEND_INTERNAL_FUNCTION && zif->internal_function.module == module) { if (!array) { diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index e2ea9eacc34d2..122931ff7aebb 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -560,7 +560,7 @@ static HashTable *zend_closure_get_debug_info(zend_object *object, int *is_temp) array_init(&val); - ZEND_HASH_FOREACH_STR_KEY_VAL(static_variables, key, var) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(static_variables, key, var) { zval copy; if (Z_TYPE_P(var) == IS_CONSTANT_AST) { diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d733acdd47268..35c5f39216f08 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1728,7 +1728,7 @@ ZEND_API void zend_activate_auto_globals(void) /* {{{ */ { zend_auto_global *auto_global; - ZEND_HASH_FOREACH_PTR(CG(auto_globals), auto_global) { + ZEND_HASH_MAP_FOREACH_PTR(CG(auto_globals), auto_global) { if (auto_global->jit) { auto_global->armed = 1; } else if (auto_global->auto_global_callback) { @@ -5768,7 +5768,7 @@ static void zend_compile_try(zend_ast *ast) /* {{{ */ /* label: try { } must not be equal to try { label: } */ if (CG(context).labels) { zend_label *label; - ZEND_HASH_REVERSE_FOREACH_PTR(CG(context).labels, label) { + ZEND_HASH_MAP_REVERSE_FOREACH_PTR(CG(context).labels, label) { if (label->opline_num == get_next_op_number()) { zend_emit_op(NULL, ZEND_NOP, NULL, NULL); } @@ -6440,7 +6440,7 @@ static void zend_compile_attributes(HashTable **attributes, zend_ast *ast, uint3 } /* Validate attributes in a secondary loop (needed to detect repeated attributes). */ - ZEND_HASH_FOREACH_PTR(*attributes, attr) { + ZEND_HASH_PACKED_FOREACH_PTR(*attributes, attr) { if (attr->offset != offset || NULL == (config = zend_internal_attribute_get(attr->lcname))) { continue; } @@ -6881,7 +6881,7 @@ static void compile_implicit_lexical_binds( op_array->static_variables = zend_new_array(8); } - ZEND_HASH_FOREACH_STR_KEY(&info->uses, var_name) + ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name) zval *value = zend_hash_add( op_array->static_variables, var_name, &EG(uninitialized_zval)); uint32_t offset = (uint32_t)((char*)value - (char*)op_array->static_variables->arData); @@ -6930,7 +6930,7 @@ static void zend_compile_closure_uses(zend_ast *ast) /* {{{ */ static void zend_compile_implicit_closure_uses(closure_info *info) { zend_string *var_name; - ZEND_HASH_FOREACH_STR_KEY(&info->uses, var_name) + ZEND_HASH_MAP_FOREACH_STR_KEY(&info->uses, var_name) zval zv; ZVAL_NULL(&zv); zend_compile_static_var_common(var_name, &zv, ZEND_BIND_IMPLICIT); diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index 4494782d565c1..ab4e6e4e6f938 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -53,7 +53,7 @@ static void zend_verify_enum_properties(zend_class_entry *ce) { zend_property_info *property_info; - ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, property_info) { if (zend_string_equals_literal(property_info->name, "name")) { continue; } @@ -192,7 +192,7 @@ static ZEND_NAMED_FUNCTION(zend_enum_cases_func) array_init(return_value); - ZEND_HASH_FOREACH_PTR(CE_CONSTANTS_TABLE(ce), c) { + ZEND_HASH_MAP_FOREACH_PTR(CE_CONSTANTS_TABLE(ce), c) { if (!(ZEND_CLASS_CONST_FLAGS(c) & ZEND_CLASS_CONST_IS_CASE)) { continue; } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 7b9f8b849dc18..96ee0f33c3d0f 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -280,7 +280,7 @@ ZEND_API void zend_shutdown_executor_values(bool fast_shutdown) if (EG(full_tables_cleanup)) { zend_hash_reverse_apply(EG(zend_constants), clean_non_persistent_constant_full); } else { - ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(zend_constants), key, zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL(EG(zend_constants), key, zv) { zend_constant *c = Z_PTR_P(zv); if (_idx == EG(persistent_constants_count)) { break; @@ -291,12 +291,12 @@ ZEND_API void zend_shutdown_executor_values(bool fast_shutdown) } efree(c); zend_string_release_ex(key, 0); - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); } /* Release static properties and static variables prior to the final GC run, * as they may hold GC roots. */ - ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(function_table), zv) { zend_op_array *op_array = Z_PTR_P(zv); if (op_array->type == ZEND_INTERNAL_FUNCTION) { break; @@ -309,7 +309,7 @@ ZEND_API void zend_shutdown_executor_values(bool fast_shutdown) } } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(class_table), zv) { zend_class_entry *ce = Z_PTR_P(zv); if (ce->default_static_members_count) { @@ -323,7 +323,7 @@ ZEND_API void zend_shutdown_executor_values(bool fast_shutdown) } else if (ce->type == ZEND_USER_CLASS && !(ce->ce_flags & ZEND_ACC_IMMUTABLE)) { /* Constants may contain objects, destroy the values before the object store. */ zend_class_constant *c; - ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { if (c->ce == ce) { zval_ptr_dtor_nogc(&c->value); ZVAL_UNDEF(&c->value); @@ -333,7 +333,7 @@ ZEND_API void zend_shutdown_executor_values(bool fast_shutdown) if (ce->ce_flags & ZEND_HAS_STATIC_IN_METHODS) { zend_op_array *op_array; - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->type == ZEND_USER_FUNCTION) { if (ZEND_MAP_PTR(op_array->static_variables_ptr)) { HashTable *ht = ZEND_MAP_PTR_GET(op_array->static_variables_ptr); @@ -412,22 +412,22 @@ void shutdown_executor(void) /* {{{ */ zend_hash_reverse_apply(EG(function_table), clean_non_persistent_function_full); zend_hash_reverse_apply(EG(class_table), clean_non_persistent_class_full); } else { - ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(function_table), key, zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL(EG(function_table), key, zv) { zend_function *func = Z_PTR_P(zv); if (_idx == EG(persistent_functions_count)) { break; } destroy_op_array(&func->op_array); zend_string_release_ex(key, 0); - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); - ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL(EG(class_table), key, zv) { if (_idx == EG(persistent_classes_count)) { break; } destroy_zend_class(zv); zend_string_release_ex(key, 0); - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); } while (EG(symtable_cache_ptr) > EG(symtable_cache)) { diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index 5c7a73aa2736f..a473c84d2d4e6 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -692,7 +692,6 @@ ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref) static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) { HashTable *ht = NULL; - Bucket *p, *end; zval *zv; GC_STACK_DCL(stack); @@ -765,37 +764,63 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) handle_ht: if (!ht->nNumUsed) goto next; - p = ht->arData; - end = p + ht->nNumUsed; - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); + if (HT_IS_PACKED(ht)) { + zval *end; + + zv = ht->arPacked; + end = zv + ht->nNumUsed; + while (1) { + end--; + if (Z_REFCOUNTED_P(end)) { + break; + } + if (zv == end) goto next; + } + while (zv != end) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + zv++; } - if (Z_REFCOUNTED_P(zv)) { - break; + } else { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + while (1) { + end--; + zv = &end->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + break; + } + if (p == end) goto next; + } + while (p != end) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + p++; } - if (p == end) goto next; - } - while (p != end) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { - GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); - } - } - p++; - } - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); } ref = Z_COUNTED_P(zv); GC_ADDREF(ref); @@ -814,7 +839,6 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack) { HashTable *ht = NULL; - Bucket *p, *end; zval *zv; GC_STACK_DCL(stack); @@ -889,37 +913,63 @@ static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack) handle_ht: if (!ht->nNumUsed) goto next; - p = ht->arData; - end = p + ht->nNumUsed; - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); + if (HT_IS_PACKED(ht)) { + zval *end; + + zv = ht->arPacked; + end = zv + ht->nNumUsed; + while (1) { + end--; + if (Z_REFCOUNTED_P(end)) { + break; + } + if (zv == end) goto next; } - if (Z_REFCOUNTED_P(zv)) { - break; + while (zv != end) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + GC_STACK_PUSH(ref); + } + } + zv++; + } + } else { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + while (1) { + end--; + zv = &end->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + break; + } + if (p == end) goto next; + } + while (p != end) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + GC_STACK_PUSH(ref); + } + } + p++; } - if (p == end) goto next; - } - while (p != end) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_DELREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_GREY); - GC_STACK_PUSH(ref); - } - } - p++; - } - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); } ref = Z_COUNTED_P(zv); GC_DELREF(ref); @@ -991,7 +1041,6 @@ static void gc_mark_roots(gc_stack *stack) static void gc_scan(zend_refcounted *ref, gc_stack *stack) { - Bucket *p, *end; zval *zv; GC_STACK_DCL(stack); @@ -1052,36 +1101,61 @@ static void gc_scan(zend_refcounted *ref, gc_stack *stack) HashTable *ht = (HashTable *)ref; ZEND_ASSERT(ht != &EG(symbol_table)); if (!ht->nNumUsed) goto next; - p = ht->arData; - end = p + ht->nNumUsed; - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); + if (HT_IS_PACKED(ht)) { + zval *end; + + zv = ht->arPacked; + end = zv + ht->nNumUsed; + while (1) { + end--; + if (Z_REFCOUNTED_P(end)) { + break; + } + if (zv == end) goto next; } - if (Z_REFCOUNTED_P(zv)) { - break; + while (zv != end) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_WHITE); + GC_STACK_PUSH(ref); + } + } + zv++; + } + } else { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + while (1) { + end--; + zv = &end->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + break; + } + if (p == end) goto next; + } + while (p != end) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_WHITE); + GC_STACK_PUSH(ref); + } + } + p++; } - if (p == end) goto next; - } - while (p != end) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_WHITE); - GC_STACK_PUSH(ref); - } - } - p++; - } - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); } ref = Z_COUNTED_P(zv); if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { @@ -1150,7 +1224,6 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta { int count = 0; HashTable *ht = NULL; - Bucket *p, *end; zval *zv; GC_STACK_DCL(stack); @@ -1240,37 +1313,63 @@ static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *sta handle_ht: if (!ht->nNumUsed) goto next; - p = ht->arData; - end = p + ht->nNumUsed; - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); + if (HT_IS_PACKED(ht)) { + zval *end; + + zv = ht->arPacked; + end = zv + ht->nNumUsed; + while (1) { + end--; + if (Z_REFCOUNTED_P(end)) { + break; + } + if (zv == end) goto next; } - if (Z_REFCOUNTED_P(zv)) { - break; + while (zv != end) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + zv++; + } + } else { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + while (1) { + end--; + zv = &end->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + break; + } + if (p == end) goto next; + } + while (p != end) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + p++; } - if (p == end) goto next; - } - while (p != end) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { - GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); - } - } - p++; - } - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); } ref = Z_COUNTED_P(zv); GC_ADDREF(ref); @@ -1329,7 +1428,6 @@ static int gc_collect_roots(uint32_t *flags, gc_stack *stack) static int gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffer *root, gc_stack *stack) { HashTable *ht = NULL; - Bucket *p, *end; zval *zv; int count = 0; GC_STACK_DCL(stack); @@ -1397,33 +1495,55 @@ static int gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffe } if (!ht->nNumUsed) goto next; - p = ht->arData; - end = p + ht->nNumUsed; - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); + if (HT_IS_PACKED(ht)) { + zval *end; + + zv = ht->arPacked; + end = zv + ht->nNumUsed; + while (1) { + end--; + if (Z_REFCOUNTED_P(end)) { + break; + } + if (zv == end) goto next; } - if (Z_REFCOUNTED_P(zv)) { - break; + while (zv != end) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_STACK_PUSH(ref); + } + zv++; + } + } else { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + while (1) { + end--; + zv = &end->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + break; + } + if (p == end) goto next; + } + while (p != end) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_STACK_PUSH(ref); + } + p++; } - if (p == end) goto next; - } - while (p != end) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_STACK_PUSH(ref); - } - p++; - } - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); } ref = Z_COUNTED_P(zv); continue; diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index b7cc9aea8cdc5..965b9edb60b8f 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -608,28 +608,46 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener HashTable *ht = Z_ARR(generator->values); HashPosition pos = Z_FE_POS(generator->values); - Bucket *p; - do { - if (UNEXPECTED(pos >= ht->nNumUsed)) { - /* Reached end of array */ - goto failure; - } + if (HT_IS_PACKED(ht)) { + do { + if (UNEXPECTED(pos >= ht->nNumUsed)) { + /* Reached end of array */ + goto failure; + } - p = &ht->arData[pos]; - value = &p->val; - pos++; - } while (Z_ISUNDEF_P(value)); + value = &ht->arPacked[pos]; + pos++; + } while (Z_ISUNDEF_P(value)); - zval_ptr_dtor(&generator->value); - ZVAL_COPY(&generator->value, value); + zval_ptr_dtor(&generator->value); + ZVAL_COPY(&generator->value, value); - zval_ptr_dtor(&generator->key); - if (p->key) { - ZVAL_STR_COPY(&generator->key, p->key); + zval_ptr_dtor(&generator->key); + ZVAL_LONG(&generator->key, pos - 1); } else { - ZVAL_LONG(&generator->key, p->h); - } + Bucket *p; + do { + if (UNEXPECTED(pos >= ht->nNumUsed)) { + /* Reached end of array */ + goto failure; + } + + p = &ht->arData[pos]; + value = &p->val; + pos++; + } while (Z_ISUNDEF_P(value)); + + zval_ptr_dtor(&generator->value); + ZVAL_COPY(&generator->value, value); + + zval_ptr_dtor(&generator->key); + if (p->key) { + ZVAL_STR_COPY(&generator->key, p->key); + } else { + ZVAL_LONG(&generator->key, p->h); + } + } Z_FE_POS(generator->values) = pos; } else { zend_object_iterator *iter = (zend_object_iterator *) Z_OBJ(generator->values); diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 8ee292106a6b3..24c4ced4b434a 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -148,12 +148,12 @@ static zend_always_inline void zend_hash_real_init_packed_ex(HashTable *ht) void *data; if (UNEXPECTED(GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)) { - data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), 1); + data = pemalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), 1); } else if (EXPECTED(ht->nTableSize == HT_MIN_SIZE)) { /* Use specialized API with constant allocation amount for a particularly common case. */ - data = emalloc(HT_SIZE_EX(HT_MIN_SIZE, HT_MIN_MASK)); + data = emalloc(HT_PACKED_SIZE_EX(HT_MIN_SIZE, HT_MIN_MASK)); } else { - data = emalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK)); + data = emalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK)); } HT_SET_DATA_ADDR(ht, data); /* Don't overwrite iterator count. */ @@ -283,21 +283,16 @@ ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t nSize) ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(zval *val1, zval *val2) { - Bucket *p; + zval *zv; HashTable *ht = emalloc(sizeof(HashTable)); _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0); ht->nNumUsed = ht->nNumOfElements = ht->nNextFreeElement = 2; zend_hash_real_init_packed_ex(ht); - p = ht->arData; - ZVAL_COPY_VALUE(&p->val, val1); - p->h = 0; - p->key = NULL; - - p++; - ZVAL_COPY_VALUE(&p->val, val2); - p->h = 1; - p->key = NULL; + zv = ht->arPacked; + ZVAL_COPY_VALUE(zv, val1); + zv++; + ZVAL_COPY_VALUE(zv, val2); return ht; } @@ -308,7 +303,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_grow(HashTable *ht) zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", ht->nTableSize * 2, sizeof(Bucket), sizeof(Bucket)); } ht->nTableSize += ht->nTableSize; - HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); + HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_PACKED_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); } ZEND_API void ZEND_FASTCALL zend_hash_real_init(HashTable *ht, bool packed) @@ -338,7 +333,9 @@ ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht) { void *new_data, *old_data = HT_GET_DATA_ADDR(ht); - Bucket *old_buckets = ht->arData; + zval *src = ht->arPacked; + Bucket *dst; + uint32_t i; uint32_t nSize = ht->nTableSize; HT_ASSERT_RC1(ht); @@ -346,7 +343,14 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht) new_data = pemalloc(HT_SIZE_EX(nSize, HT_SIZE_TO_MASK(nSize)), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); ht->nTableMask = HT_SIZE_TO_MASK(ht->nTableSize); HT_SET_DATA_ADDR(ht, new_data); - memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); + dst = ht->arData; + for (i = 0; i < ht->nNumUsed; i++) { + ZVAL_COPY_VALUE(&dst->val, src); + dst->h = i; + dst->key = NULL; + dst++; + src++; + } pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); zend_hash_rehash(ht); } @@ -354,15 +358,22 @@ ZEND_API void ZEND_FASTCALL zend_hash_packed_to_hash(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_hash_to_packed(HashTable *ht) { void *new_data, *old_data = HT_GET_DATA_ADDR(ht); - Bucket *old_buckets = ht->arData; + Bucket *src = ht->arData; + zval *dst; + uint32_t i; HT_ASSERT_RC1(ht); - new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); + new_data = pemalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; ht->nTableMask = HT_MIN_MASK; HT_SET_DATA_ADDR(ht, new_data); HT_HASH_RESET_PACKED(ht); - memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); + dst = ht->arPacked; + for (i = 0; i < ht->nNumUsed; i++) { + ZVAL_COPY_VALUE(dst, &src->val); + dst++; + src++; + } pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); } @@ -377,13 +388,13 @@ ZEND_API void ZEND_FASTCALL zend_hash_extend(HashTable *ht, uint32_t nSize, bool zend_hash_real_init(ht, packed); } else { if (packed) { - ZEND_ASSERT(HT_FLAGS(ht) & HASH_FLAG_PACKED); + ZEND_ASSERT(HT_IS_PACKED(ht)); if (nSize > ht->nTableSize) { ht->nTableSize = zend_hash_check_size(nSize); - HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); + HT_SET_DATA_ADDR(ht, perealloc2(HT_GET_DATA_ADDR(ht), HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), HT_PACKED_USED_SIZE(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); } } else { - ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED)); + ZEND_ASSERT(!HT_IS_PACKED(ht)); if (nSize > ht->nTableSize) { void *new_data, *old_data = HT_GET_DATA_ADDR(ht); Bucket *old_buckets = ht->arData; @@ -405,6 +416,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed) Bucket *p, *end, *arData; uint32_t nIndex; + ZEND_ASSERT(!HT_IS_PACKED(ht)); arData = ht->arData; p = arData + ht->nNumUsed; end = arData + nNumUsed; @@ -429,7 +441,7 @@ static uint32_t zend_array_recalc_elements(HashTable *ht) zval *val; uint32_t num = ht->nNumOfElements; - ZEND_HASH_FOREACH_VAL(ht, val) { + ZEND_HASH_MAP_FOREACH_VAL(ht, val) { if (Z_TYPE_P(val) == IS_INDIRECT) { if (UNEXPECTED(Z_TYPE_P(Z_INDIRECT_P(val)) == IS_UNDEF)) { num--; @@ -459,8 +471,14 @@ ZEND_API uint32_t zend_array_count(HashTable *ht) static zend_always_inline HashPosition _zend_hash_get_valid_pos(const HashTable *ht, HashPosition pos) { - while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arData[pos].val)) { - pos++; + if (HT_IS_PACKED(ht)) { + while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arPacked[pos])) { + pos++; + } + } else { + while (pos < ht->nNumUsed && Z_ISUNDEF(ht->arData[pos].val)) { + pos++; + } } return pos; } @@ -990,6 +1008,7 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, uint32_t nIndex; uint32_t idx; Bucket *p; + zval *zv; IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); @@ -998,41 +1017,48 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, h = 0; } - if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(ht)) { if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) != (HASH_ADD_NEW|HASH_ADD_NEXT) && h < ht->nNumUsed) { - p = ht->arData + h; - if (Z_TYPE(p->val) != IS_UNDEF) { + zv = ht->arPacked + h; + if (Z_TYPE_P(zv) != IS_UNDEF) { if (flag & HASH_LOOKUP) { - return &p->val; + return zv; } replace: if (flag & HASH_ADD) { return NULL; } if (ht->pDestructor) { - ht->pDestructor(&p->val); + ht->pDestructor(zv); } - ZVAL_COPY_VALUE(&p->val, pData); - return &p->val; + ZVAL_COPY_VALUE(zv, pData); + return zv; } else { /* we have to keep the order :( */ goto convert_to_hash; } } else if (EXPECTED(h < ht->nTableSize)) { add_to_packed: - p = ht->arData + h; + zv = ht->arPacked + h; /* incremental initialization of empty Buckets */ if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) != (HASH_ADD_NEW|HASH_ADD_NEXT)) { if (h > ht->nNumUsed) { - Bucket *q = ht->arData + ht->nNumUsed; - while (q != p) { - ZVAL_UNDEF(&q->val); + zval *q = ht->arPacked + ht->nNumUsed; + while (q != zv) { + ZVAL_UNDEF(q); q++; } } } ht->nNextFreeElement = ht->nNumUsed = h + 1; - goto add; + ht->nNumOfElements++; + if (flag & HASH_LOOKUP) { + ZVAL_NULL(zv); + } else { + ZVAL_COPY_VALUE(zv, pData); + } + + return zv; } else if ((h >> 1) < ht->nTableSize && (ht->nTableSize >> 1) < ht->nNumOfElements) { zend_hash_packed_grow(ht); @@ -1058,6 +1084,7 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, return &p->val; } ZEND_ASSERT((flag & HASH_ADD_NEW) == 0); + zv = &p->val; goto replace; } } @@ -1072,7 +1099,6 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht, if ((zend_long)h >= ht->nNextFreeElement) { ht->nNextFreeElement = (zend_long)h < ZEND_LONG_MAX ? h + 1 : ZEND_LONG_MAX; } -add: ht->nNumOfElements++; p->h = h; p->key = NULL; @@ -1141,7 +1167,7 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *b, IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); - ZEND_ASSERT(!(HT_FLAGS(ht) & HASH_FLAG_PACKED)); + ZEND_ASSERT(!HT_IS_PACKED(ht)); p = zend_hash_find_bucket(ht, key, 0); if (UNEXPECTED(p)) { @@ -1199,6 +1225,7 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); + ZEND_ASSERT(!HT_IS_PACKED(ht)); if (ht->nNumUsed > ht->nNumOfElements + (ht->nNumOfElements >> 5)) { /* additional term is there to amortize the cost of compaction */ zend_hash_rehash(ht); } else if (ht->nTableSize < HT_MAX_SIZE) { /* Let's double the table size */ @@ -1310,14 +1337,49 @@ ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht) } } -static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, Bucket *p, Bucket *prev) +static zend_always_inline void _zend_hash_packed_del_val(HashTable *ht, uint32_t idx, zval *zv) { - if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { - if (prev) { - Z_NEXT(prev->val) = Z_NEXT(p->val); - } else { - HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val); + idx = HT_HASH_TO_IDX(idx); + ht->nNumOfElements--; + if (ht->nInternalPointer == idx || UNEXPECTED(HT_HAS_ITERATORS(ht))) { + uint32_t new_idx; + + new_idx = idx; + while (1) { + new_idx++; + if (new_idx >= ht->nNumUsed) { + break; + } else if (Z_TYPE(ht->arPacked[new_idx]) != IS_UNDEF) { + break; + } + } + if (ht->nInternalPointer == idx) { + ht->nInternalPointer = new_idx; } + zend_hash_iterators_update(ht, idx, new_idx); + } + if (ht->nNumUsed - 1 == idx) { + do { + ht->nNumUsed--; + } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arPacked[ht->nNumUsed-1]) == IS_UNDEF))); + ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed); + } + if (ht->pDestructor) { + zval tmp; + ZVAL_COPY_VALUE(&tmp, zv); + ZVAL_UNDEF(zv); + ht->pDestructor(&tmp); + } else { + ZVAL_UNDEF(zv); + } +} + +static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, Bucket *p, Bucket *prev) +{ + if (prev) { + Z_NEXT(prev->val) = Z_NEXT(p->val); + } else { + HT_HASH(ht, p->h | ht->nTableMask) = Z_NEXT(p->val); } idx = HT_HASH_TO_IDX(idx); ht->nNumOfElements--; @@ -1360,27 +1422,37 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bucket *p) { Bucket *prev = NULL; + uint32_t nIndex; + uint32_t i; - if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { - uint32_t nIndex = p->h | ht->nTableMask; - uint32_t i = HT_HASH(ht, nIndex); + nIndex = p->h | ht->nTableMask; + i = HT_HASH(ht, nIndex); - if (i != idx) { + if (i != idx) { + prev = HT_HASH_TO_BUCKET(ht, i); + while (Z_NEXT(prev->val) != idx) { + i = Z_NEXT(prev->val); prev = HT_HASH_TO_BUCKET(ht, i); - while (Z_NEXT(prev->val) != idx) { - i = Z_NEXT(prev->val); - prev = HT_HASH_TO_BUCKET(ht, i); - } - } + } } _zend_hash_del_el_ex(ht, idx, p, prev); } +ZEND_API void ZEND_FASTCALL zend_hash_packed_del_val(HashTable *ht, zval *zv) +{ + IS_CONSISTENT(ht); + HT_ASSERT_RC1(ht); + ZEND_ASSERT(HT_IS_PACKED(ht)); + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(zv - ht->arPacked), zv); +} + + ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p) { IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); + ZEND_ASSERT(!HT_IS_PACKED(ht)); _zend_hash_del_el(ht, HT_IDX_TO_HASH(p - ht->arData), p); } @@ -1546,11 +1618,11 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); - if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(ht)) { if (h < ht->nNumUsed) { - p = ht->arData + h; - if (Z_TYPE(p->val) != IS_UNDEF) { - _zend_hash_del_el_ex(ht, HT_IDX_TO_HASH(h), p, NULL); + zval *zv = ht->arPacked + h; + if (Z_TYPE_P(zv) != IS_UNDEF) { + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(h), zv); return SUCCESS; } } @@ -1573,60 +1645,81 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) { - Bucket *p, *end; - IS_CONSISTENT(ht); HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); if (ht->nNumUsed) { - p = ht->arData; - end = p + ht->nNumUsed; - if (ht->pDestructor) { - SET_INCONSISTENT(HT_IS_DESTROYING); + if (HT_IS_PACKED(ht)) { + if (ht->pDestructor) { + zval *zv = ht->arPacked; + zval *end = zv + ht->nNumUsed; - if (HT_HAS_STATIC_KEYS_ONLY(ht)) { + SET_INCONSISTENT(HT_IS_DESTROYING); if (HT_IS_WITHOUT_HOLES(ht)) { do { - ht->pDestructor(&p->val); - } while (++p != end); + ht->pDestructor(zv); + } while (++zv != end); } else { do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { - ht->pDestructor(&p->val); + if (EXPECTED(Z_TYPE_P(zv) != IS_UNDEF)) { + ht->pDestructor(zv); } - } while (++p != end); + } while (++zv != end); } - } else if (HT_IS_WITHOUT_HOLES(ht)) { - do { - ht->pDestructor(&p->val); - if (EXPECTED(p->key)) { - zend_string_release(p->key); + SET_INCONSISTENT(HT_DESTROYED); + } + zend_hash_iterators_remove(ht); + } else { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + if (ht->pDestructor) { + SET_INCONSISTENT(HT_IS_DESTROYING); + + if (HT_HAS_STATIC_KEYS_ONLY(ht)) { + if (HT_IS_WITHOUT_HOLES(ht)) { + do { + ht->pDestructor(&p->val); + } while (++p != end); + } else { + do { + if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + ht->pDestructor(&p->val); + } + } while (++p != end); } - } while (++p != end); - } else { - do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + } else if (HT_IS_WITHOUT_HOLES(ht)) { + do { ht->pDestructor(&p->val); if (EXPECTED(p->key)) { zend_string_release(p->key); } - } - } while (++p != end); - } - - SET_INCONSISTENT(HT_DESTROYED); - } else { - if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { - do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { - if (EXPECTED(p->key)) { + } while (++p != end); + } else { + do { + if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + ht->pDestructor(&p->val); + if (EXPECTED(p->key)) { zend_string_release(p->key); + } } - } - } while (++p != end); + } while (++p != end); + } + + SET_INCONSISTENT(HT_DESTROYED); + } else { + if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { + do { + if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + if (EXPECTED(p->key)) { + zend_string_release(p->key); + } + } + } while (++p != end); + } } + zend_hash_iterators_remove(ht); } - zend_hash_iterators_remove(ht); } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { return; } @@ -1635,8 +1728,6 @@ ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht) { - Bucket *p, *end; - IS_CONSISTENT(ht); HT_ASSERT(ht, GC_REFCOUNT(ht) <= 1); @@ -1651,30 +1742,40 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht) goto free_ht; } - p = ht->arData; - end = p + ht->nNumUsed; SET_INCONSISTENT(HT_IS_DESTROYING); - if (HT_HAS_STATIC_KEYS_ONLY(ht)) { - do { - i_zval_ptr_dtor(&p->val); - } while (++p != end); - } else if (HT_IS_WITHOUT_HOLES(ht)) { + if (HT_IS_PACKED(ht)) { + zval *zv = ht->arPacked; + zval *end = zv + ht->nNumUsed; + do { - i_zval_ptr_dtor(&p->val); - if (EXPECTED(p->key)) { - zend_string_release_ex(p->key, 0); - } - } while (++p != end); + i_zval_ptr_dtor(zv); + } while (++zv != end); } else { - do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + if (HT_HAS_STATIC_KEYS_ONLY(ht)) { + do { + i_zval_ptr_dtor(&p->val); + } while (++p != end); + } else if (HT_IS_WITHOUT_HOLES(ht)) { + do { i_zval_ptr_dtor(&p->val); if (EXPECTED(p->key)) { zend_string_release_ex(p->key, 0); } - } - } while (++p != end); + } while (++p != end); + } else { + do { + if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + i_zval_ptr_dtor(&p->val); + if (EXPECTED(p->key)) { + zend_string_release_ex(p->key, 0); + } + } + } while (++p != end); + } } } else if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { goto free_ht; @@ -1688,48 +1789,49 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht) { - Bucket *p, *end; - IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); if (ht->nNumUsed) { - p = ht->arData; - end = p + ht->nNumUsed; - if (ht->pDestructor) { - if (HT_HAS_STATIC_KEYS_ONLY(ht)) { - if (HT_IS_WITHOUT_HOLES(ht)) { - do { - ht->pDestructor(&p->val); - } while (++p != end); - } else { - do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { - ht->pDestructor(&p->val); - } - } while (++p != end); - } - } else if (HT_IS_WITHOUT_HOLES(ht)) { - do { - ht->pDestructor(&p->val); - if (EXPECTED(p->key)) { - zend_string_release(p->key); - } - } while (++p != end); - } else { - do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { - ht->pDestructor(&p->val); - if (EXPECTED(p->key)) { - zend_string_release(p->key); - } + if (HT_IS_PACKED(ht)) { + zval *zv = ht->arPacked; + zval *end = zv + ht->nNumUsed; + + if (ht->pDestructor) { + if (HT_HAS_STATIC_KEYS_ONLY(ht)) { + if (HT_IS_WITHOUT_HOLES(ht)) { + do { + ht->pDestructor(zv); + } while (++zv != end); + } else { + do { + if (EXPECTED(Z_TYPE_P(zv) != IS_UNDEF)) { + ht->pDestructor(zv); + } + } while (++zv != end); } - } while (++p != end); + } } } else { - if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { - if (HT_IS_WITHOUT_HOLES(ht)) { + Bucket *p = ht->arData; + Bucket *end = p + ht->nNumUsed; + + if (ht->pDestructor) { + if (HT_HAS_STATIC_KEYS_ONLY(ht)) { + if (HT_IS_WITHOUT_HOLES(ht)) { + do { + ht->pDestructor(&p->val); + } while (++p != end); + } else { + do { + if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + ht->pDestructor(&p->val); + } + } while (++p != end); + } + } else if (HT_IS_WITHOUT_HOLES(ht)) { do { + ht->pDestructor(&p->val); if (EXPECTED(p->key)) { zend_string_release(p->key); } @@ -1737,15 +1839,32 @@ ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht) } else { do { if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + ht->pDestructor(&p->val); if (EXPECTED(p->key)) { zend_string_release(p->key); } } } while (++p != end); } + } else { + if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { + if (HT_IS_WITHOUT_HOLES(ht)) { + do { + if (EXPECTED(p->key)) { + zend_string_release(p->key); + } + } while (++p != end); + } else { + do { + if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { + if (EXPECTED(p->key)) { + zend_string_release(p->key); + } + } + } while (++p != end); + } + } } - } - if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED)) { HT_HASH_RESET(ht); } } @@ -1763,6 +1882,7 @@ ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht) HT_ASSERT_RC1(ht); if (ht->nNumUsed) { + ZEND_ASSERT(!HT_IS_PACKED(ht)); p = ht->arData; end = p + ht->nNumUsed; if (HT_HAS_STATIC_KEYS_ONLY(ht)) { @@ -1797,15 +1917,24 @@ ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht) { uint32_t idx; - Bucket *p; IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); - p = ht->arData; - for (idx = 0; idx < ht->nNumUsed; idx++, p++) { - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; - _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + if (HT_IS_PACKED(ht)) { + zval *zv = ht->arPacked; + + for (idx = 0; idx < ht->nNumUsed; idx++, zv++) { + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); + } + } else { + Bucket *p = ht->arData; + + for (idx = 0; idx < ht->nNumUsed; idx++, p++) { + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + } } if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { pefree(HT_GET_DATA_ADDR(ht), GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); @@ -1817,18 +1946,29 @@ ZEND_API void ZEND_FASTCALL zend_hash_graceful_destroy(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht) { uint32_t idx; - Bucket *p; IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); idx = ht->nNumUsed; - p = ht->arData + ht->nNumUsed; - while (idx > 0) { - idx--; - p--; - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; - _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + if (HT_IS_PACKED(ht)) { + zval *zv = ht->arPacked + ht->nNumUsed; + + while (idx > 0) { + idx--; + zv--; + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); + } + } else { + Bucket *p = ht->arData + ht->nNumUsed; + + while (idx > 0) { + idx--; + p--; + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + } } if (!(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { @@ -1850,22 +1990,38 @@ ZEND_API void ZEND_FASTCALL zend_hash_graceful_reverse_destroy(HashTable *ht) ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_func) { uint32_t idx; - Bucket *p; int result; IS_CONSISTENT(ht); + if (HT_IS_PACKED(ht)) { + for (idx = 0; idx < ht->nNumUsed; idx++) { + zval *zv = ht->arPacked + idx; - for (idx = 0; idx < ht->nNumUsed; idx++) { - p = ht->arData + idx; - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; - result = apply_func(&p->val); + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; + result = apply_func(zv); - if (result & ZEND_HASH_APPLY_REMOVE) { - HT_ASSERT_RC1(ht); - _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); + } + if (result & ZEND_HASH_APPLY_STOP) { + break; + } } - if (result & ZEND_HASH_APPLY_STOP) { - break; + } else { + for (idx = 0; idx < ht->nNumUsed; idx++) { + Bucket *p = ht->arData + idx; + + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + result = apply_func(&p->val); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + } + if (result & ZEND_HASH_APPLY_STOP) { + break; + } } } } @@ -1874,22 +2030,36 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply(HashTable *ht, apply_func_t apply_fu ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument) { uint32_t idx; - Bucket *p; int result; IS_CONSISTENT(ht); - - for (idx = 0; idx < ht->nNumUsed; idx++) { - p = ht->arData + idx; - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; - result = apply_func(&p->val, argument); - - if (result & ZEND_HASH_APPLY_REMOVE) { - HT_ASSERT_RC1(ht); - _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + if (HT_IS_PACKED(ht)) { + for (idx = 0; idx < ht->nNumUsed; idx++) { + zval *zv = ht->arPacked + idx; + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; + result = apply_func(zv, argument); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); + } + if (result & ZEND_HASH_APPLY_STOP) { + break; + } } - if (result & ZEND_HASH_APPLY_STOP) { - break; + } else { + for (idx = 0; idx < ht->nNumUsed; idx++) { + Bucket *p = ht->arData + idx; + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + result = apply_func(&p->val, argument); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + } + if (result & ZEND_HASH_APPLY_STOP) { + break; + } } } } @@ -1898,31 +2068,54 @@ ZEND_API void ZEND_FASTCALL zend_hash_apply_with_argument(HashTable *ht, apply_f ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int num_args, ...) { uint32_t idx; - Bucket *p; va_list args; zend_hash_key hash_key; int result; IS_CONSISTENT(ht); - for (idx = 0; idx < ht->nNumUsed; idx++) { - p = ht->arData + idx; - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; - va_start(args, num_args); - hash_key.h = p->h; - hash_key.key = p->key; + if (HT_IS_PACKED(ht)) { + for (idx = 0; idx < ht->nNumUsed; idx++) { + zval *zv = ht->arPacked + idx; - result = apply_func(&p->val, num_args, args, &hash_key); + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; + va_start(args, num_args); + hash_key.h = idx; + hash_key.key = NULL; - if (result & ZEND_HASH_APPLY_REMOVE) { - HT_ASSERT_RC1(ht); - _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + result = apply_func(zv, num_args, args, &hash_key); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); + } + if (result & ZEND_HASH_APPLY_STOP) { + va_end(args); + break; + } + va_end(args); } - if (result & ZEND_HASH_APPLY_STOP) { + } else { + for (idx = 0; idx < ht->nNumUsed; idx++) { + Bucket *p = ht->arData + idx; + + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + va_start(args, num_args); + hash_key.h = p->h; + hash_key.key = p->key; + + result = apply_func(&p->val, num_args, args, &hash_key); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + } + if (result & ZEND_HASH_APPLY_STOP) { + va_end(args); + break; + } va_end(args); - break; } - va_end(args); } } @@ -1930,25 +2123,46 @@ ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t ap ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func) { uint32_t idx; - Bucket *p; int result; IS_CONSISTENT(ht); idx = ht->nNumUsed; - while (idx > 0) { - idx--; - p = ht->arData + idx; - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + if (HT_IS_PACKED(ht)) { + zval *zv; - result = apply_func(&p->val); + while (idx > 0) { + idx--; + zv = ht->arPacked + idx; + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; - if (result & ZEND_HASH_APPLY_REMOVE) { - HT_ASSERT_RC1(ht); - _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + result = apply_func(zv); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_packed_del_val(ht, HT_IDX_TO_HASH(idx), zv); + } + if (result & ZEND_HASH_APPLY_STOP) { + break; + } } - if (result & ZEND_HASH_APPLY_STOP) { - break; + } else { + Bucket *p; + + while (idx > 0) { + idx--; + p = ht->arData + idx; + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + + result = apply_func(&p->val); + + if (result & ZEND_HASH_APPLY_REMOVE) { + HT_ASSERT_RC1(ht); + _zend_hash_del_el(ht, HT_IDX_TO_HASH(idx), p); + } + if (result & ZEND_HASH_APPLY_STOP) { + break; + } } } } @@ -1957,15 +2171,28 @@ 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) { uint32_t idx; - Bucket *p; zval *new_entry, *data; IS_CONSISTENT(source); IS_CONSISTENT(target); HT_ASSERT_RC1(target); + if (HT_IS_PACKED(source)) { + for (idx = 0; idx < source->nNumUsed; idx++) { + zval *zv = source->arPacked + idx; + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; + + new_entry = zend_hash_index_update(target, idx, zv); + if (pCopyConstructor) { + pCopyConstructor(new_entry); + } + } + return; + } + for (idx = 0; idx < source->nNumUsed; idx++) { - p = source->arData + idx; + Bucket *p = source->arData + idx; + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; /* INDIRECT element may point to UNDEF-ined slots */ @@ -1988,10 +2215,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, } -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_value(HashTable *source, HashTable *target, zval *data, zval *dest, bool packed, bool with_holes) { - zval *data = &p->val; - if (with_holes) { if (!packed && Z_TYPE_INFO_P(data) == IS_INDIRECT) { data = Z_INDIRECT_P(data); @@ -2022,14 +2247,21 @@ static zend_always_inline bool zend_array_dup_element(HashTable *source, HashTab Z_ADDREF_P(data); } } while (0); - ZVAL_COPY_VALUE(&q->val, data); + ZVAL_COPY_VALUE(dest, data); - q->h = p->h; - if (packed) { - q->key = NULL; - } else { + 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) +{ + if (!zend_array_dup_value(source, target, &p->val, &q->val, packed, with_holes)) { + return 0; + } + + if (!packed) { uint32_t nIndex; + q->h = p->h; q->key = p->key; if (!static_keys && q->key) { zend_string_addref(q->key); @@ -2044,14 +2276,14 @@ static zend_always_inline bool zend_array_dup_element(HashTable *source, HashTab static zend_always_inline void zend_array_dup_packed_elements(HashTable *source, HashTable *target, bool with_holes) { - Bucket *p = source->arData; - Bucket *q = target->arData; - Bucket *end = p + source->nNumUsed; + zval *p = source->arPacked; + zval *q = target->arPacked; + zval *end = p + source->nNumUsed; do { - if (!zend_array_dup_element(source, target, 0, p, q, 1, 1, with_holes)) { + if (!zend_array_dup_value(source, target, p, q, 1, with_holes)) { if (with_holes) { - ZVAL_UNDEF(&q->val); + ZVAL_UNDEF(q); } } p++; q++; @@ -2115,17 +2347,23 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source) target->nNumOfElements = source->nNumOfElements; target->nNextFreeElement = source->nNextFreeElement; target->nTableSize = source->nTableSize; - HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target))); - target->nInternalPointer = source->nInternalPointer; - memcpy(HT_GET_DATA_ADDR(target), HT_GET_DATA_ADDR(source), HT_USED_SIZE(source)); - } else if (HT_FLAGS(source) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(source)) { + HT_SET_DATA_ADDR(target, emalloc(HT_PACKED_SIZE(target))); + target->nInternalPointer = source->nInternalPointer; + memcpy(HT_GET_DATA_ADDR(target), HT_GET_DATA_ADDR(source), HT_PACKED_USED_SIZE(source)); + } else { + HT_SET_DATA_ADDR(target, emalloc(HT_SIZE(target))); + target->nInternalPointer = source->nInternalPointer; + memcpy(HT_GET_DATA_ADDR(target), HT_GET_DATA_ADDR(source), HT_USED_SIZE(source)); + } + } else if (HT_IS_PACKED(source)) { HT_FLAGS(target) = HT_FLAGS(source) & HASH_FLAG_MASK; target->nTableMask = HT_MIN_MASK; target->nNumUsed = source->nNumUsed; target->nNumOfElements = source->nNumOfElements; target->nNextFreeElement = source->nNextFreeElement; target->nTableSize = source->nTableSize; - HT_SET_DATA_ADDR(target, emalloc(HT_SIZE_EX(target->nTableSize, HT_MIN_MASK))); + HT_SET_DATA_ADDR(target, emalloc(HT_PACKED_SIZE_EX(target->nTableSize, HT_MIN_MASK))); target->nInternalPointer = (source->nInternalPointer < source->nNumUsed) ? source->nInternalPointer : 0; @@ -2180,6 +2418,20 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source HT_ASSERT_RC1(target); if (overwrite) { + if (HT_IS_PACKED(source)) { + for (idx = 0; idx < source->nNumUsed; idx++) { + s = source->arPacked + idx; + if (UNEXPECTED(Z_TYPE_P(s) == IS_UNDEF)) { + continue; + } + t = zend_hash_index_update(target, idx, s); + if (pCopyConstructor) { + pCopyConstructor(t); + } + } + return; + } + for (idx = 0; idx < source->nNumUsed; idx++) { p = source->arData + idx; s = &p->val; @@ -2202,6 +2454,20 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source } } } else { + if (HT_IS_PACKED(source)) { + for (idx = 0; idx < source->nNumUsed; idx++) { + s = source->arPacked + idx; + if (UNEXPECTED(Z_TYPE_P(s) == IS_UNDEF)) { + continue; + } + t = zend_hash_index_add(target, idx, s); + if (t && pCopyConstructor) { + pCopyConstructor(t); + } + } + return; + } + for (idx = 0; idx < source->nNumUsed; idx++) { p = source->arData + idx; s = &p->val; @@ -2227,12 +2493,12 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source } -static bool ZEND_FASTCALL zend_hash_replace_checker_wrapper(HashTable *target, zval *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func) +static bool ZEND_FASTCALL zend_hash_replace_checker_wrapper(HashTable *target, zval *source_data, zend_ulong h, zend_string *key, void *pParam, merge_checker_func_t merge_checker_func) { zend_hash_key hash_key; - hash_key.h = p->h; - hash_key.key = p->key; + hash_key.h = h; + hash_key.key = key; return merge_checker_func(target, source_data, &hash_key, pParam); } @@ -2247,10 +2513,11 @@ ZEND_API void ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, HashTable *sou IS_CONSISTENT(target); HT_ASSERT_RC1(target); + ZEND_ASSERT(!HT_IS_PACKED(source)); for (idx = 0; idx < source->nNumUsed; idx++) { p = source->arData + idx; if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; - if (zend_hash_replace_checker_wrapper(target, &p->val, p, pParam, pMergeSource)) { + if (zend_hash_replace_checker_wrapper(target, &p->val, p->h, p->key, pParam, pMergeSource)) { t = zend_hash_update(target, p->key, &p->val); if (pCopyConstructor) { pCopyConstructor(t); @@ -2299,11 +2566,12 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulon IS_CONSISTENT(ht); - if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(ht)) { if (h < ht->nNumUsed) { - p = ht->arData + h; - if (Z_TYPE(p->val) != IS_UNDEF) { - return &p->val; + zval *zv = ht->arPacked + h; + + if (Z_TYPE_P(zv) != IS_UNDEF) { + return zv; } } return NULL; @@ -2318,6 +2586,7 @@ ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulo Bucket *p; IS_CONSISTENT(ht); + ZEND_ASSERT(!HT_IS_PACKED(ht)); p = zend_hash_index_find_bucket(ht, h); return p ? &p->val : NULL; @@ -2342,11 +2611,21 @@ ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, Has HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); idx = ht->nNumUsed; - while (idx > 0) { - idx--; - if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { - *pos = idx; - return; + if (HT_IS_PACKED(ht)) { + while (idx > 0) { + idx--; + if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) { + *pos = idx; + return; + } + } + } else { + while (idx > 0) { + idx--; + if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { + *pos = idx; + return; + } } } *pos = ht->nNumUsed; @@ -2362,15 +2641,29 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, Hash idx = _zend_hash_get_valid_pos(ht, *pos); if (idx < ht->nNumUsed) { - while (1) { - idx++; - if (idx >= ht->nNumUsed) { - *pos = ht->nNumUsed; - return SUCCESS; + if (HT_IS_PACKED(ht)) { + while (1) { + idx++; + if (idx >= ht->nNumUsed) { + *pos = ht->nNumUsed; + return SUCCESS; + } + if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) { + *pos = idx; + return SUCCESS; + } } - if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { - *pos = idx; - return SUCCESS; + } else { + while (1) { + idx++; + if (idx >= ht->nNumUsed) { + *pos = ht->nNumUsed; + return SUCCESS; + } + if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { + *pos = idx; + return SUCCESS; + } } } } else { @@ -2386,11 +2679,21 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, Ha HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1); if (idx < ht->nNumUsed) { - while (idx > 0) { - idx--; - if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { - *pos = idx; - return SUCCESS; + if (HT_IS_PACKED(ht)) { + while (idx > 0) { + idx--; + if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) { + *pos = idx; + return SUCCESS; + } + } + } else { + while (idx > 0) { + idx--; + if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) { + *pos = idx; + return SUCCESS; + } } } *pos = ht->nNumUsed; @@ -2410,6 +2713,10 @@ ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zen IS_CONSISTENT(ht); idx = _zend_hash_get_valid_pos(ht, *pos); if (idx < ht->nNumUsed) { + if (HT_IS_PACKED(ht)) { + *num_index = idx; + return HASH_KEY_IS_LONG; + } p = ht->arData + idx; if (p->key) { *str_index = p->key; @@ -2432,6 +2739,10 @@ ZEND_API void ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *h if (idx >= ht->nNumUsed) { ZVAL_NULL(key); } else { + if (HT_IS_PACKED(ht)) { + ZVAL_LONG(key, idx); + return; + } p = ht->arData + idx; if (p->key) { ZVAL_STR_COPY(key, p->key); @@ -2449,6 +2760,9 @@ ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, Hash IS_CONSISTENT(ht); idx = _zend_hash_get_valid_pos(ht, *pos); if (idx < ht->nNumUsed) { + if (HT_IS_PACKED(ht)) { + return HASH_KEY_IS_LONG; + } p = ht->arData + idx; if (p->key) { return HASH_KEY_IS_STRING; @@ -2468,6 +2782,9 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPo IS_CONSISTENT(ht); idx = _zend_hash_get_valid_pos(ht, *pos); if (idx < ht->nNumUsed) { + if (HT_IS_PACKED(ht)) { + return &ht->arPacked[idx]; + } p = ht->arData + idx; return &p->val; } else { @@ -2531,6 +2848,10 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b return; } + if (HT_IS_PACKED(ht)) { + zend_hash_packed_to_hash(ht); // TODO: ??? + } + if (HT_IS_WITHOUT_HOLES(ht)) { /* Store original order of elements in extra space to allow stable sorting. */ for (i = 0; i < ht->nNumUsed; i++) { @@ -2552,7 +2873,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b sort((void *)ht->arData, ht->nNumUsed, sizeof(Bucket), (compare_func_t) compar, (swap_func_t)(renumber? zend_hash_bucket_renum_swap : - ((HT_FLAGS(ht) & HASH_FLAG_PACKED) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap))); + (HT_IS_PACKED(ht) ? zend_hash_bucket_packed_swap : zend_hash_bucket_swap))); ht->nInternalPointer = 0; @@ -2568,7 +2889,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b ht->nNextFreeElement = i; } - if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(ht)) { if (!renumber) { zend_hash_packed_to_hash(ht); } @@ -2576,12 +2897,19 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b if (renumber) { void *new_data, *old_data = HT_GET_DATA_ADDR(ht); Bucket *old_buckets = ht->arData; + zval *zv; - new_data = pemalloc(HT_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); + new_data = pemalloc(HT_PACKED_SIZE_EX(ht->nTableSize, HT_MIN_MASK), (GC_FLAGS(ht) & IS_ARRAY_PERSISTENT)); HT_FLAGS(ht) |= HASH_FLAG_PACKED | HASH_FLAG_STATIC_KEYS; ht->nTableMask = HT_MIN_MASK; HT_SET_DATA_ADDR(ht, new_data); - memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); + p = old_buckets; + zv = ht->arPacked; + for (i = 0; i < ht->nTableSize; i++) { + ZVAL_COPY_VALUE(zv, &p->val); + zv++; + p++; + } pefree(old_data, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT); HT_HASH_RESET_PACKED(ht); } else { @@ -2592,58 +2920,82 @@ 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) { uint32_t idx1, idx2; + zend_string *key1, *key2; + zend_ulong h1, h2; + zval *pData1, *pData2;; + int result; if (ht1->nNumOfElements != ht2->nNumOfElements) { return ht1->nNumOfElements > ht2->nNumOfElements ? 1 : -1; } for (idx1 = 0, idx2 = 0; idx1 < ht1->nNumUsed; idx1++) { - Bucket *p1 = ht1->arData + idx1, *p2; - zval *pData1, *pData2; - int result; + if (HT_IS_PACKED(ht1)) { + pData1 = ht1->arPacked + idx1; + h1 = idx1; + key1 = NULL; + } else { + Bucket *p = ht1->arData + idx1; + pData1 = &p->val; + h1 = p->h; + key1 = p->key; + } - if (Z_TYPE(p1->val) == IS_UNDEF) continue; + if (Z_TYPE_P(pData1) == IS_UNDEF) continue; if (ordered) { - while (1) { - ZEND_ASSERT(idx2 != ht2->nNumUsed); - p2 = ht2->arData + idx2; - if (Z_TYPE(p2->val) != IS_UNDEF) break; - idx2++; - } - if (p1->key == NULL && p2->key == NULL) { /* numeric indices */ - if (p1->h != p2->h) { - return p1->h > p2->h ? 1 : -1; + if (HT_IS_PACKED(ht2)) { + while (1) { + ZEND_ASSERT(idx2 != ht2->nNumUsed); + pData2 = ht2->arPacked + idx2; + h2 = idx2; + key2 = NULL; + if (Z_TYPE_P(pData2) != IS_UNDEF) break; + idx2++; + } + } else { + while (1) { + Bucket *p; + ZEND_ASSERT(idx2 != ht2->nNumUsed); + p = ht2->arData + idx2; + pData2 = &p->val; + h2 = p->h; + key2 = p->key; + if (Z_TYPE_P(pData2) != IS_UNDEF) break; + idx2++; + } + } + if (key1 == NULL && key2 == NULL) { /* numeric indices */ + if (h1 != h2) { + return h1 > h2 ? 1 : -1; } - } else if (p1->key != NULL && p2->key != NULL) { /* string indices */ - if (ZSTR_LEN(p1->key) != ZSTR_LEN(p2->key)) { - return ZSTR_LEN(p1->key) > ZSTR_LEN(p2->key) ? 1 : -1; + } else if (key1 != NULL && key2 != NULL) { /* string indices */ + if (ZSTR_LEN(key1) != ZSTR_LEN(key2)) { + return ZSTR_LEN(key1) > ZSTR_LEN(key2) ? 1 : -1; } - result = memcmp(ZSTR_VAL(p1->key), ZSTR_VAL(p2->key), ZSTR_LEN(p1->key)); + result = memcmp(ZSTR_VAL(key1), ZSTR_VAL(key2), ZSTR_LEN(key1)); if (result != 0) { return result; } } else { /* Mixed key types: A string key is considered as larger */ - return p1->key != NULL ? 1 : -1; + return key1 != NULL ? 1 : -1; } - pData2 = &p2->val; idx2++; } else { - if (p1->key == NULL) { /* numeric index */ - pData2 = zend_hash_index_find(ht2, p1->h); + if (key1 == NULL) { /* numeric index */ + pData2 = zend_hash_index_find(ht2, h1); if (pData2 == NULL) { return 1; } } else { /* string index */ - pData2 = zend_hash_find(ht2, p1->key); + pData2 = zend_hash_find(ht2, key1); if (pData2 == NULL) { return 1; } } } - pData1 = &p1->val; if (Z_TYPE_P(pData1) == IS_INDIRECT) { pData1 = Z_INDIRECT_P(pData1); } @@ -2694,10 +3046,10 @@ ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t co } -ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, bucket_compare_func_t compar, uint32_t flag) +ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t flag) { uint32_t idx; - Bucket *p, *res; + zval *res; IS_CONSISTENT(ht); @@ -2705,30 +3057,60 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, bucket_compar return NULL; } - idx = 0; - while (1) { - if (idx == ht->nNumUsed) { - return NULL; + if (HT_IS_PACKED(ht)) { + zval *zv; + + idx = 0; + while (1) { + if (idx == ht->nNumUsed) { + return NULL; + } + if (Z_TYPE(ht->arPacked[idx]) != IS_UNDEF) break; + idx++; } - if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) break; - idx++; - } - res = ht->arData + idx; - for (; idx < ht->nNumUsed; idx++) { - p = ht->arData + idx; - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + res = ht->arPacked + idx; + for (; idx < ht->nNumUsed; idx++) { + zv = ht->arPacked + idx; + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) continue; - if (flag) { - if (compar(res, p) < 0) { /* max */ - res = p; + if (flag) { + if (compar(res, zv) < 0) { /* max */ + res = zv; + } + } else { + if (compar(res, zv) > 0) { /* min */ + res = zv; + } } - } else { - if (compar(res, p) > 0) { /* min */ - res = p; + } + } else { + Bucket *p; + + idx = 0; + while (1) { + if (idx == ht->nNumUsed) { + return NULL; + } + if (Z_TYPE(ht->arData[idx].val) != IS_UNDEF) break; + idx++; + } + res = &ht->arData[idx].val; + for (; idx < ht->nNumUsed; idx++) { + p = ht->arData + idx; + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue; + + if (flag) { + if (compar(res, &p->val) < 0) { /* max */ + res = &p->val; + } + } else { + if (compar(res, &p->val) > 0) { /* min */ + res = &p->val; + } } } } - return &res->val; + return res; } ZEND_API bool ZEND_FASTCALL _zend_handle_numeric_str_ex(const char *key, size_t length, zend_ulong *idx) @@ -2784,7 +3166,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht) goto convert; } - ZEND_HASH_FOREACH_STR_KEY(ht, str_key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, str_key) { if (!str_key) { goto convert; } @@ -2833,16 +3215,18 @@ ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool zend_string *str_key; zval *zv; - ZEND_HASH_FOREACH_STR_KEY(ht, str_key) { - /* The `str_key &&` here might seem redundant: property tables should - * only have string keys. Unfortunately, this isn't true, at the very - * least because of ArrayObject, which stores a symtable where the - * property table should be. - */ - if (str_key && ZEND_HANDLE_NUMERIC(str_key, num_key)) { - goto convert; - } - } ZEND_HASH_FOREACH_END(); + if (!HT_IS_PACKED(ht)) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, str_key) { + /* The `str_key &&` here might seem redundant: property tables should + * only have string keys. Unfortunately, this isn't true, at the very + * least because of ArrayObject, which stores a symtable where the + * property table should be. + */ + if (str_key && ZEND_HANDLE_NUMERIC(str_key, num_key)) { + goto convert; + } + } ZEND_HASH_FOREACH_END(); + } if (always_duplicate) { return zend_array_dup(ht); @@ -2858,7 +3242,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool { HashTable *new_ht = zend_new_array(zend_hash_num_elements(ht)); - ZEND_HASH_FOREACH_KEY_VAL_IND(ht, num_key, str_key, zv) { + ZEND_HASH_MAP_FOREACH_KEY_VAL_IND(ht, num_key, str_key, zv) { do { if (Z_OPT_REFCOUNTED_P(zv)) { if (Z_ISREF_P(zv) && Z_REFCOUNT_P(zv) == 1) { diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 092682d67713a..b7559257d27e5 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -170,6 +170,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char * ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key, size_t len); ZEND_API zend_result ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h); ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p); +ZEND_API void ZEND_FASTCALL zend_hash_packed_del_val(HashTable *ht, zval *zv); /* Data retrieval */ ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key); @@ -192,7 +193,7 @@ static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_stri #define ZEND_HASH_INDEX_FIND(_ht, _h, _ret, _not_found) do { \ if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \ if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \ - _ret = &_ht->arData[_h].val; \ + _ret = &_ht->arPacked[_h]; \ if (UNEXPECTED(Z_TYPE_P(_ret) == IS_UNDEF)) { \ goto _not_found; \ } \ @@ -215,7 +216,7 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_index_lookup(HashTable *ht, zend_ulong h) #define ZEND_HASH_INDEX_LOOKUP(_ht, _h, _ret) do { \ if (EXPECTED(HT_FLAGS(_ht) & HASH_FLAG_PACKED)) { \ if (EXPECTED((zend_ulong)(_h) < (zend_ulong)(_ht)->nNumUsed)) { \ - _ret = &_ht->arData[_h].val; \ + _ret = &_ht->arPacked[_h]; \ if (EXPECTED(Z_TYPE_P(_ret) != IS_UNDEF)) { \ break; \ } \ @@ -284,7 +285,7 @@ ZEND_API void zend_hash_bucket_packed_swap(Bucket *p, Bucket *q); typedef int (*bucket_compare_func_t)(Bucket *a, Bucket *b); ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered); ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort_func, bucket_compare_func_t compare_func, bool renumber); -ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, bucket_compare_func_t compar, uint32_t flag); +ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_t compar, uint32_t flag); #define zend_hash_sort(ht, compare_func, renumber) \ zend_hash_sort_ex(ht, zend_sort, compare_func, renumber) @@ -958,15 +959,68 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, #define zend_hash_get_current_data_ptr(ht) \ zend_hash_get_current_data_ptr_ex(ht, &(ht)->nInternalPointer) +/* Common hash/packed array iterators */ +#if 0 +# define ZEND_HASH_ELEMENT_SIZE(__ht) \ + (HT_IS_PACKED(__ht) ? sizeof(zval) : sizeof(Bucket)) +#else /* optimized version */ +# define ZEND_HASH_ELEMENT_SIZE(__ht) \ + (sizeof(zval) + (~HT_FLAGS(__ht) & HASH_FLAG_PACKED) * ((sizeof(Bucket)-sizeof(zval))/HASH_FLAG_PACKED)) +#endif + +#define ZEND_HASH_ELEMENT_EX(__ht, _idx, _size) \ + ((zval*)(((char*)(__ht)->arPacked) + ((_idx) * (_size)))) + +#define ZEND_HASH_ELEMENT(__ht, _idx) \ + ZEND_HASH_ELEMENT_EX(__ht, _idx, ZEND_HASH_ELEMENT_SIZE(__ht)) + +#define ZEND_HASH_NEXT_ELEMENT(_el, _size) \ + ((zval*)(((char*)(_el)) + (_size))) + +#define ZEND_HASH_PREV_ELEMENT(_el, _size) \ + ((zval*)(((char*)(_el)) - (_size))) + +#define _ZEND_HASH_FOREACH_VAL(_ht) do { \ + HashTable *__ht = (_ht); \ + uint32_t _count = __ht->nNumUsed; \ + size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \ + zval *_z = __ht->arPacked; \ + for (; _count > 0; _z = ZEND_HASH_NEXT_ELEMENT(_z, _size), _count--) { \ + if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; + +#define _ZEND_HASH_REVERSE_FOREACH_VAL(_ht) do { \ + HashTable *__ht = (_ht); \ + uint32_t _idx = __ht->nNumUsed; \ + size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \ + zval *_z = ZEND_HASH_ELEMENT_EX(__ht, _idx, _size); \ + for (;_idx > 0; _idx--) { \ + _z = ZEND_HASH_PREV_ELEMENT(_z, _size); \ + if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; + #define ZEND_HASH_FOREACH_FROM(_ht, indirect, _from) do { \ HashTable *__ht = (_ht); \ - Bucket *_p = __ht->arData + (_from); \ - Bucket *_end = __ht->arData + __ht->nNumUsed; \ - for (; _p != _end; _p++) { \ - zval *_z = &_p->val; \ - if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ - _z = Z_INDIRECT_P(_z); \ + zend_ulong __h; \ + zend_string *__key = NULL; \ + uint32_t _idx = (_from); \ + size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \ + zval *__z = ZEND_HASH_ELEMENT_EX(__ht, _idx, _size); \ + uint32_t _count = __ht->nNumUsed - _idx; \ + for (;_count > 0; _count--) { \ + zval *_z = __z; \ + if (HT_IS_PACKED(__ht)) { \ + __z++; \ + __h = _idx; \ + _idx++; \ + } else { \ + Bucket *_p = (Bucket*)__z; \ + __z = &(_p + 1)->val; \ + __h = _p->h; \ + __key = _p->key; \ + if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ } \ + (void) __h; (void) __key; (void) _idx; \ if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; #define ZEND_HASH_FOREACH(_ht, indirect) ZEND_HASH_FOREACH_FROM(_ht, indirect, 0) @@ -974,14 +1028,28 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, #define ZEND_HASH_REVERSE_FOREACH(_ht, indirect) do { \ HashTable *__ht = (_ht); \ uint32_t _idx = __ht->nNumUsed; \ - Bucket *_p = __ht->arData + _idx; \ zval *_z; \ - for (_idx = __ht->nNumUsed; _idx > 0; _idx--) { \ - _p--; \ - _z = &_p->val; \ - if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ - _z = Z_INDIRECT_P(_z); \ + zend_ulong __h; \ + zend_string *__key = NULL; \ + size_t _size = ZEND_HASH_ELEMENT_SIZE(__ht); \ + zval *__z = ZEND_HASH_ELEMENT_EX(__ht, _idx, _size); \ + for (;_idx > 0; _idx--) { \ + if (HT_IS_PACKED(__ht)) { \ + __z--; \ + _z = __z; \ + __h = _idx - 1; \ + } else { \ + Bucket *_p = (Bucket*)__z; \ + _p--; \ + __z = &_p->val; \ + _z = __z; \ + __h = _p->h; \ + __key = _p->key; \ + if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ } \ + (void) __h; (void) __key; (void) __z; \ if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; #define ZEND_HASH_FOREACH_END() \ @@ -989,44 +1057,23 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, } while (0) #define ZEND_HASH_FOREACH_END_DEL() \ - __ht->nNumOfElements--; \ - do { \ - uint32_t j = HT_IDX_TO_HASH(_idx - 1); \ - uint32_t nIndex = _p->h | __ht->nTableMask; \ - uint32_t i = HT_HASH(__ht, nIndex); \ - if (UNEXPECTED(j != i)) { \ - Bucket *prev = HT_HASH_TO_BUCKET(__ht, i); \ - while (Z_NEXT(prev->val) != j) { \ - i = Z_NEXT(prev->val); \ - prev = HT_HASH_TO_BUCKET(__ht, i); \ - } \ - Z_NEXT(prev->val) = Z_NEXT(_p->val); \ - } else { \ - HT_HASH(__ht, nIndex) = Z_NEXT(_p->val); \ - } \ - } while (0); \ - } \ - __ht->nNumUsed = _idx; \ - } while (0) + ZEND_HASH_MAP_FOREACH_END_DEL() #define ZEND_HASH_FOREACH_BUCKET(ht, _bucket) \ - ZEND_HASH_FOREACH(ht, 0); \ - _bucket = _p; + ZEND_HASH_MAP_FOREACH_BUCKET(ht, _bucket) #define ZEND_HASH_FOREACH_BUCKET_FROM(ht, _bucket, _from) \ - ZEND_HASH_FOREACH_FROM(ht, 0, _from); \ - _bucket = _p; + ZEND_HASH_MAP_FOREACH_BUCKET_FROM(ht, _bucket, _from) #define ZEND_HASH_REVERSE_FOREACH_BUCKET(ht, _bucket) \ - ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _bucket = _p; + ZEND_HASH_MAP_REVERSE_FOREACH_BUCKET(ht, _bucket) #define ZEND_HASH_FOREACH_VAL(ht, _val) \ - ZEND_HASH_FOREACH(ht, 0); \ + _ZEND_HASH_FOREACH_VAL(ht); \ _val = _z; #define ZEND_HASH_REVERSE_FOREACH_VAL(ht, _val) \ - ZEND_HASH_REVERSE_FOREACH(ht, 0); \ + _ZEND_HASH_REVERSE_FOREACH_VAL(ht); \ _val = _z; #define ZEND_HASH_FOREACH_VAL_IND(ht, _val) \ @@ -1038,7 +1085,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, _val = _z; #define ZEND_HASH_FOREACH_PTR(ht, _ptr) \ - ZEND_HASH_FOREACH(ht, 0); \ + _ZEND_HASH_FOREACH_VAL(ht); \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_FOREACH_PTR_FROM(ht, _ptr, _from) \ @@ -1046,126 +1093,402 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, _ptr = Z_PTR_P(_z); #define ZEND_HASH_REVERSE_FOREACH_PTR(ht, _ptr) \ - ZEND_HASH_REVERSE_FOREACH(ht, 0); \ + _ZEND_HASH_REVERSE_FOREACH_VAL(ht, 0); \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \ ZEND_HASH_FOREACH(ht, 0); \ - _h = _p->h; + _h = __h; #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY(ht, _h) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _h = _p->h; + _h = __h; #define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \ ZEND_HASH_FOREACH(ht, 0); \ - _key = _p->key; + _key = __key; #define ZEND_HASH_REVERSE_FOREACH_STR_KEY(ht, _key) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _key = _p->key; + _key = __key; #define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \ ZEND_HASH_FOREACH(ht, 0); \ - _h = _p->h; \ - _key = _p->key; + _h = __h; \ + _key = __key; #define ZEND_HASH_REVERSE_FOREACH_KEY(ht, _h, _key) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _h = _p->h; \ - _key = _p->key; + _h = __h; \ + _key = __key; #define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \ ZEND_HASH_FOREACH(ht, 0); \ - _h = _p->h; \ + _h = __h; \ _val = _z; #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_VAL(ht, _h, _val) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _h = _p->h; \ + _h = __h; \ _val = _z; #define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \ ZEND_HASH_FOREACH(ht, 0); \ - _key = _p->key; \ + _key = __key; \ _val = _z; #define ZEND_HASH_FOREACH_STR_KEY_VAL_FROM(ht, _key, _val, _from) \ ZEND_HASH_FOREACH_FROM(ht, 0, _from); \ - _key = _p->key; \ + _key = __key; \ _val = _z; #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _key = _p->key; \ + _key = __key; \ _val = _z; #define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \ ZEND_HASH_FOREACH(ht, 0); \ - _h = _p->h; \ - _key = _p->key; \ + _h = __h; \ + _key = __key; \ _val = _z; #define ZEND_HASH_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _h = _p->h; \ - _key = _p->key; \ + _h = __h; \ + _key = __key; \ _val = _z; #define ZEND_HASH_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \ ZEND_HASH_FOREACH(ht, 1); \ - _key = _p->key; \ + _key = __key; \ _val = _z; #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \ ZEND_HASH_REVERSE_FOREACH(ht, 1); \ - _key = _p->key; \ + _key = __key; \ _val = _z; #define ZEND_HASH_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ ZEND_HASH_FOREACH(ht, 1); \ - _h = _p->h; \ - _key = _p->key; \ + _h = __h; \ + _key = __key; \ _val = _z; #define ZEND_HASH_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ ZEND_HASH_REVERSE_FOREACH(ht, 1); \ - _h = _p->h; \ - _key = _p->key; \ + _h = __h; \ + _key = __key; \ _val = _z; #define ZEND_HASH_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \ ZEND_HASH_FOREACH(ht, 0); \ - _h = _p->h; \ + _h = __h; \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_REVERSE_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _h = _p->h; \ + _h = __h; \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \ ZEND_HASH_FOREACH(ht, 0); \ - _key = _p->key; \ + _key = __key; \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_REVERSE_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ - _key = _p->key; \ + _key = __key; \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \ ZEND_HASH_FOREACH(ht, 0); \ - _h = _p->h; \ - _key = _p->key; \ + _h = __h; \ + _key = __key; \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_REVERSE_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \ ZEND_HASH_REVERSE_FOREACH(ht, 0); \ + _h = __h; \ + _key = __key; \ + _ptr = Z_PTR_P(_z); + +/* Hash array iterators */ +#define ZEND_HASH_MAP_FOREACH_FROM(_ht, indirect, _from) do { \ + HashTable *__ht = (_ht); \ + Bucket *_p = __ht->arData + (_from); \ + Bucket *_end = __ht->arData + __ht->nNumUsed; \ + ZEND_ASSERT(!HT_IS_PACKED(__ht)); \ + for (; _p != _end; _p++) { \ + zval *_z = &_p->val; \ + if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ + if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; + +#define ZEND_HASH_MAP_FOREACH(_ht, indirect) ZEND_HASH_MAP_FOREACH_FROM(_ht, indirect, 0) + +#define ZEND_HASH_MAP_REVERSE_FOREACH(_ht, indirect) do { \ + HashTable *__ht = (_ht); \ + uint32_t _idx = __ht->nNumUsed; \ + Bucket *_p = __ht->arData + _idx; \ + zval *_z; \ + ZEND_ASSERT(!HT_IS_PACKED(__ht)); \ + for (_idx = __ht->nNumUsed; _idx > 0; _idx--) { \ + _p--; \ + _z = &_p->val; \ + if (indirect && Z_TYPE_P(_z) == IS_INDIRECT) { \ + _z = Z_INDIRECT_P(_z); \ + } \ + if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; + +#define ZEND_HASH_MAP_FOREACH_END_DEL() \ + ZEND_ASSERT(!HT_IS_PACKED(__ht)); \ + __ht->nNumOfElements--; \ + do { \ + uint32_t j = HT_IDX_TO_HASH(_idx - 1); \ + uint32_t nIndex = _p->h | __ht->nTableMask; \ + uint32_t i = HT_HASH(__ht, nIndex); \ + if (UNEXPECTED(j != i)) { \ + Bucket *prev = HT_HASH_TO_BUCKET(__ht, i); \ + while (Z_NEXT(prev->val) != j) { \ + i = Z_NEXT(prev->val); \ + prev = HT_HASH_TO_BUCKET(__ht, i); \ + } \ + Z_NEXT(prev->val) = Z_NEXT(_p->val); \ + } else { \ + HT_HASH(__ht, nIndex) = Z_NEXT(_p->val); \ + } \ + } while (0); \ + } \ + __ht->nNumUsed = _idx; \ + } while (0) + +#define ZEND_HASH_MAP_FOREACH_BUCKET(ht, _bucket) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _bucket = _p; + +#define ZEND_HASH_MAP_FOREACH_BUCKET_FROM(ht, _bucket, _from) \ + ZEND_HASH_MAP_FOREACH_FROM(ht, 0, _from); \ + _bucket = _p; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_BUCKET(ht, _bucket) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _bucket = _p; + +#define ZEND_HASH_MAP_FOREACH_VAL(ht, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_VAL(ht, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_VAL_IND(ht, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 1); \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_VAL_IND(ht, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 1); \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_PTR(ht, _ptr) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_FOREACH_PTR_FROM(ht, _ptr, _from) \ + ZEND_HASH_MAP_FOREACH_FROM(ht, 0, _from); \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_REVERSE_FOREACH_PTR(ht, _ptr) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_FOREACH_NUM_KEY(ht, _h) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _h = _p->h; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_NUM_KEY(ht, _h) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _h = _p->h; + +#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _key = _p->key; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY(ht, _key) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _key = _p->key; + +#define ZEND_HASH_MAP_FOREACH_KEY(ht, _h, _key) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY(ht, _h, _key) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; + +#define ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(ht, _h, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _h = _p->h; \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_NUM_KEY_VAL(ht, _h, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _h = _p->h; \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, _key, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_FROM(ht, _key, _val, _from) \ + ZEND_HASH_MAP_FOREACH_FROM(ht, 0, _from); \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL(ht, _key, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_KEY_VAL(ht, _h, _key, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY_VAL(ht, _h, _key, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 1); \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_VAL_IND(ht, _key, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 1); \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ + ZEND_HASH_MAP_FOREACH(ht, 1); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY_VAL_IND(ht, _h, _key, _val) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 1); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_MAP_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _h = _p->h; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_REVERSE_FOREACH_NUM_KEY_PTR(ht, _h, _ptr) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _h = _p->h; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _key = _p->key; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_REVERSE_FOREACH_STR_KEY_PTR(ht, _key, _ptr) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ + _key = _p->key; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \ + ZEND_HASH_MAP_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_MAP_REVERSE_FOREACH_KEY_PTR(ht, _h, _key, _ptr) \ + ZEND_HASH_MAP_REVERSE_FOREACH(ht, 0); \ _h = _p->h; \ _key = _p->key; \ _ptr = Z_PTR_P(_z); +/* Packed array iterators */ +#define ZEND_HASH_PACKED_FOREACH_FROM(_ht, _from) do { \ + HashTable *__ht = (_ht); \ + zend_ulong _idx = (_from); \ + zval *_z = __ht->arPacked + (_from); \ + zval *_end = __ht->arPacked + __ht->nNumUsed; \ + ZEND_ASSERT(HT_IS_PACKED(__ht)); \ + for (;_z != _end; _z++, _idx++) { \ + (void) _idx; \ + if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; + +#define ZEND_HASH_PACKED_FOREACH(_ht) ZEND_HASH_PACKED_FOREACH_FROM(_ht, 0) + +#define ZEND_HASH_PACKED_REVERSE_FOREACH(_ht) do { \ + HashTable *__ht = (_ht); \ + zend_ulong _idx = __ht->nNumUsed; \ + zval *_z = __ht->arPacked + _idx; \ + ZEND_ASSERT(HT_IS_PACKED(__ht)); \ + while (_idx > 0) { \ + _z--; \ + _idx--; \ + (void) _idx; \ + if (UNEXPECTED(Z_TYPE_P(_z) == IS_UNDEF)) continue; + +#define ZEND_HASH_PACKED_FOREACH_VAL(ht, _val) \ + ZEND_HASH_PACKED_FOREACH(ht); \ + _val = _z; + +#define ZEND_HASH_PACKED_REVERSE_FOREACH_VAL(ht, _val) \ + ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \ + _val = _z; + +#define ZEND_HASH_PACKED_FOREACH_PTR(ht, _ptr) \ + ZEND_HASH_PACKED_FOREACH(ht); \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_PACKED_REVERSE_FOREACH_PTR(ht, _ptr) \ + ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_PACKED_FOREACH_KEY(ht, _h) \ + ZEND_HASH_PACKED_FOREACH(ht); \ + _h = _idx; + +#define ZEND_HASH_PACKED_REVERSE_FOREACH_KEY(ht, _h) \ + ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \ + _h = _idx; + +#define ZEND_HASH_PACKED_FOREACH_KEY_VAL(ht, _h, _val) \ + ZEND_HASH_PACKED_FOREACH(ht); \ + _h = _idx; \ + _val = _z; + +#define ZEND_HASH_PACKED_REVERSE_FOREACH_KEY_VAL(ht, _h, _val) \ + ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \ + _h = _idx; \ + _val = _z; + +#define ZEND_HASH_PACKED_FOREACH_KEY_PTR(ht, _h, _ptr) \ + ZEND_HASH_PACKED_FOREACH(ht); \ + _h = _idx; \ + _ptr = Z_PTR_P(_z); + +#define ZEND_HASH_PACKED_REVERSE_FOREACH_KEY_PTR(ht, _h, _ptr) \ + ZEND_HASH_PACKED_REVERSE_FOREACH(ht); \ + _h = _idx; \ + _ptr = Z_PTR_P(_z); + /* The following macros are useful to insert a sequence of new elements * of packed array. They may be used instead of series of * zend_hash_next_index_insert_new() @@ -1173,7 +1496,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, */ #define ZEND_HASH_FILL_PACKED(ht) do { \ HashTable *__fill_ht = (ht); \ - Bucket *__fill_bkt = __fill_ht->arData + __fill_ht->nNumUsed; \ + zval *__fill_val = __fill_ht->arPacked + __fill_ht->nNumUsed; \ uint32_t __fill_idx = __fill_ht->nNumUsed; \ ZEND_ASSERT(HT_FLAGS(__fill_ht) & HASH_FLAG_PACKED); @@ -1183,35 +1506,33 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, __fill_ht->nNumOfElements = __fill_idx; \ __fill_ht->nNextFreeElement = __fill_idx; \ zend_hash_packed_grow(__fill_ht); \ - __fill_bkt = __fill_ht->arData + __fill_idx; \ + __fill_val = __fill_ht->arPacked + __fill_idx; \ } \ } while (0); #define ZEND_HASH_FILL_SET(_val) \ - ZVAL_COPY_VALUE(&__fill_bkt->val, _val) + ZVAL_COPY_VALUE(__fill_val, _val) #define ZEND_HASH_FILL_SET_NULL() \ - ZVAL_NULL(&__fill_bkt->val) + ZVAL_NULL(__fill_val) #define ZEND_HASH_FILL_SET_LONG(_val) \ - ZVAL_LONG(&__fill_bkt->val, _val) + ZVAL_LONG(__fill_val, _val) #define ZEND_HASH_FILL_SET_DOUBLE(_val) \ - ZVAL_DOUBLE(&__fill_bkt->val, _val) + ZVAL_DOUBLE(__fill_val, _val) #define ZEND_HASH_FILL_SET_STR(_val) \ - ZVAL_STR(&__fill_bkt->val, _val) + ZVAL_STR(__fill_val, _val) #define ZEND_HASH_FILL_SET_STR_COPY(_val) \ - ZVAL_STR_COPY(&__fill_bkt->val, _val) + ZVAL_STR_COPY(__fill_val, _val) #define ZEND_HASH_FILL_SET_INTERNED_STR(_val) \ - ZVAL_INTERNED_STR(&__fill_bkt->val, _val) + ZVAL_INTERNED_STR(__fill_val, _val) #define ZEND_HASH_FILL_NEXT() do {\ - __fill_bkt->h = (__fill_idx); \ - __fill_bkt->key = NULL; \ - __fill_bkt++; \ + __fill_val++; \ __fill_idx++; \ } while (0) @@ -1243,16 +1564,24 @@ static zend_always_inline bool zend_array_is_list(zend_array *array) } /* Packed arrays are lists */ - if (HT_IS_PACKED(array) && HT_IS_WITHOUT_HOLES(array)) { - return 1; - } - - /* Check if the list could theoretically be repacked */ - ZEND_HASH_FOREACH_KEY(array, num_idx, str_idx) { - if (str_idx != NULL || num_idx != expected_idx++) { - return 0; + if (HT_IS_PACKED(array)) { + if (HT_IS_WITHOUT_HOLES(array)) { + return 1; } - } ZEND_HASH_FOREACH_END(); + /* Check if the list could theoretically be repacked */ + ZEND_HASH_PACKED_FOREACH_KEY(array, num_idx) { + if (num_idx != expected_idx++) { + return 0; + } + } ZEND_HASH_FOREACH_END(); + } else { + /* Check if the list could theoretically be repacked */ + ZEND_HASH_MAP_FOREACH_KEY(array, num_idx, str_idx) { + if (str_idx != NULL || num_idx != expected_idx++) { + return 0; + } + } ZEND_HASH_FOREACH_END(); + } return 1; } diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 0e8e1aa4627a7..ffb8fbe9e6553 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -979,7 +979,7 @@ static void ZEND_COLD emit_incompatible_method_error( if (status == INHERITANCE_UNRESOLVED) { /* Fetch the first unresolved class from registered autoloads */ zend_string *unresolved_class = NULL; - ZEND_HASH_FOREACH_STR_KEY(CG(delayed_autoloads), unresolved_class) { + ZEND_HASH_MAP_FOREACH_STR_KEY(CG(delayed_autoloads), unresolved_class) { break; } ZEND_HASH_FOREACH_END(); ZEND_ASSERT(unresolved_class); @@ -1397,7 +1397,7 @@ void zend_build_properties_info_table(zend_class_entry *ce) } } - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop) { if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) { table[OBJ_PROP_TO_NUM(prop->offset)] = prop; } @@ -1529,7 +1529,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par } } - ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, property_info) { if (property_info->ce == ce) { if (property_info->flags & ZEND_ACC_STATIC) { property_info->offset += parent_ce->default_static_members_count; @@ -1544,7 +1544,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par zend_hash_num_elements(&ce->properties_info) + zend_hash_num_elements(&parent_ce->properties_info), 0); - ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->properties_info, key, property_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->properties_info, key, property_info) { do_inherit_property(property_info, key, ce); } ZEND_HASH_FOREACH_END(); } @@ -1556,7 +1556,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par zend_hash_num_elements(&ce->constants_table) + zend_hash_num_elements(&parent_ce->constants_table), 0); - ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->constants_table, key, c) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->constants_table, key, c) { do_inherit_class_constant(key, c, ce); } ZEND_HASH_FOREACH_END(); } @@ -1567,11 +1567,11 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par zend_hash_num_elements(&parent_ce->function_table), 0); if (checked) { - ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) { do_inherit_method(key, func, ce, 0, 1); } ZEND_HASH_FOREACH_END(); } else { - ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) { do_inherit_method(key, func, ce, 0, 0); } ZEND_HASH_FOREACH_END(); } @@ -1649,11 +1649,11 @@ static void do_interface_implementation(zend_class_entry *ce, zend_class_entry * zend_string *key; zend_class_constant *c; - ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) { do_inherit_iface_constant(key, c, ce, iface); } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->function_table, key, func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&iface->function_table, key, func) { do_inherit_method(key, func, ce, 1, 0); } ZEND_HASH_FOREACH_END(); @@ -1688,7 +1688,7 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry } if (ignore) { /* Check for attempt to redeclare interface constants */ - ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) { do_inherit_constant_check(ce, c, key); } ZEND_HASH_FOREACH_END(); } else { @@ -1733,7 +1733,7 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry return; } /* skip duplications */ - ZEND_HASH_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&iface->constants_table, key, c) { do_inherit_constant_check(ce, c, key); } ZEND_HASH_FOREACH_END(); @@ -2104,7 +2104,7 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry for (i = 0; i < ce->num_traits; i++) { if (traits[i]) { /* copies functions, applies defined aliasing, and excludes unused trait methods */ - ZEND_HASH_FOREACH_STR_KEY_PTR(&traits[i]->function_table, key, fn) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->function_table, key, fn) { zend_traits_copy_functions(key, fn, ce, exclude_tables[i], aliases); } ZEND_HASH_FOREACH_END(); @@ -2118,14 +2118,14 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry } else { for (i = 0; i < ce->num_traits; i++) { if (traits[i]) { - ZEND_HASH_FOREACH_STR_KEY_PTR(&traits[i]->function_table, key, fn) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->function_table, key, fn) { zend_traits_copy_functions(key, fn, ce, NULL, aliases); } ZEND_HASH_FOREACH_END(); } } } - ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, fn) { zend_fixup_trait_method(fn, ce); } ZEND_HASH_FOREACH_END(); } @@ -2168,7 +2168,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent if (!traits[i]) { continue; } - ZEND_HASH_FOREACH_STR_KEY_PTR(&traits[i]->properties_info, prop_name, property_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->properties_info, prop_name, property_info) { uint32_t flags = property_info->flags; /* next: check for conflicts with current class */ @@ -2313,7 +2313,7 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ bool is_explicit_abstract = (ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) != 0; memset(&ai, 0, sizeof(ai)); - ZEND_HASH_FOREACH_PTR(&ce->function_table, func) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, func) { if (func->common.fn_flags & ZEND_ACC_ABSTRACT) { /* If the class is explicitly abstract, we only check private abstract methods, * because only they must be declared in the same class. */ @@ -2492,7 +2492,7 @@ static void load_delayed_classes(zend_class_entry *ce) { /* Take ownership of this HT, to avoid concurrent modification during autoloading. */ CG(delayed_autoloads) = NULL; - ZEND_HASH_FOREACH_STR_KEY(delayed_autoloads, name) { + ZEND_HASH_MAP_FOREACH_STR_KEY(delayed_autoloads, name) { zend_lookup_class(name); if (EG(exception)) { zend_exception_uncaught_error( @@ -2530,7 +2530,7 @@ static void report_variance_errors(zend_class_entry *ce) { obligations = zend_hash_index_find_ptr(all_obligations, num_key); ZEND_ASSERT(obligations != NULL); - ZEND_HASH_FOREACH_PTR(obligations, obligation) { + ZEND_HASH_PACKED_FOREACH_PTR(obligations, obligation) { if (obligation->type == OBLIGATION_COMPATIBILITY) { /* Just used to populate the delayed_autoloads table, * which will be used when printing the "unresolved" error. */ @@ -2953,7 +2953,7 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e zend_property_info *parent_info; inheritance_status overall_status = INHERITANCE_SUCCESS; - ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, parent_func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, parent_func) { zval *zv = zend_hash_find_known_hash(&ce->function_table, key); if (zv) { zend_function *child_func = Z_FUNC_P(zv); @@ -2970,7 +2970,7 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->properties_info, key, parent_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->properties_info, key, parent_info) { zval *zv; if ((parent_info->flags & ZEND_ACC_PRIVATE) || !ZEND_TYPE_IS_SET(parent_info->type)) { continue; diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index 59c8184381862..3ce92cc509523 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -125,7 +125,7 @@ ZEND_API void zend_ini_deactivate(void) /* {{{ */ if (EG(modified_ini_directives)) { zend_ini_entry *ini_entry; - ZEND_HASH_FOREACH_PTR(EG(modified_ini_directives), ini_entry) { + ZEND_HASH_MAP_FOREACH_PTR(EG(modified_ini_directives), ini_entry) { zend_restore_ini_entry_cb(ini_entry, ZEND_INI_STAGE_DEACTIVATE); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(EG(modified_ini_directives)); @@ -266,7 +266,7 @@ ZEND_API void zend_ini_refresh_caches(int stage) /* {{{ */ { zend_ini_entry *p; - ZEND_HASH_FOREACH_PTR(EG(ini_directives), p) { + ZEND_HASH_MAP_FOREACH_PTR(EG(ini_directives), p) { if (p->on_modify) { p->on_modify(p, p->value, p->mh_arg1, p->mh_arg2, p->mh_arg3, stage); } diff --git a/Zend/zend_list.c b/Zend/zend_list.c index b3409e33ce845..51ef3e1d92eb3 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -216,10 +216,11 @@ void zend_close_rsrc_list(HashTable *ht) { /* Reload ht->arData on each iteration, as it may be reallocated. */ uint32_t i = ht->nNumUsed; + while (i-- > 0) { - Bucket *p = &ht->arData[i]; - if (Z_TYPE(p->val) != IS_UNDEF) { - zend_resource *res = Z_PTR(p->val); + zval *p = ZEND_HASH_ELEMENT(ht, i); + if (Z_TYPE_P(p) != IS_UNDEF) { + zend_resource *res = Z_PTR_P(p); if (res->type >= 0) { zend_resource_dtor(res); } @@ -284,7 +285,7 @@ ZEND_API int zend_fetch_list_dtor_id(const char *type_name) { zend_rsrc_list_dtors_entry *lde; - ZEND_HASH_FOREACH_PTR(&list_destructors, lde) { + ZEND_HASH_PACKED_FOREACH_PTR(&list_destructors, lde) { if (lde->type_name && (strcmp(type_name, lde->type_name) == 0)) { return lde->resource_id; } diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 7e3fa03912a87..b09ce3b990d5c 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -238,7 +238,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, HT_FLAGS(new_object->properties) |= HT_FLAGS(old_object->properties) & HASH_FLAG_HAS_EMPTY_IND; - ZEND_HASH_FOREACH_KEY_VAL(old_object->properties, num_key, key, prop) { + ZEND_HASH_MAP_FOREACH_KEY_VAL(old_object->properties, num_key, key, prop) { if (Z_TYPE_P(prop) == IS_INDIRECT) { ZVAL_INDIRECT(&new_prop, new_object->properties_table + (Z_INDIRECT_P(prop) - old_object->properties_table)); } else { diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index ad41b9f699d01..566595783005e 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -249,7 +249,7 @@ ZEND_API void zend_cleanup_mutable_class_data(zend_class_entry *ce) if (constants_table && constants_table != &ce->constants_table) { zend_class_constant *c; - ZEND_HASH_FOREACH_PTR(constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(constants_table, c) { zval_ptr_dtor_nogc(&c->value); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(constants_table); @@ -285,7 +285,7 @@ ZEND_API void destroy_zend_class(zval *zv) zend_class_constant *c; zval *p, *end; - ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { if (c->ce == ce) { zval_ptr_dtor_nogc(&c->value); } @@ -362,7 +362,7 @@ ZEND_API void destroy_zend_class(zval *zv) } efree(ce->default_static_members_table); } - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop_info) { if (prop_info->ce == ce) { zend_string_release_ex(prop_info->name, 0); if (prop_info->doc_comment) { @@ -379,7 +379,7 @@ ZEND_API void destroy_zend_class(zval *zv) if (zend_hash_num_elements(&ce->constants_table)) { zend_class_constant *c; - ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { if (c->ce == ce) { zval_ptr_dtor_nogc(&c->value); if (c->doc_comment) { @@ -421,7 +421,7 @@ ZEND_API void destroy_zend_class(zval *zv) free(ce->default_static_members_table); } - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop_info) { if (prop_info->ce == ce) { zend_string_release(prop_info->name); zend_type_release(prop_info->type, /* persistent */ 1); @@ -432,7 +432,7 @@ ZEND_API void destroy_zend_class(zval *zv) zend_string_release_ex(ce->name, 1); /* TODO: eliminate this loop for classes without functions with arg_info */ - ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, fn) { if ((fn->common.fn_flags & (ZEND_ACC_HAS_RETURN_TYPE|ZEND_ACC_HAS_TYPE_HINTS)) && fn->common.scope == ce) { zend_free_internal_arg_info(&fn->internal_function); @@ -443,7 +443,7 @@ ZEND_API void destroy_zend_class(zval *zv) if (zend_hash_num_elements(&ce->constants_table)) { zend_class_constant *c; - ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { if (c->ce == ce) { if (Z_TYPE(c->value) == IS_CONSTANT_AST) { /* We marked this as IMMUTABLE, but do need to free it when the diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 4a1232198fcc2..c0efe2a6dcf4a 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -368,7 +368,11 @@ struct _zend_array { uint32_t flags; } u; uint32_t nTableMask; - Bucket *arData; + union { + uint32_t *arHash; /* hash table (allocated above this pointer) */ + Bucket *arData; /* array of hash buckets */ + zval *arPacked; /* packed array of zvals */ + }; uint32_t nNumUsed; uint32_t nNumOfElements; uint32_t nTableSize; @@ -382,14 +386,14 @@ struct _zend_array { * ===================== * * +=============================+ - * | HT_HASH(ht, ht->nTableMask) | - * | ... | - * | HT_HASH(ht, -1) | - * +-----------------------------+ - * ht->arData ---> | Bucket[0] | - * | ... | - * | Bucket[ht->nTableSize-1] | - * +=============================+ + * | HT_HASH(ht, ht->nTableMask) | +=============================+ + * | ... | | HT_INVALID_IDX | + * | HT_HASH(ht, -1) | | HT_INVALID_IDX | + * +-----------------------------+ +-----------------------------+ + * ht->arData ---> | Bucket[0] | ht->arPacked ---> | ZVAL[0] | + * | ... | | ... | + * | Bucket[ht->nTableSize-1] | | ZVAL[ht->nTableSize-1] | + * +=============================+ +=============================+ */ #define HT_INVALID_IDX ((uint32_t) -1) @@ -420,7 +424,7 @@ struct _zend_array { #define HT_HASH_EX(data, idx) \ ((uint32_t*)(data))[(int32_t)(idx)] #define HT_HASH(ht, idx) \ - HT_HASH_EX((ht)->arData, idx) + HT_HASH_EX((ht)->arHash, idx) #define HT_SIZE_TO_MASK(nTableSize) \ ((uint32_t)(-((nTableSize) + (nTableSize)))) @@ -434,6 +438,14 @@ struct _zend_array { HT_SIZE_EX((ht)->nTableSize, (ht)->nTableMask) #define HT_USED_SIZE(ht) \ (HT_HASH_SIZE((ht)->nTableMask) + ((size_t)(ht)->nNumUsed * sizeof(Bucket))) +#define HT_PACKED_DATA_SIZE(nTableSize) \ + ((size_t)(nTableSize) * sizeof(zval)) +#define HT_PACKED_SIZE_EX(nTableSize, nTableMask) \ + (HT_PACKED_DATA_SIZE((nTableSize)) + HT_HASH_SIZE((nTableMask))) +#define HT_PACKED_SIZE(ht) \ + HT_PACKED_SIZE_EX((ht)->nTableSize, (ht)->nTableMask) +#define HT_PACKED_USED_SIZE(ht) \ + (HT_HASH_SIZE((ht)->nTableMask) + ((size_t)(ht)->nNumUsed * sizeof(zval))) #ifdef __SSE2__ # define HT_HASH_RESET(ht) do { \ char *p = (char*)&HT_HASH(ht, (ht)->nTableMask); \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ae8b647f7f352..9979a9b2fb515 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5559,7 +5559,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED, CACHE_SLOT) zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args]; if (ZEND_TYPE_IS_SET(arg_info->type)) { SEPARATE_ARRAY(params); - ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) { HANDLE_EXCEPTION(); } @@ -5571,7 +5571,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED, CACHE_SLOT) ZVAL_ARR(params, EX(extra_named_params)); } else { SEPARATE_ARRAY(params); - ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { Z_TRY_ADDREF_P(param); zend_hash_add_new(Z_ARRVAL_P(params), name, param); } ZEND_HASH_FOREACH_END(); @@ -6830,7 +6830,6 @@ ZEND_VM_HOT_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) uint32_t value_type; HashTable *fe_ht; HashPosition pos; - Bucket *p; array = EX_VAR(opline->op1.var); if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) { @@ -6838,31 +6837,54 @@ ZEND_VM_HOT_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR) } fe_ht = Z_ARRVAL_P(array); pos = Z_FE_POS_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + Z_FE_POS_P(array) = pos + 1; + if (RETURN_VALUE_USED(opline)) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - Z_FE_POS_P(array) = pos; - if (RETURN_VALUE_USED(opline)) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + Bucket *p; + + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + Z_FE_POS_P(array) = pos; + if (RETURN_VALUE_USED(opline)) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } - if (EXPECTED(OP2_TYPE == IS_CV)) { zval *variable_ptr = EX_VAR(opline->op2.var); SAVE_OPLINE(); @@ -6897,27 +6919,48 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) { pos = zend_hash_iterator_pos_ex(Z_FE_ITER_P(EX_VAR(opline->op1.var)), array); fe_ht = Z_ARRVAL_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - ZEND_VM_C_GOTO(fe_fetch_w_exit); + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_C_GOTO(fe_fetch_w_exit); + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1; + if (RETURN_VALUE_USED(opline)) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos; - if (RETURN_VALUE_USED(opline)) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_C_GOTO(fe_fetch_w_exit); + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos; + if (RETURN_VALUE_USED(opline)) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) { @@ -9000,7 +9043,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM } SAVE_OPLINE(); - ZEND_HASH_FOREACH_STR_KEY(ht, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { ZVAL_STR(&key_tmp, key); if (zend_compare(op1, &key_tmp) == 0) { FREE_OP1(); @@ -9745,34 +9788,57 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf uint32_t value_type; HashTable *fe_ht; HashPosition pos; - Bucket *p; array = EX_VAR(opline->op1.var); SAVE_OPLINE(); fe_ht = Z_ARRVAL_P(array); pos = Z_FE_POS_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + Z_FE_POS_P(array) = pos + 1; + if (RETURN_VALUE_USED(opline)) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - Z_FE_POS_P(array) = pos; - if (RETURN_VALUE_USED(opline)) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + Bucket *p; + + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + Z_FE_POS_P(array) = pos; + if (RETURN_VALUE_USED(opline)) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d25c9e687c02d..4a26e0c252e35 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3848,7 +3848,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND zend_arg_info *arg_info = &EX(func)->common.arg_info[EX(func)->common.num_args]; if (ZEND_TYPE_IS_SET(arg_info->type)) { SEPARATE_ARRAY(params); - ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { if (UNEXPECTED(!zend_verify_variadic_arg_type(EX(func), arg_info, arg_num, param, CACHE_ADDR(opline->extended_value)))) { HANDLE_EXCEPTION(); } @@ -3860,7 +3860,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_UNUSED_HAND ZVAL_ARR(params, EX(extra_named_params)); } else { SEPARATE_ARRAY(params); - ZEND_HASH_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(EX(extra_named_params), name, param) { Z_TRY_ADDREF_P(param); zend_hash_add_new(Z_ARRVAL_P(params), name, param); } ZEND_HASH_FOREACH_END(); @@ -7682,7 +7682,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CON } SAVE_OPLINE(); - ZEND_HASH_FOREACH_STR_KEY(ht, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { ZVAL_STR(&key_tmp, key); if (zend_compare(op1, &key_tmp) == 0) { @@ -19908,7 +19908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_TMP_CONST_HANDLE } SAVE_OPLINE(); - ZEND_HASH_FOREACH_STR_KEY(ht, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { ZVAL_STR(&key_tmp, key); if (zend_compare(op1, &key_tmp) == 0) { zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); @@ -21882,7 +21882,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VA uint32_t value_type; HashTable *fe_ht; HashPosition pos; - Bucket *p; array = EX_VAR(opline->op1.var); if (UNEXPECTED(Z_TYPE_P(array) != IS_ARRAY)) { @@ -21890,31 +21889,54 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VA } fe_ht = Z_ARRVAL_P(array); pos = Z_FE_POS_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + Z_FE_POS_P(array) = pos + 1; + if (RETURN_VALUE_USED(opline)) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - Z_FE_POS_P(array) = pos; - if (RETURN_VALUE_USED(opline)) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + Bucket *p; + + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + Z_FE_POS_P(array) = pos; + if (RETURN_VALUE_USED(opline)) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } - if (EXPECTED(opline->op2_type == IS_CV)) { zval *variable_ptr = EX_VAR(opline->op2.var); SAVE_OPLINE(); @@ -21949,27 +21971,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z if (EXPECTED(Z_TYPE_P(array) == IS_ARRAY)) { pos = zend_hash_iterator_pos_ex(Z_FE_ITER_P(EX_VAR(opline->op1.var)), array); fe_ht = Z_ARRVAL_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - goto fe_fetch_w_exit; + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + goto fe_fetch_w_exit; + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos + 1; + if (RETURN_VALUE_USED(opline)) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos; - if (RETURN_VALUE_USED(opline)) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + goto fe_fetch_w_exit; + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos; + if (RETURN_VALUE_USED(opline)) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) { @@ -24841,7 +24884,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE } SAVE_OPLINE(); - ZEND_HASH_FOREACH_STR_KEY(ht, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { ZVAL_STR(&key_tmp, key); if (zend_compare(op1, &key_tmp) == 0) { zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); @@ -30942,34 +30985,57 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ uint32_t value_type; HashTable *fe_ht; HashPosition pos; - Bucket *p; array = EX_VAR(opline->op1.var); SAVE_OPLINE(); fe_ht = Z_ARRVAL_P(array); pos = Z_FE_POS_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + Z_FE_POS_P(array) = pos + 1; + if (0) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - Z_FE_POS_P(array) = pos; - if (0) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + Bucket *p; + + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + Z_FE_POS_P(array) = pos; + if (0) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } @@ -30987,34 +31053,57 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ uint32_t value_type; HashTable *fe_ht; HashPosition pos; - Bucket *p; array = EX_VAR(opline->op1.var); SAVE_OPLINE(); fe_ht = Z_ARRVAL_P(array); pos = Z_FE_POS_P(array); - p = fe_ht->arData + pos; - while (1) { - if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - /* reached end of iteration */ - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); + if (HT_IS_PACKED(fe_ht)) { + value = fe_ht->arPacked + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + pos++; + value++; } - pos++; - value = &p->val; - value_type = Z_TYPE_INFO_P(value); - ZEND_ASSERT(value_type != IS_INDIRECT); - if (EXPECTED(value_type != IS_UNDEF)) { - break; + Z_FE_POS_P(array) = pos + 1; + if (1) { + ZVAL_LONG(EX_VAR(opline->result.var), pos); } - p++; - } - Z_FE_POS_P(array) = pos; - if (1) { - if (!p->key) { - ZVAL_LONG(EX_VAR(opline->result.var), p->h); - } else { - ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } else { + Bucket *p; + + p = fe_ht->arData + pos; + while (1) { + if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + /* reached end of iteration */ + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + ZEND_VM_CONTINUE(); + } + pos++; + value = &p->val; + value_type = Z_TYPE_INFO_P(value); + ZEND_ASSERT(value_type != IS_INDIRECT); + if (EXPECTED(value_type != IS_UNDEF)) { + break; + } + p++; + } + Z_FE_POS_P(array) = pos; + if (1) { + if (!p->key) { + ZVAL_LONG(EX_VAR(opline->result.var), p->h); + } else { + ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + } } } @@ -42422,7 +42511,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER } SAVE_OPLINE(); - ZEND_HASH_FOREACH_STR_KEY(ht, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { ZVAL_STR(&key_tmp, key); if (zend_compare(op1, &key_tmp) == 0) { diff --git a/Zend/zend_vm_trace_handlers.h b/Zend/zend_vm_trace_handlers.h index 414d4d5f95f67..eaf97e012cac7 100644 --- a/Zend/zend_vm_trace_handlers.h +++ b/Zend/zend_vm_trace_handlers.h @@ -71,7 +71,7 @@ static void zend_vm_trace_finish(void) f = fopen("zend_vm_trace.log", "w+"); if (f) { zend_hash_sort(&vm_trace_ht, (compare_func_t)zend_vm_trace_compare, 0); - ZEND_HASH_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) { fprintf(f, "%s "ZEND_LONG_FMT"\n", ZSTR_VAL(key), Z_LVAL_P(val)); } ZEND_HASH_FOREACH_END(); fclose(f); diff --git a/Zend/zend_vm_trace_map.h b/Zend/zend_vm_trace_map.h index 96695312a93d0..d84aa0442d263 100644 --- a/Zend/zend_vm_trace_map.h +++ b/Zend/zend_vm_trace_map.h @@ -65,7 +65,7 @@ static void zend_vm_trace_init(void) if (f) { zend_hash_sort(&vm_trace_ht, (bucket_compare_func_t)zend_vm_trace_compare, 0); prev_key = NULL; - ZEND_HASH_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(&vm_trace_ht, key, val) { if (prev_key) { fprintf(f, ADDR_FMT" "ADDR_FMT" t %s\n", prev_addr, Z_LVAL_P(val) - prev_addr, ZSTR_VAL(prev_key)); } diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index a5930c2f46e8a..a4b16fbe97002 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -72,7 +72,7 @@ static void zend_weakref_unref(zend_ulong obj_addr, void *tagged_ptr) { uintptr_t tag = ZEND_WEAKREF_GET_TAG(tagged_ptr); if (tag == ZEND_WEAKREF_TAG_HT) { HashTable *ht = ptr; - ZEND_HASH_FOREACH_PTR(ht, tagged_ptr) { + ZEND_HASH_MAP_FOREACH_PTR(ht, tagged_ptr) { zend_weakref_unref_single( ZEND_WEAKREF_GET_PTR(tagged_ptr), ZEND_WEAKREF_GET_TAG(tagged_ptr), obj_addr); } ZEND_HASH_FOREACH_END(); @@ -209,7 +209,7 @@ static zend_always_inline bool zend_weakref_find(zend_object *referent, zval *re } if (tag == ZEND_WEAKREF_TAG_HT) { - ZEND_HASH_FOREACH_PTR(ptr, tagged_ptr) { + ZEND_HASH_MAP_FOREACH_PTR(ptr, tagged_ptr) { if (ZEND_WEAKREF_GET_TAG(tagged_ptr) == ZEND_WEAKREF_TAG_REF) { ptr = ZEND_WEAKREF_GET_PTR(tagged_ptr); goto found_weakref; @@ -290,7 +290,7 @@ static void zend_weakmap_free_obj(zend_object *object) { zend_weakmap *wm = zend_weakmap_from(object); zend_ulong obj_addr; - ZEND_HASH_FOREACH_NUM_KEY(&wm->ht, obj_addr) { + ZEND_HASH_MAP_FOREACH_NUM_KEY(&wm->ht, obj_addr) { zend_weakref_unregister( (zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP)); } ZEND_HASH_FOREACH_END(); @@ -412,7 +412,7 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop zend_ulong obj_addr; zval *val; - ZEND_HASH_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) { + ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) { zend_object *obj = (zend_object*)obj_addr; zval pair; array_init(&pair); @@ -433,7 +433,7 @@ static HashTable *zend_weakmap_get_gc(zend_object *object, zval **table, int *n) zend_weakmap *wm = zend_weakmap_from(object); zend_get_gc_buffer *gc_buffer = zend_get_gc_buffer_create(); zval *val; - ZEND_HASH_FOREACH_VAL(&wm->ht, val) { + ZEND_HASH_MAP_FOREACH_VAL(&wm->ht, val) { zend_get_gc_buffer_add_zval(gc_buffer, val); } ZEND_HASH_FOREACH_END(); zend_get_gc_buffer_use(gc_buffer, table, n); @@ -449,7 +449,7 @@ static zend_object *zend_weakmap_clone_obj(zend_object *old_object) zend_ulong obj_addr; zval *val; - ZEND_HASH_FOREACH_NUM_KEY_VAL(&new_wm->ht, obj_addr, val) { + ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&new_wm->ht, obj_addr, val) { zend_weakref_register( (zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(new_wm, ZEND_WEAKREF_TAG_MAP)); zval_add_ref(val); diff --git a/ext/dom/node.c b/ext/dom/node.c index 893670807bca4..fc1b725bb28ae 100644 --- a/ext/dom/node.c +++ b/ext/dom/node.c @@ -1592,11 +1592,11 @@ static void dom_canonicalization(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ ctxp->node = nodep; tmp = zend_hash_str_find(ht, "namespaces", sizeof("namespaces")-1); - if (tmp && Z_TYPE_P(tmp) == IS_ARRAY) { + if (tmp && Z_TYPE_P(tmp) == IS_ARRAY && !HT_IS_PACKED(Z_ARRVAL_P(tmp))) { zval *tmpns; zend_string *prefix; - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), prefix, tmpns) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), prefix, tmpns) { if (Z_TYPE_P(tmpns) == IS_STRING) { if (prefix) { xmlXPathRegisterNs(ctxp, (xmlChar *) ZSTR_VAL(prefix), (xmlChar *) Z_STRVAL_P(tmpns)); diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 01a206c0985bd..f9e7f2e0b45ee 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -405,7 +405,7 @@ static HashTable* dom_get_debug_info_helper(zend_object *object, int *is_temp) / object_str = zend_string_init("(object value omitted)", sizeof("(object value omitted)")-1, 0); - ZEND_HASH_FOREACH_STR_KEY_PTR(prop_handlers, string_key, entry) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(prop_handlers, string_key, entry) { zval value; if (entry->read_func(obj, &value) == FAILURE || !string_key) { diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index e108ca61be6f5..352a732a49626 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -296,7 +296,7 @@ static ffi_type* zend_ffi_face_struct_add_fields(ffi_type* t, zend_ffi_type *typ { zend_ffi_field *field; - ZEND_HASH_FOREACH_PTR(&type->record.fields, field) { + ZEND_HASH_MAP_FOREACH_PTR(&type->record.fields, field) { switch (ZEND_FFI_TYPE(field->type)->kind) { case ZEND_FFI_TYPE_FLOAT: t->elements[(*i)++] = &ffi_type_float; @@ -811,7 +811,7 @@ static size_t zend_ffi_arg_size(zend_ffi_type *type) /* {{{ */ zend_ffi_type *arg_type; size_t arg_size = 0; - ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { + ZEND_HASH_PACKED_FOREACH_PTR(type->func.args, arg_type) { arg_size += MAX(ZEND_FFI_TYPE(arg_type)->size, sizeof(size_t)); } ZEND_HASH_FOREACH_END(); return arg_size; @@ -885,7 +885,7 @@ static void zend_ffi_callback_trampoline(ffi_cif* cif, void* ret, void** args, v int n = 0; zend_ffi_type *arg_type; - ZEND_HASH_FOREACH_PTR(callback_data->type->func.args, arg_type) { + ZEND_HASH_PACKED_FOREACH_PTR(callback_data->type->func.args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); zend_ffi_cdata_to_zval(NULL, args[n], arg_type, BP_VAR_R, &fci.params[n], (zend_ffi_flags)(arg_type->attr & ZEND_FFI_ATTR_CONST), 0, 0); n++; @@ -959,7 +959,7 @@ static void *zend_ffi_create_callback(zend_ffi_type *type, zval *value) /* {{{ * int n = 0; zend_ffi_type *arg_type; - ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { + ZEND_HASH_PACKED_FOREACH_PTR(type->func.args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); callback_data->arg_types[n] = zend_ffi_get_type(arg_type); if (!callback_data->arg_types[n]) { @@ -1991,7 +1991,7 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp) break; case ZEND_FFI_TYPE_STRUCT: ht = zend_new_array(zend_hash_num_elements(&type->record.fields)); - ZEND_HASH_FOREACH_STR_KEY_PTR(&type->record.fields, key, f) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&type->record.fields, key, f) { if (key) { if (!f->bits) { void *f_ptr = (void*)(((char*)ptr) + f->offset); @@ -2652,7 +2652,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */ (sizeof(void*) + ZEND_FFI_SIZEOF_ARG) * EX_NUM_ARGS(), arg_values_use_heap); n = 0; if (type->func.args) { - ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { + ZEND_HASH_PACKED_FOREACH_PTR(type->func.args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n); if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) == FAILURE) { @@ -2697,7 +2697,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */ (sizeof(void*) + ZEND_FFI_SIZEOF_ARG) * EX_NUM_ARGS(), arg_values_use_heap); n = 0; if (type->func.args) { - ZEND_HASH_FOREACH_PTR(type->func.args, arg_type) { + ZEND_HASH_PACKED_FOREACH_PTR(type->func.args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); arg_values[n] = ((char*)arg_values) + (sizeof(void*) * EX_NUM_ARGS()) + (ZEND_FFI_SIZEOF_ARG * n); if (zend_ffi_pass_arg(EX_VAR_NUM(n), arg_type, &arg_types[n], arg_values, n, execute_data) == FAILURE) { @@ -2903,7 +2903,7 @@ ZEND_METHOD(FFI, cdef) /* {{{ */ zend_string *name; zend_ffi_symbol *sym; - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(symbols), name, sym) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(symbols), name, sym) { if (sym->kind == ZEND_FFI_SYM_VAR) { addr = DL_FETCH_SYMBOL(handle, ZSTR_VAL(name)); if (!addr) { @@ -2967,7 +2967,7 @@ static bool zend_ffi_same_types(zend_ffi_type *old, zend_ffi_type *type) /* {{{ zend_string *key; Bucket *b = type->record.fields.arData; - ZEND_HASH_FOREACH_STR_KEY_PTR(&old->record.fields, key, old_field) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&old->record.fields, key, old_field) { while (Z_TYPE(b->val) == IS_UNDEF) { b++; } @@ -2999,16 +2999,16 @@ static bool zend_ffi_same_types(zend_ffi_type *old, zend_ffi_type *type) /* {{{ return 0; } else if (old->func.args) { zend_ffi_type *arg_type; - Bucket *b = type->func.args->arData; + zval *zv = type->func.args->arPacked; - ZEND_HASH_FOREACH_PTR(old->func.args, arg_type) { - while (Z_TYPE(b->val) == IS_UNDEF) { - b++; + ZEND_HASH_PACKED_FOREACH_PTR(old->func.args, arg_type) { + while (Z_TYPE_P(zv) == IS_UNDEF) { + zv++; } - if (!zend_ffi_same_types(ZEND_FFI_TYPE(arg_type), ZEND_FFI_TYPE(Z_PTR(b->val)))) { + if (!zend_ffi_same_types(ZEND_FFI_TYPE(arg_type), ZEND_FFI_TYPE(Z_PTR_P(zv)))) { return 0; } - b++; + zv++; } ZEND_HASH_FOREACH_END(); } break; @@ -3068,7 +3068,7 @@ static bool zend_ffi_subst_old_type(zend_ffi_type **dcl, zend_ffi_type *old, zen if (dcl_type->func.args) { zval *zv; - ZEND_HASH_FOREACH_VAL(dcl_type->func.args, zv) { + ZEND_HASH_PACKED_FOREACH_VAL(dcl_type->func.args, zv) { if (zend_ffi_subst_old_type((zend_ffi_type**)&Z_PTR_P(zv), old, type)) { return 1; } @@ -3076,7 +3076,7 @@ static bool zend_ffi_subst_old_type(zend_ffi_type **dcl, zend_ffi_type *old, zen } break; case ZEND_FFI_TYPE_STRUCT: - ZEND_HASH_FOREACH_PTR(&dcl_type->record.fields, field) { + ZEND_HASH_MAP_FOREACH_PTR(&dcl_type->record.fields, field) { if (zend_ffi_subst_old_type(&field->type, old, type)) { return 1; } @@ -3094,12 +3094,12 @@ static void zend_ffi_cleanup_type(zend_ffi_type *old, zend_ffi_type *type) /* {{ zend_ffi_tag *tag; if (FFI_G(symbols)) { - ZEND_HASH_FOREACH_PTR(FFI_G(symbols), sym) { + ZEND_HASH_MAP_FOREACH_PTR(FFI_G(symbols), sym) { zend_ffi_subst_old_type(&sym->type, old, type); } ZEND_HASH_FOREACH_END(); } if (FFI_G(tags)) { - ZEND_HASH_FOREACH_PTR(FFI_G(tags), tag) { + ZEND_HASH_MAP_FOREACH_PTR(FFI_G(tags), tag) { zend_ffi_subst_old_type(&tag->type, old, type); } ZEND_HASH_FOREACH_END(); } @@ -3222,7 +3222,7 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */ } if (FFI_G(symbols)) { - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(symbols), name, sym) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(symbols), name, sym) { if (sym->kind == ZEND_FFI_SYM_VAR) { addr = DL_FETCH_SYMBOL(handle, ZSTR_VAL(name)); if (!addr) { @@ -3280,7 +3280,7 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */ if (preload) { if (scope && scope->tags && FFI_G(tags)) { - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(tags), name, tag) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(tags), name, tag) { zend_ffi_tag *old_tag = zend_hash_find_ptr(scope->tags, name); if (old_tag) { @@ -3319,7 +3319,7 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */ scope->symbols = FFI_G(symbols); FFI_G(symbols) = NULL; } else { - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(symbols), name, sym) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(symbols), name, sym) { if (!zend_hash_add_ptr(scope->symbols, name, sym)) { zend_ffi_type_dtor(sym->type); free(sym); @@ -3334,7 +3334,7 @@ static zend_ffi *zend_ffi_load(const char *filename, bool preload) /* {{{ */ scope->tags = FFI_G(tags); FFI_G(tags) = NULL; } else { - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(tags), name, tag) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(tags), name, tag) { if (!zend_hash_add_ptr(scope->tags, name, tag)) { zend_ffi_type_dtor(tag->type); free(tag); @@ -3483,7 +3483,7 @@ static zend_result zend_ffi_validate_incomplete_type(zend_ffi_type *type, bool a zend_string *key; zend_ffi_tag *tag; - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(tags), key, tag) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(tags), key, tag) { if (ZEND_FFI_TYPE(tag->type) == type) { if (type->kind == ZEND_FFI_TYPE_ENUM) { zend_ffi_throw_parser_error("Incomplete enum \"%s\" at line %d", ZSTR_VAL(key), FFI_G(line)); @@ -3500,7 +3500,7 @@ static zend_result zend_ffi_validate_incomplete_type(zend_ffi_type *type, bool a zend_string *key; zend_ffi_symbol *sym; - ZEND_HASH_FOREACH_STR_KEY_PTR(FFI_G(symbols), key, sym) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(FFI_G(symbols), key, sym) { if (type == ZEND_FFI_TYPE(sym->type)) { zend_ffi_throw_parser_error("Incomplete C type %s at line %d", ZSTR_VAL(key), FFI_G(line)); return FAILURE; @@ -3572,7 +3572,7 @@ static bool zend_ffi_subst_type(zend_ffi_type **dcl, zend_ffi_type *type) /* {{{ if (dcl_type->func.args) { zval *zv; - ZEND_HASH_FOREACH_VAL(dcl_type->func.args, zv) { + ZEND_HASH_PACKED_FOREACH_VAL(dcl_type->func.args, zv) { if (zend_ffi_subst_type((zend_ffi_type**)&Z_PTR_P(zv), type)) { return 1; } @@ -3580,7 +3580,7 @@ static bool zend_ffi_subst_type(zend_ffi_type **dcl, zend_ffi_type *type) /* {{{ } break; case ZEND_FFI_TYPE_STRUCT: - ZEND_HASH_FOREACH_PTR(&dcl_type->record.fields, field) { + ZEND_HASH_MAP_FOREACH_PTR(&dcl_type->record.fields, field) { if (zend_ffi_subst_type(&field->type, type)) { return 1; } @@ -3595,7 +3595,7 @@ static bool zend_ffi_subst_type(zend_ffi_type **dcl, zend_ffi_type *type) /* {{{ static void zend_ffi_tags_cleanup(zend_ffi_dcl *dcl) /* {{{ */ { zend_ffi_tag *tag; - ZEND_HASH_FOREACH_PTR(FFI_G(tags), tag) { + ZEND_HASH_MAP_FOREACH_PTR(FFI_G(tags), tag) { if (ZEND_FFI_TYPE_IS_OWNED(tag->type)) { zend_ffi_type *type = ZEND_FFI_TYPE(tag->type); zend_ffi_subst_type(&dcl->type, type); @@ -4624,7 +4624,7 @@ ZEND_METHOD(FFI_CType, getStructFieldNames) /* {{{ */ ht = zend_new_array(zend_hash_num_elements(&type->record.fields)); RETVAL_ARR(ht); - ZEND_HASH_FOREACH_STR_KEY(&type->record.fields, name) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&type->record.fields, name) { ZVAL_STR_COPY(&zv, name); zend_hash_next_index_insert_new(ht, &zv); } ZEND_HASH_FOREACH_END(); @@ -5901,7 +5901,7 @@ static zend_result zend_ffi_validate_prev_field_type(zend_ffi_type *struct_type) if (zend_hash_num_elements(&struct_type->record.fields) > 0) { zend_ffi_field *field = NULL; - ZEND_HASH_REVERSE_FOREACH_PTR(&struct_type->record.fields, field) { + ZEND_HASH_MAP_REVERSE_FOREACH_PTR(&struct_type->record.fields, field) { break; } ZEND_HASH_FOREACH_END(); if (ZEND_FFI_TYPE(field->type)->attr & ZEND_FFI_ATTR_INCOMPLETE_ARRAY) { @@ -6004,7 +6004,7 @@ void zend_ffi_add_anonymous_field(zend_ffi_dcl *struct_dcl, zend_ffi_dcl *field_ } } - ZEND_HASH_FOREACH_STR_KEY_PTR(&field_type->record.fields, key, field) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&field_type->record.fields, key, field) { zend_ffi_field *new_field = pemalloc(sizeof(zend_ffi_field), FFI_G(persistent)); if (struct_type->attr & ZEND_FFI_ATTR_UNION) { @@ -6108,7 +6108,7 @@ void zend_ffi_add_bit_field(zend_ffi_dcl *struct_dcl, const char *name, size_t n zend_ffi_field *prev_field = NULL; if (zend_hash_num_elements(&struct_type->record.fields) > 0) { - ZEND_HASH_REVERSE_FOREACH_PTR(&struct_type->record.fields, prev_field) { + ZEND_HASH_MAP_REVERSE_FOREACH_PTR(&struct_type->record.fields, prev_field) { break; } ZEND_HASH_FOREACH_END(); } @@ -6264,7 +6264,7 @@ void zend_ffi_make_func_type(zend_ffi_dcl *dcl, HashTable *args, zend_ffi_dcl *n int no_args = 0; zend_ffi_type *arg_type; - ZEND_HASH_FOREACH_PTR(args, arg_type) { + ZEND_HASH_PACKED_FOREACH_PTR(args, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); if (arg_type->kind == ZEND_FFI_TYPE_VOID) { if (zend_hash_num_elements(args) != 1) { @@ -6291,7 +6291,7 @@ void zend_ffi_make_func_type(zend_ffi_dcl *dcl, HashTable *args, zend_ffi_dcl *n zend_ulong i; zend_ffi_type *arg_type; - ZEND_HASH_FOREACH_NUM_KEY_PTR(args, i, arg_type) { + ZEND_HASH_PACKED_FOREACH_KEY_PTR(args, i, arg_type) { arg_type = ZEND_FFI_TYPE(arg_type); # ifdef _WIN64 if (i >= 4 && i <= 5 && (arg_type->kind == ZEND_FFI_TYPE_FLOAT || arg_type->kind == ZEND_FFI_TYPE_DOUBLE)) { diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 880d6dddc7d70..d7b030d134535 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -3233,15 +3233,17 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode) zend_string *key; /* walk the assoc array */ - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(EXT), key, item) { - if (key == NULL) { - continue; - } - if (zend_string_equals_literal(key, "linespacing")) { - strex.flags |= gdFTEX_LINESPACE; - strex.linespacing = zval_get_double(item); - } - } ZEND_HASH_FOREACH_END(); + if (!HT_IS_PACKED(Z_ARRVAL_P(EXT))) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(EXT), key, item) { + if (key == NULL) { + continue; + } + if (zend_string_equals_literal(key, "linespacing")) { + strex.flags |= gdFTEX_LINESPACE; + strex.linespacing = zval_get_double(item); + } + } ZEND_HASH_FOREACH_END(); + } } #ifdef VIRTUAL_DIR diff --git a/ext/hash/hash.c b/ext/hash/hash.c index a89939e634127..62b82263dc7e3 100644 --- a/ext/hash/hash.c +++ b/ext/hash/hash.c @@ -860,7 +860,7 @@ PHP_FUNCTION(hash_algos) } array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY(&php_hash_hashtable, str) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&php_hash_hashtable, str) { add_next_index_str(return_value, zend_string_copy(str)); } ZEND_HASH_FOREACH_END(); } @@ -877,7 +877,7 @@ PHP_FUNCTION(hash_hmac_algos) } array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(&php_hash_hashtable, str, ops) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&php_hash_hashtable, str, ops) { if (ops->is_crypto) { add_next_index_str(return_value, zend_string_copy(str)); } @@ -1663,7 +1663,7 @@ PHP_MINFO_FUNCTION(hash) zend_string *str; char *s = buffer, *e = s + sizeof(buffer); - ZEND_HASH_FOREACH_STR_KEY(&php_hash_hashtable, str) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&php_hash_hashtable, str) { s += slprintf(s, e - s, "%s ", ZSTR_VAL(str)); } ZEND_HASH_FOREACH_END(); *s = 0; diff --git a/ext/imap/php_imap.c b/ext/imap/php_imap.c index a543c1d78a21b..b6d2dd8b74da8 100644 --- a/ext/imap/php_imap.c +++ b/ext/imap/php_imap.c @@ -3193,10 +3193,10 @@ PHP_FUNCTION(imap_mail_compose) bod->parameter = tmp_param; } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "type.parameters", sizeof("type.parameters") - 1)) != NULL) { - if(Z_TYPE_P(pvalue) == IS_ARRAY) { + if(Z_TYPE_P(pvalue) == IS_ARRAY && !HT_IS_PACKED(Z_ARRVAL_P(pvalue))) { disp_param = tmp_param = NULL; SEPARATE_ARRAY(pvalue); - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { if (key == NULL) continue; CHECK_HEADER_INJECTION(key, 0, "body disposition key"); disp_param = mail_newbody_parameter(); @@ -3233,10 +3233,10 @@ PHP_FUNCTION(imap_mail_compose) memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1); } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition", sizeof("disposition") - 1)) != NULL) { - if (Z_TYPE_P(pvalue) == IS_ARRAY) { + if (Z_TYPE_P(pvalue) == IS_ARRAY && !HT_IS_PACKED(Z_ARRVAL_P(pvalue))) { disp_param = tmp_param = NULL; SEPARATE_ARRAY(pvalue); - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { if (key == NULL) continue; CHECK_HEADER_INJECTION(key, 0, "body type.parameters key"); disp_param = mail_newbody_parameter(); @@ -3315,10 +3315,10 @@ PHP_FUNCTION(imap_mail_compose) bod->parameter = tmp_param; } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "type.parameters", sizeof("type.parameters") - 1)) != NULL) { - if (Z_TYPE_P(pvalue) == IS_ARRAY) { + if (Z_TYPE_P(pvalue) == IS_ARRAY && !HT_IS_PACKED(Z_ARRVAL_P(pvalue))) { disp_param = tmp_param = NULL; SEPARATE_ARRAY(pvalue); - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { if (key == NULL) continue; CHECK_HEADER_INJECTION(key, 0, "body type.parameters key"); disp_param = mail_newbody_parameter(); @@ -3355,10 +3355,10 @@ PHP_FUNCTION(imap_mail_compose) memcpy(bod->disposition.type, Z_STRVAL_P(pvalue), Z_STRLEN_P(pvalue)+1); } if ((pvalue = zend_hash_str_find(Z_ARRVAL_P(data), "disposition", sizeof("disposition") - 1)) != NULL) { - if (Z_TYPE_P(pvalue) == IS_ARRAY) { + if (Z_TYPE_P(pvalue) == IS_ARRAY && !HT_IS_PACKED(Z_ARRVAL_P(pvalue))) { disp_param = tmp_param = NULL; SEPARATE_ARRAY(pvalue); - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(pvalue), key, disp_data) { if (key == NULL) continue; CHECK_HEADER_INJECTION(key, 0, "body disposition key"); disp_param = mail_newbody_parameter(); diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 3782820e77d62..cf16f198a812c 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -398,7 +398,7 @@ HashTable *mysqli_object_get_debug_info(zend_object *object, int *is_temp) retval = zend_new_array(zend_hash_num_elements(props) + 1); - ZEND_HASH_FOREACH_PTR(props, entry) { + ZEND_HASH_MAP_FOREACH_PTR(props, entry) { zval rv; zval *value; diff --git a/ext/mysqlnd/mysqlnd_debug.c b/ext/mysqlnd/mysqlnd_debug.c index 0d76d2e4f6af1..6a33a16892436 100644 --- a/ext/mysqlnd/mysqlnd_debug.c +++ b/ext/mysqlnd/mysqlnd_debug.c @@ -430,7 +430,7 @@ MYSQLND_METHOD(mysqlnd_debug, close)(MYSQLND_DEBUG * self) self->m->log_va(self, __LINE__, __FILE__, 0, "info : ", "number of functions: %d", zend_hash_num_elements(&self->function_profiles)); - ZEND_HASH_FOREACH_STR_KEY_PTR(&self->function_profiles, string_key, f_profile) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&self->function_profiles, string_key, f_profile) { self->m->log_va(self, __LINE__, __FILE__, -1, "info : ", "%-40s\tcalls=%5" PRIu64 " own_slow=%5" PRIu64 diff --git a/ext/mysqlnd/mysqlnd_plugin.c b/ext/mysqlnd/mysqlnd_plugin.c index dad8187ba9646..4bd9894b8c4bb 100644 --- a/ext/mysqlnd/mysqlnd_plugin.c +++ b/ext/mysqlnd/mysqlnd_plugin.c @@ -167,7 +167,7 @@ PHPAPI void mysqlnd_plugin_apply_with_argument(apply_func_arg_t apply_func, void zval *val; int result; - ZEND_HASH_FOREACH_VAL(&mysqlnd_registered_plugins, val) { + ZEND_HASH_MAP_FOREACH_VAL(&mysqlnd_registered_plugins, val) { result = apply_func(val, argument); if (result & ZEND_HASH_APPLY_REMOVE) { php_error_docref(NULL, E_WARNING, "mysqlnd_plugin_apply_with_argument must not remove table entries"); diff --git a/ext/mysqlnd/mysqlnd_reverse_api.c b/ext/mysqlnd/mysqlnd_reverse_api.c index ae4b4e74c8031..982aac065eb04 100644 --- a/ext/mysqlnd/mysqlnd_reverse_api.c +++ b/ext/mysqlnd/mysqlnd_reverse_api.c @@ -67,7 +67,7 @@ PHPAPI MYSQLND * zval_to_mysqlnd(zval * zv, const unsigned int client_api_capabilities, unsigned int * save_client_api_capabilities) { MYSQLND_REVERSE_API *api; - ZEND_HASH_FOREACH_PTR(&mysqlnd_api_ext_ht, api) { + ZEND_HASH_MAP_FOREACH_PTR(&mysqlnd_api_ext_ht, api) { if (api->conversion_cb) { MYSQLND *retval = api->conversion_cb(zv); if (retval) { diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 77d0c31aa6dda..644909cc4ba98 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -573,7 +573,7 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet) { zend_string * key; zval * entry_value; - ZEND_HASH_FOREACH_STR_KEY_VAL(packet->connect_attr, key, entry_value) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(packet->connect_attr, key, entry_value) { if (key) { /* HASH_KEY_IS_STRING */ size_t value_len = Z_STRLEN_P(entry_value); @@ -591,7 +591,7 @@ size_t php_mysqlnd_auth_write(MYSQLND_CONN_DATA * conn, void * _packet) { zend_string * key; zval * entry_value; - ZEND_HASH_FOREACH_STR_KEY_VAL(packet->connect_attr, key, entry_value) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(packet->connect_attr, key, entry_value) { if (key) { /* HASH_KEY_IS_STRING */ size_t value_len = Z_STRLEN_P(entry_value); diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c index ff31a54b454f3..368c253a64f9f 100644 --- a/ext/mysqlnd/php_mysqlnd.c +++ b/ext/mysqlnd/php_mysqlnd.c @@ -31,7 +31,7 @@ mysqlnd_minfo_print_hash(zval *values) zval *values_entry; zend_string *string_key; - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(values), string_key, values_entry) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(values), string_key, values_entry) { convert_to_string(values_entry); php_info_print_table_row(2, ZSTR_VAL(string_key), Z_STRVAL_P(values_entry)); } ZEND_HASH_FOREACH_END(); @@ -63,7 +63,7 @@ mysqlnd_minfo_dump_api_plugins(smart_str * buffer) HashTable *ht = mysqlnd_reverse_api_get_api_list(); MYSQLND_REVERSE_API *ext; - ZEND_HASH_FOREACH_PTR(ht, ext) { + ZEND_HASH_MAP_FOREACH_PTR(ht, ext) { if (buffer->s) { smart_str_appendc(buffer, ','); } diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 8fe2d271f7f49..e06d3ca67250f 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -601,7 +601,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } /* function table hash keys */ - ZEND_HASH_FOREACH_BUCKET(CG(function_table), p) { + ZEND_HASH_MAP_FOREACH_BUCKET(CG(function_table), p) { if (p->key) { p->key = new_interned_string(p->key); } @@ -630,7 +630,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } ZEND_HASH_FOREACH_END(); /* class table hash keys, class names, properties, methods, constants, etc */ - ZEND_HASH_FOREACH_BUCKET(CG(class_table), p) { + ZEND_HASH_MAP_FOREACH_BUCKET(CG(class_table), p) { zend_class_entry *ce; ce = (zend_class_entry*)Z_PTR(p->val); @@ -644,7 +644,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int ZEND_ASSERT(ZSTR_HAS_CE_CACHE(ce->name)); } - ZEND_HASH_FOREACH_BUCKET(&ce->properties_info, q) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->properties_info, q) { zend_property_info *info; info = (zend_property_info*)Z_PTR(q->val); @@ -658,7 +658,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_BUCKET(&ce->function_table, q) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->function_table, q) { if (q->key) { q->key = new_interned_string(q->key); } @@ -667,7 +667,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_BUCKET(&ce->constants_table, q) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->constants_table, q) { if (q->key) { q->key = new_interned_string(q->key); } @@ -675,7 +675,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } ZEND_HASH_FOREACH_END(); /* constant hash keys */ - ZEND_HASH_FOREACH_BUCKET(EG(zend_constants), p) { + ZEND_HASH_MAP_FOREACH_BUCKET(EG(zend_constants), p) { zend_constant *c; if (p->key) { @@ -691,7 +691,7 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } ZEND_HASH_FOREACH_END(); /* auto globals hash keys and names */ - ZEND_HASH_FOREACH_BUCKET(CG(auto_globals), p) { + ZEND_HASH_MAP_FOREACH_BUCKET(CG(auto_globals), p) { zend_auto_global *auto_global; auto_global = (zend_auto_global*)Z_PTR(p->val); @@ -703,13 +703,13 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_BUCKET(&module_registry, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&module_registry, p) { if (p->key) { p->key = new_interned_string(p->key); } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_BUCKET(EG(ini_directives), p) { + ZEND_HASH_MAP_FOREACH_BUCKET(EG(ini_directives), p) { zend_ini_entry *entry = (zend_ini_entry*)Z_PTR(p->val); if (p->key) { @@ -727,21 +727,21 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int } ZEND_HASH_FOREACH_END(); ht = php_get_stream_filters_hash_global(); - ZEND_HASH_FOREACH_BUCKET(ht, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(ht, p) { if (p->key) { p->key = new_interned_string(p->key); } } ZEND_HASH_FOREACH_END(); ht = php_stream_get_url_stream_wrappers_hash_global(); - ZEND_HASH_FOREACH_BUCKET(ht, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(ht, p) { if (p->key) { p->key = new_interned_string(p->key); } } ZEND_HASH_FOREACH_END(); ht = php_stream_xport_get_hash(); - ZEND_HASH_FOREACH_BUCKET(ht, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(ht, p) { if (p->key) { p->key = new_interned_string(p->key); } @@ -2405,7 +2405,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, i = 0; entry->dependencies_count = zend_hash_num_elements(dependencies); entry->dependencies = (zend_class_dependency*)ZCG(mem); - ZEND_HASH_FOREACH_STR_KEY_PTR(dependencies, dep_name, dep_ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(dependencies, dep_name, dep_ce) { #if ZEND_DEBUG ZEND_ASSERT(zend_accel_in_shm(dep_name)); #endif @@ -2588,7 +2588,7 @@ static void accel_reset_pcre_cache(void) return; } - ZEND_HASH_FOREACH_BUCKET(&PCRE_G(pcre_cache), p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&PCRE_G(pcre_cache), p) { /* Remove PCRE cache entries with inconsistent keys */ if (zend_accel_in_shm(p->key)) { p->key = NULL; @@ -3462,31 +3462,31 @@ static void preload_shutdown(void) #if 0 if (EG(zend_constants)) { - ZEND_HASH_REVERSE_FOREACH_VAL(EG(zend_constants), zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(zend_constants), zv) { zend_constant *c = Z_PTR_P(zv); if (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT) { break; } - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); } #endif if (EG(function_table)) { - ZEND_HASH_REVERSE_FOREACH_VAL(EG(function_table), zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(function_table), zv) { zend_function *func = Z_PTR_P(zv); if (func->type == ZEND_INTERNAL_FUNCTION) { break; } - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); } if (EG(class_table)) { - ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(class_table), zv) { zend_class_entry *ce = Z_PTR_P(zv); if (ce->type == ZEND_INTERNAL_CLASS) { break; } - } ZEND_HASH_FOREACH_END_DEL(); + } ZEND_HASH_MAP_FOREACH_END_DEL(); } } @@ -3530,7 +3530,7 @@ static void preload_move_user_functions(HashTable *src, HashTable *dst) src->pDestructor = NULL; zend_hash_extend(dst, dst->nNumUsed + src->nNumUsed, 0); - ZEND_HASH_REVERSE_FOREACH_BUCKET(src, p) { + ZEND_HASH_MAP_REVERSE_FOREACH_BUCKET(src, p) { zend_function *function = Z_PTR(p->val); if (EXPECTED(function->type == ZEND_USER_FUNCTION)) { @@ -3569,7 +3569,7 @@ static void preload_move_user_classes(HashTable *src, HashTable *dst) src->pDestructor = NULL; zend_hash_extend(dst, dst->nNumUsed + src->nNumUsed, 0); - ZEND_HASH_FOREACH_BUCKET_FROM(src, p, EG(persistent_classes_count)) { + ZEND_HASH_MAP_FOREACH_BUCKET_FROM(src, p, EG(persistent_classes_count)) { zend_class_entry *ce = Z_PTR(p->val); ZEND_ASSERT(ce->type == ZEND_USER_CLASS); if (ce->info.user.filename != filename) { @@ -3734,7 +3734,7 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) do { ok = 1; changed = 0; - ZEND_HASH_FOREACH_PTR(&ce->constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { val = &c->value; if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (EXPECTED(preload_update_constant(val, c->ce) == SUCCESS)) { @@ -3875,7 +3875,7 @@ static void preload_link(void) do { changed = 0; - ZEND_HASH_FOREACH_STR_KEY_VAL_FROM(EG(class_table), key, zv, EG(persistent_classes_count)) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_FROM(EG(class_table), key, zv, EG(persistent_classes_count)) { ce = Z_PTR_P(zv); ZEND_ASSERT(ce->type != ZEND_INTERNAL_CLASS); @@ -3966,7 +3966,7 @@ static void preload_link(void) do { changed = 0; - ZEND_HASH_REVERSE_FOREACH_VAL(EG(class_table), zv) { + ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(class_table), zv) { ce = Z_PTR_P(zv); if (ce->type == ZEND_INTERNAL_CLASS) { break; @@ -3984,7 +3984,7 @@ static void preload_link(void) } while (changed); /* Warn for classes that could not be linked. */ - ZEND_HASH_FOREACH_STR_KEY_VAL_FROM( + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_FROM( EG(class_table), key, zv, EG(persistent_classes_count)) { ce = Z_PTR_P(zv); ZEND_ASSERT(ce->type != ZEND_INTERNAL_CLASS); @@ -4015,7 +4015,7 @@ static void preload_link(void) zend_hash_destroy(&errors); - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { zend_op_array *op_array = &script->script.main_op_array; preload_remove_declares(op_array); @@ -4030,12 +4030,12 @@ static void preload_link(void) /* Dynamic defs inside functions and methods need to be removed as well. */ zend_op_array *op_array; - ZEND_HASH_FOREACH_PTR_FROM(EG(function_table), op_array, EG(persistent_functions_count)) { + ZEND_HASH_MAP_FOREACH_PTR_FROM(EG(function_table), op_array, EG(persistent_functions_count)) { ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION); preload_remove_declares(op_array); } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_PTR_FROM(EG(class_table), ce, EG(persistent_classes_count)) { - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR_FROM(EG(class_table), ce, EG(persistent_classes_count)) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->type == ZEND_USER_FUNCTION) { preload_remove_declares(op_array); } @@ -4057,14 +4057,14 @@ static void preload_remove_empty_includes(void) bool changed; /* mark all as empty */ - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { script->empty = 1; } ZEND_HASH_FOREACH_END(); /* find non empty scripts */ do { changed = 0; - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { if (script->empty) { int empty = 1; zend_op *opline = script->script.main_op_array.opcodes; @@ -4106,7 +4106,7 @@ static void preload_remove_empty_includes(void) } while (changed); /* remove empty includes */ - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { zend_op *opline = script->script.main_op_array.opcodes; zend_op *end = opline + script->script.main_op_array.last; @@ -4139,7 +4139,7 @@ static void preload_remove_empty_includes(void) static void preload_register_trait_methods(zend_class_entry *ce) { zend_op_array *op_array; - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (!(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { ZEND_ASSERT(op_array->refcount && "Must have refcount pointer"); zend_shared_alloc_register_xlat_entry(op_array->refcount, op_array); @@ -4151,7 +4151,7 @@ static void preload_fix_trait_methods(zend_class_entry *ce) { zend_op_array *op_array; - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->fn_flags & ZEND_ACC_TRAIT_CLONE) { zend_op_array *orig_op_array = zend_shared_alloc_get_xlat_entry(op_array->refcount); ZEND_ASSERT(orig_op_array && "Must be in xlat table"); @@ -4178,14 +4178,14 @@ static void preload_optimize(zend_persistent_script *script) zend_shared_alloc_init_xlat_table(); - ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { + ZEND_HASH_MAP_FOREACH_PTR(&script->script.class_table, ce) { if (ce->ce_flags & ZEND_ACC_TRAIT) { preload_register_trait_methods(ce); } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_PTR(preload_scripts, tmp_script) { - ZEND_HASH_FOREACH_PTR(&tmp_script->script.class_table, ce) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, tmp_script) { + ZEND_HASH_MAP_FOREACH_PTR(&tmp_script->script.class_table, ce) { if (ce->ce_flags & ZEND_ACC_TRAIT) { preload_register_trait_methods(ce); } @@ -4195,19 +4195,19 @@ static void preload_optimize(zend_persistent_script *script) zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); zend_accel_finalize_delayed_early_binding_list(script); - ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { + ZEND_HASH_MAP_FOREACH_PTR(&script->script.class_table, ce) { preload_fix_trait_methods(ce); } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { - ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(&script->script.class_table, ce) { preload_fix_trait_methods(ce); } ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END(); zend_shared_alloc_destroy_xlat_table(); - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level); zend_accel_finalize_delayed_early_binding_list(script); } ZEND_HASH_FOREACH_END(); @@ -4442,7 +4442,7 @@ static int accel_preload(const char *config, bool in_child) if (EG(zend_constants)) { /* Remember __COMPILER_HALT_OFFSET__(s). Do this early, * as zend_shutdown_executor_values() destroys constants. */ - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { zend_execute_data *orig_execute_data = EG(current_execute_data); zend_execute_data fake_execute_data; zval *offset; @@ -4547,7 +4547,7 @@ static int accel_preload(const char *config, bool in_child) i = 0; ZCSG(saved_scripts) = zend_shared_alloc((zend_hash_num_elements(preload_scripts) + 1) * sizeof(void*)); - ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { if (zend_hash_num_elements(&script->script.class_table) > 1) { zend_hash_sort_ex(&script->script.class_table, preload_sort_classes, NULL, 0); } diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index dc2e3a33fedf1..720680a8f19d6 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -4266,7 +4266,7 @@ void zend_jit_check_funcs(HashTable *function_table, bool is_method) { uintptr_t counter; zend_jit_op_array_extension *jit_extension; - ZEND_HASH_REVERSE_FOREACH_PTR(function_table, func) { + ZEND_HASH_MAP_REVERSE_FOREACH_PTR(function_table, func) { if (func->type == ZEND_INTERNAL_FUNCTION) { break; } @@ -4570,8 +4570,8 @@ ZEND_EXT_API int zend_jit_script(zend_script *script) zend_class_entry *ce; zend_op_array *op_array; - ZEND_HASH_FOREACH_PTR(&script->class_table, ce) { - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&script->class_table, ce) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (!ZEND_FUNC_INFO(op_array)) { void *jit_extension = zend_shared_alloc_get_xlat_entry(op_array->opcodes); @@ -5053,7 +5053,7 @@ ZEND_EXT_API void zend_jit_deactivate(void) zend_jit_unprotect(); zend_jit_check_funcs(EG(function_table), 0); - ZEND_HASH_REVERSE_FOREACH_PTR(EG(class_table), ce) { + ZEND_HASH_MAP_REVERSE_FOREACH_PTR(EG(class_table), ce) { if (ce->type == ZEND_INTERNAL_CLASS) { break; } @@ -5108,12 +5108,12 @@ static void zend_jit_restart_preloaded_script(zend_persistent_script *script) zend_jit_restart_preloaded_op_array(&script->script.main_op_array); - ZEND_HASH_FOREACH_PTR(&script->script.function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&script->script.function_table, op_array) { zend_jit_restart_preloaded_op_array(op_array); } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&script->script.class_table, ce) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->type == ZEND_USER_FUNCTION) { zend_jit_restart_preloaded_op_array(op_array); } diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 21d8392b6cb6e..16f1781a0b799 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -5083,15 +5083,15 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o } else { | bls >2 // NOT_FOUND } - | // _ret = &_ht->arData[_h].val; + | // _ret = &_ht->arPacked[_h].val; if (val >= 0) { - | ldr REG0, [FCARG1x, #offsetof(zend_array, arData)] + | ldr REG0, [FCARG1x, #offsetof(zend_array, arPacked)] if (val != 0) { - | ADD_SUB_64_WITH_CONST add, REG0, REG0, (val * sizeof(Bucket)), TMP1 + | ADD_SUB_64_WITH_CONST add, REG0, REG0, (val * sizeof(zval)), TMP1 } } else { - | ldr TMP1, [FCARG1x, #offsetof(zend_array, arData)] - | add REG0, TMP1, FCARG2x, lsl #5 + | ldr TMP1, [FCARG1x, #offsetof(zend_array, arPacked)] + | add REG0, TMP1, FCARG2x, lsl #4 } } } @@ -13805,7 +13805,11 @@ static int zend_jit_hash_jmp(dasm_State **Dst, const zend_op *opline, const zend | LOAD_ADDR FCARG1x, jumptable | ldr TMP1, [FCARG1x, #offsetof(HashTable, arData)] | sub REG0, REG0, TMP1 - | mov FCARG1x, #(sizeof(Bucket) / sizeof(void*)) + if (HT_IS_PACKED(jumptable)) { + | mov FCARG1x, #(sizeof(zval) / sizeof(void*)) + } else { + | mov FCARG1x, #(sizeof(Bucket) / sizeof(void*)) + } | sdiv REG0, REG0, FCARG1x | adr FCARG1x, >4 | ldr TMP1, [FCARG1x, REG0] @@ -13842,7 +13846,11 @@ static int zend_jit_hash_jmp(dasm_State **Dst, const zend_op *opline, const zend | .addr &exit_addr } } - p++; + if (HT_IS_PACKED(jumptable)) { + p = (Bucket*)(((zval*)p)+1); + } else { + p++; + } count--; } while (count); |.code @@ -13961,7 +13969,7 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o } if (HT_IS_PACKED(jumptable)) { uint32_t count = jumptable->nNumUsed; - Bucket *p = jumptable->arData; + zval *zv = jumptable->arPacked; | CMP_64_WITH_CONST_32 FCARG2x, jumptable->nNumUsed, TMP1 if (default_label) { @@ -13981,9 +13989,8 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o if (trace_info) { trace_info->jmp_table_size += count; } - p = jumptable->arData; do { - if (Z_TYPE(p->val) == IS_UNDEF) { + if (Z_TYPE_P(zv) == IS_UNDEF) { if (default_label) { | .addr &default_label } else if (next_opline) { @@ -13992,7 +13999,7 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o | .addr =>default_b } } else { - target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL(p->val)); + target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL_P(zv)); if (!next_opline) { b = ssa->cfg.map[target - op_array->opcodes]; | .addr =>b @@ -14004,7 +14011,7 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o | .addr &exit_addr } } - p++; + zv++; count--; } while (count); |.code @@ -14310,84 +14317,166 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o | // array = EX_VAR(opline->op1.var); | // fe_ht = Z_ARRVAL_P(array); | GET_ZVAL_PTR FCARG1x, op1_addr, TMP1 + + if (op1_info & MAY_BE_PACKED_GUARD) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_PACKED_GUARD); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + if (op1_info & MAY_BE_ARRAY_PACKED) { + | ldr TMP1w, [FCARG1x, #offsetof(zend_array, u.flags)] + | TST_32_WITH_CONST TMP1w, HASH_FLAG_PACKED, TMP2w + | beq &exit_addr + } else { + | ldr TMP1w, [FCARG1x, #offsetof(zend_array, u.flags)] + | TST_32_WITH_CONST TMP1w, HASH_FLAG_PACKED, TMP2w + | bne &exit_addr + } + } + | // pos = Z_FE_POS_P(array); | MEM_ACCESS_32_WITH_UOFFSET ldr, REG0w, FP, (opline->op1.var + offsetof(zval, u2.fe_pos)), TMP1 - | // p = fe_ht->arData + pos; - || ZEND_ASSERT(sizeof(Bucket) == 32); - | mov FCARG2w, REG0w - | ldr TMP1, [FCARG1x, #offsetof(zend_array, arData)] - | add FCARG2x, TMP1, FCARG2x, lsl #5 - |1: - | // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - | ldr TMP1w, [FCARG1x, #offsetof(zend_array, nNumUsed)] - | cmp TMP1w, REG0w - | // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - | // ZEND_VM_CONTINUE(); - if (exit_addr) { - if (exit_opcode == ZEND_JMP) { - | bls &exit_addr + + if (MAY_BE_HASH(op1_info)) { + if (MAY_BE_PACKED(op1_info)) { + | ldr TMP1w, [FCARG1x, #offsetof(zend_array, u.flags)] + | TST_32_WITH_CONST TMP1w, HASH_FLAG_PACKED, TMP2w + | bne >2 + } + | // p = fe_ht->arData + pos; + || ZEND_ASSERT(sizeof(Bucket) == 32); + | mov FCARG2w, REG0w + | ldr TMP1, [FCARG1x, #offsetof(zend_array, arData)] + | add FCARG2x, TMP1, FCARG2x, lsl #5 + |1: + | // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + | ldr TMP1w, [FCARG1x, #offsetof(zend_array, nNumUsed)] + | cmp TMP1w, REG0w + | // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + | // ZEND_VM_CONTINUE(); + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + | bls &exit_addr + } else { + | bls >3 + } } else { - | bls >3 + | bls =>target_label + } + | // pos++; + | add REG0w, REG0w, #1 + | // value_type = Z_TYPE_INFO_P(value); + | // if (EXPECTED(value_type != IS_UNDEF)) { + if (!exit_addr || exit_opcode == ZEND_JMP) { + | IF_NOT_Z_TYPE FCARG2x, IS_UNDEF, >3, TMP1w + } else { + | IF_NOT_Z_TYPE FCARG2x, IS_UNDEF, &exit_addr, TMP1w + } + | // p++; + | add FCARG2x, FCARG2x, #sizeof(Bucket) + | b <1 + if (MAY_BE_PACKED(op1_info)) { + |2: } - } else { - | bls =>target_label } - | // pos++; - | add REG0w, REG0w, #1 - | // value_type = Z_TYPE_INFO_P(value); - | // if (EXPECTED(value_type != IS_UNDEF)) { - if (!exit_addr || exit_opcode == ZEND_JMP) { - | IF_NOT_Z_TYPE FCARG2x, IS_UNDEF, >3, TMP1w - } else { - | IF_NOT_Z_TYPE FCARG2x, IS_UNDEF, &exit_addr, TMP1w + if (MAY_BE_PACKED(op1_info)) { + | // p = fe_ht->arPacked + pos; + || ZEND_ASSERT(sizeof(zval) == 16); + | mov FCARG2w, REG0w + | ldr TMP1, [FCARG1x, #offsetof(zend_array, arPacked)] + | add FCARG2x, TMP1, FCARG2x, lsl #4 + |1: + | // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + | ldr TMP1w, [FCARG1x, #offsetof(zend_array, nNumUsed)] + | cmp TMP1w, REG0w + | // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + | // ZEND_VM_CONTINUE(); + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + | bls &exit_addr + } else { + | bls >4 + } + } else { + | bls =>target_label + } + | // pos++; + | add REG0w, REG0w, #1 + | // value_type = Z_TYPE_INFO_P(value); + | // if (EXPECTED(value_type != IS_UNDEF)) { + if (!exit_addr || exit_opcode == ZEND_JMP) { + | IF_NOT_Z_TYPE FCARG2x, IS_UNDEF, >4, TMP1w + } else { + | IF_NOT_Z_TYPE FCARG2x, IS_UNDEF, &exit_addr, TMP1w + } + | // p++; + | add FCARG2x, FCARG2x, #sizeof(zval) + | b <1 } - | // p++; - | add FCARG2x, FCARG2x, #sizeof(Bucket) - | b <1 - |3: if (!exit_addr || exit_opcode == ZEND_JMP) { zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var); uint32_t val_info; - | // Z_FE_POS_P(array) = pos + 1; - | MEM_ACCESS_32_WITH_UOFFSET str, REG0w, FP, (opline->op1.var + offsetof(zval, u2.fe_pos)), TMP1 - if (RETURN_VALUE_USED(opline)) { zend_jit_addr res_addr = RES_ADDR(); - if ((op1_info & MAY_BE_ARRAY_KEY_LONG) - && (op1_info & MAY_BE_ARRAY_KEY_STRING)) { - | // if (!p->key) { - | ldr REG0, [FCARG2x, #offsetof(Bucket, key)] - | cbz REG0, >2 - } - if (op1_info & MAY_BE_ARRAY_KEY_STRING) { - | // ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); - | ldr REG0, [FCARG2x, #offsetof(Bucket, key)] - | SET_ZVAL_PTR res_addr, REG0, TMP1 - | ldr TMP1w, [REG0, #offsetof(zend_refcounted, gc.u.type_info)] - | TST_32_WITH_CONST TMP1w, IS_STR_INTERNED, TMP2w - | beq >1 - | SET_ZVAL_TYPE_INFO res_addr, IS_STRING, TMP1w, TMP2 - | b >3 - |1: - | GC_ADDREF REG0, TMP1w - | SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX, TMP1w, TMP2 + if (MAY_BE_HASH(op1_info)) { + |3: + | // Z_FE_POS_P(array) = pos + 1; + | MEM_ACCESS_32_WITH_UOFFSET str, REG0w, FP, (opline->op1.var + offsetof(zval, u2.fe_pos)), TMP1 + + if ((op1_info & MAY_BE_ARRAY_KEY_LONG) + && (op1_info & MAY_BE_ARRAY_KEY_STRING)) { + | // if (!p->key) { + | ldr REG0, [FCARG2x, #offsetof(Bucket, key)] + | cbz REG0, >2 + } + if (op1_info & MAY_BE_ARRAY_KEY_STRING) { + | // ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + | ldr REG0, [FCARG2x, #offsetof(Bucket, key)] + | SET_ZVAL_PTR res_addr, REG0, TMP1 + | ldr TMP1w, [REG0, #offsetof(zend_refcounted, gc.u.type_info)] + | TST_32_WITH_CONST TMP1w, IS_STR_INTERNED, TMP2w + | beq >1 + | SET_ZVAL_TYPE_INFO res_addr, IS_STRING, TMP1w, TMP2 + | b >3 + |1: + | GC_ADDREF REG0, TMP1w + | SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX, TMP1w, TMP2 + if ((op1_info & MAY_BE_ARRAY_KEY_LONG) || MAY_BE_PACKED(op1_info)) { + | b >3 + |2: + } + } if (op1_info & MAY_BE_ARRAY_KEY_LONG) { - | b >3 - |2: + | // ZVAL_LONG(EX_VAR(opline->result.var), p->h); + | ldr REG0, [FCARG2x, #offsetof(Bucket, h)] + | SET_ZVAL_LVAL_FROM_REG res_addr, REG0, TMP1 + | SET_ZVAL_TYPE_INFO res_addr, IS_LONG, TMP1w, TMP2 + if (MAY_BE_PACKED(op1_info)) { + | b >3 + } } } - if (op1_info & MAY_BE_ARRAY_KEY_LONG) { - | // ZVAL_LONG(EX_VAR(opline->result.var), p->h); - | ldr REG0, [FCARG2x, #offsetof(Bucket, h)] + if (MAY_BE_PACKED(op1_info)) { + |4: + | // Z_FE_POS_P(array) = pos + 1; + | MEM_ACCESS_32_WITH_UOFFSET str, REG0w, FP, (opline->op1.var + offsetof(zval, u2.fe_pos)), TMP1 + | sub REG0w, REG0w, #1 | SET_ZVAL_LVAL_FROM_REG res_addr, REG0, TMP1 | SET_ZVAL_TYPE_INFO res_addr, IS_LONG, TMP1w, TMP2 } |3: + } else { + |3: + |4: + | // Z_FE_POS_P(array) = pos + 1; + | MEM_ACCESS_32_WITH_UOFFSET str, REG0w, FP, (opline->op1.var + offsetof(zval, u2.fe_pos)), TMP1 } val_info = ((op1_info & MAY_BE_ARRAY_OF_ANY) >> MAY_BE_ARRAY_SHIFT); @@ -14411,6 +14500,9 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o | ZVAL_COPY_VALUE var_addr, -1, val_addr, val_info, ZREG_REG0, ZREG_FCARG1, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0 | TRY_ADDREF val_info, REG0w, FCARG1x, TMP1w } + } else { + |3: + |4: } return 1; diff --git a/ext/opcache/jit/zend_jit_disasm.c b/ext/opcache/jit/zend_jit_disasm.c index 621bf1991b8ea..afa0da5dc3af3 100644 --- a/ext/opcache/jit/zend_jit_disasm.c +++ b/ext/opcache/jit/zend_jit_disasm.c @@ -415,7 +415,7 @@ static int zend_jit_disasm(const char *name, /* label numbering */ n = 0; m = 0; - ZEND_HASH_FOREACH_VAL(&labels, z) { + ZEND_HASH_MAP_FOREACH_VAL(&labels, z) { if (Z_TYPE_P(z) == IS_FALSE) { m--; ZVAL_LONG(z, m); diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 35c702300adb5..3afde0206483a 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -1726,8 +1726,23 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin case ZEND_COUNT: case ZEND_QM_ASSIGN: case ZEND_FE_RESET_R: + ADD_OP1_TRACE_GUARD(); + break; case ZEND_FE_FETCH_R: ADD_OP1_TRACE_GUARD(); + if (op1_type == IS_ARRAY && (orig_op1_type & ~IS_TRACE_PACKED) == IS_ARRAY) { + + zend_ssa_var_info *info = &tssa->var_info[tssa->ops[idx].op1_use]; + + if (MAY_BE_PACKED(info->type) && MAY_BE_HASH(info->type)) { + info->type |= MAY_BE_PACKED_GUARD; + if (orig_op1_type & IS_TRACE_PACKED) { + info->type &= ~(MAY_BE_ARRAY_NUMERIC_HASH|MAY_BE_ARRAY_STRING_HASH); + } else { + info->type &= ~MAY_BE_ARRAY_PACKED; + } + } + } break; case ZEND_VERIFY_RETURN_TYPE: if (opline->op1_type == IS_UNUSED) { diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 07ca85a8c1a7f..214105f92c3fc 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -5557,20 +5557,20 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o } else { | jbe >2 // NOT_FOUND } - | // _ret = &_ht->arData[_h].val; + | // _ret = &_ht->arPacked[h]; if (val >= 0) { - | mov r0, aword [FCARG1a + offsetof(zend_array, arData)] + | mov r0, aword [FCARG1a + offsetof(zend_array, arPacked)] if (val != 0) { - | add r0, val * sizeof(Bucket) + | add r0, val * sizeof(zval) } } else { |.if X64 | mov r0, FCARG2a - | shl r0, 5 + | shl r0, 4 |.else - | imul r0, FCARG2a, sizeof(Bucket) + | imul r0, FCARG2a, sizeof(zval) |.endif - | add r0, aword [FCARG1a + offsetof(zend_array, arData)] + | add r0, aword [FCARG1a + offsetof(zend_array, arPacked)] } } } @@ -14650,7 +14650,11 @@ static int zend_jit_hash_jmp(dasm_State **Dst, const zend_op *opline, const zend } | LOAD_ADDR FCARG1a, jumptable | sub r0, aword [FCARG1a + offsetof(HashTable, arData)] - | mov FCARG1a, (sizeof(Bucket) / sizeof(void*)) + if (HT_IS_PACKED(jumptable)) { + | mov FCARG1a, (sizeof(zval) / sizeof(void*)) + } else { + | mov FCARG1a, (sizeof(Bucket) / sizeof(void*)) + } |.if X64 | cqo |.else @@ -14698,7 +14702,11 @@ static int zend_jit_hash_jmp(dasm_State **Dst, const zend_op *opline, const zend | .aword &exit_addr } } - p++; + if (HT_IS_PACKED(jumptable)) { + p = (Bucket*)(((zval*)p)+1); + } else { + p++; + } count--; } while (count); |.code @@ -14815,7 +14823,7 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o } if (HT_IS_PACKED(jumptable)) { uint32_t count = jumptable->nNumUsed; - Bucket *p = jumptable->arData; + zval *zv = jumptable->arPacked; | cmp FCARG2a, jumptable->nNumUsed if (default_label) { @@ -14841,9 +14849,8 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o if (trace_info) { trace_info->jmp_table_size += count; } - p = jumptable->arData; do { - if (Z_TYPE(p->val) == IS_UNDEF) { + if (Z_TYPE_P(zv) == IS_UNDEF) { if (default_label) { | .aword &default_label } else if (next_opline) { @@ -14852,7 +14859,7 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o | .aword =>default_b } } else { - target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL(p->val)); + target = ZEND_OFFSET_TO_OPLINE(opline, Z_LVAL_P(zv)); if (!next_opline) { b = ssa->cfg.map[target - op_array->opcodes]; | .aword =>b @@ -14864,7 +14871,7 @@ static int zend_jit_switch(dasm_State **Dst, const zend_op *opline, const zend_o | .aword &exit_addr } } - p++; + zv++; count--; } while (count); |.code @@ -15175,86 +15182,166 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o | // array = EX_VAR(opline->op1.var); | // fe_ht = Z_ARRVAL_P(array); | GET_ZVAL_PTR FCARG1a, op1_addr + + if (op1_info & MAY_BE_PACKED_GUARD) { + int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_PACKED_GUARD); + const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point); + + if (!exit_addr) { + return 0; + } + if (op1_info & MAY_BE_ARRAY_PACKED) { + | test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + | jz &exit_addr + } else { + | test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + | jnz &exit_addr + } + } + | // pos = Z_FE_POS_P(array); | mov eax, dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)] - | // p = fe_ht->arData + pos; - |.if X64 - || ZEND_ASSERT(sizeof(Bucket) == 32); - | mov FCARG2d, eax - | shl FCARG2a, 5 - |.else - | imul FCARG2a, r0, sizeof(Bucket) - |.endif - | add FCARG2a, aword [FCARG1a + offsetof(zend_array, arData)] - |1: - | // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { - | cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], eax - | // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - | // ZEND_VM_CONTINUE(); - if (exit_addr) { - if (exit_opcode == ZEND_JMP) { - | jbe &exit_addr + + if (MAY_BE_HASH(op1_info)) { + if (MAY_BE_PACKED(op1_info)) { + | test dword [FCARG1a + offsetof(zend_array, u.flags)], HASH_FLAG_PACKED + | jnz >2 + } + + | // p = fe_ht->arData + pos; + |.if X64 + || ZEND_ASSERT(sizeof(Bucket) == 32); + | mov FCARG2d, eax + | shl FCARG2a, 5 + |.else + | imul FCARG2a, r0, sizeof(Bucket) + |.endif + | add FCARG2a, aword [FCARG1a + offsetof(zend_array, arData)] + |1: + | // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + | cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], eax + | // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + | // ZEND_VM_CONTINUE(); + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + | jbe &exit_addr + } else { + | jbe >3 + } } else { - | jbe >3 + | jbe =>target_label + } + | // pos++; + | add eax, 1 + | // value_type = Z_TYPE_INFO_P(value); + | // if (EXPECTED(value_type != IS_UNDEF)) { + if (!exit_addr || exit_opcode == ZEND_JMP) { + | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >3 + } else { + | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, &exit_addr + } + | // p++; + | add FCARG2a, sizeof(Bucket) + | jmp <1 + if (MAY_BE_PACKED(op1_info)) { + |2: } - } else { - | jbe =>target_label } - | // pos++; - | add eax, 1 - | // value_type = Z_TYPE_INFO_P(value); - | // if (EXPECTED(value_type != IS_UNDEF)) { - if (!exit_addr || exit_opcode == ZEND_JMP) { - | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >3 - } else { - | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, &exit_addr + if (MAY_BE_PACKED(op1_info)) { + | // p = fe_ht->arPacked + pos; + || ZEND_ASSERT(sizeof(zval) == 16); + | mov FCARG2d, eax + | shl FCARG2a, 4 + | add FCARG2a, aword [FCARG1a + offsetof(zend_array, arPacked)] + |1: + | // if (UNEXPECTED(pos >= fe_ht->nNumUsed)) { + | cmp dword [FCARG1a + offsetof(zend_array, nNumUsed)], eax + | // ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + | // ZEND_VM_CONTINUE(); + if (exit_addr) { + if (exit_opcode == ZEND_JMP) { + | jbe &exit_addr + } else { + | jbe >4 + } + } else { + | jbe =>target_label + } + | // pos++; + | add eax, 1 + | // value_type = Z_TYPE_INFO_P(value); + | // if (EXPECTED(value_type != IS_UNDEF)) { + if (!exit_addr || exit_opcode == ZEND_JMP) { + | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >4 + } else { + | IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, &exit_addr + } + | // p++; + | add FCARG2a, sizeof(zval) + | jmp <1 } - | // p++; - | add FCARG2a, sizeof(Bucket) - | jmp <1 - |3: + if (!exit_addr || exit_opcode == ZEND_JMP) { zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG2, 0); zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var); uint32_t val_info; - | // Z_FE_POS_P(array) = pos + 1; - | mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax - if (RETURN_VALUE_USED(opline)) { zend_jit_addr res_addr = RES_ADDR(); - if ((op1_info & MAY_BE_ARRAY_KEY_LONG) - && (op1_info & MAY_BE_ARRAY_KEY_STRING)) { - | // if (!p->key) { - | cmp aword [FCARG2a + offsetof(Bucket, key)], 0 - | jz >2 - } - if (op1_info & MAY_BE_ARRAY_KEY_STRING) { - | // ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); - | mov r0, aword [FCARG2a + offsetof(Bucket, key)] - | SET_ZVAL_PTR res_addr, r0 - | test dword [r0 + offsetof(zend_refcounted, gc.u.type_info)], IS_STR_INTERNED - | jz >1 - | SET_ZVAL_TYPE_INFO res_addr, IS_STRING - | jmp >3 - |1: - | GC_ADDREF r0 - | SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX + if (MAY_BE_HASH(op1_info)) { + |3: + | // Z_FE_POS_P(array) = pos + 1; + | mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax + + if ((op1_info & MAY_BE_ARRAY_KEY_LONG) + && (op1_info & MAY_BE_ARRAY_KEY_STRING)) { + | // if (!p->key) { + | cmp aword [FCARG2a + offsetof(Bucket, key)], 0 + | jz >2 + } + if (op1_info & MAY_BE_ARRAY_KEY_STRING) { + | // ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key); + | mov r0, aword [FCARG2a + offsetof(Bucket, key)] + | SET_ZVAL_PTR res_addr, r0 + | test dword [r0 + offsetof(zend_refcounted, gc.u.type_info)], IS_STR_INTERNED + | jz >1 + | SET_ZVAL_TYPE_INFO res_addr, IS_STRING + | jmp >3 + |1: + | GC_ADDREF r0 + | SET_ZVAL_TYPE_INFO res_addr, IS_STRING_EX + if ((op1_info & MAY_BE_ARRAY_KEY_LONG) || MAY_BE_PACKED(op1_info)) { + | jmp >3 + |2: + } + } if (op1_info & MAY_BE_ARRAY_KEY_LONG) { - | jmp >3 - |2: + | // ZVAL_LONG(EX_VAR(opline->result.var), p->h); + | mov r0, aword [FCARG2a + offsetof(Bucket, h)] + | SET_ZVAL_LVAL res_addr, r0 + | SET_ZVAL_TYPE_INFO res_addr, IS_LONG + if (MAY_BE_PACKED(op1_info)) { + | jmp >3 + } } } - if (op1_info & MAY_BE_ARRAY_KEY_LONG) { - | // ZVAL_LONG(EX_VAR(opline->result.var), p->h); - | mov r0, aword [FCARG2a + offsetof(Bucket, h)] + if (MAY_BE_PACKED(op1_info)) { + |4: + | // Z_FE_POS_P(array) = pos + 1; + | mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax + | sub r0, 1 | SET_ZVAL_LVAL res_addr, r0 | SET_ZVAL_TYPE_INFO res_addr, IS_LONG } |3: + } else { + |3: + |4: + | // Z_FE_POS_P(array) = pos + 1; + | mov dword [FP + opline->op1.var + offsetof(zval, u2.fe_pos)], eax } val_info = ((op1_info & MAY_BE_ARRAY_OF_ANY) >> MAY_BE_ARRAY_SHIFT); @@ -15278,6 +15365,9 @@ static int zend_jit_fe_fetch(dasm_State **Dst, const zend_op *opline, uint32_t o | ZVAL_COPY_VALUE var_addr, -1, val_addr, val_info, ZREG_R0, ZREG_FCARG1 | TRY_ADDREF val_info, ah, FCARG1a } + } else { + |3: + |4: } return 1; diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index da1696bb92083..f785303c936a7 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -649,7 +649,7 @@ ZEND_FUNCTION(opcache_get_status) zend_op_array *op_array; array_init(&scripts); - ZEND_HASH_FOREACH_PTR(&ZCSG(preload_script)->script.function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ZCSG(preload_script)->script.function_table, op_array) { add_next_index_str(&scripts, op_array->function_name); } ZEND_HASH_FOREACH_END(); add_assoc_zval(&statistics, "functions", &scripts); @@ -660,7 +660,7 @@ ZEND_FUNCTION(opcache_get_status) zend_string *key; array_init(&scripts); - ZEND_HASH_FOREACH_STR_KEY_PTR(&ZCSG(preload_script)->script.class_table, key, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ZCSG(preload_script)->script.class_table, key, ce) { if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) { add_next_index_str(&scripts, key); } else { diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index b34f434d7c672..578556b8ef395 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -299,8 +299,6 @@ static void zend_file_cache_serialize_hash(HashTable *ht, void *buf, serialize_callback_t func) { - Bucket *p, *end; - if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) { ht->arData = NULL; return; @@ -308,16 +306,33 @@ static void zend_file_cache_serialize_hash(HashTable *ht, if (IS_SERIALIZED(ht->arData)) { return; } - SERIALIZE_PTR(ht->arData); - p = ht->arData; - UNSERIALIZE_PTR(p); - end = p + ht->nNumUsed; - while (p < end) { - if (Z_TYPE(p->val) != IS_UNDEF) { - SERIALIZE_STR(p->key); - func(&p->val, script, info, buf); + if (HT_IS_PACKED(ht)) { + zval *p, *end; + + SERIALIZE_PTR(ht->arPacked); + p = ht->arPacked; + UNSERIALIZE_PTR(p); + end = p + ht->nNumUsed; + while (p < end) { + if (Z_TYPE_P(p) != IS_UNDEF) { + func(p, script, info, buf); + } + p++; + } + } else { + Bucket *p, *end; + + SERIALIZE_PTR(ht->arData); + p = ht->arData; + UNSERIALIZE_PTR(p); + end = p + ht->nNumUsed; + while (p < end) { + if (Z_TYPE(p->val) != IS_UNDEF) { + SERIALIZE_STR(p->key); + func(&p->val, script, info, buf); + } + p++; } - p++; } } @@ -1107,8 +1122,6 @@ static void zend_file_cache_unserialize_hash(HashTable *ht, unserialize_callback_t func, dtor_func_t dtor) { - Bucket *p, *end; - ht->pDestructor = dtor; if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) { if (EXPECTED(!file_cache_only)) { @@ -1122,14 +1135,29 @@ static void zend_file_cache_unserialize_hash(HashTable *ht, return; } UNSERIALIZE_PTR(ht->arData); - p = ht->arData; - end = p + ht->nNumUsed; - while (p < end) { - if (Z_TYPE(p->val) != IS_UNDEF) { - UNSERIALIZE_STR(p->key); - func(&p->val, script, buf); + if (HT_IS_PACKED(ht)) { + zval *p, *end; + + p = ht->arPacked; + end = p + ht->nNumUsed; + while (p < end) { + if (Z_TYPE_P(p) != IS_UNDEF) { + func(p, script, buf); + } + p++; + } + } else { + Bucket *p, *end; + + p = ht->arData; + end = p + ht->nNumUsed; + while (p < end) { + if (Z_TYPE(p->val) != IS_UNDEF) { + UNSERIALIZE_STR(p->key); + func(&p->val, script, buf); + } + p++; } - p++; } } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 4a8c3fa47bc6e..0523f052ebd13 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -115,12 +115,12 @@ static void zend_hash_persist(HashTable *ht) HT_FLAGS(ht) |= HASH_FLAG_UNINITIALIZED; return; } - if (HT_FLAGS(ht) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(ht)) { void *data = HT_GET_DATA_ADDR(ht); if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) { - data = zend_shared_memdup(data, HT_USED_SIZE(ht)); + data = zend_shared_memdup(data, HT_PACKED_USED_SIZE(ht)); } else { - data = zend_shared_memdup_free(data, HT_USED_SIZE(ht)); + data = zend_shared_memdup_free(data, HT_PACKED_USED_SIZE(ht)); } HT_SET_DATA_ADDR(ht, data); } else if (ht->nNumUsed > HT_MIN_SIZE && ht->nNumUsed < (uint32_t)(-(int32_t)ht->nTableMask) / 4) { @@ -215,21 +215,32 @@ static void zend_persist_zval(zval *z) && zend_accel_in_shm(Z_ARR_P(z))) { /* pass */ } else { - Bucket *p; + HashTable *ht; if (!Z_REFCOUNTED_P(z)) { - Z_ARR_P(z) = zend_shared_memdup_put(Z_ARR_P(z), sizeof(zend_array)); + ht = zend_shared_memdup_put(Z_ARR_P(z), sizeof(zend_array)); } else { GC_REMOVE_FROM_BUFFER(Z_ARR_P(z)); - Z_ARR_P(z) = zend_shared_memdup_put_free(Z_ARR_P(z), sizeof(zend_array)); + ht = zend_shared_memdup_put_free(Z_ARR_P(z), sizeof(zend_array)); + } + Z_ARR_P(z) = ht; + zend_hash_persist(ht); + if (HT_IS_PACKED(ht)) { + zval *zv; + + ZEND_HASH_PACKED_FOREACH_VAL(ht, zv) { + zend_persist_zval(zv); + } ZEND_HASH_FOREACH_END(); + } else { + Bucket *p; + + ZEND_HASH_MAP_FOREACH_BUCKET(ht, p) { + if (p->key) { + zend_accel_store_interned_string(p->key); + } + zend_persist_zval(&p->val); + } ZEND_HASH_FOREACH_END(); } - zend_hash_persist(Z_ARRVAL_P(z)); - ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(z), p) { - if (p->key) { - zend_accel_store_interned_string(p->key); - } - zend_persist_zval(&p->val); - } ZEND_HASH_FOREACH_END(); /* make immutable array */ Z_TYPE_FLAGS_P(z) = 0; GC_SET_REFCOUNT(Z_COUNTED_P(z), 2); @@ -274,7 +285,7 @@ static HashTable *zend_persist_attributes(HashTable *attributes) zend_hash_persist(attributes); - ZEND_HASH_FOREACH_VAL(attributes, v) { + ZEND_HASH_PACKED_FOREACH_VAL(attributes, v) { zend_attribute *attr = Z_PTR_P(v); zend_attribute *copy = zend_shared_memdup_put_free(attr, ZEND_ATTRIBUTE_SIZE(attr->argc)); @@ -328,15 +339,24 @@ uint32_t zend_accel_get_class_name_map_ptr(zend_string *type_name) static HashTable *zend_persist_backed_enum_table(HashTable *backed_enum_table) { HashTable *ptr; - Bucket *p; zend_hash_persist(backed_enum_table); - ZEND_HASH_FOREACH_BUCKET(backed_enum_table, p) { - if (p->key != NULL) { - zend_accel_store_interned_string(p->key); - } - zend_persist_zval(&p->val); - } ZEND_HASH_FOREACH_END(); + if (HT_IS_PACKED(backed_enum_table)) { + zval *zv; + + ZEND_HASH_PACKED_FOREACH_VAL(backed_enum_table, zv) { + zend_persist_zval(zv); + } ZEND_HASH_FOREACH_END(); + } else { + Bucket *p; + + ZEND_HASH_MAP_FOREACH_BUCKET(backed_enum_table, p) { + if (p->key != NULL) { + zend_accel_store_interned_string(p->key); + } + zend_persist_zval(&p->val); + } ZEND_HASH_FOREACH_END(); + } ptr = zend_shared_memdup_free(backed_enum_table, sizeof(HashTable)); GC_SET_REFCOUNT(ptr, 2); @@ -493,7 +513,7 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc Bucket *p; zend_hash_persist(op_array->static_variables); - ZEND_HASH_FOREACH_BUCKET(op_array->static_variables, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(op_array->static_variables, p) { ZEND_ASSERT(p->key != NULL); zend_accel_store_interned_string(p->key); zend_persist_zval(&p->val); @@ -882,7 +902,7 @@ zend_class_entry *zend_persist_class_entry(zend_class_entry *orig_ce) } zend_hash_persist(&ce->function_table); - ZEND_HASH_FOREACH_BUCKET(&ce->function_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->function_table, p) { ZEND_ASSERT(p->key != NULL); zend_accel_store_interned_string(p->key); zend_persist_class_method(&p->val, ce); @@ -916,7 +936,7 @@ zend_class_entry *zend_persist_class_entry(zend_class_entry *orig_ce) } zend_hash_persist(&ce->constants_table); - ZEND_HASH_FOREACH_BUCKET(&ce->constants_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->constants_table, p) { ZEND_ASSERT(p->key != NULL); zend_accel_store_interned_string(p->key); zend_persist_class_constant(&p->val); @@ -924,7 +944,7 @@ zend_class_entry *zend_persist_class_entry(zend_class_entry *orig_ce) HT_FLAGS(&ce->constants_table) &= (HASH_FLAG_UNINITIALIZED | HASH_FLAG_STATIC_KEYS); zend_hash_persist(&ce->properties_info); - ZEND_HASH_FOREACH_BUCKET(&ce->properties_info, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->properties_info, p) { zend_property_info *prop = Z_PTR(p->val); ZEND_ASSERT(p->key != NULL); zend_accel_store_interned_string(p->key); @@ -1208,12 +1228,12 @@ static void zend_accel_persist_class_table(HashTable *class_table) JIT_G(on) = 0; #endif zend_hash_persist(class_table); - ZEND_HASH_FOREACH_BUCKET(class_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(class_table, p) { ZEND_ASSERT(p->key != NULL); zend_accel_store_interned_string(p->key); Z_CE(p->val) = zend_persist_class_entry(Z_CE(p->val)); } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_BUCKET(class_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(class_table, p) { if (EXPECTED(Z_TYPE(p->val) != IS_ALIAS_PTR)) { ce = Z_PTR(p->val); zend_update_parent_ce(ce); @@ -1225,10 +1245,10 @@ static void zend_accel_persist_class_table(HashTable *class_table) !ZCG(current_persistent_script)->corrupted) { zend_op_array *op_array; - ZEND_HASH_FOREACH_BUCKET(class_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(class_table, p) { if (EXPECTED(Z_TYPE(p->val) != IS_ALIAS_PTR)) { ce = Z_PTR(p->val); - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->type == ZEND_USER_FUNCTION) { if (op_array->scope == ce && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { @@ -1241,10 +1261,10 @@ static void zend_accel_persist_class_table(HashTable *class_table) } ZEND_HASH_FOREACH_END(); } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_BUCKET(class_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(class_table, p) { if (EXPECTED(Z_TYPE(p->val) != IS_ALIAS_PTR)) { ce = Z_PTR(p->val); - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->type == ZEND_USER_FUNCTION) { if ((op_array->scope != ce || (op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) @@ -1328,7 +1348,7 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script zend_accel_persist_class_table(&script->script.class_table); zend_hash_persist(&script->script.function_table); - ZEND_HASH_FOREACH_BUCKET(&script->script.function_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&script->script.function_table, p) { ZEND_ASSERT(p->key != NULL); zend_accel_store_interned_string(p->key); zend_persist_op_array(&p->val); diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index ed9a75bfced7c..1eac4684c58af 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -54,7 +54,9 @@ static void zend_hash_persist_calc(HashTable *ht) return; } - if (!(HT_FLAGS(ht) & HASH_FLAG_PACKED) && ht->nNumUsed > HT_MIN_SIZE && ht->nNumUsed < (uint32_t)(-(int32_t)ht->nTableMask) / 4) { + if (HT_IS_PACKED(ht)) { + ADD_SIZE(HT_PACKED_USED_SIZE(ht)); + } else if (ht->nNumUsed > HT_MIN_SIZE && ht->nNumUsed < (uint32_t)(-(int32_t)ht->nTableMask) / 4) { /* compact table */ uint32_t hash_size; @@ -112,16 +114,26 @@ static void zend_persist_zval_calc(zval *z) } size = zend_shared_memdup_size(Z_ARR_P(z), sizeof(zend_array)); if (size) { - Bucket *p; + HashTable *ht = Z_ARRVAL_P(z); ADD_SIZE(size); - zend_hash_persist_calc(Z_ARRVAL_P(z)); - ZEND_HASH_FOREACH_BUCKET(Z_ARRVAL_P(z), p) { - if (p->key) { - ADD_INTERNED_STRING(p->key); - } - zend_persist_zval_calc(&p->val); - } ZEND_HASH_FOREACH_END(); + zend_hash_persist_calc(ht); + if (HT_IS_PACKED(ht)) { + zval *zv; + + ZEND_HASH_PACKED_FOREACH_VAL(Z_ARRVAL_P(z), zv) { + zend_persist_zval_calc(zv); + } ZEND_HASH_FOREACH_END(); + } else { + Bucket *p; + + ZEND_HASH_MAP_FOREACH_BUCKET(Z_ARRVAL_P(z), p) { + if (p->key) { + ADD_INTERNED_STRING(p->key); + } + zend_persist_zval_calc(&p->val); + } ZEND_HASH_FOREACH_END(); + } } break; case IS_CONSTANT_AST: @@ -152,7 +164,7 @@ static void zend_persist_attributes_calc(HashTable *attributes) ADD_SIZE(sizeof(HashTable)); zend_hash_persist_calc(attributes); - ZEND_HASH_FOREACH_PTR(attributes, attr) { + ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { ADD_SIZE(ZEND_ATTRIBUTE_SIZE(attr->argc)); ADD_INTERNED_STRING(attr->name); ADD_INTERNED_STRING(attr->lcname); @@ -216,7 +228,7 @@ static void zend_persist_op_array_calc_ex(zend_op_array *op_array) zend_shared_alloc_register_xlat_entry(op_array->static_variables, op_array->static_variables); ADD_SIZE(sizeof(HashTable)); zend_hash_persist_calc(op_array->static_variables); - ZEND_HASH_FOREACH_BUCKET(op_array->static_variables, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(op_array->static_variables, p) { ZEND_ASSERT(p->key != NULL); ADD_INTERNED_STRING(p->key); zend_persist_zval_calc(&p->val); @@ -407,7 +419,7 @@ void zend_persist_class_entry_calc(zend_class_entry *ce) } zend_hash_persist_calc(&ce->function_table); - ZEND_HASH_FOREACH_BUCKET(&ce->function_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->function_table, p) { ZEND_ASSERT(p->key != NULL); ADD_INTERNED_STRING(p->key); zend_persist_class_method_calc(&p->val); @@ -431,14 +443,14 @@ void zend_persist_class_entry_calc(zend_class_entry *ce) } } zend_hash_persist_calc(&ce->constants_table); - ZEND_HASH_FOREACH_BUCKET(&ce->constants_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->constants_table, p) { ZEND_ASSERT(p->key != NULL); ADD_INTERNED_STRING(p->key); zend_persist_class_constant_calc(&p->val); } ZEND_HASH_FOREACH_END(); zend_hash_persist_calc(&ce->properties_info); - ZEND_HASH_FOREACH_BUCKET(&ce->properties_info, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&ce->properties_info, p) { zend_property_info *prop = Z_PTR(p->val); ZEND_ASSERT(p->key != NULL); ADD_INTERNED_STRING(p->key); @@ -534,15 +546,24 @@ void zend_persist_class_entry_calc(zend_class_entry *ce) } if (ce->backed_enum_table) { - Bucket *p; ADD_SIZE(sizeof(HashTable)); zend_hash_persist_calc(ce->backed_enum_table); - ZEND_HASH_FOREACH_BUCKET(ce->backed_enum_table, p) { - if (p->key != NULL) { - ADD_INTERNED_STRING(p->key); - } - zend_persist_zval_calc(&p->val); - } ZEND_HASH_FOREACH_END(); + if (HT_IS_PACKED(ce->backed_enum_table)) { + zval *zv; + + ZEND_HASH_PACKED_FOREACH_VAL(ce->backed_enum_table, zv) { + zend_persist_zval_calc(zv); + } ZEND_HASH_FOREACH_END(); + } else { + Bucket *p; + + ZEND_HASH_MAP_FOREACH_BUCKET(ce->backed_enum_table, p) { + if (p->key != NULL) { + ADD_INTERNED_STRING(p->key); + } + zend_persist_zval_calc(&p->val); + } ZEND_HASH_FOREACH_END(); + } } } } @@ -552,7 +573,7 @@ static void zend_accel_persist_class_table_calc(HashTable *class_table) Bucket *p; zend_hash_persist_calc(class_table); - ZEND_HASH_FOREACH_BUCKET(class_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(class_table, p) { ZEND_ASSERT(p->key != NULL); ADD_INTERNED_STRING(p->key); zend_persist_class_entry_calc(Z_CE(p->val)); @@ -610,7 +631,7 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s zend_hash_rehash(&new_persistent_script->script.function_table); } zend_hash_persist_calc(&new_persistent_script->script.function_table); - ZEND_HASH_FOREACH_BUCKET(&new_persistent_script->script.function_table, p) { + ZEND_HASH_MAP_FOREACH_BUCKET(&new_persistent_script->script.function_table, p) { ZEND_ASSERT(p->key != NULL); ADD_INTERNED_STRING(p->key); zend_persist_op_array_calc(&p->val); diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index c7abfda2856d6..cb2a44c1cf57a 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -2115,7 +2115,7 @@ static zend_string *php_pcre_replace_array(HashTable *regex, tmp_replace_entry_str = NULL; break; } - zv = &replace_ht->arData[replace_idx].val; + zv = ZEND_HASH_ELEMENT(replace_ht, replace_idx); replace_idx++; if (Z_TYPE_P(zv) != IS_UNDEF) { replace_entry_str = zval_get_tmp_string(zv, &tmp_replace_entry_str); diff --git a/ext/pdo/pdo.c b/ext/pdo/pdo.c index b18efe462842a..f11b983a9a82f 100644 --- a/ext/pdo/pdo.c +++ b/ext/pdo/pdo.c @@ -71,7 +71,7 @@ PHP_FUNCTION(pdo_drivers) array_init(return_value); - ZEND_HASH_FOREACH_PTR(&pdo_driver_hash, pdriver) { + ZEND_HASH_MAP_FOREACH_PTR(&pdo_driver_hash, pdriver) { add_next_index_stringl(return_value, pdriver->driver_name, pdriver->driver_name_len); } ZEND_HASH_FOREACH_END(); } @@ -277,7 +277,7 @@ PHP_MINFO_FUNCTION(pdo) php_info_print_table_start(); php_info_print_table_header(2, "PDO support", "enabled"); - ZEND_HASH_FOREACH_PTR(&pdo_driver_hash, pdriver) { + ZEND_HASH_MAP_FOREACH_PTR(&pdo_driver_hash, pdriver) { spprintf(&drivers, 0, "%s, %s", ldrivers, pdriver->driver_name); efree(ldrivers); ldrivers = drivers; diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index d53d2ca63c0d1..479959db42bb0 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1187,7 +1187,7 @@ PHP_METHOD(PDO, getAvailableDrivers) array_init(return_value); - ZEND_HASH_FOREACH_PTR(&pdo_driver_hash, pdriver) { + ZEND_HASH_MAP_FOREACH_PTR(&pdo_driver_hash, pdriver) { add_next_index_stringl(return_value, (char*)pdriver->driver_name, pdriver->driver_name_len); } ZEND_HASH_FOREACH_END(); } diff --git a/ext/phar/phar.c b/ext/phar/phar.c index bc08e4edde05d..91310c21e4967 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -2015,7 +2015,7 @@ int phar_detect_phar_fname_ext(const char *filename, size_t filename_len, const } else { zend_string *str_key; - ZEND_HASH_FOREACH_STR_KEY_PTR(&PHAR_G(phar_fname_map), str_key, pphar) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&PHAR_G(phar_fname_map), str_key, pphar) { if (ZSTR_LEN(str_key) > (uint32_t) filename_len) { continue; } @@ -2028,7 +2028,7 @@ int phar_detect_phar_fname_ext(const char *filename, size_t filename_len, const } ZEND_HASH_FOREACH_END(); if (PHAR_G(manifest_cached)) { - ZEND_HASH_FOREACH_STR_KEY_PTR(&cached_phars, str_key, pphar) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&cached_phars, str_key, pphar) { if (ZSTR_LEN(str_key) > (uint32_t) filename_len) { continue; } @@ -2723,7 +2723,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv } new_manifest_count = 0; offset = 0; - ZEND_HASH_FOREACH_PTR(&phar->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&phar->manifest, entry) { if (entry->cfp) { /* did we forget to get rid of cfp last time? */ php_stream_close(entry->cfp); @@ -2955,7 +2955,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv manifest_ftell = php_stream_tell(newfile); /* now write the manifest */ - ZEND_HASH_FOREACH_PTR(&phar->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&phar->manifest, entry) { const zend_string *metadata_str; if (entry->is_deleted || entry->is_mounted) { /* remove this from the new phar if deleted, ignore if mounted */ @@ -3039,7 +3039,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv /* now copy the actual file data to the new phar */ offset = php_stream_tell(newfile); - ZEND_HASH_FOREACH_PTR(&phar->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&phar->manifest, entry) { if (entry->is_deleted || entry->is_dir || entry->is_mounted) { continue; } @@ -3251,7 +3251,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv if (shared_cfp != NULL) { php_stream_close(shared_cfp); } - ZEND_HASH_FOREACH_PTR(&phar->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&phar->manifest, entry) { if (entry->cfp) { entry->cfp = NULL; entry->header_offset = 0; @@ -3504,7 +3504,7 @@ void phar_request_initialize(void) /* {{{ */ phar_archive_data *pphar; phar_entry_fp *stuff = (phar_entry_fp *) ecalloc(zend_hash_num_elements(&cached_phars), sizeof(phar_entry_fp)); - ZEND_HASH_FOREACH_PTR(&cached_phars, pphar) { + ZEND_HASH_MAP_FOREACH_PTR(&cached_phars, pphar) { stuff[pphar->phar_pos].manifest = (phar_entry_fp_info *) ecalloc( zend_hash_num_elements(&(pphar->manifest)), sizeof(phar_entry_fp_info)); } ZEND_HASH_FOREACH_END(); diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 448d03b7cc75e..a9bad08aa39f9 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2250,7 +2250,7 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert phar_metadata_tracker_copy(&phar->metadata_tracker, &source->metadata_tracker, phar->is_persistent); /* first copy each file's uncompressed contents to a temporary file and set per-file flags */ - ZEND_HASH_FOREACH_PTR(&source->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&source->manifest, entry) { newentry = *entry; @@ -4269,13 +4269,13 @@ static int extract_helper(phar_archive_data *archive, zend_string *search, char if (!search) { /* nothing to match -- extract all files */ - ZEND_HASH_FOREACH_PTR(&archive->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&archive->manifest, entry) { if (FAILURE == phar_extract_file(overwrite, entry, pathto, pathto_len, error)) return -1; extracted++; } ZEND_HASH_FOREACH_END(); } else if ('/' == ZSTR_VAL(search)[ZSTR_LEN(search) - 1]) { /* ends in "/" -- extract all entries having that prefix */ - ZEND_HASH_FOREACH_PTR(&archive->manifest, entry) { + ZEND_HASH_MAP_FOREACH_PTR(&archive->manifest, entry) { if (0 != strncmp(ZSTR_VAL(search), entry->filename, ZSTR_LEN(search))) continue; if (FAILURE == phar_extract_file(overwrite, entry, pathto, pathto_len, error)) return -1; extracted++; diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 745c3b429cf70..9bba67c6fc963 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -613,7 +613,7 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f if (HT_IS_INITIALIZED(&phar->mounted_dirs) && zend_hash_num_elements(&phar->mounted_dirs)) { zend_string *str_key; - ZEND_HASH_FOREACH_STR_KEY(&phar->mounted_dirs, str_key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&phar->mounted_dirs, str_key) { if (ZSTR_LEN(str_key) >= internal_file_len || strncmp(ZSTR_VAL(str_key), internal_file, ZSTR_LEN(str_key))) { continue; } else { @@ -883,7 +883,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from uint32_t from_len = ZSTR_LEN(resource_from->path) - 1; uint32_t to_len = ZSTR_LEN(resource_to->path) - 1; - ZEND_HASH_FOREACH_BUCKET(&phar->manifest, b) { + ZEND_HASH_MAP_FOREACH_BUCKET(&phar->manifest, b) { str_key = b->key; entry = Z_PTR(b->val); if (!entry->is_deleted && @@ -910,7 +910,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from } ZEND_HASH_FOREACH_END(); zend_hash_rehash(&phar->manifest); - ZEND_HASH_FOREACH_BUCKET(&phar->virtual_dirs, b) { + ZEND_HASH_MAP_FOREACH_BUCKET(&phar->virtual_dirs, b) { str_key = b->key; if (ZSTR_LEN(str_key) >= from_len && memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource_from->path)+1, from_len) == 0 && @@ -928,7 +928,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from } ZEND_HASH_FOREACH_END(); zend_hash_rehash(&phar->virtual_dirs); - ZEND_HASH_FOREACH_BUCKET(&phar->mounted_dirs, b) { + ZEND_HASH_MAP_FOREACH_BUCKET(&phar->mounted_dirs, b) { str_key = b->key; if (ZSTR_LEN(str_key) >= from_len && memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource_from->path)+1, from_len) == 0 && diff --git a/ext/phar/util.c b/ext/phar/util.c index 515830bf2c70a..72e633a5b3324 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -1290,7 +1290,7 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, si if (HT_IS_INITIALIZED(&phar->mounted_dirs) && zend_hash_num_elements(&phar->mounted_dirs)) { zend_string *str_key; - ZEND_HASH_FOREACH_STR_KEY(&phar->mounted_dirs, str_key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&phar->mounted_dirs, str_key) { if (ZSTR_LEN(str_key) >= path_len || strncmp(ZSTR_VAL(str_key), path, ZSTR_LEN(str_key))) { continue; } else { @@ -2056,7 +2056,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar) /* {{{ */ *pphar = phar; /* now, scan the list of persistent Phar objects referencing this phar and update the pointers */ - ZEND_HASH_FOREACH_PTR(&PHAR_G(phar_persist_map), objphar) { + ZEND_HASH_MAP_FOREACH_PTR(&PHAR_G(phar_persist_map), objphar) { if (objphar->archive->fname_len == phar->fname_len && !memcmp(objphar->archive->fname, phar->fname, phar->fname_len)) { objphar->archive = phar; } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 11024b9aee8cd..820520c0aedd1 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -384,7 +384,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char zend_string *key; zend_class_constant *c; - ZEND_HASH_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), key, c) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), key, c) { _class_const_string(str, ZSTR_VAL(key), c, ZSTR_VAL(sub_indent)); if (UNEXPECTED(EG(exception))) { zend_string_release(sub_indent); @@ -400,7 +400,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char if (count > 0) { zend_property_info *prop; - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop) { if ((prop->flags & ZEND_ACC_PRIVATE) && prop->ce != ce) { count_shadow_props++; } else if (prop->flags & ZEND_ACC_STATIC) { @@ -414,7 +414,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char if (count_static_props > 0) { zend_property_info *prop; - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop) { if ((prop->flags & ZEND_ACC_STATIC) && (!(prop->flags & ZEND_ACC_PRIVATE) || prop->ce == ce)) { _property_string(str, prop, NULL, ZSTR_VAL(sub_indent)); } @@ -428,7 +428,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char if (count > 0) { zend_function *mptr; - ZEND_HASH_FOREACH_PTR(&ce->function_table, mptr) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, mptr) { if ((mptr->common.fn_flags & ZEND_ACC_STATIC) && ((mptr->common.fn_flags & ZEND_ACC_PRIVATE) == 0 || mptr->common.scope == ce)) { @@ -442,7 +442,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char if (count_static_funcs > 0) { zend_function *mptr; - ZEND_HASH_FOREACH_PTR(&ce->function_table, mptr) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, mptr) { if ((mptr->common.fn_flags & ZEND_ACC_STATIC) && ((mptr->common.fn_flags & ZEND_ACC_PRIVATE) == 0 || mptr->common.scope == ce)) { @@ -461,7 +461,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char if (count > 0) { zend_property_info *prop; - ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop) { if (!(prop->flags & ZEND_ACC_STATIC) && (!(prop->flags & ZEND_ACC_PRIVATE) || prop->ce == ce)) { _property_string(str, prop, NULL, ZSTR_VAL(sub_indent)); @@ -477,7 +477,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_FOREACH_STR_KEY(properties, prop_name) { + ZEND_HASH_MAP_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++; @@ -500,7 +500,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char smart_str method_str = {0}; count = 0; - ZEND_HASH_FOREACH_PTR(&ce->function_table, mptr) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, mptr) { if ((mptr->common.fn_flags & ZEND_ACC_STATIC) == 0 && ((mptr->common.fn_flags & ZEND_ACC_PRIVATE) == 0 || mptr->common.scope == ce)) { @@ -748,7 +748,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)); i = 0; - ZEND_HASH_FOREACH_STR_KEY(static_variables, key) { + ZEND_HASH_MAP_FOREACH_STR_KEY(static_variables, key) { smart_str_append_printf(str, "%s Variable #%d [ $%s ]\n", indent, i++, ZSTR_VAL(key)); } ZEND_HASH_FOREACH_END(); smart_str_append_printf(str, "%s}\n", indent); @@ -1020,7 +1020,7 @@ static void _extension_string(smart_str *str, zend_module_entry *module, char *i { smart_str str_ini = {0}; zend_ini_entry *ini_entry; - ZEND_HASH_FOREACH_PTR(EG(ini_directives), ini_entry) { + ZEND_HASH_MAP_FOREACH_PTR(EG(ini_directives), ini_entry) { _extension_ini_string(ini_entry, &str_ini, indent, module->module_number); } ZEND_HASH_FOREACH_END(); if (smart_str_get_len(&str_ini) > 0) { @@ -1036,7 +1036,7 @@ static void _extension_string(smart_str *str, zend_module_entry *module, char *i zend_constant *constant; int num_constants = 0; - ZEND_HASH_FOREACH_PTR(EG(zend_constants), constant) { + ZEND_HASH_MAP_FOREACH_PTR(EG(zend_constants), constant) { if (ZEND_CONSTANT_MODULE_NUMBER(constant) == module->module_number) { _const_string(&str_constants, ZSTR_VAL(constant->name), &constant->value, indent); num_constants++; @@ -1055,7 +1055,7 @@ static void _extension_string(smart_str *str, zend_module_entry *module, char *i zend_function *fptr; int first = 1; - ZEND_HASH_FOREACH_PTR(CG(function_table), fptr) { + ZEND_HASH_MAP_FOREACH_PTR(CG(function_table), fptr) { if (fptr->common.type==ZEND_INTERNAL_FUNCTION && fptr->internal_function.module == module) { if (first) { @@ -1077,7 +1077,7 @@ static void _extension_string(smart_str *str, zend_module_entry *module, char *i zend_class_entry *ce; int num_classes = 0; - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { _extension_class_string(ce, key, &str_classes, ZSTR_VAL(sub_indent), module, &num_classes); } ZEND_HASH_FOREACH_END(); if (num_classes) { @@ -1125,7 +1125,7 @@ static int read_attributes(zval *ret, HashTable *attributes, zend_class_entry *s // Name based filtering using lowercased key. zend_string *filter = zend_string_tolower(name); - ZEND_HASH_FOREACH_PTR(attributes, attr) { + ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { if (attr->offset == offset && zend_string_equals(attr->lcname, filter)) { reflection_attribute_factory(&tmp, attributes, attr, scope, target, filename); add_next_index_zval(ret, &tmp); @@ -1136,7 +1136,7 @@ static int read_attributes(zval *ret, HashTable *attributes, zend_class_entry *s return SUCCESS; } - ZEND_HASH_FOREACH_PTR(attributes, attr) { + ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { if (attr->offset != offset) { continue; } @@ -1905,7 +1905,7 @@ ZEND_METHOD(ReflectionFunctionAbstract, getStaticVariables) ht = zend_array_dup(fptr->op_array.static_variables); ZEND_MAP_PTR_SET(fptr->op_array.static_variables_ptr, ht); } - ZEND_HASH_FOREACH_VAL(ht, val) { + ZEND_HASH_MAP_FOREACH_VAL(ht, val) { if (UNEXPECTED(zval_update_constant_ex(val, fptr->common.scope) != SUCCESS)) { RETURN_THROWS(); } @@ -3954,7 +3954,7 @@ static void add_class_vars(zend_class_entry *ce, bool statics, zval *return_valu zval *prop, prop_copy; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { if (((prop_info->flags & ZEND_ACC_PRIVATE) && prop_info->ce != ce)) { continue; @@ -4012,7 +4012,7 @@ ZEND_METHOD(ReflectionClass, getStaticProperties) array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { if (((prop_info->flags & ZEND_ACC_PRIVATE) && prop_info->ce != ce)) { continue; @@ -4404,7 +4404,7 @@ ZEND_METHOD(ReflectionClass, getMethods) GET_REFLECTION_OBJECT_PTR(ce); array_init(return_value); - ZEND_HASH_FOREACH_PTR(&ce->function_table, mptr) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, mptr) { _addmethod(mptr, ce, Z_ARRVAL_P(return_value), filter); } ZEND_HASH_FOREACH_END(); @@ -4580,14 +4580,14 @@ ZEND_METHOD(ReflectionClass, getProperties) GET_REFLECTION_OBJECT_PTR(ce); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ce->properties_info, key, prop_info) { _addproperty(prop_info, key, ce, Z_ARRVAL_P(return_value), filter); } ZEND_HASH_FOREACH_END(); if (Z_TYPE(intern->obj) != IS_UNDEF && (filter & ZEND_ACC_PUBLIC) != 0) { HashTable *properties = Z_OBJ_HT(intern->obj)->get_properties(Z_OBJ(intern->obj)); zval *prop; - ZEND_HASH_FOREACH_STR_KEY_VAL(properties, key, prop) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(properties, key, prop) { _adddynproperty(prop, key, ce, return_value); } ZEND_HASH_FOREACH_END(); } @@ -4636,7 +4636,7 @@ ZEND_METHOD(ReflectionClass, getConstants) GET_REFLECTION_OBJECT_PTR(ce); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), key, constant) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), key, constant) { if (UNEXPECTED(zval_update_constant_ex(&constant->value, ce) != SUCCESS)) { RETURN_THROWS(); } @@ -4670,7 +4670,7 @@ ZEND_METHOD(ReflectionClass, getReflectionConstants) GET_REFLECTION_OBJECT_PTR(ce); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), name, constant) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(CE_CONSTANTS_TABLE(ce), name, constant) { if (ZEND_CLASS_CONST_FLAGS(constant) & filter) { zval class_const; reflection_class_constant_factory(name, constant, &class_const); @@ -4695,7 +4695,7 @@ ZEND_METHOD(ReflectionClass, getConstant) GET_REFLECTION_OBJECT_PTR(ce); constants_table = CE_CONSTANTS_TABLE(ce); - ZEND_HASH_FOREACH_PTR(constants_table, c) { + ZEND_HASH_MAP_FOREACH_PTR(constants_table, c) { if (UNEXPECTED(zval_update_constant_ex(&c->value, ce) != SUCCESS)) { RETURN_THROWS(); } @@ -5919,7 +5919,7 @@ ZEND_METHOD(ReflectionExtension, getFunctions) GET_REFLECTION_OBJECT_PTR(module); array_init(return_value); - ZEND_HASH_FOREACH_PTR(CG(function_table), fptr) { + ZEND_HASH_MAP_FOREACH_PTR(CG(function_table), fptr) { if (fptr->common.type==ZEND_INTERNAL_FUNCTION && fptr->internal_function.module == module) { reflection_function_factory(fptr, NULL, &function); @@ -5942,7 +5942,7 @@ ZEND_METHOD(ReflectionExtension, getConstants) GET_REFLECTION_OBJECT_PTR(module); array_init(return_value); - ZEND_HASH_FOREACH_PTR(EG(zend_constants), constant) { + ZEND_HASH_MAP_FOREACH_PTR(EG(zend_constants), constant) { if (module->module_number == ZEND_CONSTANT_MODULE_NUMBER(constant)) { zval const_val; ZVAL_COPY_OR_DUP(&const_val, &constant->value); @@ -5980,7 +5980,7 @@ ZEND_METHOD(ReflectionExtension, getINIEntries) GET_REFLECTION_OBJECT_PTR(module); array_init(return_value); - ZEND_HASH_FOREACH_PTR(EG(ini_directives), ini_entry) { + ZEND_HASH_MAP_FOREACH_PTR(EG(ini_directives), ini_entry) { _addinientry(ini_entry, return_value, module->module_number); } ZEND_HASH_FOREACH_END(); } @@ -6024,7 +6024,7 @@ ZEND_METHOD(ReflectionExtension, getClasses) GET_REFLECTION_OBJECT_PTR(module); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { add_extension_class(ce, key, return_value, module, 1); } ZEND_HASH_FOREACH_END(); } @@ -6044,7 +6044,7 @@ ZEND_METHOD(ReflectionExtension, getClassNames) GET_REFLECTION_OBJECT_PTR(module); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(class_table), key, ce) { add_extension_class(ce, key, return_value, module, 0); } ZEND_HASH_FOREACH_END(); } @@ -6777,7 +6777,7 @@ ZEND_METHOD(ReflectionEnum, getCases) GET_REFLECTION_OBJECT_PTR(ce); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, name, constant) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&ce->constants_table, name, constant) { if (ZEND_CLASS_CONST_FLAGS(constant) & ZEND_CLASS_CONST_IS_CASE) { zval class_const; reflection_enum_case_factory(ce, name, constant, &class_const); diff --git a/ext/session/session.c b/ext/session/session.c index 18444932ceb37..32e2f33ae3028 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -1727,7 +1727,6 @@ PHP_FUNCTION(session_set_cookie_params) zend_argument_value_error(5, "must be null when argument #1 ($lifetime_or_options) is an array"); RETURN_THROWS(); } - ZEND_HASH_FOREACH_STR_KEY_VAL(options_ht, key, value) { if (key) { ZVAL_DEREF(value); @@ -1986,7 +1985,7 @@ PHP_FUNCTION(session_set_save_handler) /* For compatibility reason, implemented interface is not checked */ /* Find implemented methods - SessionHandlerInterface */ i = 0; - ZEND_HASH_FOREACH_STR_KEY(&php_session_iface_entry->function_table, func_name) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&php_session_iface_entry->function_table, func_name) { if ((current_mptr = zend_hash_find_ptr(&Z_OBJCE_P(obj)->function_table, func_name))) { if (!Z_ISUNDEF(PS(mod_user_names).names[i])) { zval_ptr_dtor(&PS(mod_user_names).names[i]); @@ -2005,7 +2004,7 @@ PHP_FUNCTION(session_set_save_handler) } ZEND_HASH_FOREACH_END(); /* Find implemented methods - SessionIdInterface (optional) */ - ZEND_HASH_FOREACH_STR_KEY(&php_session_id_iface_entry->function_table, func_name) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&php_session_id_iface_entry->function_table, func_name) { if ((current_mptr = zend_hash_find_ptr(&Z_OBJCE_P(obj)->function_table, func_name))) { if (!Z_ISUNDEF(PS(mod_user_names).names[i])) { zval_ptr_dtor(&PS(mod_user_names).names[i]); @@ -2025,7 +2024,7 @@ PHP_FUNCTION(session_set_save_handler) } ZEND_HASH_FOREACH_END(); /* Find implemented methods - SessionUpdateTimestampInterface (optional) */ - ZEND_HASH_FOREACH_STR_KEY(&php_session_update_timestamp_iface_entry->function_table, func_name) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&php_session_update_timestamp_iface_entry->function_table, func_name) { if ((current_mptr = zend_hash_find_ptr(&Z_OBJCE_P(obj)->function_table, func_name))) { if (!Z_ISUNDEF(PS(mod_user_names).names[i])) { zval_ptr_dtor(&PS(mod_user_names).names[i]); diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index ccce7bf1da610..ef3b08730c92d 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -703,12 +703,22 @@ static bool php_snmp_parse_oid( pptr = ZSTR_VAL(type_str); objid_query->vars[objid_query->count].type = *pptr; } else if (type_ht) { - while (idx_type < type_ht->nNumUsed) { - tmp_type = &type_ht->arData[idx_type].val; - if (Z_TYPE_P(tmp_type) != IS_UNDEF) { - break; + if (HT_IS_PACKED(type_ht)) { + while (idx_type < type_ht->nNumUsed) { + tmp_type = &type_ht->arPacked[idx_type]; + if (Z_TYPE_P(tmp_type) != IS_UNDEF) { + break; + } + idx_type++; + } + } else { + while (idx_type < type_ht->nNumUsed) { + tmp_type = &type_ht->arData[idx_type].val; + if (Z_TYPE_P(tmp_type) != IS_UNDEF) { + break; + } + idx_type++; } - idx_type++; } if (idx_type < type_ht->nNumUsed) { convert_to_string(tmp_type); @@ -730,12 +740,22 @@ static bool php_snmp_parse_oid( if (value_str) { objid_query->vars[objid_query->count].value = ZSTR_VAL(value_str); } else if (value_ht) { - while (idx_value < value_ht->nNumUsed) { - tmp_value = &value_ht->arData[idx_value].val; - if (Z_TYPE_P(tmp_value) != IS_UNDEF) { - break; + if (HT_IS_PACKED(value_ht)) { + while (idx_value < value_ht->nNumUsed) { + tmp_value = &value_ht->arPacked[idx_value]; + if (Z_TYPE_P(tmp_value) != IS_UNDEF) { + break; + } + idx_value++; + } + } else { + while (idx_value < value_ht->nNumUsed) { + tmp_value = &value_ht->arData[idx_value].val; + if (Z_TYPE_P(tmp_value) != IS_UNDEF) { + break; + } + idx_value++; } - idx_value++; } if (idx_value < value_ht->nNumUsed) { convert_to_string(tmp_value); @@ -1801,7 +1821,7 @@ static HashTable *php_snmp_get_properties(zend_object *object) obj = php_snmp_fetch_object(object); props = zend_std_get_properties(object); - ZEND_HASH_FOREACH_STR_KEY_PTR(&php_snmp_properties, key, hnd) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&php_snmp_properties, key, hnd) { if (!hnd->read_func || hnd->read_func(obj, &rv) != SUCCESS) { ZVAL_NULL(&rv); } diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 3a4626aa5beee..3b7d6c3885dcb 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -448,7 +448,7 @@ static xmlNodePtr master_to_xml_int(encodePtr encode, zval *data, int style, xml zval *tmp; zend_string *type_name; - ZEND_HASH_FOREACH_STR_KEY_VAL(SOAP_GLOBAL(class_map), type_name, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(SOAP_GLOBAL(class_map), type_name, tmp) { ZVAL_DEREF(tmp); if (Z_TYPE_P(tmp) == IS_STRING && ZSTR_LEN(ce->name) == Z_STRLEN_P(tmp) && diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c index db3c97b647391..f61357128bfc1 100644 --- a/ext/soap/php_http.c +++ b/ext/soap/php_http.c @@ -823,12 +823,12 @@ int make_http_soap_request(zval *this_ptr, /* Send cookies along with request */ cookies = Z_CLIENT_COOKIES_P(this_ptr); ZEND_ASSERT(Z_TYPE_P(cookies) == IS_ARRAY); - if (zend_hash_num_elements(Z_ARRVAL_P(cookies)) != 0) { + if (zend_hash_num_elements(Z_ARRVAL_P(cookies)) != 0 && !HT_IS_PACKED(Z_ARRVAL_P(cookies))) { zval *data; zend_string *key; has_cookies = 1; smart_str_append_const(&soap_headers, "Cookie: "); - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(cookies), key, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(cookies), key, data) { if (key && Z_TYPE_P(data) == IS_ARRAY) { zval *value; diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c index e93679a55ea39..68d78326e30ae 100644 --- a/ext/soap/php_schema.c +++ b/ext/soap/php_schema.c @@ -2287,17 +2287,17 @@ void schema_pass2(sdlCtx *ctx) } ZEND_HASH_FOREACH_END(); } if (ctx->attributeGroups) { - ZEND_HASH_FOREACH_PTR(ctx->attributeGroups, type) { + ZEND_HASH_MAP_FOREACH_PTR(ctx->attributeGroups, type) { schema_type_fixup(ctx, type); } ZEND_HASH_FOREACH_END(); } if (sdl->elements) { - ZEND_HASH_FOREACH_PTR(sdl->elements, type) { + ZEND_HASH_MAP_FOREACH_PTR(sdl->elements, type) { schema_type_fixup(ctx, type); } ZEND_HASH_FOREACH_END(); } if (sdl->groups) { - ZEND_HASH_FOREACH_PTR(sdl->groups, type) { + ZEND_HASH_MAP_FOREACH_PTR(sdl->groups, type) { schema_type_fixup(ctx, type); } ZEND_HASH_FOREACH_END(); } diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c index 4b79090ee83ff..2049f44821331 100644 --- a/ext/soap/php_sdl.c +++ b/ext/soap/php_sdl.c @@ -184,7 +184,7 @@ sdlBindingPtr get_binding_from_type(sdlPtr sdl, sdlBindingType type) return NULL; } - ZEND_HASH_FOREACH_PTR(sdl->bindings, binding) { + ZEND_HASH_MAP_FOREACH_PTR(sdl->bindings, binding) { if (binding->bindingType == type) { return binding; } @@ -1860,7 +1860,7 @@ static void sdl_serialize_attribute(sdlAttributePtr attr, HashTable *tmp_encoder sdlExtraAttributePtr tmp; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(attr->extraAttributes, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(attr->extraAttributes, key, tmp) { sdl_serialize_key(key, out); sdl_serialize_string(tmp->ns, out); sdl_serialize_string(tmp->val, out); @@ -1960,7 +1960,7 @@ static void sdl_serialize_type(sdlTypePtr type, HashTable *tmp_encoders, HashTab sdlRestrictionCharPtr tmp; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(type->restrictions->enumeration, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(type->restrictions->enumeration, key, tmp) { sdl_serialize_resriction_char(tmp, out); sdl_serialize_key(key, out); } ZEND_HASH_FOREACH_END(); @@ -2069,7 +2069,7 @@ static void sdl_serialize_soap_body(sdlSoapBindingFunctionBodyPtr body, HashTabl sdlSoapBindingFunctionHeaderPtr tmp; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(body->headers, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(body->headers, key, tmp) { sdl_serialize_key(key, out); WSDL_CACHE_PUT_1(tmp->use, out); if (tmp->use == SOAP_ENCODED) { @@ -2089,7 +2089,7 @@ static void sdl_serialize_soap_body(sdlSoapBindingFunctionBodyPtr body, HashTabl sdlSoapBindingFunctionHeaderPtr tmp2; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(body->headers, key, tmp2) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(body->headers, key, tmp2) { sdl_serialize_key(key, out); WSDL_CACHE_PUT_1(tmp2->use, out); if (tmp2->use == SOAP_ENCODED) { @@ -2147,7 +2147,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s sdlTypePtr tmp; zval zv; - ZEND_HASH_FOREACH_PTR(sdl->groups, tmp) { + ZEND_HASH_MAP_FOREACH_PTR(sdl->groups, tmp) { ZVAL_LONG(&zv, type_num); zend_hash_str_add(&tmp_types, (char*)&tmp, sizeof(tmp), &zv); ++type_num; @@ -2181,7 +2181,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s sdlTypePtr tmp; zval zv; - ZEND_HASH_FOREACH_PTR(sdl->elements, tmp) { + ZEND_HASH_MAP_FOREACH_PTR(sdl->elements, tmp) { ZVAL_LONG(&zv, type_num); zend_hash_str_add(&tmp_types, (char*)&tmp, sizeof(tmp), &zv); ++type_num; @@ -2218,7 +2218,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s sdlTypePtr tmp; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->groups, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->groups, key, tmp) { sdl_serialize_key(key, out); sdl_serialize_type(tmp, &tmp_encoders, &tmp_types, out); } ZEND_HASH_FOREACH_END(); @@ -2238,7 +2238,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s sdlTypePtr tmp; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->elements, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->elements, key, tmp) { sdl_serialize_key(key, out); sdl_serialize_type(tmp, &tmp_encoders, &tmp_types, out); } ZEND_HASH_FOREACH_END(); @@ -2267,7 +2267,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s zval zv; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->bindings, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->bindings, key, tmp) { sdl_serialize_key(key, out); sdl_serialize_string(tmp->name, out); sdl_serialize_string(tmp->location, out); @@ -2295,7 +2295,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s int function_num = 1; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(&sdl->functions, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&sdl->functions, key, tmp) { sdl_serialize_key(key, out); sdl_serialize_string(tmp->functionName, out); sdl_serialize_string(tmp->requestName, out); @@ -2327,7 +2327,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s WSDL_CACHE_PUT_INT(zend_hash_num_elements(tmp->faults), out); - ZEND_HASH_FOREACH_STR_KEY_PTR(tmp->faults, key, fault) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(tmp->faults, key, fault) { sdl_serialize_key(key, out); sdl_serialize_string(fault->name, out); sdl_serialize_parameters(fault->details, &tmp_encoders, &tmp_types, out); @@ -2364,7 +2364,7 @@ static void add_sdl_to_cache(const char *fn, const char *uri, time_t t, sdlPtr s zval *function_num; zend_string *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->requests, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->requests, key, tmp) { function_num = zend_hash_str_find(&tmp_functions, (char*)&tmp, sizeof(tmp)); WSDL_CACHE_PUT_INT(Z_LVAL_P(function_num), out); sdl_serialize_key(key, out); @@ -2444,7 +2444,7 @@ static HashTable* make_persistent_sdl_function_headers(HashTable *headers, HashT pheaders = malloc(sizeof(HashTable)); zend_hash_init(pheaders, zend_hash_num_elements(headers), NULL, delete_header_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(headers, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(headers, key, tmp) { pheader = malloc(sizeof(sdlSoapBindingFunctionHeader)); memset(pheader, 0, sizeof(sdlSoapBindingFunctionHeader)); *pheader = *tmp; @@ -2550,7 +2550,7 @@ static HashTable* make_persistent_sdl_function_faults(sdlFunctionPtr func, HashT pfaults = malloc(sizeof(HashTable)); zend_hash_init(pfaults, zend_hash_num_elements(faults), NULL, delete_fault_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(faults, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(faults, key, tmp) { pfault = malloc(sizeof(sdlFault)); memset(pfault, 0, sizeof(sdlFault)); *pfault = *tmp; @@ -2624,7 +2624,7 @@ static sdlAttributePtr make_persistent_sdl_attribute(sdlAttributePtr attr, HashT pattr->extraAttributes = malloc(sizeof(HashTable)); zend_hash_init(pattr->extraAttributes, zend_hash_num_elements(attr->extraAttributes), NULL, delete_extra_attribute_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(attr->extraAttributes, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(attr->extraAttributes, key, tmp) { if (key) { pextra = malloc(sizeof(sdlExtraAttribute)); memset(pextra, 0, sizeof(sdlExtraAttribute)); @@ -2768,7 +2768,7 @@ static sdlTypePtr make_persistent_sdl_type(sdlTypePtr type, HashTable *ptr_map, sdlRestrictionCharPtr tmp, penum; ptype->restrictions->enumeration = malloc(sizeof(HashTable)); zend_hash_init(ptype->restrictions->enumeration, zend_hash_num_elements(type->restrictions->enumeration), NULL, delete_restriction_var_char_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(type->restrictions->enumeration, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(type->restrictions->enumeration, key, tmp) { penum = tmp; make_persistent_restriction_char_int(&penum); /* We have to duplicate key emalloc->malloc */ @@ -2953,7 +2953,7 @@ static sdlPtr make_persistent_sdl(sdlPtr sdl) psdl->groups = malloc(sizeof(HashTable)); zend_hash_init(psdl->groups, zend_hash_num_elements(sdl->groups), NULL, delete_type_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->groups, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->groups, key, tmp) { ptype = make_persistent_sdl_type(tmp, &ptr_map, &bp_types, &bp_encoders); if (key) { /* We have to duplicate key emalloc->malloc */ @@ -2991,7 +2991,7 @@ static sdlPtr make_persistent_sdl(sdlPtr sdl) psdl->elements = malloc(sizeof(HashTable)); zend_hash_init(psdl->elements, zend_hash_num_elements(sdl->elements), NULL, delete_type_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->elements, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->elements, key, tmp) { ptype = make_persistent_sdl_type(tmp, &ptr_map, &bp_types, &bp_encoders); if (key) { /* We have to duplicate key emalloc->malloc */ @@ -3052,7 +3052,7 @@ static sdlPtr make_persistent_sdl(sdlPtr sdl) psdl->bindings = malloc(sizeof(HashTable)); zend_hash_init(psdl->bindings, zend_hash_num_elements(sdl->bindings), NULL, delete_binding_persistent, 1); - ZEND_HASH_FOREACH_STR_KEY_PTR(sdl->bindings, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(sdl->bindings, key, tmp) { pbind = make_persistent_sdl_binding(tmp, &ptr_map); if (key) { /* We have to duplicate key emalloc->malloc */ @@ -3069,7 +3069,7 @@ static sdlPtr make_persistent_sdl(sdlPtr sdl) sdlFunctionPtr tmp; sdlFunctionPtr pfunc; - ZEND_HASH_FOREACH_STR_KEY_PTR(&sdl->functions, key, tmp) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&sdl->functions, key, tmp) { pfunc = make_persistent_sdl_function(tmp, &ptr_map); if (key) { /* We have to duplicate key emalloc->malloc */ @@ -3089,7 +3089,7 @@ static sdlPtr make_persistent_sdl(sdlPtr sdl) psdl->requests = malloc(sizeof(HashTable)); zend_hash_init(psdl->requests, zend_hash_num_elements(sdl->requests), NULL, NULL, 1); - ZEND_HASH_FOREACH_STR_KEY_VAL(sdl->requests, key, zv) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(sdl->requests, key, zv) { tmp = Z_PTR_P(zv); if ((preq = zend_hash_str_find_ptr(&ptr_map, (char*)&tmp, sizeof(tmp))) == NULL) { assert(0); @@ -3352,7 +3352,7 @@ sdlPtr get_sdl(zval *this_ptr, char *uri, zend_long cache_wsdl) time_t latest = t; zend_string *latest_key = NULL, *key; - ZEND_HASH_FOREACH_STR_KEY_PTR(SOAP_GLOBAL(mem_cache), key, q) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(SOAP_GLOBAL(mem_cache), key, q) { if (q->time < latest) { latest = q->time; latest_key = key; diff --git a/ext/soap/soap.c b/ext/soap/soap.c index f33aacfff706a..11a4984d02c9c 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -744,25 +744,27 @@ static HashTable* soap_create_typemap(sdlPtr sdl, HashTable *ht) /* {{{ */ } ht2 = Z_ARRVAL_P(tmp); - ZEND_HASH_FOREACH_STR_KEY_VAL(ht2, name, tmp) { - if (name) { - if (zend_string_equals_literal(name, "type_name")) { - if (Z_TYPE_P(tmp) == IS_STRING) { - type_name = Z_STRVAL_P(tmp); - } else if (Z_TYPE_P(tmp) != IS_NULL) { - } - } else if (zend_string_equals_literal(name, "type_ns")) { - if (Z_TYPE_P(tmp) == IS_STRING) { - type_ns = Z_STRVAL_P(tmp); - } else if (Z_TYPE_P(tmp) != IS_NULL) { + if (!HT_IS_PACKED(ht2)) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht2, name, tmp) { + if (name) { + if (zend_string_equals_literal(name, "type_name")) { + if (Z_TYPE_P(tmp) == IS_STRING) { + type_name = Z_STRVAL_P(tmp); + } else if (Z_TYPE_P(tmp) != IS_NULL) { + } + } else if (zend_string_equals_literal(name, "type_ns")) { + if (Z_TYPE_P(tmp) == IS_STRING) { + type_ns = Z_STRVAL_P(tmp); + } else if (Z_TYPE_P(tmp) != IS_NULL) { + } + } else if (zend_string_equals_literal(name, "to_xml")) { + to_xml = tmp; + } else if (zend_string_equals_literal(name, "from_xml")) { + to_zval = tmp; } - } else if (zend_string_equals_literal(name, "to_xml")) { - to_xml = tmp; - } else if (zend_string_equals_literal(name, "from_xml")) { - to_zval = tmp; } - } - } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FOREACH_END(); + } if (type_name) { smart_str nscat = {0}; @@ -1063,14 +1065,14 @@ PHP_METHOD(SoapServer, getFunctions) } else if (service->soap_functions.ft != NULL) { zval *name; - ZEND_HASH_FOREACH_VAL(service->soap_functions.ft, name) { + ZEND_HASH_MAP_FOREACH_VAL(service->soap_functions.ft, name) { add_next_index_str(return_value, zend_string_copy(Z_STR_P(name))); } ZEND_HASH_FOREACH_END(); } if (ft != NULL) { zend_function *f; - ZEND_HASH_FOREACH_PTR(ft, f) { + ZEND_HASH_MAP_FOREACH_PTR(ft, f) { if ((service->type != SOAP_OBJECT && service->type != SOAP_CLASS) || (f->common.fn_flags & ZEND_ACC_PUBLIC)) { add_next_index_str(return_value, zend_string_copy(f->common.function_name)); } @@ -2568,7 +2570,7 @@ PHP_METHOD(SoapClient, __getFunctions) sdlFunctionPtr function; array_init(return_value); - ZEND_HASH_FOREACH_PTR(&sdl->functions, function) { + ZEND_HASH_MAP_FOREACH_PTR(&sdl->functions, function) { function_to_string(function, &buf); add_next_index_stringl(return_value, ZSTR_VAL(buf.s), ZSTR_LEN(buf.s)); smart_str_free(&buf); @@ -4091,7 +4093,7 @@ static sdlFunctionPtr get_doc_function(sdlPtr sdl, xmlNodePtr params) /* {{{ */ sdlFunctionPtr tmp; sdlParamPtr param; - ZEND_HASH_FOREACH_PTR(&sdl->functions, tmp) { + ZEND_HASH_MAP_FOREACH_PTR(&sdl->functions, tmp) { if (tmp->binding && tmp->binding->bindingType == BINDING_SOAP) { sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)tmp->bindingAttributes; if (fnb->style == SOAP_DOCUMENT) { diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index a82300114c214..1df6eaa09d659 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -2353,8 +2353,8 @@ PHP_FUNCTION(socket_addrinfo_lookup) memset(&hints, 0, sizeof(hints)); - if (zhints) { - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zhints), key, hint) { + if (zhints && !HT_IS_PACKED(Z_ARRVAL_P(zhints))) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(zhints), key, hint) { if (key) { if (zend_string_equals_literal(key, "ai_flags")) { hints.ai_flags = zval_get_long(hint); diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index c6b7e02a00ce7..839e978ec61ad 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -410,7 +410,7 @@ static zend_class_entry *spl_perform_autoload(zend_string *class_name, zend_stri return NULL; } - /* We don't use ZEND_HASH_FOREACH here, + /* We don't use ZEND_HASH_MAP_FOREACH here, * because autoloaders may be added/removed during autoloading. */ HashPosition pos; zend_hash_internal_pointer_reset_ex(spl_autoload_functions, &pos); @@ -464,6 +464,7 @@ PHP_FUNCTION(spl_autoload_call) } /* }}} */ #define HT_MOVE_TAIL_TO_HEAD(ht) \ + ZEND_ASSERT(!HT_IS_PACKED(ht)); \ do { \ Bucket tmp = (ht)->arData[(ht)->nNumUsed-1]; \ memmove((ht)->arData + 1, (ht)->arData, \ @@ -478,7 +479,7 @@ static Bucket *spl_find_registered_function(autoload_func_info *find_alfi) { } autoload_func_info *alfi; - ZEND_HASH_FOREACH_PTR(spl_autoload_functions, alfi) { + ZEND_HASH_MAP_FOREACH_PTR(spl_autoload_functions, alfi) { if (autoload_func_info_equals(alfi, find_alfi)) { return _p; } @@ -599,7 +600,7 @@ PHP_FUNCTION(spl_autoload_functions) array_init(return_value); if (spl_autoload_functions) { - ZEND_HASH_FOREACH_PTR(spl_autoload_functions, alfi) { + ZEND_HASH_MAP_FOREACH_PTR(spl_autoload_functions, alfi) { if (alfi->closure) { GC_ADDREF(alfi->closure); add_next_index_object(return_value, alfi->closure); @@ -675,7 +676,7 @@ PHP_MINFO_FUNCTION(spl) array_init(&list); SPL_LIST_CLASSES(&list, 0, 1, ZEND_ACC_INTERFACE) strg = estrdup(""); - ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(&list), zv) { + ZEND_HASH_MAP_FOREACH_VAL(Z_ARRVAL_P(&list), zv) { spl_build_class_list_string(zv, &strg); } ZEND_HASH_FOREACH_END(); zend_array_destroy(Z_ARR(list)); @@ -685,7 +686,7 @@ PHP_MINFO_FUNCTION(spl) array_init(&list); SPL_LIST_CLASSES(&list, 0, -1, ZEND_ACC_INTERFACE) strg = estrdup(""); - ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(&list), zv) { + ZEND_HASH_MAP_FOREACH_VAL(Z_ARRVAL_P(&list), zv) { spl_build_class_list_string(zv, &strg); } ZEND_HASH_FOREACH_END(); zend_array_destroy(Z_ARR(list)); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 65d1c518d338d..8daaf0a3f49ac 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1986,10 +1986,17 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* { uint32_t idx = 0; zval *first; - while (Z_ISUNDEF(Z_ARRVAL(intern->u.file.current_zval)->arData[idx].val)) { - idx++; + if (HT_IS_PACKED(Z_ARRVAL(intern->u.file.current_zval))) { + while (Z_ISUNDEF(Z_ARRVAL(intern->u.file.current_zval)->arPacked[idx])) { + idx++; + } + first = &Z_ARRVAL(intern->u.file.current_zval)->arPacked[idx]; + } else { + while (Z_ISUNDEF(Z_ARRVAL(intern->u.file.current_zval)->arData[idx].val)) { + idx++; + } + first = &Z_ARRVAL(intern->u.file.current_zval)->arData[idx].val; } - first = &Z_ARRVAL(intern->u.file.current_zval)->arData[idx].val; return Z_TYPE_P(first) == IS_STRING && Z_STRLEN_P(first) == 0; } return zend_hash_num_elements(Z_ARRVAL(intern->u.file.current_zval)) == 0; diff --git a/ext/standard/array.c b/ext/standard/array.c index 6345dd4ebbadf..8137bfcbd8d79 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1205,6 +1205,12 @@ PHP_FUNCTION(key) } /* }}} */ +static int php_data_compare(const void *f, const void *s) /* {{{ */ +{ + return zend_compare((zval*)f, (zval*)s); +} +/* }}} */ + /* {{{ * proto mixed min(array values) * proto mixed min(mixed arg1 [, mixed arg2 [, mixed ...]]) @@ -1224,7 +1230,7 @@ PHP_FUNCTION(min) zend_argument_type_error(1, "must be of type array, %s given", zend_zval_type_name(&args[0])); RETURN_THROWS(); } else { - zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_array_data_compare_unstable, 0); + zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_data_compare, 0); if (result) { RETURN_COPY_DEREF(result); } else { @@ -1270,7 +1276,7 @@ PHP_FUNCTION(max) zend_argument_type_error(1, "must be of type array, %s given", zend_zval_type_name(&args[0])); RETURN_THROWS(); } else { - zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_array_data_compare_unstable, 1); + zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_data_compare, 1); if (result) { RETURN_COPY_DEREF(result); } else { @@ -1667,7 +1673,10 @@ static zend_long php_extract_ref_if_exists(zend_array *arr, zend_array *symbol_t zend_string *var_name; zval *entry, *orig_var; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -1710,7 +1719,10 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table zend_string *var_name; zval *entry, *orig_var; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -1751,7 +1763,10 @@ static zend_long php_extract_ref_overwrite(zend_array *arr, zend_array *symbol_t zend_string *var_name; zval *entry, *orig_var; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -1798,7 +1813,10 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table zend_string *var_name; zval *entry, *orig_var; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -1840,7 +1858,10 @@ static zend_long php_extract_ref_prefix_if_exists(zend_array *arr, zend_array *s zend_string *var_name; zval *entry, *orig_var, final_name; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -1896,7 +1917,10 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo zend_string *var_name; zval *entry, *orig_var, final_name; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -1947,7 +1971,10 @@ static zend_long php_extract_ref_prefix_same(zend_array *arr, zend_array *symbol zend_string *var_name; zval *entry, *orig_var, final_name; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -2021,7 +2048,10 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab zend_string *var_name; zval *entry, *orig_var, final_name; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -2291,7 +2321,10 @@ static zend_long php_extract_ref_skip(zend_array *arr, zend_array *symbol_table) zend_string *var_name; zval *entry, *orig_var; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -2336,7 +2369,10 @@ static zend_long php_extract_skip(zend_array *arr, zend_array *symbol_table) /* zend_string *var_name; zval *entry, *orig_var; - ZEND_HASH_FOREACH_STR_KEY_VAL(arr, var_name, entry) { + if (HT_IS_PACKED(arr)) { + return 0; + } + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(arr, var_name, entry) { if (!var_name) { continue; } @@ -2566,8 +2602,7 @@ PHP_FUNCTION(array_fill) RETURN_THROWS(); } else if (EXPECTED(start_key >= 0) && EXPECTED(start_key < num)) { /* create packed array */ - Bucket *p; - zend_long n; + zval *zv; array_init_size(return_value, (uint32_t)(start_key + num)); zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); @@ -2579,18 +2614,15 @@ PHP_FUNCTION(array_fill) GC_ADDREF_EX(Z_COUNTED_P(val), (uint32_t)num); } - p = Z_ARRVAL_P(return_value)->arData; - n = start_key; + zv = Z_ARRVAL_P(return_value)->arPacked; while (start_key--) { - ZVAL_UNDEF(&p->val); - p++; + ZVAL_UNDEF(zv); + zv++; } while (num--) { - ZVAL_COPY_VALUE(&p->val, val); - p->h = n++; - p->key = NULL; - p++; + ZVAL_COPY_VALUE(zv, val); + zv++; } } else { /* create hash */ @@ -2859,7 +2891,7 @@ PHP_FUNCTION(range) static void php_array_data_shuffle(zval *array) /* {{{ */ { uint32_t idx, j, n_elems; - Bucket *p, temp; + zval *zv, temp; HashTable *hash; zend_long rnd_idx; uint32_t n_left; @@ -2873,13 +2905,29 @@ static void php_array_data_shuffle(zval *array) /* {{{ */ hash = Z_ARRVAL_P(array); n_left = n_elems; + if (!HT_IS_PACKED(hash)) { + if (!HT_HAS_STATIC_KEYS_ONLY(hash)) { + Bucket *p = hash->arData; + uint32_t i = hash->nNumUsed; + + for (; i > 0; p++, i--) { + if (Z_ISUNDEF(p->val)) continue; + if (p->key) { + zend_string_release(p->key); + p->key = NULL; + } + } + } + zend_hash_to_packed(hash); + } + if (EXPECTED(!HT_HAS_ITERATORS(hash))) { if (hash->nNumUsed != hash->nNumOfElements) { for (j = 0, idx = 0; idx < hash->nNumUsed; idx++) { - p = hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; + zv = hash->arPacked + idx; + if (Z_TYPE_P(zv) == IS_UNDEF) continue; if (j != idx) { - hash->arData[j] = *p; + ZVAL_COPY_VALUE(&hash->arPacked[j], zv); } j++; } @@ -2887,9 +2935,9 @@ static void php_array_data_shuffle(zval *array) /* {{{ */ while (--n_left) { rnd_idx = php_mt_rand_range(0, n_left); if (rnd_idx != n_left) { - temp = hash->arData[n_left]; - hash->arData[n_left] = hash->arData[rnd_idx]; - hash->arData[rnd_idx] = temp; + ZVAL_COPY_VALUE(&temp, &hash->arPacked[n_left]); + ZVAL_COPY_VALUE(&hash->arPacked[n_left], &hash->arPacked[rnd_idx]); + ZVAL_COPY_VALUE(&hash->arPacked[rnd_idx], &temp); } } } else { @@ -2897,10 +2945,10 @@ static void php_array_data_shuffle(zval *array) /* {{{ */ if (hash->nNumUsed != hash->nNumOfElements) { for (j = 0, idx = 0; idx < hash->nNumUsed; idx++) { - p = hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; + zv = hash->arPacked + idx; + if (Z_TYPE_P(zv) == IS_UNDEF) continue; if (j != idx) { - hash->arData[j] = *p; + ZVAL_COPY_VALUE(&hash->arPacked[j], zv); if (idx == iter_pos) { zend_hash_iterators_update(hash, idx, j); iter_pos = zend_hash_iterators_lower_pos(hash, iter_pos + 1); @@ -2912,28 +2960,16 @@ static void php_array_data_shuffle(zval *array) /* {{{ */ while (--n_left) { rnd_idx = php_mt_rand_range(0, n_left); if (rnd_idx != n_left) { - temp = hash->arData[n_left]; - hash->arData[n_left] = hash->arData[rnd_idx]; - hash->arData[rnd_idx] = temp; + ZVAL_COPY_VALUE(&temp, &hash->arPacked[n_left]); + ZVAL_COPY_VALUE(&hash->arPacked[n_left], &hash->arPacked[rnd_idx]); + ZVAL_COPY_VALUE(&hash->arPacked[rnd_idx], &temp); zend_hash_iterators_update(hash, (uint32_t)rnd_idx, n_left); } } } hash->nNumUsed = n_elems; hash->nInternalPointer = 0; - - for (j = 0; j < n_elems; j++) { - p = hash->arData + j; - if (p->key) { - zend_string_release_ex(p->key, 0); - } - p->h = j; - p->key = NULL; - } hash->nNextFreeElement = n_elems; - if (!(HT_FLAGS(hash) & HASH_FLAG_PACKED)) { - zend_hash_to_packed(hash); - } } /* }}} */ @@ -2958,7 +2994,6 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H zend_long num_in; /* Number of entries in the input hashtable */ zend_long pos; /* Current position in the hashtable */ uint32_t idx; - Bucket *p; /* Pointer to hash bucket */ zval *entry; /* Hash entry */ uint32_t iter_pos = zend_hash_iterators_lower_pos(in_hash, 0); @@ -2982,80 +3017,138 @@ static void php_splice(HashTable *in_hash, zend_long offset, zend_long length, H /* Create and initialize output hash */ zend_hash_init(&out_hash, (length > 0 ? num_in - length : 0) + (replace ? zend_hash_num_elements(replace) : 0), NULL, ZVAL_PTR_DTOR, 0); - /* Start at the beginning of the input hash and copy entries to output hash until offset is reached */ - for (pos = 0, idx = 0; pos < offset && idx < in_hash->nNumUsed; idx++) { - p = in_hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - entry = &p->val; + if (HT_IS_PACKED(in_hash)) { + /* Start at the beginning of the input hash and copy entries to output hash until offset is reached */ + entry = in_hash->arPacked; + for (pos = 0, idx = 0; pos < offset && idx < in_hash->nNumUsed; idx++, entry++) { + if (Z_TYPE_P(entry) == IS_UNDEF) continue; - /* Update output hash depending on key type */ - if (p->key == NULL) { zend_hash_next_index_insert_new(&out_hash, entry); - } else { - zend_hash_add_new(&out_hash, p->key, entry); + if (idx == iter_pos) { + if ((zend_long)idx != pos) { + zend_hash_iterators_update(in_hash, idx, pos); + } + iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos + 1); + } + pos++; + } + + /* If hash for removed entries exists, go until offset+length and copy the entries to it */ + if (removed != NULL) { + for ( ; pos < offset + length && idx < in_hash->nNumUsed; idx++, entry++) { + if (Z_TYPE_P(entry) == IS_UNDEF) continue; + pos++; + Z_TRY_ADDREF_P(entry); + zend_hash_next_index_insert_new(removed, entry); + zend_hash_packed_del_val(in_hash, entry); + } + } else { /* otherwise just skip those entries */ + int pos2 = pos; + + for ( ; pos2 < offset + length && idx < in_hash->nNumUsed; idx++, entry++) { + if (Z_TYPE_P(entry) == IS_UNDEF) continue; + pos2++; + zend_hash_packed_del_val(in_hash, entry); + } + } + iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos); + + /* If there are entries to insert.. */ + if (replace) { + ZEND_HASH_FOREACH_VAL(replace, entry) { + Z_TRY_ADDREF_P(entry); + zend_hash_next_index_insert_new(&out_hash, entry); + pos++; + } ZEND_HASH_FOREACH_END(); } - if (idx == iter_pos) { - if ((zend_long)idx != pos) { - zend_hash_iterators_update(in_hash, idx, pos); + + /* Copy the remaining input hash entries to the output hash */ + entry = in_hash->arPacked + idx; + for ( ; idx < in_hash->nNumUsed ; idx++, entry++) { + if (Z_TYPE_P(entry) == IS_UNDEF) continue; + zend_hash_next_index_insert_new(&out_hash, entry); + if (idx == iter_pos) { + if ((zend_long)idx != pos) { + zend_hash_iterators_update(in_hash, idx, pos); + } + iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos + 1); } - iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos + 1); + pos++; } - pos++; - } + } else { + Bucket *p = in_hash->arData; - /* If hash for removed entries exists, go until offset+length and copy the entries to it */ - if (removed != NULL) { - for ( ; pos < offset + length && idx < in_hash->nNumUsed; idx++) { - p = in_hash->arData + idx; + /* Start at the beginning of the input hash and copy entries to output hash until offset is reached */ + for (pos = 0, idx = 0; pos < offset && idx < in_hash->nNumUsed; idx++, p++) { if (Z_TYPE(p->val) == IS_UNDEF) continue; - pos++; entry = &p->val; - Z_TRY_ADDREF_P(entry); + + /* Update output hash depending on key type */ if (p->key == NULL) { - zend_hash_next_index_insert_new(removed, entry); + zend_hash_next_index_insert_new(&out_hash, entry); } else { - zend_hash_add_new(removed, p->key, entry); + zend_hash_add_new(&out_hash, p->key, entry); + } + if (idx == iter_pos) { + if ((zend_long)idx != pos) { + zend_hash_iterators_update(in_hash, idx, pos); + } + iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos + 1); } - zend_hash_del_bucket(in_hash, p); + pos++; } - } else { /* otherwise just skip those entries */ - int pos2 = pos; - for ( ; pos2 < offset + length && idx < in_hash->nNumUsed; idx++) { - p = in_hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - pos2++; - zend_hash_del_bucket(in_hash, p); - } - } - iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos); + /* If hash for removed entries exists, go until offset+length and copy the entries to it */ + if (removed != NULL) { + for ( ; pos < offset + length && idx < in_hash->nNumUsed; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + pos++; + entry = &p->val; + Z_TRY_ADDREF_P(entry); + if (p->key == NULL) { + zend_hash_next_index_insert_new(removed, entry); + } else { + zend_hash_add_new(removed, p->key, entry); + } + zend_hash_del_bucket(in_hash, p); + } + } else { /* otherwise just skip those entries */ + int pos2 = pos; - /* If there are entries to insert.. */ - if (replace) { - ZEND_HASH_FOREACH_VAL(replace, entry) { - Z_TRY_ADDREF_P(entry); - zend_hash_next_index_insert_new(&out_hash, entry); - pos++; - } ZEND_HASH_FOREACH_END(); - } + for ( ; pos2 < offset + length && idx < in_hash->nNumUsed; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + pos2++; + zend_hash_del_bucket(in_hash, p); + } + } + iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos); - /* Copy the remaining input hash entries to the output hash */ - for ( ; idx < in_hash->nNumUsed ; idx++) { - p = in_hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - entry = &p->val; - if (p->key == NULL) { - zend_hash_next_index_insert_new(&out_hash, entry); - } else { - zend_hash_add_new(&out_hash, p->key, entry); + /* If there are entries to insert.. */ + if (replace) { + ZEND_HASH_FOREACH_VAL(replace, entry) { + Z_TRY_ADDREF_P(entry); + zend_hash_next_index_insert_new(&out_hash, entry); + pos++; + } ZEND_HASH_FOREACH_END(); } - if (idx == iter_pos) { - if ((zend_long)idx != pos) { - zend_hash_iterators_update(in_hash, idx, pos); + + /* Copy the remaining input hash entries to the output hash */ + for ( ; idx < in_hash->nNumUsed ; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + entry = &p->val; + if (p->key == NULL) { + zend_hash_next_index_insert_new(&out_hash, entry); + } else { + zend_hash_add_new(&out_hash, p->key, entry); + } + if (idx == iter_pos) { + if ((zend_long)idx != pos) { + zend_hash_iterators_update(in_hash, idx, pos); + } + iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos + 1); } - iter_pos = zend_hash_iterators_lower_pos(in_hash, iter_pos + 1); + pos++; } - pos++; } /* replace HashTable data */ @@ -3114,7 +3207,6 @@ PHP_FUNCTION(array_pop) zval *stack, /* Input stack */ *val; /* Value to be popped */ uint32_t idx; - Bucket *p; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_ARRAY_EX(stack, 0, 1) @@ -3124,27 +3216,52 @@ PHP_FUNCTION(array_pop) return; } - /* Get the last value and copy it into the return value */ - idx = Z_ARRVAL_P(stack)->nNumUsed; - while (1) { - if (idx == 0) { - return; + if (HT_IS_PACKED(Z_ARRVAL_P(stack))) { + /* Get the last value and copy it into the return value */ + idx = Z_ARRVAL_P(stack)->nNumUsed; + while (1) { + if (idx == 0) { + return; + } + idx--; + val = Z_ARRVAL_P(stack)->arPacked + idx; + if (Z_TYPE_P(val) != IS_UNDEF) { + break; + } } - idx--; - p = Z_ARRVAL_P(stack)->arData + idx; - val = &p->val; - if (Z_TYPE_P(val) != IS_UNDEF) { - break; + RETVAL_COPY_DEREF(val); + + if (idx == (Z_ARRVAL_P(stack)->nNextFreeElement - 1)) { + Z_ARRVAL_P(stack)->nNextFreeElement = Z_ARRVAL_P(stack)->nNextFreeElement - 1; } - } - RETVAL_COPY_DEREF(val); - if (!p->key && (zend_long)p->h == (Z_ARRVAL_P(stack)->nNextFreeElement - 1)) { - Z_ARRVAL_P(stack)->nNextFreeElement = Z_ARRVAL_P(stack)->nNextFreeElement - 1; - } + /* Delete the last value */ + zend_hash_packed_del_val(Z_ARRVAL_P(stack), val); + } else { + Bucket *p; - /* Delete the last value */ - zend_hash_del_bucket(Z_ARRVAL_P(stack), p); + /* Get the last value and copy it into the return value */ + idx = Z_ARRVAL_P(stack)->nNumUsed; + while (1) { + if (idx == 0) { + return; + } + idx--; + p = Z_ARRVAL_P(stack)->arData + idx; + val = &p->val; + if (Z_TYPE_P(val) != IS_UNDEF) { + break; + } + } + RETVAL_COPY_DEREF(val); + + if (!p->key && (zend_long)p->h == (Z_ARRVAL_P(stack)->nNextFreeElement - 1)) { + Z_ARRVAL_P(stack)->nNextFreeElement = Z_ARRVAL_P(stack)->nNextFreeElement - 1; + } + + /* Delete the last value */ + zend_hash_del_bucket(Z_ARRVAL_P(stack), p); + } zend_hash_internal_pointer_reset(Z_ARRVAL_P(stack)); } /* }}} */ @@ -3155,7 +3272,6 @@ PHP_FUNCTION(array_shift) zval *stack, /* Input stack */ *val; /* Value to be popped */ uint32_t idx; - Bucket *p; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_ARRAY_EX(stack, 0, 1) @@ -3165,38 +3281,35 @@ PHP_FUNCTION(array_shift) return; } - /* Get the first value and copy it into the return value */ - idx = 0; - while (1) { - if (idx == Z_ARRVAL_P(stack)->nNumUsed) { - return; - } - p = Z_ARRVAL_P(stack)->arData + idx; - val = &p->val; - if (Z_TYPE_P(val) != IS_UNDEF) { - break; - } - idx++; - } - RETVAL_COPY_DEREF(val); - - /* Delete the first value */ - zend_hash_del_bucket(Z_ARRVAL_P(stack), p); - /* re-index like it did before */ - if (HT_FLAGS(Z_ARRVAL_P(stack)) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(Z_ARRVAL_P(stack))) { uint32_t k = 0; + /* Get the first value and copy it into the return value */ + idx = 0; + while (1) { + if (idx == Z_ARRVAL_P(stack)->nNumUsed) { + return; + } + val = Z_ARRVAL_P(stack)->arPacked + idx; + if (Z_TYPE_P(val) != IS_UNDEF) { + break; + } + idx++; + } + RETVAL_COPY_DEREF(val); + + /* Delete the first value */ + zend_hash_packed_del_val(Z_ARRVAL_P(stack), val); + if (EXPECTED(!HT_HAS_ITERATORS(Z_ARRVAL_P(stack)))) { for (idx = 0; idx < Z_ARRVAL_P(stack)->nNumUsed; idx++) { - p = Z_ARRVAL_P(stack)->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; + val = Z_ARRVAL_P(stack)->arPacked + idx; + if (Z_TYPE_P(val) == IS_UNDEF) continue; if (idx != k) { - Bucket *q = Z_ARRVAL_P(stack)->arData + k; - q->h = k; - q->key = NULL; - ZVAL_COPY_VALUE(&q->val, &p->val); - ZVAL_UNDEF(&p->val); + zval *q = Z_ARRVAL_P(stack)->arPacked + k; + ZVAL_COPY_VALUE(q, val); + ZVAL_UNDEF(val); } k++; } @@ -3204,14 +3317,12 @@ PHP_FUNCTION(array_shift) uint32_t iter_pos = zend_hash_iterators_lower_pos(Z_ARRVAL_P(stack), 0); for (idx = 0; idx < Z_ARRVAL_P(stack)->nNumUsed; idx++) { - p = Z_ARRVAL_P(stack)->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; + val = Z_ARRVAL_P(stack)->arPacked + idx; + if (Z_TYPE_P(val) == IS_UNDEF) continue; if (idx != k) { - Bucket *q = Z_ARRVAL_P(stack)->arData + k; - q->h = k; - q->key = NULL; - ZVAL_COPY_VALUE(&q->val, &p->val); - ZVAL_UNDEF(&p->val); + zval *q = Z_ARRVAL_P(stack)->arPacked + k; + ZVAL_COPY_VALUE(q, val); + ZVAL_UNDEF(val); if (idx == iter_pos) { zend_hash_iterators_update(Z_ARRVAL_P(stack), idx, k); iter_pos = zend_hash_iterators_lower_pos(Z_ARRVAL_P(stack), iter_pos + 1); @@ -3225,6 +3336,25 @@ PHP_FUNCTION(array_shift) } else { uint32_t k = 0; int should_rehash = 0; + Bucket *p; + + /* Get the first value and copy it into the return value */ + idx = 0; + while (1) { + if (idx == Z_ARRVAL_P(stack)->nNumUsed) { + return; + } + p = Z_ARRVAL_P(stack)->arData + idx; + val = &p->val; + if (Z_TYPE_P(val) != IS_UNDEF) { + break; + } + idx++; + } + RETVAL_COPY_DEREF(val); + + /* Delete the first value */ + zend_hash_del_bucket(Z_ARRVAL_P(stack), p); for (idx = 0; idx < Z_ARRVAL_P(stack)->nNumUsed; idx++) { p = Z_ARRVAL_P(stack)->arData + idx; @@ -3380,7 +3510,7 @@ static inline Bucket* find_bucket_at_offset(HashTable* ht, zend_long offset) } /* Otherwise, this code has to iterate over the HashTable and skip holes in the array. */ pos = 0; - ZEND_HASH_FOREACH_BUCKET(ht, bucket) { + ZEND_HASH_MAP_FOREACH_BUCKET(ht, bucket) { if (pos >= offset) { /* This is the bucket of the array element at the requested offset */ return bucket; @@ -3393,6 +3523,33 @@ static inline Bucket* find_bucket_at_offset(HashTable* ht, zend_long offset) } /* }}} */ +/* {{{ find_bucket_at_offset(HashTable* ht, zend_long offset) + Finds the bucket at the given valid offset */ +static inline zval* find_packed_val_at_offset(HashTable* ht, zend_long offset) +{ + zend_long pos; + zval *zv; + ZEND_ASSERT(offset >= 0 && offset <= ht->nNumOfElements); + if (HT_IS_WITHOUT_HOLES(ht)) { + /* There's no need to iterate over the array to filter out holes if there are no holes */ + /* This properly handles both packed and unpacked arrays. */ + return ht->arPacked + offset; + } + /* Otherwise, this code has to iterate over the HashTable and skip holes in the array. */ + pos = 0; + ZEND_HASH_PACKED_FOREACH_VAL(ht, zv) { + if (pos >= offset) { + /* This is the bucket of the array element at the requested offset */ + return zv; + } + ++pos; + } ZEND_HASH_FOREACH_END(); + + /* Return a pointer to the end of the bucket array. */ + return ht->arPacked + ht->nNumUsed; +} +/* }}} */ + /* {{{ Returns elements specified by offset and length */ PHP_FUNCTION(array_slice) { @@ -3446,34 +3603,57 @@ PHP_FUNCTION(array_slice) // Contains modified variants of ZEND_HASH_FOREACH_VAL { HashTable *ht = Z_ARRVAL_P(input); - Bucket *p = find_bucket_at_offset(ht, offset); - Bucket *end = ht->arData + ht->nNumUsed; /* Start at the beginning and go until we hit offset */ - if (HT_IS_PACKED(Z_ARRVAL_P(input)) && - (!preserve_keys || - (offset == 0 && HT_IS_WITHOUT_HOLES(Z_ARRVAL_P(input))))) { - - zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); - ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { - for (; p != end; p++) { - if (__fill_idx >= length) { - break; + if (HT_IS_PACKED(ht)) { + zval *zv = find_packed_val_at_offset(ht, offset); + zval *end = ht->arPacked + ht->nNumUsed; + + if (!preserve_keys + || (offset == 0 && HT_IS_WITHOUT_HOLES(ht))) { + zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); + ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { + for (; zv != end; zv++) { + if (__fill_idx >= length) { + break; + } + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) { + continue; + } + entry = zv; + if (UNEXPECTED(Z_ISREF_P(entry)) && + UNEXPECTED(Z_REFCOUNT_P(entry) == 1)) { + entry = Z_REFVAL_P(entry); + } + Z_TRY_ADDREF_P(entry); + ZEND_HASH_FILL_ADD(entry); } - entry = &p->val; - if (UNEXPECTED(Z_TYPE_P(entry) == IS_UNDEF)) { + } ZEND_HASH_FILL_END(); + } else { + zend_long n = 0; /* Current number of elements */ + zend_long idx = zv - ht->arPacked; + + for (; zv != end; zv++, idx++) { + if (UNEXPECTED(Z_TYPE_P(zv) == IS_UNDEF)) { continue; } - if (UNEXPECTED(Z_ISREF_P(entry)) && - UNEXPECTED(Z_REFCOUNT_P(entry) == 1)) { - entry = Z_REFVAL_P(entry); + if (n >= length) { + break; } - Z_TRY_ADDREF_P(entry); - ZEND_HASH_FILL_ADD(entry); + n++; + if (preserve_keys) { + entry = zend_hash_index_add_new(Z_ARRVAL_P(return_value), idx, zv); + } else { + entry = zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), zv); + } + zval_add_ref(entry); } - } ZEND_HASH_FILL_END(); + } } else { zend_long n = 0; /* Current number of elements */ + Bucket *p = find_bucket_at_offset(ht, offset); + Bucket *end = ht->arData + ht->nNumUsed; + for (; p != end; p++) { entry = &p->val; if (UNEXPECTED(Z_TYPE_P(entry) == IS_UNDEF)) { @@ -3574,10 +3754,10 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src) /* {{{ */ zval *src_entry; zend_string *string_key; - if ((HT_FLAGS(dest) & HASH_FLAG_PACKED) && (HT_FLAGS(src) & HASH_FLAG_PACKED)) { + if (HT_IS_PACKED(dest) && HT_IS_PACKED(src)) { zend_hash_extend(dest, zend_hash_num_elements(dest) + zend_hash_num_elements(src), 1); ZEND_HASH_FILL_PACKED(dest) { - ZEND_HASH_FOREACH_VAL(src, src_entry) { + ZEND_HASH_PACKED_FOREACH_VAL(src, src_entry) { if (UNEXPECTED(Z_ISREF_P(src_entry)) && UNEXPECTED(Z_REFCOUNT_P(src_entry) == 1)) { src_entry = Z_REFVAL_P(src_entry); @@ -3749,7 +3929,7 @@ static zend_always_inline void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMET ret = &args[0]; } if (ret) { - if (HT_FLAGS(Z_ARRVAL_P(ret)) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(Z_ARRVAL_P(ret))) { if (HT_IS_WITHOUT_HOLES(Z_ARRVAL_P(ret))) { ZVAL_COPY(return_value, ret); return; @@ -3777,10 +3957,10 @@ static zend_always_inline void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMET /* copy first array */ array_init_size(return_value, count); dest = Z_ARRVAL_P(return_value); - if (HT_FLAGS(src) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(src)) { zend_hash_real_init_packed(dest); ZEND_HASH_FILL_PACKED(dest) { - ZEND_HASH_FOREACH_VAL(src, src_entry) { + ZEND_HASH_PACKED_FOREACH_VAL(src, src_entry) { if (UNEXPECTED(Z_ISREF_P(src_entry) && Z_REFCOUNT_P(src_entry) == 1)) { src_entry = Z_REFVAL_P(src_entry); @@ -3792,7 +3972,7 @@ static zend_always_inline void php_array_merge_wrapper(INTERNAL_FUNCTION_PARAMET } else { zend_string *string_key; zend_hash_real_init_mixed(dest); - ZEND_HASH_FOREACH_STR_KEY_VAL(src, string_key, src_entry) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(src, string_key, src_entry) { if (UNEXPECTED(Z_ISREF_P(src_entry) && Z_REFCOUNT_P(src_entry) == 1)) { src_entry = Z_REFVAL_P(src_entry); @@ -4170,10 +4350,10 @@ PHP_FUNCTION(array_reverse) /* Initialize return array */ array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(input))); - if ((HT_FLAGS(Z_ARRVAL_P(input)) & HASH_FLAG_PACKED) && !preserve_keys) { + if (HT_IS_PACKED(Z_ARRVAL_P(input)) && !preserve_keys) { zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { - ZEND_HASH_REVERSE_FOREACH_VAL(Z_ARRVAL_P(input), entry) { + ZEND_HASH_PACKED_REVERSE_FOREACH_VAL(Z_ARRVAL_P(input), entry) { if (UNEXPECTED(Z_ISREF_P(entry) && Z_REFCOUNT_P(entry) == 1)) { entry = Z_REFVAL_P(entry); @@ -4238,7 +4418,7 @@ PHP_FUNCTION(array_pad) } array_init_size(return_value, pad_size_abs); - if (HT_FLAGS(Z_ARRVAL_P(input)) & HASH_FLAG_PACKED) { + if (HT_IS_PACKED(Z_ARRVAL_P(input))) { zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); if (pad_size < 0) { @@ -4250,7 +4430,7 @@ PHP_FUNCTION(array_pad) } ZEND_HASH_FILL_PACKED(Z_ARRVAL_P(return_value)) { - ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(input), value) { + ZEND_HASH_PACKED_FOREACH_VAL(Z_ARRVAL_P(input), value) { Z_TRY_ADDREF_P(value); ZEND_HASH_FILL_ADD(value); } ZEND_HASH_FOREACH_END(); @@ -4270,7 +4450,7 @@ PHP_FUNCTION(array_pad) } } - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(input), key, value) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(input), key, value) { Z_TRY_ADDREF_P(value); if (key) { zend_hash_add_new(Z_ARRVAL_P(return_value), key, value); @@ -4440,12 +4620,24 @@ PHP_FUNCTION(array_unique) /* create and sort array with pointers to the target_hash buckets */ arTmp = pemalloc((Z_ARRVAL_P(array)->nNumOfElements + 1) * sizeof(struct bucketindex), GC_FLAGS(Z_ARRVAL_P(array)) & IS_ARRAY_PERSISTENT); - for (i = 0, idx = 0; idx < Z_ARRVAL_P(array)->nNumUsed; idx++) { - p = Z_ARRVAL_P(array)->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - arTmp[i].b = *p; - arTmp[i].i = i; - i++; + if (HT_IS_PACKED(Z_ARRVAL_P(array))) { + zval *zv = Z_ARRVAL_P(array)->arPacked; + for (i = 0, idx = 0; idx < Z_ARRVAL_P(array)->nNumUsed; idx++, zv++) { + if (Z_TYPE_P(zv) == IS_UNDEF) continue; + ZVAL_COPY_VALUE(&arTmp[i].b.val, zv); + arTmp[i].b.h = idx; + arTmp[i].b.key = NULL; + arTmp[i].i = i; + i++; + } + } else { + p = Z_ARRVAL_P(array)->arData; + for (i = 0, idx = 0; idx < Z_ARRVAL_P(array)->nNumUsed; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + arTmp[i].b = *p; + arTmp[i].i = i; + i++; + } } ZVAL_UNDEF(&arTmp[i].b.val); zend_sort((void *) arTmp, i, sizeof(struct bucketindex), @@ -4690,10 +4882,21 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int list = (Bucket *) pemalloc((hash->nNumOfElements + 1) * sizeof(Bucket), GC_FLAGS(hash) & IS_ARRAY_PERSISTENT); lists[i] = list; ptrs[i] = list; - for (idx = 0; idx < hash->nNumUsed; idx++) { - p = hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - *list++ = *p; + if (HT_IS_PACKED(hash)) { + zval *zv = hash->arPacked; + for (idx = 0; idx < hash->nNumUsed; idx++, zv++) { + if (Z_TYPE_P(zv) == IS_UNDEF) continue; + ZVAL_COPY_VALUE(&list->val, zv); + list->h = idx; + list->key = NULL; + list++; + } + } else { + p = hash->arData; + for (idx = 0; idx < hash->nNumUsed; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + *list++ = *p; + } } ZVAL_UNDEF(&list->val); if (hash->nNumOfElements > 1) { @@ -5064,10 +5267,21 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_ list = (Bucket *) pemalloc((hash->nNumOfElements + 1) * sizeof(Bucket), GC_FLAGS(hash) & IS_ARRAY_PERSISTENT); lists[i] = list; ptrs[i] = list; - for (idx = 0; idx < hash->nNumUsed; idx++) { - p = hash->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - *list++ = *p; + if (HT_IS_PACKED(hash)) { + zval *zv = hash->arPacked; + for (idx = 0; idx < hash->nNumUsed; idx++, zv++) { + if (Z_TYPE_P(zv) == IS_UNDEF) continue; + ZVAL_COPY_VALUE(&list->val, zv); + list->h = idx; + list->key = NULL; + list++; + } + } else { + p = hash->arData; + for (idx = 0; idx < hash->nNumUsed; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + *list++ = *p; + } } ZVAL_UNDEF(&list->val); if (hash->nNumOfElements > 1) { @@ -5416,7 +5630,6 @@ PHP_FUNCTION(array_multisort) zval** arrays; Bucket** indirect; uint32_t idx; - Bucket* p; HashTable* hash; int argc; int array_size; @@ -5533,11 +5746,22 @@ PHP_FUNCTION(array_multisort) } for (i = 0; i < num_arrays; i++) { k = 0; - for (idx = 0; idx < Z_ARRVAL_P(arrays[i])->nNumUsed; idx++) { - p = Z_ARRVAL_P(arrays[i])->arData + idx; - if (Z_TYPE(p->val) == IS_UNDEF) continue; - indirect[k][i] = *p; - k++; + if (HT_IS_PACKED(Z_ARRVAL_P(arrays[i]))) { + zval *zv = Z_ARRVAL_P(arrays[i])->arPacked; + for (idx = 0; idx < Z_ARRVAL_P(arrays[i])->nNumUsed; idx++, zv++) { + if (Z_TYPE_P(zv) == IS_UNDEF) continue; + ZVAL_COPY_VALUE(&indirect[k][i].val, zv); + indirect[k][i].h = idx; + indirect[k][i].key = NULL; + k++; + } + } else { + Bucket *p = Z_ARRVAL_P(arrays[i])->arData; + for (idx = 0; idx < Z_ARRVAL_P(arrays[i])->nNumUsed; idx++, p++) { + if (Z_TYPE(p->val) == IS_UNDEF) continue; + indirect[k][i] = *p; + k++; + } } } for (k = 0; k < array_size; k++) { @@ -5550,26 +5774,28 @@ PHP_FUNCTION(array_multisort) /* Restructure the arrays based on sorted indirect - this is mostly taken from zend_hash_sort() function. */ for (i = 0; i < num_arrays; i++) { - int repack; - hash = Z_ARRVAL_P(arrays[i]); hash->nNumUsed = array_size; + hash->nNextFreeElement = array_size; hash->nInternalPointer = 0; - repack = !(HT_FLAGS(hash) & HASH_FLAG_PACKED); + if (HT_IS_PACKED(hash)) { + for (k = 0; k < array_size; k++) { + ZVAL_COPY_VALUE(&hash->arPacked[k], &indirect[k][i].val); + } + } else { + int repack = 1; - for (n = 0, k = 0; k < array_size; k++) { - hash->arData[k] = indirect[k][i]; - if (hash->arData[k].key == NULL) { - hash->arData[k].h = n++; - } else { - repack = 0; + for (n = 0, k = 0; k < array_size; k++) { + hash->arData[k] = indirect[k][i]; + if (hash->arData[k].key == NULL) { + hash->arData[k].h = n++; + } else { + repack = 0; + } + } + if (repack) { + zend_hash_to_packed(hash); } - } - hash->nNextFreeElement = array_size; - if (repack) { - zend_hash_to_packed(hash); - } else if (!(HT_FLAGS(hash) & HASH_FLAG_PACKED)) { - zend_hash_rehash(hash); } } @@ -5634,17 +5860,27 @@ PHP_FUNCTION(array_rand) * The worst case probability of hitting an empty element is 1-1/2. The worst case * probability of hitting N empty elements in a row is (1-1/2)**N. * For N=10 this becomes smaller than 0.1%. */ - do { - zend_long randval = php_mt_rand_range(0, ht->nNumUsed - 1); - Bucket *bucket = &ht->arData[randval]; - if (!Z_ISUNDEF(bucket->val)) { - if (bucket->key) { - RETURN_STR_COPY(bucket->key); - } else { - RETURN_LONG(bucket->h); + if (HT_IS_PACKED(ht)) { + do { + zend_long randval = php_mt_rand_range(0, ht->nNumUsed - 1); + zval *zv = &ht->arPacked[randval]; + if (!Z_ISUNDEF_P(zv)) { + RETURN_LONG(randval); } - } - } while (1); + } while (1); + } else { + do { + zend_long randval = php_mt_rand_range(0, ht->nNumUsed - 1); + Bucket *bucket = &ht->arData[randval]; + if (!Z_ISUNDEF(bucket->val)) { + if (bucket->key) { + RETURN_STR_COPY(bucket->key); + } else { + RETURN_LONG(bucket->h); + } + } + } while (1); + } } if (num_req <= 0 || num_req > num_avail) { @@ -5938,7 +6174,7 @@ PHP_FUNCTION(array_map) } array_init_size(return_value, maxlen); - zend_hash_real_init(Z_ARRVAL_P(return_value), HT_FLAGS(Z_ARRVAL(arrays[0])) & HASH_FLAG_PACKED); + zend_hash_real_init(Z_ARRVAL_P(return_value), HT_IS_PACKED(Z_ARRVAL(arrays[0]))); ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(arrays[0]), num_key, str_key, zv) { fci.retval = &result; @@ -5988,18 +6224,31 @@ PHP_FUNCTION(array_map) /* If this array still has elements, add the current one to the * parameter list, otherwise use null value. */ uint32_t pos = array_pos[i]; - while (1) { - if (pos >= Z_ARRVAL(arrays[i])->nNumUsed) { - ZVAL_NULL(&zv); - break; - } else if (Z_TYPE(Z_ARRVAL(arrays[i])->arData[pos].val) != IS_UNDEF) { - ZVAL_COPY(&zv, &Z_ARRVAL(arrays[i])->arData[pos].val); - array_pos[i] = pos + 1; - break; + if (HT_IS_PACKED(Z_ARRVAL(arrays[i]))) { + while (1) { + if (pos >= Z_ARRVAL(arrays[i])->nNumUsed) { + ZVAL_NULL(&zv); + break; + } else if (Z_TYPE(Z_ARRVAL(arrays[i])->arPacked[pos]) != IS_UNDEF) { + ZVAL_COPY(&zv, &Z_ARRVAL(arrays[i])->arPacked[pos]); + array_pos[i] = pos + 1; + break; + } + pos++; + } + } else { + while (1) { + if (pos >= Z_ARRVAL(arrays[i])->nNumUsed) { + ZVAL_NULL(&zv); + break; + } else if (Z_TYPE(Z_ARRVAL(arrays[i])->arData[pos].val) != IS_UNDEF) { + ZVAL_COPY(&zv, &Z_ARRVAL(arrays[i])->arData[pos].val); + array_pos[i] = pos + 1; + break; + } + pos++; } - pos++; } - zend_hash_next_index_insert_new(Z_ARRVAL(result), &zv); } @@ -6014,16 +6263,30 @@ PHP_FUNCTION(array_map) /* If this array still has elements, add the current one to the * parameter list, otherwise use null value. */ uint32_t pos = array_pos[i]; - while (1) { - if (pos >= Z_ARRVAL(arrays[i])->nNumUsed) { - ZVAL_NULL(¶ms[i]); - break; - } else if (Z_TYPE(Z_ARRVAL(arrays[i])->arData[pos].val) != IS_UNDEF) { - ZVAL_COPY(¶ms[i], &Z_ARRVAL(arrays[i])->arData[pos].val); - array_pos[i] = pos + 1; - break; + if (HT_IS_PACKED(Z_ARRVAL(arrays[i]))) { + while (1) { + if (pos >= Z_ARRVAL(arrays[i])->nNumUsed) { + ZVAL_NULL(¶ms[i]); + break; + } else if (Z_TYPE(Z_ARRVAL(arrays[i])->arPacked[pos]) != IS_UNDEF) { + ZVAL_COPY(¶ms[i], &Z_ARRVAL(arrays[i])->arPacked[pos]); + array_pos[i] = pos + 1; + break; + } + pos++; + } + } else { + while (1) { + if (pos >= Z_ARRVAL(arrays[i])->nNumUsed) { + ZVAL_NULL(¶ms[i]); + break; + } else if (Z_TYPE(Z_ARRVAL(arrays[i])->arData[pos].val) != IS_UNDEF) { + ZVAL_COPY(¶ms[i], &Z_ARRVAL(arrays[i])->arData[pos].val); + array_pos[i] = pos + 1; + break; + } + pos++; } - pos++; } } @@ -6198,8 +6461,9 @@ PHP_FUNCTION(array_combine) while (1) { if (pos_values >= values->nNumUsed) { break; - } else if (Z_TYPE(values->arData[pos_values].val) != IS_UNDEF) { - entry_values = &values->arData[pos_values].val; + } + entry_values = ZEND_HASH_ELEMENT(values, pos_values); + if (Z_TYPE_P(entry_values) != IS_UNDEF) { if (Z_TYPE_P(entry_keys) == IS_LONG) { entry_values = zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(entry_keys), entry_values); diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 73d92fd447f19..911e41842fd40 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2015,7 +2015,7 @@ PHP_FUNCTION(ini_get_all) } array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(ini_directives), key, ini_entry) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(ini_directives), key, ini_entry) { zval option; if (module_number != 0 && ini_entry->module_number != module_number) { diff --git a/ext/standard/info.c b/ext/standard/info.c index 395110d25f218..e97faf627a639 100644 --- a/ext/standard/info.c +++ b/ext/standard/info.c @@ -99,20 +99,22 @@ static ZEND_COLD void php_info_print_stream_hash(const char *name, HashTable *ht php_info_printf("\nRegistered %s => ", name); } - ZEND_HASH_FOREACH_STR_KEY(ht, key) { - if (key) { - if (first) { - first = 0; - } else { - php_info_print(", "); - } - if (!sapi_module.phpinfo_as_text) { - php_info_print_html_esc(ZSTR_VAL(key), ZSTR_LEN(key)); - } else { - php_info_print(ZSTR_VAL(key)); + if (!HT_IS_PACKED(ht)) { + ZEND_HASH_MAP_FOREACH_STR_KEY(ht, key) { + if (key) { + if (first) { + first = 0; + } else { + php_info_print(", "); + } + if (!sapi_module.phpinfo_as_text) { + php_info_print_html_esc(ZSTR_VAL(key), ZSTR_LEN(key)); + } else { + php_info_print(ZSTR_VAL(key)); + } } - } - } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FOREACH_END(); + } if (!sapi_module.phpinfo_as_text) { php_info_print("\n"); @@ -926,7 +928,7 @@ PHPAPI ZEND_COLD void php_print_info(int flag) zend_hash_copy(&sorted_registry, &module_registry, NULL); zend_hash_sort(&sorted_registry, module_name_cmp, 0); - ZEND_HASH_FOREACH_PTR(&sorted_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&sorted_registry, module) { if (module->info_func || module->version) { php_info_print_module(module); } @@ -935,7 +937,7 @@ PHPAPI ZEND_COLD void php_print_info(int flag) SECTION("Additional Modules"); php_info_print_table_start(); php_info_print_table_header(1, "Module Name"); - ZEND_HASH_FOREACH_PTR(&sorted_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&sorted_registry, module) { if (!module->info_func && !module->version) { php_info_print_module(module); } diff --git a/ext/standard/password.c b/ext/standard/password.c index 651cffc9fe656..98b27ff34bd0c 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -678,7 +678,7 @@ PHP_FUNCTION(password_algos) { ZEND_PARSE_PARAMETERS_NONE(); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY(&php_password_algos, algo) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&php_password_algos, algo) { add_next_index_str(return_value, zend_string_copy(algo)); } ZEND_HASH_FOREACH_END(); } diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 3dd22956d3a9b..419b49e586f71 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -571,7 +571,7 @@ PHP_FUNCTION(stream_get_transports) stream_xport_hash = php_stream_xport_get_hash(); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY(stream_xport_hash, stream_xport) { + ZEND_HASH_MAP_FOREACH_STR_KEY(stream_xport_hash, stream_xport) { add_next_index_str(return_value, zend_string_copy(stream_xport)); } ZEND_HASH_FOREACH_END(); } @@ -587,7 +587,7 @@ PHP_FUNCTION(stream_get_wrappers) url_stream_wrappers_hash = php_stream_get_url_stream_wrappers_hash(); array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY(url_stream_wrappers_hash, stream_protocol) { + ZEND_HASH_MAP_FOREACH_STR_KEY(url_stream_wrappers_hash, stream_protocol) { if (stream_protocol) { add_next_index_str(return_value, zend_string_copy(stream_protocol)); } @@ -892,11 +892,13 @@ static int parse_context_options(php_stream_context *context, HashTable *options ZEND_HASH_FOREACH_STR_KEY_VAL(options, wkey, wval) { ZVAL_DEREF(wval); if (wkey && Z_TYPE_P(wval) == IS_ARRAY) { - ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(wval), okey, oval) { - if (okey) { - php_stream_context_set_option(context, ZSTR_VAL(wkey), ZSTR_VAL(okey), oval); - } - } ZEND_HASH_FOREACH_END(); + if (!HT_IS_PACKED(Z_ARRVAL_P(wval))) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(wval), okey, oval) { + if (okey) { + php_stream_context_set_option(context, ZSTR_VAL(wkey), ZSTR_VAL(okey), oval); + } + } ZEND_HASH_FOREACH_END(); + } } else { zend_value_error("Options should have the form [\"wrappername\"][\"optionname\"] = $value"); return FAILURE; diff --git a/ext/standard/string.c b/ext/standard/string.c index 4608d954d4bd2..0f29cbb038a73 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2352,12 +2352,22 @@ PHP_FUNCTION(substr_replace) zend_string *tmp_repl_str = NULL; if (repl_ht) { repl_idx = 0; - while (repl_idx < repl_ht->nNumUsed) { - tmp_repl = &repl_ht->arData[repl_idx].val; - if (Z_TYPE_P(tmp_repl) != IS_UNDEF) { - break; + if (HT_IS_PACKED(repl_ht)) { + while (repl_idx < repl_ht->nNumUsed) { + tmp_repl = &repl_ht->arPacked[repl_idx]; + if (Z_TYPE_P(tmp_repl) != IS_UNDEF) { + break; + } + repl_idx++; + } + } else { + while (repl_idx < repl_ht->nNumUsed) { + tmp_repl = &repl_ht->arData[repl_idx].val; + if (Z_TYPE_P(tmp_repl) != IS_UNDEF) { + break; + } + repl_idx++; } - repl_idx++; } if (repl_idx < repl_ht->nNumUsed) { repl_str = zval_get_tmp_string(tmp_repl, &tmp_repl_str); @@ -2399,12 +2409,22 @@ PHP_FUNCTION(substr_replace) zend_string *orig_str = zval_get_tmp_string(tmp_str, &tmp_orig_str); if (from_ht) { - while (from_idx < from_ht->nNumUsed) { - tmp_from = &from_ht->arData[from_idx].val; - if (Z_TYPE_P(tmp_from) != IS_UNDEF) { - break; + if (HT_IS_PACKED(from_ht)) { + while (from_idx < from_ht->nNumUsed) { + tmp_from = &from_ht->arPacked[from_idx]; + if (Z_TYPE_P(tmp_from) != IS_UNDEF) { + break; + } + from_idx++; + } + } else { + while (from_idx < from_ht->nNumUsed) { + tmp_from = &from_ht->arData[from_idx].val; + if (Z_TYPE_P(tmp_from) != IS_UNDEF) { + break; + } + from_idx++; } - from_idx++; } if (from_idx < from_ht->nNumUsed) { f = zval_get_long(tmp_from); @@ -2434,12 +2454,22 @@ PHP_FUNCTION(substr_replace) } if (len_ht) { - while (len_idx < len_ht->nNumUsed) { - tmp_len = &len_ht->arData[len_idx].val; - if (Z_TYPE_P(tmp_len) != IS_UNDEF) { - break; + if (HT_IS_PACKED(len_ht)) { + while (len_idx < len_ht->nNumUsed) { + tmp_len = &len_ht->arPacked[len_idx]; + if (Z_TYPE_P(tmp_len) != IS_UNDEF) { + break; + } + len_idx++; + } + } else { + while (len_idx < len_ht->nNumUsed) { + tmp_len = &len_ht->arData[len_idx].val; + if (Z_TYPE_P(tmp_len) != IS_UNDEF) { + break; + } + len_idx++; } - len_idx++; } if (len_idx < len_ht->nNumUsed) { l = zval_get_long(tmp_len); @@ -2469,12 +2499,22 @@ PHP_FUNCTION(substr_replace) result_len = ZSTR_LEN(orig_str) - l; if (repl_ht) { - while (repl_idx < repl_ht->nNumUsed) { - tmp_repl = &repl_ht->arData[repl_idx].val; - if (repl_ht != IS_UNDEF) { - break; + if (HT_IS_PACKED(repl_ht)) { + while (repl_idx < repl_ht->nNumUsed) { + tmp_repl = &repl_ht->arPacked[repl_idx]; + if (repl_ht != IS_UNDEF) { + break; + } + repl_idx++; + } + } else { + while (repl_idx < repl_ht->nNumUsed) { + tmp_repl = &repl_ht->arData[repl_idx].val; + if (repl_ht != IS_UNDEF) { + break; + } + repl_idx++; } - repl_idx++; } if (repl_idx < repl_ht->nNumUsed) { zend_string *tmp_repl_str; @@ -4157,12 +4197,22 @@ static zend_long php_str_replace_in_subject( if (replace_ht) { /* Get current entry */ zval *replace_entry = NULL; - while (replace_idx < replace_ht->nNumUsed) { - replace_entry = &replace_ht->arData[replace_idx].val; - if (Z_TYPE_P(replace_entry) != IS_UNDEF) { - break; + if (HT_IS_PACKED(replace_ht)) { + while (replace_idx < replace_ht->nNumUsed) { + replace_entry = &replace_ht->arPacked[replace_idx]; + if (Z_TYPE_P(replace_entry) != IS_UNDEF) { + break; + } + replace_idx++; + } + } else { + while (replace_idx < replace_ht->nNumUsed) { + replace_entry = &replace_ht->arData[replace_idx].val; + if (Z_TYPE_P(replace_entry) != IS_UNDEF) { + break; + } + replace_idx++; } - replace_idx++; } if (replace_idx < replace_ht->nNumUsed) { /* Make sure we're dealing with strings. */ diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index 9bfd85c6518e5..dcbfc381d295f 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -497,8 +497,8 @@ PHP_FUNCTION(stream_get_filters) filters_hash = php_get_stream_filters_hash(); - if (filters_hash) { - ZEND_HASH_FOREACH_STR_KEY(filters_hash, filter_name) { + if (filters_hash && !HT_IS_PACKED(filters_hash)) { + ZEND_HASH_MAP_FOREACH_STR_KEY(filters_hash, filter_name) { if (filter_name) { add_next_index_str(return_value, zend_string_copy(filter_name)); } diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index acf73b8a7c68b..4ed51ab3127fe 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -774,13 +774,14 @@ static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options) zval *opt_val; zend_string *opt_name; - ZEND_HASH_FOREACH_STR_KEY_VAL(ht_options, opt_name, opt_val) { - if (opt_name == NULL) { - continue; - } - _php_tidy_set_tidy_opt(doc, ZSTR_VAL(opt_name), opt_val); - } ZEND_HASH_FOREACH_END(); - + if (!HT_IS_PACKED(ht_options)) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht_options, opt_name, opt_val) { + if (opt_name == NULL) { + continue; + } + _php_tidy_set_tidy_opt(doc, ZSTR_VAL(opt_name), opt_val); + } ZEND_HASH_FOREACH_END(); + } return SUCCESS; } diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index bb52f75ac2c2d..c62c0a13ceaec 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -65,7 +65,7 @@ static char **php_xsl_xslt_make_params(HashTable *parht, int xpath_params) params = (char **)safe_emalloc((2 * zend_hash_num_elements(parht) + 1), sizeof(char *), 0); memset((char *)params, 0, parsize); - ZEND_HASH_FOREACH_STR_KEY_VAL(parht, string_key, value) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(parht, string_key, value) { ZEND_ASSERT(string_key != NULL); if (Z_TYPE_P(value) != IS_STRING) { if (!try_convert_to_string(value)) { diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index ca040b52e2b36..e54c497624794 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -993,7 +993,7 @@ static HashTable *php_zip_get_properties(zend_object *object)/* {{{ */ return NULL; } - ZEND_HASH_FOREACH_STR_KEY_PTR(obj->prop_handler, key, hnd) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(obj->prop_handler, key, hnd) { zval *ret, val; ret = php_zip_property_reader(obj, hnd, &val); if (ret == NULL) { diff --git a/main/output.c b/main/output.c index 3efc0294f85b8..3e29f8f152673 100644 --- a/main/output.c +++ b/main/output.c @@ -560,7 +560,7 @@ PHPAPI int php_output_handler_start(php_output_handler *handler) } } if (NULL != (rconflicts = zend_hash_find_ptr(&php_output_handler_reverse_conflicts, handler->name))) { - ZEND_HASH_FOREACH_PTR(rconflicts, conflict) { + ZEND_HASH_PACKED_FOREACH_PTR(rconflicts, conflict) { if (SUCCESS != conflict(ZSTR_VAL(handler->name), ZSTR_LEN(handler->name))) { return FAILURE; } diff --git a/main/php_ini.c b/main/php_ini.c index fd6f366488212..c41da5b432c38 100644 --- a/main/php_ini.c +++ b/main/php_ini.c @@ -125,7 +125,7 @@ PHPAPI ZEND_COLD void display_ini_entries(zend_module_entry *module) module_number = 0; } - ZEND_HASH_FOREACH_PTR(EG(ini_directives), ini_entry) { + ZEND_HASH_MAP_FOREACH_PTR(EG(ini_directives), ini_entry) { if (ini_entry->module_number != module_number) { continue; } @@ -812,7 +812,7 @@ PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int zval *data; /* Walk through config hash and alter matching ini entries using the values found in the hash */ - ZEND_HASH_FOREACH_STR_KEY_VAL(source_hash, str, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(source_hash, str, data) { zend_string *data_str = zend_string_dup(Z_STR_P(data), 0); zend_alter_ini_entry_ex(str, data_str, modify_type, stage, 0); zend_string_release(data_str); diff --git a/main/rfc1867.c b/main/rfc1867.c index aaafbd4c5fc9d..a242e04bf3f11 100644 --- a/main/rfc1867.c +++ b/main/rfc1867.c @@ -191,7 +191,7 @@ PHPAPI void destroy_uploaded_files_hash(void) /* {{{ */ { zval *el; - ZEND_HASH_FOREACH_VAL(SG(rfc1867_uploaded_files), el) { + ZEND_HASH_MAP_FOREACH_VAL(SG(rfc1867_uploaded_files), el) { zend_string *filename = Z_STR_P(el); VCWD_UNLINK(ZSTR_VAL(filename)); } ZEND_HASH_FOREACH_END(); diff --git a/sapi/apache2handler/apache_config.c b/sapi/apache2handler/apache_config.c index 4ce90c0a1ba4c..e051964a81591 100644 --- a/sapi/apache2handler/apache_config.c +++ b/sapi/apache2handler/apache_config.c @@ -157,7 +157,7 @@ void *merge_php_config(apr_pool_t *p, void *base_conf, void *new_conf) n = create_php_config(p, "merge_php_config"); /* copy old config */ #ifdef ZTS - ZEND_HASH_FOREACH_STR_KEY_VAL(&d->config, str, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(&d->config, str, data) { zend_string *key; zval *new_entry; @@ -195,7 +195,7 @@ void apply_config(void *dummy) zend_string *str; php_dir_entry *data; - ZEND_HASH_FOREACH_STR_KEY_PTR(&d->config, str, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&d->config, str, data) { phpapdebug((stderr, "APPLYING (%s)(%s)\n", ZSTR_VAL(str), data->value)); if (zend_alter_ini_entry_chars(str, data->value, data->value_len, data->status, data->htaccess?PHP_INI_STAGE_HTACCESS:PHP_INI_STAGE_ACTIVATE) == FAILURE) { phpapdebug((stderr, "..FAILED\n")); diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index 178b6f3de479a..7933e6accea38 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -562,7 +562,7 @@ typedef struct { zend_string *str; php_conf_rec *c = ap_get_module_config(r->per_dir_config, &php_module); - ZEND_HASH_FOREACH_STR_KEY(&c->config, str) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&c->config, str) { zend_restore_ini_entry(str, ZEND_INI_STAGE_SHUTDOWN); } ZEND_HASH_FOREACH_END(); } diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 499a7932bed17..75511ef3bd701 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -254,7 +254,7 @@ static void print_modules(void) zend_hash_init(&sorted_registry, 64, NULL, NULL, 1); zend_hash_copy(&sorted_registry, &module_registry, NULL); zend_hash_sort(&sorted_registry, module_name_cmp, 0); - ZEND_HASH_FOREACH_PTR(&sorted_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&sorted_registry, module) { php_printf("%s\n", module->name); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&sorted_registry); diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 0ad53e813c944..fdd604cec53b0 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -193,7 +193,7 @@ static void print_modules(void) /* {{{ */ zend_hash_init(&sorted_registry, 50, NULL, NULL, 0); zend_hash_copy(&sorted_registry, &module_registry, NULL); zend_hash_sort(&sorted_registry, module_name_cmp, 0); - ZEND_HASH_FOREACH_PTR(&sorted_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&sorted_registry, module) { php_printf("%s\n", module->name); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&sorted_registry); diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 02e0c52088374..55df8b9edac1f 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -398,7 +398,7 @@ PHP_FUNCTION(apache_request_headers) /* {{{ */ array_init_size(return_value, zend_hash_num_elements(headers)); - ZEND_HASH_FOREACH_STR_KEY_PTR(headers, key, value) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(headers, key, value) { ZVAL_STRING(&tmp, value); zend_symtable_update(Z_ARRVAL_P(return_value), key, &tmp); } ZEND_HASH_FOREACH_END(); diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index a8d7f73406e11..657ff72b673a1 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -200,7 +200,7 @@ static void print_modules(void) /* {{{ */ zend_hash_init(&sorted_registry, 50, NULL, NULL, 1); zend_hash_copy(&sorted_registry, &module_registry, NULL); zend_hash_sort(&sorted_registry, module_name_cmp, 0); - ZEND_HASH_FOREACH_PTR(&sorted_registry, module) { + ZEND_HASH_MAP_FOREACH_PTR(&sorted_registry, module) { php_printf("%s\n", module->name); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&sorted_registry); diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index e9a5884b728f2..42a2a9c036432 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -538,7 +538,7 @@ PHP_FUNCTION(phpdbg_get_executable) array_init(return_value); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(function_table), name, func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(function_table), name, func) { if (func->type == ZEND_USER_FUNCTION) { if (zend_hash_exists(files, func->op_array.filename)) { insert_ht = phpdbg_add_empty_array(Z_ARR_P(return_value), func->op_array.filename); @@ -552,10 +552,10 @@ PHP_FUNCTION(phpdbg_get_executable) } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(class_table), name, ce) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(class_table), name, ce) { if (ce->type == ZEND_USER_CLASS) { if (zend_hash_exists(files, ce->info.user.filename)) { - ZEND_HASH_FOREACH_PTR(&ce->function_table, func) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, func) { if (func->type == ZEND_USER_FUNCTION && zend_hash_exists(files, func->op_array.filename)) { insert_ht = phpdbg_add_empty_array(Z_ARR_P(return_value), func->op_array.filename); @@ -572,7 +572,7 @@ PHP_FUNCTION(phpdbg_get_executable) } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_STR_KEY(files, name) { + ZEND_HASH_MAP_FOREACH_STR_KEY(files, name) { phpdbg_file_source *source = zend_hash_find_ptr(&PHPDBG_G(file_sources), name); if (source) { phpdbg_oplog_fill_executable( diff --git a/sapi/phpdbg/phpdbg_bp.c b/sapi/phpdbg/phpdbg_bp.c index 3780c89033553..a79efef4161bd 100644 --- a/sapi/phpdbg/phpdbg_bp.c +++ b/sapi/phpdbg/phpdbg_bp.c @@ -312,7 +312,7 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, size_t path_len, ze if (pending) { zend_string *file; - ZEND_HASH_FOREACH_STR_KEY(&PHPDBG_G(file_sources), file) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&PHPDBG_G(file_sources), file) { HashTable *fileht; phpdbg_debug("Compare against loaded %s\n", file); @@ -394,7 +394,7 @@ PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file) /* {{{ */ phpdbg_debug("was compiled: %s\n", file); - ZEND_HASH_FOREACH_STR_KEY_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur, fileht) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur, fileht) { phpdbg_debug("check bp: %s\n", cur); phpdbg_resolve_pending_file_break_ex(file, filelen, cur, fileht); @@ -551,7 +551,7 @@ PHPDBG_API void phpdbg_resolve_op_array_breaks(zend_op_array *op_array) /* {{{ * return; } - ZEND_HASH_FOREACH_PTR(oplines_table, brake) { + ZEND_HASH_MAP_FOREACH_PTR(oplines_table, brake) { if (phpdbg_resolve_op_array_break(brake, op_array) == SUCCESS) { phpdbg_breakline_t *opline_break; @@ -1095,7 +1095,7 @@ static inline phpdbg_breakbase_t *phpdbg_find_conditional_breakpoint(zend_execut phpdbg_breakcond_t *bp; int breakpoint = FAILURE; - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_COND], bp) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_COND], bp) { zval retval; const zend_op *orig_opline = EG(current_execute_data)->opline; zend_function *orig_func = EG(current_execute_data)->func; @@ -1449,7 +1449,7 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Function Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], brake) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], brake) { phpdbg_writeln("#%d\t\t%s%s", brake->id, brake->symbol, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1461,10 +1461,10 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Method Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_table) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_table) { phpdbg_breakmethod_t *brake; - ZEND_HASH_FOREACH_PTR(class_table, brake) { + ZEND_HASH_MAP_FOREACH_PTR(class_table, brake) { phpdbg_writeln("#%d\t\t%s::%s%s", brake->id, brake->class_name, brake->func_name, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1477,10 +1477,10 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("File Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], points) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], points) { phpdbg_breakfile_t *brake; - ZEND_HASH_FOREACH_PTR(points, brake) { + ZEND_HASH_MAP_FOREACH_PTR(points, brake) { phpdbg_writeln("#%d\t\t%s:"ZEND_ULONG_FMT"%s", brake->id, brake->filename, brake->line, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1491,10 +1491,10 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Pending File Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], points) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], points) { phpdbg_breakfile_t *brake; - ZEND_HASH_FOREACH_PTR(points, brake) { + ZEND_HASH_MAP_FOREACH_PTR(points, brake) { phpdbg_writeln("#%d\t\t%s:"ZEND_ULONG_FMT"%s", brake->id, brake->filename, brake->line, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1507,7 +1507,7 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Opline Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], brake) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], brake) { const char *type; switch (brake->type) { case PHPDBG_BREAK_METHOD_OPLINE: @@ -1547,11 +1547,11 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Method opline Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD_OPLINE], class_table) { - ZEND_HASH_FOREACH_PTR(class_table, method_table) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD_OPLINE], class_table) { + ZEND_HASH_MAP_FOREACH_PTR(class_table, method_table) { phpdbg_breakopline_t *brake; - ZEND_HASH_FOREACH_PTR(method_table, brake) { + ZEND_HASH_MAP_FOREACH_PTR(method_table, brake) { phpdbg_writeln("#%d\t\t%s::%s opline "ZEND_ULONG_FMT"%s", brake->id, brake->class_name, brake->func_name, brake->opline_num, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1565,10 +1565,10 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Function opline Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FUNCTION_OPLINE], function_table) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FUNCTION_OPLINE], function_table) { phpdbg_breakopline_t *brake; - ZEND_HASH_FOREACH_PTR(function_table, brake) { + ZEND_HASH_MAP_FOREACH_PTR(function_table, brake) { phpdbg_writeln("#%d\t\t%s opline "ZEND_ULONG_FMT"%s", brake->id, brake->func_name, brake->opline_num, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1581,10 +1581,10 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("File opline Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_OPLINE], file_table) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_OPLINE], file_table) { phpdbg_breakopline_t *brake; - ZEND_HASH_FOREACH_PTR(file_table, brake) { + ZEND_HASH_MAP_FOREACH_PTR(file_table, brake) { phpdbg_writeln("#%d\t\t%s opline "ZEND_ULONG_FMT"%s", brake->id, brake->class_name, brake->opline_num, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); @@ -1597,7 +1597,7 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Conditional Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_COND], brake) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_COND], brake) { if (brake->paramed) { switch (brake->param.type) { case STR_PARAM: @@ -1653,7 +1653,7 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */ phpdbg_out(SEPARATE "\n"); phpdbg_out("Opcode Breakpoints:\n"); - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE], brake) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE], brake) { phpdbg_writeln("#%d\t\t%s%s", brake->id, brake->name, ((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : ""); diff --git a/sapi/phpdbg/phpdbg_info.c b/sapi/phpdbg/phpdbg_info.c index e63ec89e557dc..0a1e7570a493c 100644 --- a/sapi/phpdbg/phpdbg_info.c +++ b/sapi/phpdbg/phpdbg_info.c @@ -69,7 +69,7 @@ PHPDBG_INFO(files) /* {{{ */ } phpdbg_end_try_access(); phpdbg_try_access { - ZEND_HASH_FOREACH_STR_KEY(&EG(included_files), fname) { + ZEND_HASH_MAP_FOREACH_STR_KEY(&EG(included_files), fname) { phpdbg_writeln("File: %s", ZSTR_VAL(fname)); } ZEND_HASH_FOREACH_END(); } phpdbg_catch_access { @@ -105,7 +105,7 @@ PHPDBG_INFO(constants) /* {{{ */ if (EG(zend_constants)) { phpdbg_try_access { - ZEND_HASH_FOREACH_PTR(EG(zend_constants), data) { + ZEND_HASH_MAP_FOREACH_PTR(EG(zend_constants), data) { if (ZEND_CONSTANT_MODULE_NUMBER(data) == PHP_USER_CONSTANT) { zend_hash_update_ptr(&consts, data->name, data); } @@ -119,7 +119,7 @@ PHPDBG_INFO(constants) /* {{{ */ if (zend_hash_num_elements(&consts)) { phpdbg_out("Address Refs Type Constant\n"); - ZEND_HASH_FOREACH_PTR(&consts, data) { + ZEND_HASH_MAP_FOREACH_PTR(&consts, data) { #define VARIABLEINFO(msg, ...) \ phpdbg_writeln( \ @@ -196,7 +196,7 @@ static int phpdbg_print_symbols(bool show_globals) { zend_hash_init(&vars, 8, NULL, NULL, 0); phpdbg_try_access { - ZEND_HASH_FOREACH_STR_KEY_VAL(symtable, var, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(symtable, var, data) { if (zend_is_auto_global(var) ^ !show_globals) { zend_hash_update(&vars, var, data); } @@ -227,7 +227,7 @@ static int phpdbg_print_symbols(bool show_globals) { if (zend_hash_num_elements(&vars)) { phpdbg_out("Address Refs Type Variable\n"); - ZEND_HASH_FOREACH_STR_KEY_VAL(&vars, var, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(&vars, var, data) { phpdbg_try_access { const char *isref = ""; #define VARIABLEINFO(msg, ...) \ @@ -387,7 +387,7 @@ PHPDBG_INFO(classes) /* {{{ */ zend_hash_init(&classes, 8, NULL, NULL, 0); phpdbg_try_access { - ZEND_HASH_FOREACH_PTR(EG(class_table), ce) { + ZEND_HASH_MAP_FOREACH_PTR(EG(class_table), ce) { if (ce->type == ZEND_USER_CLASS) { zend_hash_next_index_insert_ptr(&classes, ce); } @@ -399,7 +399,7 @@ PHPDBG_INFO(classes) /* {{{ */ phpdbg_notice("User Classes (%d)", zend_hash_num_elements(&classes)); /* once added, assume that classes are stable... until shutdown. */ - ZEND_HASH_FOREACH_PTR(&classes, ce) { + ZEND_HASH_PACKED_FOREACH_PTR(&classes, ce) { phpdbg_print_class_name(ce); if (ce->parent) { @@ -431,7 +431,7 @@ PHPDBG_INFO(funcs) /* {{{ */ zend_hash_init(&functions, 8, NULL, NULL, 0); phpdbg_try_access { - ZEND_HASH_FOREACH_PTR(EG(function_table), zf) { + ZEND_HASH_MAP_FOREACH_PTR(EG(function_table), zf) { if (zf->type == ZEND_USER_FUNCTION) { zend_hash_next_index_insert_ptr(&functions, zf); } @@ -442,7 +442,7 @@ PHPDBG_INFO(funcs) /* {{{ */ phpdbg_notice("User Functions (%d)", zend_hash_num_elements(&functions)); - ZEND_HASH_FOREACH_PTR(&functions, zf) { + 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}"); diff --git a/sapi/phpdbg/phpdbg_print.c b/sapi/phpdbg/phpdbg_print.c index 67d68b9da3588..c28576de3bc9c 100644 --- a/sapi/phpdbg/phpdbg_print.c +++ b/sapi/phpdbg/phpdbg_print.c @@ -140,7 +140,7 @@ PHPDBG_PRINT(class) /* {{{ */ if (zend_hash_num_elements(&ce->function_table)) { zend_function *method; - ZEND_HASH_FOREACH_PTR(&ce->function_table, method) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, method) { phpdbg_print_function_helper(method); } ZEND_HASH_FOREACH_END(); } @@ -291,7 +291,7 @@ static void phpdbg_print_opcodes_ce(zend_class_entry *ce) { } phpdbg_out("%d methods: ", zend_hash_num_elements(&ce->function_table)); - ZEND_HASH_FOREACH_PTR(&ce->function_table, method) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, method) { if (first) { first = 0; } else { @@ -304,7 +304,7 @@ static void phpdbg_print_opcodes_ce(zend_class_entry *ce) { } phpdbg_out("\n"); - ZEND_HASH_FOREACH_PTR(&ce->function_table, method) { + ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, method) { phpdbg_print_function_helper(method); } ZEND_HASH_FOREACH_END(); } @@ -332,13 +332,13 @@ void phpdbg_print_opcodes(const char *function) phpdbg_print_opcodes_main(); - ZEND_HASH_FOREACH_STR_KEY_PTR(EG(function_table), name, func) { + ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(EG(function_table), name, func) { if (func->type == ZEND_USER_FUNCTION) { phpdbg_print_opcodes_function(ZSTR_VAL(name), ZSTR_LEN(name)); } } ZEND_HASH_FOREACH_END(); - ZEND_HASH_FOREACH_PTR(EG(class_table), ce) { + ZEND_HASH_MAP_FOREACH_PTR(EG(class_table), ce) { if (ce->type == ZEND_USER_CLASS) { phpdbg_out("\n"); phpdbg_print_opcodes_ce(ce); diff --git a/sapi/phpdbg/phpdbg_watch.c b/sapi/phpdbg/phpdbg_watch.c index 05155bdd069ee..6e7494c931760 100644 --- a/sapi/phpdbg/phpdbg_watch.c +++ b/sapi/phpdbg/phpdbg_watch.c @@ -771,7 +771,7 @@ void phpdbg_automatic_dequeue_free(phpdbg_watch_element *element) { void phpdbg_dequeue_elements_for_recreation(void) { phpdbg_watch_element *element; - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(watch_recreation), element) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(watch_recreation), element) { ZEND_ASSERT(element->flags & (PHPDBG_WATCH_IMPLICIT | PHPDBG_WATCH_RECURSIVE_ROOT | PHPDBG_WATCH_SIMPLE)); if (element->parent || zend_hash_index_find(&PHPDBG_G(watch_free), (zend_ulong) element->parent_container)) { zval _zv, *zv = &_zv; @@ -816,7 +816,7 @@ void phpdbg_remove_watch_element_recursively(phpdbg_watch_element *element) { element->child = NULL; } else if (element->flags & (PHPDBG_WATCH_ARRAY | PHPDBG_WATCH_OBJECT)) { phpdbg_watch_element *child; - ZEND_HASH_FOREACH_PTR(&element->child_container, child) { + ZEND_HASH_MAP_FOREACH_PTR(&element->child_container, child) { phpdbg_remove_watch_element_recursively(child); phpdbg_free_watch_element(child); } ZEND_HASH_FOREACH_END(); @@ -933,11 +933,11 @@ void phpdbg_update_watch_collision_elements(phpdbg_watchpoint_t *watch) { phpdbg_watchpoint_t *parent; phpdbg_watch_element *element; - ZEND_HASH_FOREACH_PTR(&watch->coll->parents, parent) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->coll->parents, parent) { if (parent->coll) { phpdbg_update_watch_collision_elements(parent); } else { - ZEND_HASH_FOREACH_PTR(&parent->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&parent->elements, element) { phpdbg_update_watch_element_watch(element); } ZEND_HASH_FOREACH_END(); } @@ -957,7 +957,7 @@ void phpdbg_remove_watchpoint(phpdbg_watchpoint_t *watch) { } watch->elements.nNumOfElements++; /* dirty hack to avoid double free */ - ZEND_HASH_FOREACH_PTR(&watch->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) { phpdbg_update_watch_element_watch(element); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&watch->elements); @@ -980,7 +980,7 @@ zend_string *phpdbg_watchpoint_change_collision_name(phpdbg_watchpoint_t *watch) phpdbg_watch_element *element; zend_string *name = NULL; if (watch->coll) { - ZEND_HASH_FOREACH_PTR(&watch->coll->parents, parent) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->coll->parents, parent) { if (name) { zend_string_release(name); } @@ -988,7 +988,7 @@ zend_string *phpdbg_watchpoint_change_collision_name(phpdbg_watchpoint_t *watch) } ZEND_HASH_FOREACH_END(); return name; } - ZEND_HASH_FOREACH_PTR(&watch->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) { if (element->flags & PHPDBG_WATCH_IMPLICIT) { if ((watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) && Z_TYPE(watch->backup.zv) > IS_STRING) { phpdbg_update_watch_element_watch(element->child); @@ -1012,7 +1012,7 @@ void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { zend_string *str; zend_long idx; zval *zv; - ZEND_HASH_FOREACH_PTR(&watch->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) { if (element->flags & PHPDBG_WATCH_RECURSIVE) { phpdbg_btree_result *res = phpdbg_btree_find(&PHPDBG_G(watch_HashTables), (zend_ulong) HT_WATCH_HT(watch)); phpdbg_watch_ht_info *hti = res ? res->ptr : NULL; @@ -1027,7 +1027,7 @@ void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { zend_string_release(str); break; } - ZEND_HASH_FOREACH_PTR(&watch->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) { if (element->flags & PHPDBG_WATCH_RECURSIVE) { phpdbg_add_recursive_watch_from_ht(element, idx, str, zv); } @@ -1067,7 +1067,7 @@ void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { phpdbg_watch_element *element = NULL; zval *new; - ZEND_HASH_FOREACH_PTR(&watch->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) { break; } ZEND_HASH_FOREACH_END(); @@ -1107,7 +1107,7 @@ void phpdbg_check_watchpoint(phpdbg_watchpoint_t *watch) { if (watch->type == WATCH_ON_ZVAL || watch->type == WATCH_ON_BUCKET) { phpdbg_watch_element *element; phpdbg_update_watch_ref(watch); - ZEND_HASH_FOREACH_PTR(&watch->elements, element) { + ZEND_HASH_MAP_FOREACH_PTR(&watch->elements, element) { if (element->flags & PHPDBG_WATCH_RECURSIVE) { phpdbg_recurse_watch_element(element); } @@ -1122,7 +1122,7 @@ void phpdbg_reenable_memory_watches(void) { phpdbg_btree_result *res; phpdbg_watchpoint_t *watch; - ZEND_HASH_FOREACH_NUM_KEY(PHPDBG_G(watchlist_mem), page) { + ZEND_HASH_MAP_FOREACH_NUM_KEY(PHPDBG_G(watchlist_mem), page) { /* Disable writing again if there are any watchers on that page */ res = phpdbg_btree_find_closest(&PHPDBG_G(watchpoint_tree), page + phpdbg_pagesize - 1); if (res) { @@ -1165,7 +1165,7 @@ int phpdbg_print_changed_zvals(void) { mem_list = PHPDBG_G(watchlist_mem); PHPDBG_G(watchlist_mem) = PHPDBG_G(watchlist_mem_backup); - ZEND_HASH_FOREACH_NUM_KEY(mem_list, page) { + ZEND_HASH_MAP_FOREACH_NUM_KEY(mem_list, page) { phpdbg_btree_position pos = phpdbg_btree_find_between(&PHPDBG_G(watchpoint_tree), page, page + phpdbg_pagesize); while ((res = phpdbg_btree_next(&pos))) { @@ -1210,7 +1210,7 @@ void phpdbg_watch_efree(void *ptr) { phpdbg_watch_element *element; phpdbg_watch_ht_info *hti = (phpdbg_watch_ht_info *) watch; - ZEND_HASH_FOREACH_PTR(&hti->watches, element) { + ZEND_HASH_MAP_FOREACH_PTR(&hti->watches, element) { zend_ulong num = zend_hash_num_elements(&hti->watches); phpdbg_remove_watchpoint(element->watch); if (num == 1) { /* prevent access into freed memory */ @@ -1493,7 +1493,7 @@ void phpdbg_destroy_watchpoints(void) { phpdbg_watch_element *element; /* unconditionally free all remaining elements to avoid memory leaks */ - ZEND_HASH_FOREACH_PTR(&PHPDBG_G(watch_recreation), element) { + ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(watch_recreation), element) { phpdbg_automatic_dequeue_free(element); } ZEND_HASH_FOREACH_END(); diff --git a/win32/registry.c b/win32/registry.c index 9aa2005443acf..cd9fc38c199fe 100644 --- a/win32/registry.c +++ b/win32/registry.c @@ -116,7 +116,7 @@ static int LoadDirectory(HashTable *directories, HKEY key, char *path, int path_ zend_ulong num; zval *tmpdata; - ZEND_HASH_FOREACH_KEY_VAL(parent_ht, num, index, tmpdata) { + ZEND_HASH_MAP_FOREACH_KEY_VAL(parent_ht, num, index, tmpdata) { zend_hash_add(ht, index, tmpdata); } ZEND_HASH_FOREACH_END(); } @@ -263,7 +263,7 @@ void UpdateIniFromRegistry(char *path) zend_string *index; zval *data; - ZEND_HASH_FOREACH_STR_KEY_VAL(ht, index, data) { + ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(ht, index, data) { zend_alter_ini_entry(index, Z_STR_P(data), PHP_INI_USER, PHP_INI_STAGE_ACTIVATE); } ZEND_HASH_FOREACH_END(); } From e089a50f53c8fd1eb9a932f1856a524d4ac83406 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 15 Oct 2021 12:03:26 -0300 Subject: [PATCH 0208/1346] Add support for PCRE n modifier Add support for /n (NO_AUTO_CAPTURE) modifier, which makes simple `(xyz)` groups non-capturing. Closes GH-7583. --- UPGRADING | 7 ++++++ ext/pcre/php_pcre.c | 1 + ext/pcre/tests/preg_match_non_capture.phpt | 25 ++++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 ext/pcre/tests/preg_match_non_capture.phpt diff --git a/UPGRADING b/UPGRADING index 1bbdfbd67d84c..a7ad6c4761a39 100644 --- a/UPGRADING +++ b/UPGRADING @@ -27,6 +27,13 @@ PHP 8.2 UPGRADE NOTES . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective HTTP method in curl_getinfo() return value. +- PCRE: + . Added support for the "n" (NO_AUTO_CAPTURE) modifier, which makes simple + `(xyz)` groups non-capturing. Only named groups like `(?xyz)` are + capturing. This only affects which groups are capturing, it is still + possible to use numbered subpattern references, and the matches array will + still contain numbered results. + ======================================== 3. Changes in SAPI modules ======================================== diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index cb2a44c1cf57a..a7c5dbb3d8b76 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -734,6 +734,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, in /* Perl compatible options */ case 'i': coptions |= PCRE2_CASELESS; break; case 'm': coptions |= PCRE2_MULTILINE; break; + case 'n': coptions |= PCRE2_NO_AUTO_CAPTURE; break; case 's': coptions |= PCRE2_DOTALL; break; case 'x': coptions |= PCRE2_EXTENDED; break; diff --git a/ext/pcre/tests/preg_match_non_capture.phpt b/ext/pcre/tests/preg_match_non_capture.phpt new file mode 100644 index 0000000000000..c2459e4b2d05d --- /dev/null +++ b/ext/pcre/tests/preg_match_non_capture.phpt @@ -0,0 +1,25 @@ +--TEST-- +testing /n modifier in preg_match() +--FILE-- +.)./n', 'abc', $m); +var_dump($m); + +?> +--EXPECT-- +array(1) { + [0]=> + string(3) "abc" +} +array(3) { + [0]=> + string(3) "abc" + ["test"]=> + string(1) "b" + [1]=> + string(1) "b" +} From 64bd602b6a048dd1955b17190dbc41845eb5fdcc Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 3 Nov 2021 15:49:27 +0000 Subject: [PATCH 0209/1346] Updated to version 2021.5 (2021e) --- ext/date/lib/timezonedb.h | 1611 +++++++++++++++++++------------------ 1 file changed, 806 insertions(+), 805 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 124e480ccaa0b..411ef5b44254e 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -270,340 +270,340 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Asia/Dushanbe" , 0x0247C2 }, { "Asia/Famagusta" , 0x02493C }, { "Asia/Gaza" , 0x024D03 }, - { "Asia/Harbin" , 0x0251D6 }, - { "Asia/Hebron" , 0x02536B }, - { "Asia/Ho_Chi_Minh" , 0x02584F }, - { "Asia/Hong_Kong" , 0x025947 }, - { "Asia/Hovd" , 0x025C5A }, - { "Asia/Irkutsk" , 0x025EE3 }, - { "Asia/Istanbul" , 0x026201 }, - { "Asia/Jakarta" , 0x0266BD }, - { "Asia/Jayapura" , 0x0267CE }, - { "Asia/Jerusalem" , 0x0268BB }, - { "Asia/Kabul" , 0x026CF9 }, - { "Asia/Kamchatka" , 0x026DA4 }, - { "Asia/Karachi" , 0x027099 }, - { "Asia/Kashgar" , 0x0271AF }, - { "Asia/Kathmandu" , 0x027240 }, - { "Asia/Katmandu" , 0x0272ED }, - { "Asia/Khandyga" , 0x02739A }, - { "Asia/Kolkata" , 0x0276CB }, - { "Asia/Krasnoyarsk" , 0x0277B3 }, - { "Asia/Kuala_Lumpur" , 0x027ABD }, - { "Asia/Kuching" , 0x027BDD }, - { "Asia/Kuwait" , 0x027D37 }, - { "Asia/Macao" , 0x027DC8 }, - { "Asia/Macau" , 0x0280EB }, - { "Asia/Magadan" , 0x02840E }, - { "Asia/Makassar" , 0x028719 }, - { "Asia/Manila" , 0x02882C }, - { "Asia/Muscat" , 0x028926 }, - { "Asia/Nicosia" , 0x0289B7 }, - { "Asia/Novokuznetsk" , 0x028C2B }, - { "Asia/Novosibirsk" , 0x028F1E }, - { "Asia/Omsk" , 0x02922F }, - { "Asia/Oral" , 0x02952D }, - { "Asia/Phnom_Penh" , 0x0297B9 }, - { "Asia/Pontianak" , 0x02985D }, - { "Asia/Pyongyang" , 0x029976 }, - { "Asia/Qatar" , 0x029A39 }, - { "Asia/Qostanay" , 0x029ADD }, - { "Asia/Qyzylorda" , 0x029D6A }, - { "Asia/Rangoon" , 0x02A003 }, - { "Asia/Riyadh" , 0x02A0CA }, - { "Asia/Saigon" , 0x02A15B }, - { "Asia/Sakhalin" , 0x02A253 }, - { "Asia/Samarkand" , 0x02A56A }, - { "Asia/Seoul" , 0x02A6F5 }, - { "Asia/Shanghai" , 0x02A8A0 }, - { "Asia/Singapore" , 0x02AA41 }, - { "Asia/Srednekolymsk" , 0x02AB4D }, - { "Asia/Taipei" , 0x02AE61 }, - { "Asia/Tashkent" , 0x02B06C }, - { "Asia/Tbilisi" , 0x02B1F7 }, - { "Asia/Tehran" , 0x02B478 }, - { "Asia/Tel_Aviv" , 0x02BC58 }, - { "Asia/Thimbu" , 0x02C096 }, - { "Asia/Thimphu" , 0x02C13C }, - { "Asia/Tokyo" , 0x02C1E2 }, - { "Asia/Tomsk" , 0x02C2C3 }, - { "Asia/Ujung_Pandang" , 0x02C5CE }, - { "Asia/Ulaanbaatar" , 0x02C698 }, - { "Asia/Ulan_Bator" , 0x02C90B }, - { "Asia/Urumqi" , 0x02CB69 }, - { "Asia/Ust-Nera" , 0x02CC07 }, - { "Asia/Vientiane" , 0x02CF2A }, - { "Asia/Vladivostok" , 0x02CFCE }, - { "Asia/Yakutsk" , 0x02D2D3 }, - { "Asia/Yangon" , 0x02D5D7 }, - { "Asia/Yekaterinburg" , 0x02D69E }, - { "Asia/Yerevan" , 0x02D9B0 }, - { "Atlantic/Azores" , 0x02DC80 }, - { "Atlantic/Bermuda" , 0x02E23F }, - { "Atlantic/Canary" , 0x02E64B }, - { "Atlantic/Cape_Verde" , 0x02E843 }, - { "Atlantic/Faeroe" , 0x02E8FE }, - { "Atlantic/Faroe" , 0x02EAC3 }, - { "Atlantic/Jan_Mayen" , 0x02EC88 }, - { "Atlantic/Madeira" , 0x02EF38 }, - { "Atlantic/Reykjavik" , 0x02F500 }, - { "Atlantic/South_Georgia" , 0x02F7FD }, - { "Atlantic/St_Helena" , 0x02F88D }, - { "Atlantic/Stanley" , 0x02F91B }, - { "Australia/ACT" , 0x02FC3C }, - { "Australia/Adelaide" , 0x02FFD0 }, - { "Australia/Brisbane" , 0x030384 }, - { "Australia/Broken_Hill" , 0x0304C8 }, - { "Australia/Canberra" , 0x03089D }, - { "Australia/Currie" , 0x030C31 }, - { "Australia/Darwin" , 0x031028 }, - { "Australia/Eucla" , 0x031130 }, - { "Australia/Hobart" , 0x03128F }, - { "Australia/LHI" , 0x03168E }, - { "Australia/Lindeman" , 0x03194E }, - { "Australia/Lord_Howe" , 0x031ABE }, - { "Australia/Melbourne" , 0x031D8E }, - { "Australia/North" , 0x03212A }, - { "Australia/NSW" , 0x032220 }, - { "Australia/Perth" , 0x0325B4 }, - { "Australia/Queensland" , 0x032710 }, - { "Australia/South" , 0x03283D }, - { "Australia/Sydney" , 0x032BE2 }, - { "Australia/Tasmania" , 0x032F92 }, - { "Australia/Victoria" , 0x033389 }, - { "Australia/West" , 0x03371D }, - { "Australia/Yancowinna" , 0x03385B }, - { "Brazil/Acre" , 0x033C14 }, - { "Brazil/DeNoronha" , 0x033DC2 }, - { "Brazil/East" , 0x033FB2 }, - { "Brazil/West" , 0x034376 }, - { "Canada/Atlantic" , 0x03451E }, - { "Canada/Central" , 0x034BB2 }, - { "Canada/Eastern" , 0x0350CC }, - { "Canada/Mountain" , 0x03578D }, - { "Canada/Newfoundland" , 0x035B63 }, - { "Canada/Pacific" , 0x0362C5 }, - { "Canada/Saskatchewan" , 0x036803 }, - { "Canada/Yukon" , 0x036A8D }, - { "CET" , 0x036E9E }, - { "Chile/Continental" , 0x037117 }, - { "Chile/EasterIsland" , 0x037625 }, - { "CST6CDT" , 0x037A7F }, - { "Cuba" , 0x037E42 }, - { "EET" , 0x0382AB }, - { "Egypt" , 0x0384A8 }, - { "Eire" , 0x0389B0 }, - { "EST" , 0x038F94 }, - { "EST5EDT" , 0x03900F }, - { "Etc/GMT" , 0x0393D2 }, - { "Etc/GMT+0" , 0x03944D }, - { "Etc/GMT+1" , 0x0394C8 }, - { "Etc/GMT+10" , 0x039545 }, - { "Etc/GMT+11" , 0x0395C3 }, - { "Etc/GMT+12" , 0x039641 }, - { "Etc/GMT+2" , 0x0396BF }, - { "Etc/GMT+3" , 0x03973C }, - { "Etc/GMT+4" , 0x0397B9 }, - { "Etc/GMT+5" , 0x039836 }, - { "Etc/GMT+6" , 0x0398B3 }, - { "Etc/GMT+7" , 0x039930 }, - { "Etc/GMT+8" , 0x0399AD }, - { "Etc/GMT+9" , 0x039A2A }, - { "Etc/GMT-0" , 0x039AA7 }, - { "Etc/GMT-1" , 0x039B22 }, - { "Etc/GMT-10" , 0x039BA0 }, - { "Etc/GMT-11" , 0x039C1F }, - { "Etc/GMT-12" , 0x039C9E }, - { "Etc/GMT-13" , 0x039D1D }, - { "Etc/GMT-14" , 0x039D9C }, - { "Etc/GMT-2" , 0x039E1B }, - { "Etc/GMT-3" , 0x039E99 }, - { "Etc/GMT-4" , 0x039F17 }, - { "Etc/GMT-5" , 0x039F95 }, - { "Etc/GMT-6" , 0x03A013 }, - { "Etc/GMT-7" , 0x03A091 }, - { "Etc/GMT-8" , 0x03A10F }, - { "Etc/GMT-9" , 0x03A18D }, - { "Etc/GMT0" , 0x03A20B }, - { "Etc/Greenwich" , 0x03A286 }, - { "Etc/UCT" , 0x03A301 }, - { "Etc/Universal" , 0x03A37C }, - { "Etc/UTC" , 0x03A3F7 }, - { "Etc/Zulu" , 0x03A472 }, - { "Europe/Amsterdam" , 0x03A4ED }, - { "Europe/Andorra" , 0x03A928 }, - { "Europe/Astrakhan" , 0x03AAB9 }, - { "Europe/Athens" , 0x03ADAD }, - { "Europe/Belfast" , 0x03B063 }, - { "Europe/Belgrade" , 0x03B6AE }, - { "Europe/Berlin" , 0x03B898 }, - { "Europe/Bratislava" , 0x03BB79 }, - { "Europe/Brussels" , 0x03BE58 }, - { "Europe/Bucharest" , 0x03C2B3 }, - { "Europe/Budapest" , 0x03C554 }, - { "Europe/Busingen" , 0x03C85E }, - { "Europe/Chisinau" , 0x03CA63 }, - { "Europe/Copenhagen" , 0x03CD62 }, - { "Europe/Dublin" , 0x03CFDD }, - { "Europe/Gibraltar" , 0x03D5C1 }, - { "Europe/Guernsey" , 0x03DA91 }, - { "Europe/Helsinki" , 0x03E0DC }, - { "Europe/Isle_of_Man" , 0x03E2C9 }, - { "Europe/Istanbul" , 0x03E914 }, - { "Europe/Jersey" , 0x03EDD0 }, - { "Europe/Kaliningrad" , 0x03F41B }, - { "Europe/Kiev" , 0x03F7C3 }, - { "Europe/Kirov" , 0x03FA08 }, - { "Europe/Lisbon" , 0x03FCEF }, - { "Europe/Ljubljana" , 0x0402BC }, - { "Europe/London" , 0x0404A6 }, - { "Europe/Luxembourg" , 0x040AF1 }, - { "Europe/Madrid" , 0x040F3C }, - { "Europe/Malta" , 0x0412D9 }, - { "Europe/Mariehamn" , 0x041685 }, - { "Europe/Minsk" , 0x041872 }, - { "Europe/Monaco" , 0x041BA6 }, - { "Europe/Moscow" , 0x04200C }, - { "Europe/Nicosia" , 0x0423B8 }, - { "Europe/Oslo" , 0x042619 }, - { "Europe/Paris" , 0x0428C9 }, - { "Europe/Podgorica" , 0x042D26 }, - { "Europe/Prague" , 0x042F10 }, - { "Europe/Riga" , 0x0431EF }, - { "Europe/Rome" , 0x0434B1 }, - { "Europe/Samara" , 0x043870 }, - { "Europe/San_Marino" , 0x043B71 }, - { "Europe/Sarajevo" , 0x043F30 }, - { "Europe/Saratov" , 0x04411A }, - { "Europe/Simferopol" , 0x04440C }, - { "Europe/Skopje" , 0x04477F }, - { "Europe/Sofia" , 0x044969 }, - { "Europe/Stockholm" , 0x044BC5 }, - { "Europe/Tallinn" , 0x044DC2 }, - { "Europe/Tirane" , 0x045071 }, - { "Europe/Tiraspol" , 0x0452D9 }, - { "Europe/Ulyanovsk" , 0x0455D8 }, - { "Europe/Uzhgorod" , 0x0458EE }, - { "Europe/Vaduz" , 0x045B1A }, - { "Europe/Vatican" , 0x045D17 }, - { "Europe/Vienna" , 0x0460D6 }, - { "Europe/Vilnius" , 0x046374 }, - { "Europe/Volgograd" , 0x046624 }, - { "Europe/Warsaw" , 0x046921 }, - { "Europe/Zagreb" , 0x046CC8 }, - { "Europe/Zaporozhye" , 0x046EB2 }, - { "Europe/Zurich" , 0x047109 }, - { "Factory" , 0x047306 }, - { "GB" , 0x047383 }, - { "GB-Eire" , 0x0479CE }, - { "GMT" , 0x048019 }, - { "GMT+0" , 0x048094 }, - { "GMT-0" , 0x04810F }, - { "GMT0" , 0x04818A }, - { "Greenwich" , 0x048205 }, - { "Hongkong" , 0x048280 }, - { "HST" , 0x048593 }, - { "Iceland" , 0x04860F }, - { "Indian/Antananarivo" , 0x04890C }, - { "Indian/Chagos" , 0x0489D7 }, - { "Indian/Christmas" , 0x048A7B }, - { "Indian/Cocos" , 0x048B0C }, - { "Indian/Comoro" , 0x048BA4 }, - { "Indian/Kerguelen" , 0x048C6F }, - { "Indian/Mahe" , 0x048D00 }, - { "Indian/Maldives" , 0x048D91 }, - { "Indian/Mauritius" , 0x048E35 }, - { "Indian/Mayotte" , 0x048EF4 }, - { "Indian/Reunion" , 0x048FBF }, - { "Iran" , 0x049050 }, - { "Israel" , 0x049830 }, - { "Jamaica" , 0x049C6E }, - { "Japan" , 0x049DCD }, - { "Kwajalein" , 0x049EAE }, - { "Libya" , 0x049F95 }, - { "MET" , 0x04A150 }, - { "Mexico/BajaNorte" , 0x04A3C9 }, - { "Mexico/BajaSur" , 0x04A7D6 }, - { "Mexico/General" , 0x04A951 }, - { "MST" , 0x04AAF9 }, - { "MST7MDT" , 0x04AB74 }, - { "Navajo" , 0x04AF37 }, - { "NZ" , 0x04B355 }, - { "NZ-CHAT" , 0x04B774 }, - { "Pacific/Apia" , 0x04BAA8 }, - { "Pacific/Auckland" , 0x04BC4B }, - { "Pacific/Bougainville" , 0x04C082 }, - { "Pacific/Chatham" , 0x04C163 }, - { "Pacific/Chuuk" , 0x04C4A6 }, - { "Pacific/Easter" , 0x04C584 }, - { "Pacific/Efate" , 0x04C9EB }, - { "Pacific/Enderbury" , 0x04CB4D }, - { "Pacific/Fakaofo" , 0x04CC05 }, - { "Pacific/Fiji" , 0x04CCAA }, - { "Pacific/Funafuti" , 0x04CE59 }, - { "Pacific/Galapagos" , 0x04CEEB }, - { "Pacific/Gambier" , 0x04CFB7 }, - { "Pacific/Guadalcanal" , 0x04D056 }, - { "Pacific/Guam" , 0x04D0E8 }, - { "Pacific/Honolulu" , 0x04D252 }, - { "Pacific/Johnston" , 0x04D341 }, - { "Pacific/Kanton" , 0x04D42A }, - { "Pacific/Kiritimati" , 0x04D4F1 }, - { "Pacific/Kosrae" , 0x04D5B7 }, - { "Pacific/Kwajalein" , 0x04D6BB }, - { "Pacific/Majuro" , 0x04D7AB }, - { "Pacific/Marquesas" , 0x04D8AE }, - { "Pacific/Midway" , 0x04D956 }, - { "Pacific/Nauru" , 0x04DA02 }, - { "Pacific/Niue" , 0x04DAC5 }, - { "Pacific/Norfolk" , 0x04DB6B }, - { "Pacific/Noumea" , 0x04DC6E }, - { "Pacific/Pago_Pago" , 0x04DD40 }, - { "Pacific/Palau" , 0x04DDDE }, - { "Pacific/Pitcairn" , 0x04DE7E }, - { "Pacific/Pohnpei" , 0x04DF23 }, - { "Pacific/Ponape" , 0x04E013 }, - { "Pacific/Port_Moresby" , 0x04E0F5 }, - { "Pacific/Rarotonga" , 0x04E1B8 }, - { "Pacific/Saipan" , 0x04E35A }, - { "Pacific/Samoa" , 0x04E4C4 }, - { "Pacific/Tahiti" , 0x04E562 }, - { "Pacific/Tarawa" , 0x04E602 }, - { "Pacific/Tongatapu" , 0x04E6A3 }, - { "Pacific/Truk" , 0x04E79C }, - { "Pacific/Wake" , 0x04E86B }, - { "Pacific/Wallis" , 0x04E908 }, - { "Pacific/Yap" , 0x04E99A }, - { "Poland" , 0x04EA69 }, - { "Portugal" , 0x04EE10 }, - { "PRC" , 0x04F3CA }, - { "PST8PDT" , 0x04F55F }, - { "ROC" , 0x04F922 }, - { "ROK" , 0x04FB2D }, - { "Singapore" , 0x04FCD8 }, - { "Turkey" , 0x04FDE4 }, - { "UCT" , 0x0502A0 }, - { "Universal" , 0x05031B }, - { "US/Alaska" , 0x050396 }, - { "US/Aleutian" , 0x050773 }, - { "US/Arizona" , 0x050B48 }, - { "US/Central" , 0x050C44 }, - { "US/East-Indiana" , 0x05132A }, - { "US/Eastern" , 0x051549 }, - { "US/Hawaii" , 0x051C25 }, - { "US/Indiana-Starke" , 0x051D0E }, - { "US/Michigan" , 0x052112 }, - { "US/Mountain" , 0x0524A1 }, - { "US/Pacific" , 0x0528BF }, - { "US/Samoa" , 0x052DD9 }, - { "UTC" , 0x052E77 }, - { "W-SU" , 0x052EF2 }, - { "WET" , 0x05328A }, - { "Zulu" , 0x053484 }, + { "Asia/Harbin" , 0x0251E7 }, + { "Asia/Hebron" , 0x02537C }, + { "Asia/Ho_Chi_Minh" , 0x025871 }, + { "Asia/Hong_Kong" , 0x025969 }, + { "Asia/Hovd" , 0x025C7C }, + { "Asia/Irkutsk" , 0x025F05 }, + { "Asia/Istanbul" , 0x026223 }, + { "Asia/Jakarta" , 0x0266DF }, + { "Asia/Jayapura" , 0x0267F0 }, + { "Asia/Jerusalem" , 0x0268DD }, + { "Asia/Kabul" , 0x026D1B }, + { "Asia/Kamchatka" , 0x026DC6 }, + { "Asia/Karachi" , 0x0270BB }, + { "Asia/Kashgar" , 0x0271D1 }, + { "Asia/Kathmandu" , 0x027262 }, + { "Asia/Katmandu" , 0x02730F }, + { "Asia/Khandyga" , 0x0273BC }, + { "Asia/Kolkata" , 0x0276ED }, + { "Asia/Krasnoyarsk" , 0x0277D5 }, + { "Asia/Kuala_Lumpur" , 0x027ADF }, + { "Asia/Kuching" , 0x027BFF }, + { "Asia/Kuwait" , 0x027D59 }, + { "Asia/Macao" , 0x027DEA }, + { "Asia/Macau" , 0x02810D }, + { "Asia/Magadan" , 0x028430 }, + { "Asia/Makassar" , 0x02873B }, + { "Asia/Manila" , 0x02884E }, + { "Asia/Muscat" , 0x028948 }, + { "Asia/Nicosia" , 0x0289D9 }, + { "Asia/Novokuznetsk" , 0x028C4D }, + { "Asia/Novosibirsk" , 0x028F40 }, + { "Asia/Omsk" , 0x029251 }, + { "Asia/Oral" , 0x02954F }, + { "Asia/Phnom_Penh" , 0x0297DB }, + { "Asia/Pontianak" , 0x02987F }, + { "Asia/Pyongyang" , 0x029998 }, + { "Asia/Qatar" , 0x029A5B }, + { "Asia/Qostanay" , 0x029AFF }, + { "Asia/Qyzylorda" , 0x029D8C }, + { "Asia/Rangoon" , 0x02A025 }, + { "Asia/Riyadh" , 0x02A0EC }, + { "Asia/Saigon" , 0x02A17D }, + { "Asia/Sakhalin" , 0x02A275 }, + { "Asia/Samarkand" , 0x02A58C }, + { "Asia/Seoul" , 0x02A717 }, + { "Asia/Shanghai" , 0x02A8C2 }, + { "Asia/Singapore" , 0x02AA63 }, + { "Asia/Srednekolymsk" , 0x02AB6F }, + { "Asia/Taipei" , 0x02AE83 }, + { "Asia/Tashkent" , 0x02B08E }, + { "Asia/Tbilisi" , 0x02B219 }, + { "Asia/Tehran" , 0x02B49A }, + { "Asia/Tel_Aviv" , 0x02BC7A }, + { "Asia/Thimbu" , 0x02C0B8 }, + { "Asia/Thimphu" , 0x02C15E }, + { "Asia/Tokyo" , 0x02C204 }, + { "Asia/Tomsk" , 0x02C2E5 }, + { "Asia/Ujung_Pandang" , 0x02C5F0 }, + { "Asia/Ulaanbaatar" , 0x02C6BA }, + { "Asia/Ulan_Bator" , 0x02C92D }, + { "Asia/Urumqi" , 0x02CB8B }, + { "Asia/Ust-Nera" , 0x02CC29 }, + { "Asia/Vientiane" , 0x02CF4C }, + { "Asia/Vladivostok" , 0x02CFF0 }, + { "Asia/Yakutsk" , 0x02D2F5 }, + { "Asia/Yangon" , 0x02D5F9 }, + { "Asia/Yekaterinburg" , 0x02D6C0 }, + { "Asia/Yerevan" , 0x02D9D2 }, + { "Atlantic/Azores" , 0x02DCA2 }, + { "Atlantic/Bermuda" , 0x02E261 }, + { "Atlantic/Canary" , 0x02E66D }, + { "Atlantic/Cape_Verde" , 0x02E865 }, + { "Atlantic/Faeroe" , 0x02E920 }, + { "Atlantic/Faroe" , 0x02EAE5 }, + { "Atlantic/Jan_Mayen" , 0x02ECAA }, + { "Atlantic/Madeira" , 0x02EF5A }, + { "Atlantic/Reykjavik" , 0x02F522 }, + { "Atlantic/South_Georgia" , 0x02F81F }, + { "Atlantic/St_Helena" , 0x02F8AF }, + { "Atlantic/Stanley" , 0x02F93D }, + { "Australia/ACT" , 0x02FC5E }, + { "Australia/Adelaide" , 0x02FFF2 }, + { "Australia/Brisbane" , 0x0303A6 }, + { "Australia/Broken_Hill" , 0x0304EA }, + { "Australia/Canberra" , 0x0308BF }, + { "Australia/Currie" , 0x030C53 }, + { "Australia/Darwin" , 0x03104A }, + { "Australia/Eucla" , 0x031152 }, + { "Australia/Hobart" , 0x0312B1 }, + { "Australia/LHI" , 0x0316B0 }, + { "Australia/Lindeman" , 0x031970 }, + { "Australia/Lord_Howe" , 0x031AE0 }, + { "Australia/Melbourne" , 0x031DB0 }, + { "Australia/North" , 0x03214C }, + { "Australia/NSW" , 0x032242 }, + { "Australia/Perth" , 0x0325D6 }, + { "Australia/Queensland" , 0x032732 }, + { "Australia/South" , 0x03285F }, + { "Australia/Sydney" , 0x032C04 }, + { "Australia/Tasmania" , 0x032FB4 }, + { "Australia/Victoria" , 0x0333AB }, + { "Australia/West" , 0x03373F }, + { "Australia/Yancowinna" , 0x03387D }, + { "Brazil/Acre" , 0x033C36 }, + { "Brazil/DeNoronha" , 0x033DE4 }, + { "Brazil/East" , 0x033FD4 }, + { "Brazil/West" , 0x034398 }, + { "Canada/Atlantic" , 0x034540 }, + { "Canada/Central" , 0x034BD4 }, + { "Canada/Eastern" , 0x0350EE }, + { "Canada/Mountain" , 0x0357AF }, + { "Canada/Newfoundland" , 0x035B85 }, + { "Canada/Pacific" , 0x0362E7 }, + { "Canada/Saskatchewan" , 0x036825 }, + { "Canada/Yukon" , 0x036AAF }, + { "CET" , 0x036EC0 }, + { "Chile/Continental" , 0x037139 }, + { "Chile/EasterIsland" , 0x037647 }, + { "CST6CDT" , 0x037AA1 }, + { "Cuba" , 0x037E64 }, + { "EET" , 0x0382CD }, + { "Egypt" , 0x0384CA }, + { "Eire" , 0x0389D2 }, + { "EST" , 0x038FB6 }, + { "EST5EDT" , 0x039031 }, + { "Etc/GMT" , 0x0393F4 }, + { "Etc/GMT+0" , 0x03946F }, + { "Etc/GMT+1" , 0x0394EA }, + { "Etc/GMT+10" , 0x039567 }, + { "Etc/GMT+11" , 0x0395E5 }, + { "Etc/GMT+12" , 0x039663 }, + { "Etc/GMT+2" , 0x0396E1 }, + { "Etc/GMT+3" , 0x03975E }, + { "Etc/GMT+4" , 0x0397DB }, + { "Etc/GMT+5" , 0x039858 }, + { "Etc/GMT+6" , 0x0398D5 }, + { "Etc/GMT+7" , 0x039952 }, + { "Etc/GMT+8" , 0x0399CF }, + { "Etc/GMT+9" , 0x039A4C }, + { "Etc/GMT-0" , 0x039AC9 }, + { "Etc/GMT-1" , 0x039B44 }, + { "Etc/GMT-10" , 0x039BC2 }, + { "Etc/GMT-11" , 0x039C41 }, + { "Etc/GMT-12" , 0x039CC0 }, + { "Etc/GMT-13" , 0x039D3F }, + { "Etc/GMT-14" , 0x039DBE }, + { "Etc/GMT-2" , 0x039E3D }, + { "Etc/GMT-3" , 0x039EBB }, + { "Etc/GMT-4" , 0x039F39 }, + { "Etc/GMT-5" , 0x039FB7 }, + { "Etc/GMT-6" , 0x03A035 }, + { "Etc/GMT-7" , 0x03A0B3 }, + { "Etc/GMT-8" , 0x03A131 }, + { "Etc/GMT-9" , 0x03A1AF }, + { "Etc/GMT0" , 0x03A22D }, + { "Etc/Greenwich" , 0x03A2A8 }, + { "Etc/UCT" , 0x03A323 }, + { "Etc/Universal" , 0x03A39E }, + { "Etc/UTC" , 0x03A419 }, + { "Etc/Zulu" , 0x03A494 }, + { "Europe/Amsterdam" , 0x03A50F }, + { "Europe/Andorra" , 0x03A94A }, + { "Europe/Astrakhan" , 0x03AADB }, + { "Europe/Athens" , 0x03ADCF }, + { "Europe/Belfast" , 0x03B085 }, + { "Europe/Belgrade" , 0x03B6D0 }, + { "Europe/Berlin" , 0x03B8BA }, + { "Europe/Bratislava" , 0x03BB9B }, + { "Europe/Brussels" , 0x03BE7A }, + { "Europe/Bucharest" , 0x03C2D5 }, + { "Europe/Budapest" , 0x03C576 }, + { "Europe/Busingen" , 0x03C880 }, + { "Europe/Chisinau" , 0x03CA85 }, + { "Europe/Copenhagen" , 0x03CD84 }, + { "Europe/Dublin" , 0x03CFFF }, + { "Europe/Gibraltar" , 0x03D5E3 }, + { "Europe/Guernsey" , 0x03DAB3 }, + { "Europe/Helsinki" , 0x03E0FE }, + { "Europe/Isle_of_Man" , 0x03E2EB }, + { "Europe/Istanbul" , 0x03E936 }, + { "Europe/Jersey" , 0x03EDF2 }, + { "Europe/Kaliningrad" , 0x03F43D }, + { "Europe/Kiev" , 0x03F7E5 }, + { "Europe/Kirov" , 0x03FA2A }, + { "Europe/Lisbon" , 0x03FD11 }, + { "Europe/Ljubljana" , 0x0402DE }, + { "Europe/London" , 0x0404C8 }, + { "Europe/Luxembourg" , 0x040B13 }, + { "Europe/Madrid" , 0x040F5E }, + { "Europe/Malta" , 0x0412FB }, + { "Europe/Mariehamn" , 0x0416A7 }, + { "Europe/Minsk" , 0x041894 }, + { "Europe/Monaco" , 0x041BC8 }, + { "Europe/Moscow" , 0x04202E }, + { "Europe/Nicosia" , 0x0423DA }, + { "Europe/Oslo" , 0x04263B }, + { "Europe/Paris" , 0x0428EB }, + { "Europe/Podgorica" , 0x042D48 }, + { "Europe/Prague" , 0x042F32 }, + { "Europe/Riga" , 0x043211 }, + { "Europe/Rome" , 0x0434D3 }, + { "Europe/Samara" , 0x043892 }, + { "Europe/San_Marino" , 0x043B93 }, + { "Europe/Sarajevo" , 0x043F52 }, + { "Europe/Saratov" , 0x04413C }, + { "Europe/Simferopol" , 0x04442E }, + { "Europe/Skopje" , 0x0447A1 }, + { "Europe/Sofia" , 0x04498B }, + { "Europe/Stockholm" , 0x044BE7 }, + { "Europe/Tallinn" , 0x044DE4 }, + { "Europe/Tirane" , 0x045093 }, + { "Europe/Tiraspol" , 0x0452FB }, + { "Europe/Ulyanovsk" , 0x0455FA }, + { "Europe/Uzhgorod" , 0x045910 }, + { "Europe/Vaduz" , 0x045B3C }, + { "Europe/Vatican" , 0x045D39 }, + { "Europe/Vienna" , 0x0460F8 }, + { "Europe/Vilnius" , 0x046396 }, + { "Europe/Volgograd" , 0x046646 }, + { "Europe/Warsaw" , 0x046943 }, + { "Europe/Zagreb" , 0x046CEA }, + { "Europe/Zaporozhye" , 0x046ED4 }, + { "Europe/Zurich" , 0x04712B }, + { "Factory" , 0x047328 }, + { "GB" , 0x0473A5 }, + { "GB-Eire" , 0x0479F0 }, + { "GMT" , 0x04803B }, + { "GMT+0" , 0x0480B6 }, + { "GMT-0" , 0x048131 }, + { "GMT0" , 0x0481AC }, + { "Greenwich" , 0x048227 }, + { "Hongkong" , 0x0482A2 }, + { "HST" , 0x0485B5 }, + { "Iceland" , 0x048631 }, + { "Indian/Antananarivo" , 0x04892E }, + { "Indian/Chagos" , 0x0489F9 }, + { "Indian/Christmas" , 0x048A9D }, + { "Indian/Cocos" , 0x048B2E }, + { "Indian/Comoro" , 0x048BC6 }, + { "Indian/Kerguelen" , 0x048C91 }, + { "Indian/Mahe" , 0x048D22 }, + { "Indian/Maldives" , 0x048DB3 }, + { "Indian/Mauritius" , 0x048E57 }, + { "Indian/Mayotte" , 0x048F16 }, + { "Indian/Reunion" , 0x048FE1 }, + { "Iran" , 0x049072 }, + { "Israel" , 0x049852 }, + { "Jamaica" , 0x049C90 }, + { "Japan" , 0x049DEF }, + { "Kwajalein" , 0x049ED0 }, + { "Libya" , 0x049FB7 }, + { "MET" , 0x04A172 }, + { "Mexico/BajaNorte" , 0x04A3EB }, + { "Mexico/BajaSur" , 0x04A7F8 }, + { "Mexico/General" , 0x04A973 }, + { "MST" , 0x04AB1B }, + { "MST7MDT" , 0x04AB96 }, + { "Navajo" , 0x04AF59 }, + { "NZ" , 0x04B377 }, + { "NZ-CHAT" , 0x04B796 }, + { "Pacific/Apia" , 0x04BACA }, + { "Pacific/Auckland" , 0x04BC6D }, + { "Pacific/Bougainville" , 0x04C0A4 }, + { "Pacific/Chatham" , 0x04C185 }, + { "Pacific/Chuuk" , 0x04C4C8 }, + { "Pacific/Easter" , 0x04C5A6 }, + { "Pacific/Efate" , 0x04CA0D }, + { "Pacific/Enderbury" , 0x04CB6F }, + { "Pacific/Fakaofo" , 0x04CC27 }, + { "Pacific/Fiji" , 0x04CCCC }, + { "Pacific/Funafuti" , 0x04CE84 }, + { "Pacific/Galapagos" , 0x04CF16 }, + { "Pacific/Gambier" , 0x04CFE2 }, + { "Pacific/Guadalcanal" , 0x04D081 }, + { "Pacific/Guam" , 0x04D113 }, + { "Pacific/Honolulu" , 0x04D27D }, + { "Pacific/Johnston" , 0x04D36C }, + { "Pacific/Kanton" , 0x04D455 }, + { "Pacific/Kiritimati" , 0x04D51C }, + { "Pacific/Kosrae" , 0x04D5E2 }, + { "Pacific/Kwajalein" , 0x04D6E6 }, + { "Pacific/Majuro" , 0x04D7D6 }, + { "Pacific/Marquesas" , 0x04D8D9 }, + { "Pacific/Midway" , 0x04D981 }, + { "Pacific/Nauru" , 0x04DA2D }, + { "Pacific/Niue" , 0x04DAF0 }, + { "Pacific/Norfolk" , 0x04DB96 }, + { "Pacific/Noumea" , 0x04DC99 }, + { "Pacific/Pago_Pago" , 0x04DD6B }, + { "Pacific/Palau" , 0x04DE09 }, + { "Pacific/Pitcairn" , 0x04DEA9 }, + { "Pacific/Pohnpei" , 0x04DF4E }, + { "Pacific/Ponape" , 0x04E03E }, + { "Pacific/Port_Moresby" , 0x04E120 }, + { "Pacific/Rarotonga" , 0x04E1E3 }, + { "Pacific/Saipan" , 0x04E385 }, + { "Pacific/Samoa" , 0x04E4EF }, + { "Pacific/Tahiti" , 0x04E58D }, + { "Pacific/Tarawa" , 0x04E62D }, + { "Pacific/Tongatapu" , 0x04E6CE }, + { "Pacific/Truk" , 0x04E7C7 }, + { "Pacific/Wake" , 0x04E896 }, + { "Pacific/Wallis" , 0x04E933 }, + { "Pacific/Yap" , 0x04E9C5 }, + { "Poland" , 0x04EA94 }, + { "Portugal" , 0x04EE3B }, + { "PRC" , 0x04F3F5 }, + { "PST8PDT" , 0x04F58A }, + { "ROC" , 0x04F94D }, + { "ROK" , 0x04FB58 }, + { "Singapore" , 0x04FD03 }, + { "Turkey" , 0x04FE0F }, + { "UCT" , 0x0502CB }, + { "Universal" , 0x050346 }, + { "US/Alaska" , 0x0503C1 }, + { "US/Aleutian" , 0x05079E }, + { "US/Arizona" , 0x050B73 }, + { "US/Central" , 0x050C6F }, + { "US/East-Indiana" , 0x051355 }, + { "US/Eastern" , 0x051574 }, + { "US/Hawaii" , 0x051C50 }, + { "US/Indiana-Starke" , 0x051D39 }, + { "US/Michigan" , 0x05213D }, + { "US/Mountain" , 0x0524CC }, + { "US/Pacific" , 0x0528EA }, + { "US/Samoa" , 0x052E04 }, + { "UTC" , 0x052EA2 }, + { "W-SU" , 0x052F1D }, + { "WET" , 0x0532B5 }, + { "Zulu" , 0x0534AF }, }; -const unsigned char timelib_timezone_db_data_builtin[341247] = { +const unsigned char timelib_timezone_db_data_builtin[341290] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -10702,7 +10702,7 @@ const unsigned char timelib_timezone_db_data_builtin[341247] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xBD, 0x4A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x59, 0xCF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xFA, 0xA6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x38, 0x9C, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE5, 0xEB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xAC, 0xFE, 0x00, 0xFF, @@ -10760,21 +10760,22 @@ const unsigned char timelib_timezone_db_data_builtin[341247] = { 0x00, 0x00, 0x00, 0x58, 0xD5, 0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF3, 0xAC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, +0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, -0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, -0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, -0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, 0x39, 0x0A, 0x00, 0xB9, 0x64, -0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, -0x72, 0x69, 0x70, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x20, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, +0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, +0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, +0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, +0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xB9, +0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, +0x74, 0x72, 0x69, 0x70, /* Asia/Harbin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -10810,7 +10811,7 @@ const unsigned char timelib_timezone_db_data_builtin[341247] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xBD, 0x4A, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x59, 0xCF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xFA, 0xA6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x38, 0x9C, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE5, 0xEB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xAC, 0xFE, 0x00, 0xFF, @@ -10869,21 +10870,22 @@ const unsigned char timelib_timezone_db_data_builtin[341247] = { 0x00, 0x00, 0x00, 0x58, 0xD5, 0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF3, 0xAC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, +0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x20, 0xE7, -0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, -0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, -0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, -0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, -0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, 0x39, 0x0A, 0x00, -0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, 0x74, 0x20, -0x42, 0x61, 0x6E, 0x6B, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, +0x20, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, +0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, +0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, +0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, +0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, +0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, 0x74, +0x20, 0x42, 0x61, 0x6E, 0x6B, /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21605,7 +21607,7 @@ const unsigned char timelib_timezone_db_data_builtin[341247] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x13, 0xB1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x3B, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xD7, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x24, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB7, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x11, 0x2C, 0xE0, 0x00, @@ -21620,13 +21622,14 @@ const unsigned char timelib_timezone_db_data_builtin[341247] = { 0x00, 0x00, 0x00, 0x5A, 0x5A, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDD, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x39, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xC6, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x19, 0xD4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xDE, 0x07, 0x60, 0x00, -0x00, 0x00, 0x00, 0x60, 0x02, 0xF1, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x60, 0x02, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6F, 0xA6, 0xE0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, -0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, -0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x3C, 0x2B, 0x31, 0x33, 0x3E, -0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x2E, 0x32, 0x2E, 0x33, 0x2F, -0x39, 0x39, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0xA7, +0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, +0x3E, 0x2D, 0x31, 0x32, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x32, 0x2E, +0x30, 0x2C, 0x4D, 0x31, 0x2E, 0x32, 0x2E, 0x33, 0x2F, 0x39, 0x39, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, +0x02, 0x22, 0xE6, 0x82, 0x00, 0x00, 0x00, 0x00, /* Pacific/Funafuti */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -23687,340 +23690,340 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Asia/Dushanbe" , 0x0476ED }, { "Asia/Famagusta" , 0x047948 }, { "Asia/Gaza" , 0x04814F }, - { "Asia/Harbin" , 0x048ADB }, - { "Asia/Hebron" , 0x048D18 }, - { "Asia/Ho_Chi_Minh" , 0x0496BF }, - { "Asia/Hong_Kong" , 0x04982A }, - { "Asia/Hovd" , 0x049CE9 }, - { "Asia/Irkutsk" , 0x04A09B }, - { "Asia/Istanbul" , 0x04A59C }, - { "Asia/Jakarta" , 0x04AD43 }, - { "Asia/Jayapura" , 0x04AEBF }, - { "Asia/Jerusalem" , 0x04AFDE }, - { "Asia/Kabul" , 0x04B93E }, - { "Asia/Kamchatka" , 0x04BA1A }, - { "Asia/Karachi" , 0x04BEC6 }, - { "Asia/Kashgar" , 0x04C04D }, - { "Asia/Kathmandu" , 0x04C0FE }, - { "Asia/Katmandu" , 0x04C1DE }, - { "Asia/Khandyga" , 0x04C2BE }, - { "Asia/Kolkata" , 0x04C7DF }, - { "Asia/Krasnoyarsk" , 0x04C908 }, - { "Asia/Kuala_Lumpur" , 0x04CDE4 }, - { "Asia/Kuching" , 0x04CF83 }, - { "Asia/Kuwait" , 0x04D180 }, - { "Asia/Macao" , 0x04D231 }, - { "Asia/Macau" , 0x04D708 }, - { "Asia/Magadan" , 0x04DBDF }, - { "Asia/Makassar" , 0x04E0C1 }, - { "Asia/Manila" , 0x04E214 }, - { "Asia/Muscat" , 0x04E368 }, - { "Asia/Nicosia" , 0x04E419 }, - { "Asia/Novokuznetsk" , 0x04EC0A }, - { "Asia/Novosibirsk" , 0x04F0B4 }, - { "Asia/Omsk" , 0x04F599 }, - { "Asia/Oral" , 0x04FA69 }, - { "Asia/Phnom_Penh" , 0x04FE71 }, - { "Asia/Pontianak" , 0x04FF44 }, - { "Asia/Pyongyang" , 0x0500C7 }, - { "Asia/Qatar" , 0x0501C0 }, - { "Asia/Qostanay" , 0x050293 }, - { "Asia/Qyzylorda" , 0x0506AC }, - { "Asia/Rangoon" , 0x050AD6 }, - { "Asia/Riyadh" , 0x050BEE }, - { "Asia/Saigon" , 0x050C9F }, - { "Asia/Sakhalin" , 0x050E0A }, - { "Asia/Samarkand" , 0x0512E0 }, - { "Asia/Seoul" , 0x05153E }, - { "Asia/Shanghai" , 0x0517B3 }, - { "Asia/Singapore" , 0x0519FC }, - { "Asia/Srednekolymsk" , 0x051B87 }, - { "Asia/Taipei" , 0x05206D }, - { "Asia/Tashkent" , 0x052372 }, - { "Asia/Tbilisi" , 0x0525DE }, - { "Asia/Tehran" , 0x0529F5 }, - { "Asia/Tel_Aviv" , 0x053417 }, - { "Asia/Thimbu" , 0x053D77 }, - { "Asia/Thimphu" , 0x053E4E }, - { "Asia/Tokyo" , 0x053F25 }, - { "Asia/Tomsk" , 0x054066 }, - { "Asia/Ujung_Pandang" , 0x054545 }, - { "Asia/Ulaanbaatar" , 0x05464F }, - { "Asia/Ulan_Bator" , 0x0549EB }, - { "Asia/Urumqi" , 0x054D72 }, - { "Asia/Ust-Nera" , 0x054E30 }, - { "Asia/Vientiane" , 0x055334 }, - { "Asia/Vladivostok" , 0x055407 }, - { "Asia/Yakutsk" , 0x0558DE }, - { "Asia/Yangon" , 0x055DB4 }, - { "Asia/Yekaterinburg" , 0x055ECC }, - { "Asia/Yerevan" , 0x0563C1 }, - { "Atlantic/Azores" , 0x05684C }, - { "Atlantic/Bermuda" , 0x057616 }, - { "Atlantic/Canary" , 0x057F7E }, - { "Atlantic/Cape_Verde" , 0x058701 }, - { "Atlantic/Faeroe" , 0x05881B }, - { "Atlantic/Faroe" , 0x058F3E }, - { "Atlantic/Jan_Mayen" , 0x059661 }, - { "Atlantic/Madeira" , 0x059F21 }, - { "Atlantic/Reykjavik" , 0x05ACEB }, - { "Atlantic/South_Georgia" , 0x05B181 }, - { "Atlantic/St_Helena" , 0x05B231 }, - { "Atlantic/Stanley" , 0x05B2D1 }, - { "Australia/ACT" , 0x05B79B }, - { "Australia/Adelaide" , 0x05C035 }, - { "Australia/Brisbane" , 0x05C8F0 }, - { "Australia/Broken_Hill" , 0x05CAB6 }, - { "Australia/Canberra" , 0x05D393 }, - { "Australia/Currie" , 0x05DC2D }, - { "Australia/Darwin" , 0x05E56F }, - { "Australia/Eucla" , 0x05E6D2 }, - { "Australia/Hobart" , 0x05E8CD }, - { "Australia/LHI" , 0x05F217 }, - { "Australia/Lindeman" , 0x05F967 }, - { "Australia/Lord_Howe" , 0x05FB6D }, - { "Australia/Melbourne" , 0x0602CD }, - { "Australia/North" , 0x060B6F }, - { "Australia/NSW" , 0x060CC0 }, - { "Australia/Perth" , 0x06155A }, - { "Australia/Queensland" , 0x061742 }, - { "Australia/South" , 0x0618F1 }, - { "Australia/Sydney" , 0x06219D }, - { "Australia/Tasmania" , 0x062A53 }, - { "Australia/Victoria" , 0x063395 }, - { "Australia/West" , 0x063C2F }, - { "Australia/Yancowinna" , 0x063DF9 }, - { "Brazil/Acre" , 0x0646BA }, - { "Brazil/DeNoronha" , 0x06493A }, - { "Brazil/East" , 0x064C12 }, - { "Brazil/West" , 0x0651C2 }, - { "Canada/Atlantic" , 0x06542A }, - { "Canada/Central" , 0x066196 }, - { "Canada/Eastern" , 0x066CD6 }, - { "Canada/Mountain" , 0x067A88 }, - { "Canada/Newfoundland" , 0x0683B0 }, - { "Canada/Pacific" , 0x069203 }, - { "Canada/Saskatchewan" , 0x069D5B }, - { "Canada/Yukon" , 0x06A13B }, - { "CET" , 0x06A795 }, - { "Chile/Continental" , 0x06AFCF }, - { "Chile/EasterIsland" , 0x06B9BC }, - { "CST6CDT" , 0x06C281 }, - { "Cuba" , 0x06CB93 }, - { "EET" , 0x06D50F }, - { "Egypt" , 0x06DC8F }, - { "Eire" , 0x06E43E }, - { "EST" , 0x06F1EE }, - { "EST5EDT" , 0x06F26C }, - { "Etc/GMT" , 0x06FB7E }, - { "Etc/GMT+0" , 0x06FBFC }, - { "Etc/GMT+1" , 0x06FC7A }, - { "Etc/GMT+10" , 0x06FCFA }, - { "Etc/GMT+11" , 0x06FD7B }, - { "Etc/GMT+12" , 0x06FDFC }, - { "Etc/GMT+2" , 0x06FE7D }, - { "Etc/GMT+3" , 0x06FEFD }, - { "Etc/GMT+4" , 0x06FF7D }, - { "Etc/GMT+5" , 0x06FFFD }, - { "Etc/GMT+6" , 0x07007D }, - { "Etc/GMT+7" , 0x0700FD }, - { "Etc/GMT+8" , 0x07017D }, - { "Etc/GMT+9" , 0x0701FD }, - { "Etc/GMT-0" , 0x07027D }, - { "Etc/GMT-1" , 0x0702FB }, - { "Etc/GMT-10" , 0x07037C }, - { "Etc/GMT-11" , 0x0703FE }, - { "Etc/GMT-12" , 0x070480 }, - { "Etc/GMT-13" , 0x070502 }, - { "Etc/GMT-14" , 0x070584 }, - { "Etc/GMT-2" , 0x070606 }, - { "Etc/GMT-3" , 0x070687 }, - { "Etc/GMT-4" , 0x070708 }, - { "Etc/GMT-5" , 0x070789 }, - { "Etc/GMT-6" , 0x07080A }, - { "Etc/GMT-7" , 0x07088B }, - { "Etc/GMT-8" , 0x07090C }, - { "Etc/GMT-9" , 0x07098D }, - { "Etc/GMT0" , 0x070A0E }, - { "Etc/Greenwich" , 0x070A8C }, - { "Etc/UCT" , 0x070B0A }, - { "Etc/Universal" , 0x070B88 }, - { "Etc/UTC" , 0x070C06 }, - { "Etc/Zulu" , 0x070C84 }, - { "Europe/Amsterdam" , 0x070D02 }, - { "Europe/Andorra" , 0x07186C }, - { "Europe/Astrakhan" , 0x071F46 }, - { "Europe/Athens" , 0x0723F1 }, - { "Europe/Belfast" , 0x072CD3 }, - { "Europe/Belgrade" , 0x073B1F }, - { "Europe/Berlin" , 0x0742AB }, - { "Europe/Bratislava" , 0x074BC5 }, - { "Europe/Brussels" , 0x0754CE }, - { "Europe/Bucharest" , 0x07604F }, - { "Europe/Budapest" , 0x0768E3 }, - { "Europe/Busingen" , 0x07722F }, - { "Europe/Chisinau" , 0x0779B8 }, - { "Europe/Copenhagen" , 0x07831A }, - { "Europe/Dublin" , 0x078B7F }, - { "Europe/Gibraltar" , 0x07992F }, - { "Europe/Guernsey" , 0x07A527 }, - { "Europe/Helsinki" , 0x07B373 }, - { "Europe/Isle_of_Man" , 0x07BAEB }, - { "Europe/Istanbul" , 0x07C937 }, - { "Europe/Jersey" , 0x07D0DE }, - { "Europe/Kaliningrad" , 0x07DF2A }, - { "Europe/Kiev" , 0x07E51F }, - { "Europe/Kirov" , 0x07ED67 }, - { "Europe/Lisbon" , 0x07F202 }, - { "Europe/Ljubljana" , 0x07FFCA }, - { "Europe/London" , 0x080756 }, - { "Europe/Luxembourg" , 0x0815A2 }, - { "Europe/Madrid" , 0x082130 }, - { "Europe/Malta" , 0x082B82 }, - { "Europe/Mariehamn" , 0x0835CA }, - { "Europe/Minsk" , 0x083D42 }, - { "Europe/Monaco" , 0x084277 }, - { "Europe/Moscow" , 0x084E03 }, - { "Europe/Nicosia" , 0x085422 }, - { "Europe/Oslo" , 0x085C00 }, - { "Europe/Paris" , 0x0864C0 }, - { "Europe/Podgorica" , 0x08705E }, - { "Europe/Prague" , 0x0877EA }, - { "Europe/Riga" , 0x0880F3 }, - { "Europe/Rome" , 0x088995 }, - { "Europe/Samara" , 0x0893F2 }, - { "Europe/San_Marino" , 0x0898D6 }, - { "Europe/Sarajevo" , 0x08A333 }, - { "Europe/Saratov" , 0x08AABF }, - { "Europe/Simferopol" , 0x08AF7A }, - { "Europe/Skopje" , 0x08B539 }, - { "Europe/Sofia" , 0x08BCC5 }, - { "Europe/Stockholm" , 0x08C4EE }, - { "Europe/Tallinn" , 0x08CC6F }, - { "Europe/Tirane" , 0x08D4DF }, - { "Europe/Tiraspol" , 0x08DD0F }, - { "Europe/Ulyanovsk" , 0x08E671 }, - { "Europe/Uzhgorod" , 0x08EB82 }, - { "Europe/Vaduz" , 0x08F39E }, - { "Europe/Vatican" , 0x08FB1F }, - { "Europe/Vienna" , 0x09057C }, - { "Europe/Vilnius" , 0x090E20 }, - { "Europe/Volgograd" , 0x09169E }, - { "Europe/Warsaw" , 0x091B49 }, - { "Europe/Zagreb" , 0x0925B3 }, - { "Europe/Zaporozhye" , 0x092D3F }, - { "Europe/Zurich" , 0x0935A0 }, - { "Factory" , 0x093D21 }, - { "GB" , 0x093DA1 }, - { "GB-Eire" , 0x094BED }, - { "GMT" , 0x095A39 }, - { "GMT+0" , 0x095AB7 }, - { "GMT-0" , 0x095B35 }, - { "GMT0" , 0x095BB3 }, - { "Greenwich" , 0x095C31 }, - { "Hongkong" , 0x095CAF }, - { "HST" , 0x09616E }, - { "Iceland" , 0x0961ED }, - { "Indian/Antananarivo" , 0x096683 }, - { "Indian/Chagos" , 0x096798 }, - { "Indian/Christmas" , 0x09686B }, - { "Indian/Cocos" , 0x09691C }, - { "Indian/Comoro" , 0x0969D6 }, - { "Indian/Kerguelen" , 0x096AEB }, - { "Indian/Mahe" , 0x096B9C }, - { "Indian/Maldives" , 0x096C4D }, - { "Indian/Mauritius" , 0x096D20 }, - { "Indian/Mayotte" , 0x096E1D }, - { "Indian/Reunion" , 0x096F32 }, - { "Iran" , 0x096FE3 }, - { "Israel" , 0x097A05 }, - { "Jamaica" , 0x098365 }, - { "Japan" , 0x098553 }, - { "Kwajalein" , 0x098694 }, - { "Libya" , 0x0987DC }, - { "MET" , 0x098A59 }, - { "Mexico/BajaNorte" , 0x099293 }, - { "Mexico/BajaSur" , 0x099BC5 }, - { "Mexico/General" , 0x09A1C7 }, - { "MST" , 0x09A803 }, - { "MST7MDT" , 0x09A881 }, - { "Navajo" , 0x09B193 }, - { "NZ" , 0x09BB2B }, - { "NZ-CHAT" , 0x09C4BC }, - { "Pacific/Apia" , 0x09CCDC }, - { "Pacific/Auckland" , 0x09CF4C }, - { "Pacific/Bougainville" , 0x09D8F5 }, - { "Pacific/Chatham" , 0x09DA19 }, - { "Pacific/Chuuk" , 0x09E248 }, - { "Pacific/Easter" , 0x09E370 }, - { "Pacific/Efate" , 0x09EC42 }, - { "Pacific/Enderbury" , 0x09EE68 }, - { "Pacific/Fakaofo" , 0x09EF5E }, - { "Pacific/Fiji" , 0x09F032 }, - { "Pacific/Funafuti" , 0x09F473 }, - { "Pacific/Galapagos" , 0x09F525 }, - { "Pacific/Gambier" , 0x09F630 }, - { "Pacific/Guadalcanal" , 0x09F6EF }, - { "Pacific/Guam" , 0x09F7A1 }, - { "Pacific/Honolulu" , 0x09F99B }, - { "Pacific/Johnston" , 0x09FAF6 }, - { "Pacific/Kanton" , 0x09FC4B }, - { "Pacific/Kiritimati" , 0x09FD50 }, - { "Pacific/Kosrae" , 0x09FE56 }, - { "Pacific/Kwajalein" , 0x09FFC7 }, - { "Pacific/Majuro" , 0x0A0118 }, - { "Pacific/Marquesas" , 0x0A0277 }, - { "Pacific/Midway" , 0x0A0341 }, - { "Pacific/Nauru" , 0x0A040A }, - { "Pacific/Niue" , 0x0A0512 }, - { "Pacific/Norfolk" , 0x0A05E9 }, - { "Pacific/Noumea" , 0x0A0965 }, - { "Pacific/Pago_Pago" , 0x0A0AA1 }, - { "Pacific/Palau" , 0x0A0B5C }, - { "Pacific/Pitcairn" , 0x0A0C1C }, - { "Pacific/Pohnpei" , 0x0A0CF2 }, - { "Pacific/Ponape" , 0x0A0E3B }, - { "Pacific/Port_Moresby" , 0x0A0F76 }, - { "Pacific/Rarotonga" , 0x0A1059 }, - { "Pacific/Saipan" , 0x0A12C0 }, - { "Pacific/Samoa" , 0x0A14BA }, - { "Pacific/Tahiti" , 0x0A1575 }, - { "Pacific/Tarawa" , 0x0A1635 }, - { "Pacific/Tongatapu" , 0x0A16F6 }, - { "Pacific/Truk" , 0x0A1876 }, - { "Pacific/Wake" , 0x0A198F }, - { "Pacific/Wallis" , 0x0A1A4C }, - { "Pacific/Yap" , 0x0A1AFE }, - { "Poland" , 0x0A1C17 }, - { "Portugal" , 0x0A2681 }, - { "PRC" , 0x0A3436 }, - { "PST8PDT" , 0x0A3673 }, - { "ROC" , 0x0A3F85 }, - { "ROK" , 0x0A428A }, - { "Singapore" , 0x0A44FF }, - { "Turkey" , 0x0A468A }, - { "UCT" , 0x0A4E31 }, - { "Universal" , 0x0A4EAF }, - { "US/Alaska" , 0x0A4F2D }, - { "US/Aleutian" , 0x0A587C }, - { "US/Arizona" , 0x0A61BC }, - { "US/Central" , 0x0A6310 }, - { "US/East-Indiana" , 0x0A7114 }, - { "US/Eastern" , 0x0A77A2 }, - { "US/Hawaii" , 0x0A857E }, - { "US/Indiana-Starke" , 0x0A86D3 }, - { "US/Michigan" , 0x0A905B }, - { "US/Mountain" , 0x0A991D }, - { "US/Pacific" , 0x0AA2B5 }, - { "US/Samoa" , 0x0AADD5 }, - { "UTC" , 0x0AAE90 }, - { "W-SU" , 0x0AAF0E }, - { "WET" , 0x0AB519 }, - { "Zulu" , 0x0ABC96 }, + { "Asia/Harbin" , 0x048ADA }, + { "Asia/Hebron" , 0x048D17 }, + { "Asia/Ho_Chi_Minh" , 0x0496BD }, + { "Asia/Hong_Kong" , 0x049828 }, + { "Asia/Hovd" , 0x049CE7 }, + { "Asia/Irkutsk" , 0x04A099 }, + { "Asia/Istanbul" , 0x04A59A }, + { "Asia/Jakarta" , 0x04AD41 }, + { "Asia/Jayapura" , 0x04AEBD }, + { "Asia/Jerusalem" , 0x04AFDC }, + { "Asia/Kabul" , 0x04B93C }, + { "Asia/Kamchatka" , 0x04BA18 }, + { "Asia/Karachi" , 0x04BEC4 }, + { "Asia/Kashgar" , 0x04C04B }, + { "Asia/Kathmandu" , 0x04C0FC }, + { "Asia/Katmandu" , 0x04C1DC }, + { "Asia/Khandyga" , 0x04C2BC }, + { "Asia/Kolkata" , 0x04C7DD }, + { "Asia/Krasnoyarsk" , 0x04C906 }, + { "Asia/Kuala_Lumpur" , 0x04CDE2 }, + { "Asia/Kuching" , 0x04CF81 }, + { "Asia/Kuwait" , 0x04D17E }, + { "Asia/Macao" , 0x04D22F }, + { "Asia/Macau" , 0x04D706 }, + { "Asia/Magadan" , 0x04DBDD }, + { "Asia/Makassar" , 0x04E0BF }, + { "Asia/Manila" , 0x04E212 }, + { "Asia/Muscat" , 0x04E366 }, + { "Asia/Nicosia" , 0x04E417 }, + { "Asia/Novokuznetsk" , 0x04EC08 }, + { "Asia/Novosibirsk" , 0x04F0B2 }, + { "Asia/Omsk" , 0x04F597 }, + { "Asia/Oral" , 0x04FA67 }, + { "Asia/Phnom_Penh" , 0x04FE6F }, + { "Asia/Pontianak" , 0x04FF42 }, + { "Asia/Pyongyang" , 0x0500C5 }, + { "Asia/Qatar" , 0x0501BE }, + { "Asia/Qostanay" , 0x050291 }, + { "Asia/Qyzylorda" , 0x0506AA }, + { "Asia/Rangoon" , 0x050AD4 }, + { "Asia/Riyadh" , 0x050BEC }, + { "Asia/Saigon" , 0x050C9D }, + { "Asia/Sakhalin" , 0x050E08 }, + { "Asia/Samarkand" , 0x0512DE }, + { "Asia/Seoul" , 0x05153C }, + { "Asia/Shanghai" , 0x0517B1 }, + { "Asia/Singapore" , 0x0519FA }, + { "Asia/Srednekolymsk" , 0x051B85 }, + { "Asia/Taipei" , 0x05206B }, + { "Asia/Tashkent" , 0x052370 }, + { "Asia/Tbilisi" , 0x0525DC }, + { "Asia/Tehran" , 0x0529F3 }, + { "Asia/Tel_Aviv" , 0x053415 }, + { "Asia/Thimbu" , 0x053D75 }, + { "Asia/Thimphu" , 0x053E4C }, + { "Asia/Tokyo" , 0x053F23 }, + { "Asia/Tomsk" , 0x054064 }, + { "Asia/Ujung_Pandang" , 0x054543 }, + { "Asia/Ulaanbaatar" , 0x05464D }, + { "Asia/Ulan_Bator" , 0x0549E9 }, + { "Asia/Urumqi" , 0x054D70 }, + { "Asia/Ust-Nera" , 0x054E2E }, + { "Asia/Vientiane" , 0x055332 }, + { "Asia/Vladivostok" , 0x055405 }, + { "Asia/Yakutsk" , 0x0558DC }, + { "Asia/Yangon" , 0x055DB2 }, + { "Asia/Yekaterinburg" , 0x055ECA }, + { "Asia/Yerevan" , 0x0563BF }, + { "Atlantic/Azores" , 0x05684A }, + { "Atlantic/Bermuda" , 0x057614 }, + { "Atlantic/Canary" , 0x057F7C }, + { "Atlantic/Cape_Verde" , 0x0586FF }, + { "Atlantic/Faeroe" , 0x058819 }, + { "Atlantic/Faroe" , 0x058F3C }, + { "Atlantic/Jan_Mayen" , 0x05965F }, + { "Atlantic/Madeira" , 0x059F1F }, + { "Atlantic/Reykjavik" , 0x05ACE9 }, + { "Atlantic/South_Georgia" , 0x05B17F }, + { "Atlantic/St_Helena" , 0x05B22F }, + { "Atlantic/Stanley" , 0x05B2CF }, + { "Australia/ACT" , 0x05B799 }, + { "Australia/Adelaide" , 0x05C033 }, + { "Australia/Brisbane" , 0x05C8EE }, + { "Australia/Broken_Hill" , 0x05CAB4 }, + { "Australia/Canberra" , 0x05D391 }, + { "Australia/Currie" , 0x05DC2B }, + { "Australia/Darwin" , 0x05E56D }, + { "Australia/Eucla" , 0x05E6D0 }, + { "Australia/Hobart" , 0x05E8CB }, + { "Australia/LHI" , 0x05F215 }, + { "Australia/Lindeman" , 0x05F965 }, + { "Australia/Lord_Howe" , 0x05FB6B }, + { "Australia/Melbourne" , 0x0602CB }, + { "Australia/North" , 0x060B6D }, + { "Australia/NSW" , 0x060CBE }, + { "Australia/Perth" , 0x061558 }, + { "Australia/Queensland" , 0x061740 }, + { "Australia/South" , 0x0618EF }, + { "Australia/Sydney" , 0x06219B }, + { "Australia/Tasmania" , 0x062A51 }, + { "Australia/Victoria" , 0x063393 }, + { "Australia/West" , 0x063C2D }, + { "Australia/Yancowinna" , 0x063DF7 }, + { "Brazil/Acre" , 0x0646B8 }, + { "Brazil/DeNoronha" , 0x064938 }, + { "Brazil/East" , 0x064C10 }, + { "Brazil/West" , 0x0651C0 }, + { "Canada/Atlantic" , 0x065428 }, + { "Canada/Central" , 0x066194 }, + { "Canada/Eastern" , 0x066CD4 }, + { "Canada/Mountain" , 0x067A86 }, + { "Canada/Newfoundland" , 0x0683AE }, + { "Canada/Pacific" , 0x069201 }, + { "Canada/Saskatchewan" , 0x069D59 }, + { "Canada/Yukon" , 0x06A139 }, + { "CET" , 0x06A793 }, + { "Chile/Continental" , 0x06AFCD }, + { "Chile/EasterIsland" , 0x06B9BA }, + { "CST6CDT" , 0x06C27F }, + { "Cuba" , 0x06CB91 }, + { "EET" , 0x06D50D }, + { "Egypt" , 0x06DC8D }, + { "Eire" , 0x06E43C }, + { "EST" , 0x06F1EC }, + { "EST5EDT" , 0x06F26A }, + { "Etc/GMT" , 0x06FB7C }, + { "Etc/GMT+0" , 0x06FBFA }, + { "Etc/GMT+1" , 0x06FC78 }, + { "Etc/GMT+10" , 0x06FCF8 }, + { "Etc/GMT+11" , 0x06FD79 }, + { "Etc/GMT+12" , 0x06FDFA }, + { "Etc/GMT+2" , 0x06FE7B }, + { "Etc/GMT+3" , 0x06FEFB }, + { "Etc/GMT+4" , 0x06FF7B }, + { "Etc/GMT+5" , 0x06FFFB }, + { "Etc/GMT+6" , 0x07007B }, + { "Etc/GMT+7" , 0x0700FB }, + { "Etc/GMT+8" , 0x07017B }, + { "Etc/GMT+9" , 0x0701FB }, + { "Etc/GMT-0" , 0x07027B }, + { "Etc/GMT-1" , 0x0702F9 }, + { "Etc/GMT-10" , 0x07037A }, + { "Etc/GMT-11" , 0x0703FC }, + { "Etc/GMT-12" , 0x07047E }, + { "Etc/GMT-13" , 0x070500 }, + { "Etc/GMT-14" , 0x070582 }, + { "Etc/GMT-2" , 0x070604 }, + { "Etc/GMT-3" , 0x070685 }, + { "Etc/GMT-4" , 0x070706 }, + { "Etc/GMT-5" , 0x070787 }, + { "Etc/GMT-6" , 0x070808 }, + { "Etc/GMT-7" , 0x070889 }, + { "Etc/GMT-8" , 0x07090A }, + { "Etc/GMT-9" , 0x07098B }, + { "Etc/GMT0" , 0x070A0C }, + { "Etc/Greenwich" , 0x070A8A }, + { "Etc/UCT" , 0x070B08 }, + { "Etc/Universal" , 0x070B86 }, + { "Etc/UTC" , 0x070C04 }, + { "Etc/Zulu" , 0x070C82 }, + { "Europe/Amsterdam" , 0x070D00 }, + { "Europe/Andorra" , 0x07186A }, + { "Europe/Astrakhan" , 0x071F44 }, + { "Europe/Athens" , 0x0723EF }, + { "Europe/Belfast" , 0x072CD1 }, + { "Europe/Belgrade" , 0x073B1D }, + { "Europe/Berlin" , 0x0742A9 }, + { "Europe/Bratislava" , 0x074BC3 }, + { "Europe/Brussels" , 0x0754CC }, + { "Europe/Bucharest" , 0x07604D }, + { "Europe/Budapest" , 0x0768E1 }, + { "Europe/Busingen" , 0x07722D }, + { "Europe/Chisinau" , 0x0779B6 }, + { "Europe/Copenhagen" , 0x078318 }, + { "Europe/Dublin" , 0x078B7D }, + { "Europe/Gibraltar" , 0x07992D }, + { "Europe/Guernsey" , 0x07A525 }, + { "Europe/Helsinki" , 0x07B371 }, + { "Europe/Isle_of_Man" , 0x07BAE9 }, + { "Europe/Istanbul" , 0x07C935 }, + { "Europe/Jersey" , 0x07D0DC }, + { "Europe/Kaliningrad" , 0x07DF28 }, + { "Europe/Kiev" , 0x07E51D }, + { "Europe/Kirov" , 0x07ED65 }, + { "Europe/Lisbon" , 0x07F200 }, + { "Europe/Ljubljana" , 0x07FFC8 }, + { "Europe/London" , 0x080754 }, + { "Europe/Luxembourg" , 0x0815A0 }, + { "Europe/Madrid" , 0x08212E }, + { "Europe/Malta" , 0x082B80 }, + { "Europe/Mariehamn" , 0x0835C8 }, + { "Europe/Minsk" , 0x083D40 }, + { "Europe/Monaco" , 0x084275 }, + { "Europe/Moscow" , 0x084E01 }, + { "Europe/Nicosia" , 0x085420 }, + { "Europe/Oslo" , 0x085BFE }, + { "Europe/Paris" , 0x0864BE }, + { "Europe/Podgorica" , 0x08705C }, + { "Europe/Prague" , 0x0877E8 }, + { "Europe/Riga" , 0x0880F1 }, + { "Europe/Rome" , 0x088993 }, + { "Europe/Samara" , 0x0893F0 }, + { "Europe/San_Marino" , 0x0898D4 }, + { "Europe/Sarajevo" , 0x08A331 }, + { "Europe/Saratov" , 0x08AABD }, + { "Europe/Simferopol" , 0x08AF78 }, + { "Europe/Skopje" , 0x08B537 }, + { "Europe/Sofia" , 0x08BCC3 }, + { "Europe/Stockholm" , 0x08C4EC }, + { "Europe/Tallinn" , 0x08CC6D }, + { "Europe/Tirane" , 0x08D4DD }, + { "Europe/Tiraspol" , 0x08DD0D }, + { "Europe/Ulyanovsk" , 0x08E66F }, + { "Europe/Uzhgorod" , 0x08EB80 }, + { "Europe/Vaduz" , 0x08F39C }, + { "Europe/Vatican" , 0x08FB1D }, + { "Europe/Vienna" , 0x09057A }, + { "Europe/Vilnius" , 0x090E1E }, + { "Europe/Volgograd" , 0x09169C }, + { "Europe/Warsaw" , 0x091B47 }, + { "Europe/Zagreb" , 0x0925B1 }, + { "Europe/Zaporozhye" , 0x092D3D }, + { "Europe/Zurich" , 0x09359E }, + { "Factory" , 0x093D1F }, + { "GB" , 0x093D9F }, + { "GB-Eire" , 0x094BEB }, + { "GMT" , 0x095A37 }, + { "GMT+0" , 0x095AB5 }, + { "GMT-0" , 0x095B33 }, + { "GMT0" , 0x095BB1 }, + { "Greenwich" , 0x095C2F }, + { "Hongkong" , 0x095CAD }, + { "HST" , 0x09616C }, + { "Iceland" , 0x0961EB }, + { "Indian/Antananarivo" , 0x096681 }, + { "Indian/Chagos" , 0x096796 }, + { "Indian/Christmas" , 0x096869 }, + { "Indian/Cocos" , 0x09691A }, + { "Indian/Comoro" , 0x0969D4 }, + { "Indian/Kerguelen" , 0x096AE9 }, + { "Indian/Mahe" , 0x096B9A }, + { "Indian/Maldives" , 0x096C4B }, + { "Indian/Mauritius" , 0x096D1E }, + { "Indian/Mayotte" , 0x096E1B }, + { "Indian/Reunion" , 0x096F30 }, + { "Iran" , 0x096FE1 }, + { "Israel" , 0x097A03 }, + { "Jamaica" , 0x098363 }, + { "Japan" , 0x098551 }, + { "Kwajalein" , 0x098692 }, + { "Libya" , 0x0987DA }, + { "MET" , 0x098A57 }, + { "Mexico/BajaNorte" , 0x099291 }, + { "Mexico/BajaSur" , 0x099BC3 }, + { "Mexico/General" , 0x09A1C5 }, + { "MST" , 0x09A801 }, + { "MST7MDT" , 0x09A87F }, + { "Navajo" , 0x09B191 }, + { "NZ" , 0x09BB29 }, + { "NZ-CHAT" , 0x09C4BA }, + { "Pacific/Apia" , 0x09CCDA }, + { "Pacific/Auckland" , 0x09CF4A }, + { "Pacific/Bougainville" , 0x09D8F3 }, + { "Pacific/Chatham" , 0x09DA17 }, + { "Pacific/Chuuk" , 0x09E246 }, + { "Pacific/Easter" , 0x09E36E }, + { "Pacific/Efate" , 0x09EC40 }, + { "Pacific/Enderbury" , 0x09EE66 }, + { "Pacific/Fakaofo" , 0x09EF5C }, + { "Pacific/Fiji" , 0x09F030 }, + { "Pacific/Funafuti" , 0x09F455 }, + { "Pacific/Galapagos" , 0x09F507 }, + { "Pacific/Gambier" , 0x09F612 }, + { "Pacific/Guadalcanal" , 0x09F6D1 }, + { "Pacific/Guam" , 0x09F783 }, + { "Pacific/Honolulu" , 0x09F97D }, + { "Pacific/Johnston" , 0x09FAD8 }, + { "Pacific/Kanton" , 0x09FC2D }, + { "Pacific/Kiritimati" , 0x09FD32 }, + { "Pacific/Kosrae" , 0x09FE38 }, + { "Pacific/Kwajalein" , 0x09FFA9 }, + { "Pacific/Majuro" , 0x0A00FA }, + { "Pacific/Marquesas" , 0x0A0259 }, + { "Pacific/Midway" , 0x0A0323 }, + { "Pacific/Nauru" , 0x0A03EC }, + { "Pacific/Niue" , 0x0A04F4 }, + { "Pacific/Norfolk" , 0x0A05CB }, + { "Pacific/Noumea" , 0x0A0947 }, + { "Pacific/Pago_Pago" , 0x0A0A83 }, + { "Pacific/Palau" , 0x0A0B3E }, + { "Pacific/Pitcairn" , 0x0A0BFE }, + { "Pacific/Pohnpei" , 0x0A0CD4 }, + { "Pacific/Ponape" , 0x0A0E1D }, + { "Pacific/Port_Moresby" , 0x0A0F58 }, + { "Pacific/Rarotonga" , 0x0A103B }, + { "Pacific/Saipan" , 0x0A12A2 }, + { "Pacific/Samoa" , 0x0A149C }, + { "Pacific/Tahiti" , 0x0A1557 }, + { "Pacific/Tarawa" , 0x0A1617 }, + { "Pacific/Tongatapu" , 0x0A16D8 }, + { "Pacific/Truk" , 0x0A1858 }, + { "Pacific/Wake" , 0x0A1971 }, + { "Pacific/Wallis" , 0x0A1A2E }, + { "Pacific/Yap" , 0x0A1AE0 }, + { "Poland" , 0x0A1BF9 }, + { "Portugal" , 0x0A2663 }, + { "PRC" , 0x0A3418 }, + { "PST8PDT" , 0x0A3655 }, + { "ROC" , 0x0A3F67 }, + { "ROK" , 0x0A426C }, + { "Singapore" , 0x0A44E1 }, + { "Turkey" , 0x0A466C }, + { "UCT" , 0x0A4E13 }, + { "Universal" , 0x0A4E91 }, + { "US/Alaska" , 0x0A4F0F }, + { "US/Aleutian" , 0x0A585E }, + { "US/Arizona" , 0x0A619E }, + { "US/Central" , 0x0A62F2 }, + { "US/East-Indiana" , 0x0A70F6 }, + { "US/Eastern" , 0x0A7784 }, + { "US/Hawaii" , 0x0A8560 }, + { "US/Indiana-Starke" , 0x0A86B5 }, + { "US/Michigan" , 0x0A903D }, + { "US/Mountain" , 0x0A98FF }, + { "US/Pacific" , 0x0AA297 }, + { "US/Samoa" , 0x0AADB7 }, + { "UTC" , 0x0AAE72 }, + { "W-SU" , 0x0AAEF0 }, + { "WET" , 0x0AB4FB }, + { "Zulu" , 0x0ABC78 }, }; -const unsigned char timelib_timezone_db_data_builtin[703764] = { +const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43202,15 +43205,15 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0x56, 0x29, 0x5C, 0x60, 0x56, 0xF5, 0xC2, 0xF0, 0x58, 0x13, 0xCA, 0x60, 0x58, 0xD5, 0xA4, 0xF0, 0x59, 0xF3, 0xAC, 0x60, 0x5A, 0xB5, 0x86, 0xF0, 0x5B, 0xD3, 0x8E, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB3, 0x62, 0x50, 0x5E, 0x7E, 0x77, 0x60, 0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, -0x61, 0x7C, 0x6E, 0xE0, 0x62, 0x3E, 0x3B, 0x60, 0x63, 0x5C, 0x50, 0xE0, 0x64, 0x1E, 0x1D, 0x60, -0x65, 0x3C, 0x32, 0xE0, 0x66, 0x07, 0x39, 0xE0, 0x67, 0x1C, 0x14, 0xE0, 0x67, 0xE7, 0x1B, 0xE0, -0x68, 0xFB, 0xF6, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, 0x6A, 0xDB, 0xD8, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, -0x6C, 0xC4, 0xF5, 0x60, 0x6D, 0x86, 0xC1, 0xE0, 0x6E, 0xA4, 0xD7, 0x60, 0x6F, 0x66, 0xA3, 0xE0, -0x70, 0x84, 0xB9, 0x60, 0x71, 0x4F, 0xC0, 0x60, 0x72, 0x64, 0x9B, 0x60, 0x73, 0x2F, 0xA2, 0x60, -0x74, 0x44, 0x7D, 0x60, 0x75, 0x0F, 0x84, 0x60, 0x76, 0x2D, 0x99, 0xE0, 0x76, 0xEF, 0x66, 0x60, -0x78, 0x0D, 0x7B, 0xE0, 0x78, 0xCF, 0x48, 0x60, 0x79, 0xED, 0x5D, 0xE0, 0x7A, 0xAF, 0x2A, 0x60, -0x7B, 0xCD, 0x3F, 0xE0, 0x7C, 0x98, 0x46, 0xE0, 0x7D, 0xAD, 0x21, 0xE0, 0x7E, 0x78, 0x28, 0xE0, -0x7F, 0x8D, 0x03, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3E, 0x3B, 0x60, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1E, 0x1D, 0x60, +0x65, 0x3A, 0xE1, 0x60, 0x66, 0x07, 0x39, 0xE0, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE7, 0x1B, 0xE0, +0x69, 0x03, 0xDF, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, +0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x86, 0xC1, 0xE0, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x66, 0xA3, 0xE0, +0x70, 0x83, 0x67, 0xE0, 0x71, 0x4F, 0xC0, 0x60, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x2F, 0xA2, 0x60, +0x74, 0x4C, 0x66, 0x60, 0x75, 0x0F, 0x84, 0x60, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xEF, 0x66, 0x60, +0x78, 0x0C, 0x2A, 0x60, 0x78, 0xCF, 0x48, 0x60, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xAF, 0x2A, 0x60, +0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x98, 0x46, 0xE0, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x78, 0x28, 0xE0, +0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, @@ -43287,23 +43290,23 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, -0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7C, 0x6E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x62, -0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5C, 0x50, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x64, -0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3C, 0x32, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x66, -0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1C, 0x14, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, -0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFB, 0xF6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, -0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDB, 0xD8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, -0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC4, 0xF5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6D, -0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA4, 0xD7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6F, -0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x84, 0xB9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x71, -0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x72, 0x64, 0x9B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x73, -0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x44, 0x7D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, -0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2D, 0x99, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, -0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0D, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x78, -0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x79, 0xED, 0x5D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7A, -0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCD, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, -0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAD, 0x21, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8D, 0x03, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, +0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, +0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, +0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, +0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, +0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, +0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, +0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, +0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, +0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, +0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, +0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, +0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, +0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, +0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, +0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, @@ -43320,9 +43323,9 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, -0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, -0x2E, 0x34, 0x2F, 0x34, 0x39, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, -0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, +0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, +0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, +0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, /* Asia/Harbin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43395,15 +43398,15 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0x54, 0x49, 0x6C, 0x50, 0x55, 0x15, 0xD2, 0xE0, 0x56, 0x29, 0x5C, 0x60, 0x56, 0xF5, 0xC2, 0xF0, 0x58, 0x13, 0xCA, 0x60, 0x58, 0xD5, 0xA4, 0xF0, 0x59, 0xF3, 0xAC, 0x60, 0x5A, 0xB5, 0x86, 0xF0, 0x5B, 0xD3, 0x8E, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB3, 0x62, 0x50, 0x5E, 0x7E, 0x77, 0x60, -0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, 0x61, 0x7C, 0x6E, 0xE0, 0x62, 0x3E, 0x3B, 0x60, -0x63, 0x5C, 0x50, 0xE0, 0x64, 0x1E, 0x1D, 0x60, 0x65, 0x3C, 0x32, 0xE0, 0x66, 0x07, 0x39, 0xE0, -0x67, 0x1C, 0x14, 0xE0, 0x67, 0xE7, 0x1B, 0xE0, 0x68, 0xFB, 0xF6, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, -0x6A, 0xDB, 0xD8, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, 0x6C, 0xC4, 0xF5, 0x60, 0x6D, 0x86, 0xC1, 0xE0, -0x6E, 0xA4, 0xD7, 0x60, 0x6F, 0x66, 0xA3, 0xE0, 0x70, 0x84, 0xB9, 0x60, 0x71, 0x4F, 0xC0, 0x60, -0x72, 0x64, 0x9B, 0x60, 0x73, 0x2F, 0xA2, 0x60, 0x74, 0x44, 0x7D, 0x60, 0x75, 0x0F, 0x84, 0x60, -0x76, 0x2D, 0x99, 0xE0, 0x76, 0xEF, 0x66, 0x60, 0x78, 0x0D, 0x7B, 0xE0, 0x78, 0xCF, 0x48, 0x60, -0x79, 0xED, 0x5D, 0xE0, 0x7A, 0xAF, 0x2A, 0x60, 0x7B, 0xCD, 0x3F, 0xE0, 0x7C, 0x98, 0x46, 0xE0, -0x7D, 0xAD, 0x21, 0xE0, 0x7E, 0x78, 0x28, 0xE0, 0x7F, 0x8D, 0x03, 0xE0, 0x03, 0x01, 0x02, 0x01, +0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, 0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3E, 0x3B, 0x60, +0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1E, 0x1D, 0x60, 0x65, 0x3A, 0xE1, 0x60, 0x66, 0x07, 0x39, 0xE0, +0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE7, 0x1B, 0xE0, 0x69, 0x03, 0xDF, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, +0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, 0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x86, 0xC1, 0xE0, +0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x66, 0xA3, 0xE0, 0x70, 0x83, 0x67, 0xE0, 0x71, 0x4F, 0xC0, 0x60, +0x72, 0x63, 0x49, 0xE0, 0x73, 0x2F, 0xA2, 0x60, 0x74, 0x4C, 0x66, 0x60, 0x75, 0x0F, 0x84, 0x60, +0x76, 0x2C, 0x48, 0x60, 0x76, 0xEF, 0x66, 0x60, 0x78, 0x0C, 0x2A, 0x60, 0x78, 0xCF, 0x48, 0x60, +0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xAF, 0x2A, 0x60, 0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x98, 0x46, 0xE0, +0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x78, 0x28, 0xE0, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, @@ -43482,23 +43485,23 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, -0x00, 0x61, 0x7C, 0x6E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, -0x00, 0x63, 0x5C, 0x50, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, -0x00, 0x65, 0x3C, 0x32, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x67, 0x1C, 0x14, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x68, 0xFB, 0xF6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6A, 0xDB, 0xD8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6C, 0xC4, 0xF5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6E, 0xA4, 0xD7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x70, 0x84, 0xB9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x71, 0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, -0x00, 0x72, 0x64, 0x9B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, -0x00, 0x74, 0x44, 0x7D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, -0x00, 0x76, 0x2D, 0x99, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, -0x00, 0x78, 0x0D, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, -0x00, 0x79, 0xED, 0x5D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, -0x00, 0x7B, 0xCD, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7D, 0xAD, 0x21, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7F, 0x8D, 0x03, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, +0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, +0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, +0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, +0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, +0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, +0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, +0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, +0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, @@ -43515,9 +43518,9 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, -0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, -0x39, 0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, -0x73, 0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, +0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, +0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, +0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66123,7 +66126,7 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { /* Pacific/Fiji */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x9A, 0x13, 0xB1, 0xC0, +0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x9A, 0x13, 0xB1, 0xC0, 0x36, 0x3B, 0x17, 0xE0, 0x36, 0xD7, 0xFA, 0x60, 0x38, 0x24, 0x34, 0x60, 0x38, 0xB7, 0xDC, 0x60, 0x4B, 0x11, 0x2C, 0xE0, 0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xC2, 0xEA, 0x60, 0x4D, 0x72, 0x41, 0xE0, 0x4E, 0xA2, 0xCC, 0x60, 0x4F, 0x1A, 0xC4, 0xE0, 0x50, 0x82, 0xAE, 0x60, 0x50, 0xFA, 0xA6, 0xE0, @@ -66131,65 +66134,63 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { 0x56, 0x34, 0xC9, 0x60, 0x56, 0x9A, 0x4C, 0xE0, 0x58, 0x1D, 0xE5, 0xE0, 0x58, 0x7A, 0x2E, 0xE0, 0x59, 0xFD, 0xC7, 0xE0, 0x5A, 0x5A, 0x10, 0xE0, 0x5B, 0xDD, 0xA9, 0xE0, 0x5C, 0x39, 0xF2, 0xE0, 0x5D, 0xC6, 0xC6, 0x60, 0x5E, 0x19, 0xD4, 0xE0, 0x5F, 0xDE, 0x07, 0x60, 0x60, 0x02, 0xF1, 0x60, -0x61, 0x8F, 0xC4, 0xE0, 0x61, 0xE2, 0xD3, 0x60, 0x63, 0x6F, 0xA6, 0xE0, 0x63, 0xC2, 0xB5, 0x60, -0x65, 0x4F, 0x88, 0xE0, 0x65, 0xA2, 0x97, 0x60, 0x67, 0x2F, 0x6A, 0xE0, 0x67, 0x82, 0x79, 0x60, -0x69, 0x0F, 0x4C, 0xE0, 0x69, 0x6B, 0x95, 0xE0, 0x6A, 0xEF, 0x2E, 0xE0, 0x6B, 0x4B, 0x77, 0xE0, -0x6C, 0xD8, 0x4B, 0x60, 0x6D, 0x2B, 0x59, 0xE0, 0x6E, 0xB8, 0x2D, 0x60, 0x6F, 0x0B, 0x3B, 0xE0, -0x70, 0x98, 0x0F, 0x60, 0x70, 0xEB, 0x1D, 0xE0, 0x72, 0x77, 0xF1, 0x60, 0x72, 0xCA, 0xFF, 0xE0, -0x74, 0x57, 0xD3, 0x60, 0x74, 0xB4, 0x1C, 0x60, 0x76, 0x40, 0xEF, 0xE0, 0x76, 0x93, 0xFE, 0x60, -0x78, 0x20, 0xD1, 0xE0, 0x78, 0x73, 0xE0, 0x60, 0x7A, 0x00, 0xB3, 0xE0, 0x7A, 0x53, 0xC2, 0x60, -0x7B, 0xE0, 0x95, 0xE0, 0x7C, 0x33, 0xA4, 0x60, 0x7D, 0xC0, 0x77, 0xE0, 0x7E, 0x1C, 0xC0, 0xE0, -0x7F, 0xA0, 0x59, 0xE0, 0x7F, 0xFC, 0xA2, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0xA7, 0xC0, -0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, -0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x13, 0xB1, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x36, 0x3B, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xD7, 0xFA, 0x60, 0x00, 0x00, -0x00, 0x00, 0x38, 0x24, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB7, 0xDC, 0x60, 0x00, 0x00, -0x00, 0x00, 0x4B, 0x11, 0x2C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x0F, 0x60, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xC2, 0xEA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x72, 0x41, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xA2, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x1A, 0xC4, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x50, 0x82, 0xAE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFA, 0xA6, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6B, 0xCA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x52, 0xDA, 0x7A, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x54, 0x54, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0xBA, 0x6A, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x56, 0x34, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x9A, 0x4C, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x58, 0x1D, 0xE5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7A, 0x2E, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x59, 0xFD, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x5A, 0x10, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xDD, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x39, 0xF2, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xC6, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x19, 0xD4, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x5F, 0xDE, 0x07, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0xF1, 0x60, 0x00, 0x00, -0x00, 0x00, 0x61, 0x8F, 0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0xE2, 0xD3, 0x60, 0x00, 0x00, -0x00, 0x00, 0x63, 0x6F, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0xC2, 0xB5, 0x60, 0x00, 0x00, -0x00, 0x00, 0x65, 0x4F, 0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0xA2, 0x97, 0x60, 0x00, 0x00, -0x00, 0x00, 0x67, 0x2F, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x82, 0x79, 0x60, 0x00, 0x00, -0x00, 0x00, 0x69, 0x0F, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6B, 0x95, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xEF, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x4B, 0x77, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xD8, 0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x2B, 0x59, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xB8, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x0B, 0x3B, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x70, 0x98, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0xEB, 0x1D, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x72, 0x77, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x72, 0xCA, 0xFF, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x74, 0x57, 0xD3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0xB4, 0x1C, 0x60, 0x00, 0x00, -0x00, 0x00, 0x76, 0x40, 0xEF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x93, 0xFE, 0x60, 0x00, 0x00, -0x00, 0x00, 0x78, 0x20, 0xD1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x73, 0xE0, 0x60, 0x00, 0x00, -0x00, 0x00, 0x7A, 0x00, 0xB3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x53, 0xC2, 0x60, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xE0, 0x95, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x33, 0xA4, 0x60, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xC0, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x1C, 0xC0, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xA0, 0x59, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0xA2, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x63, 0x6F, 0xA6, 0xE0, 0x63, 0xC2, 0xB5, 0x60, 0x65, 0x4F, 0x88, 0xE0, 0x65, 0xA2, 0x97, 0x60, +0x67, 0x2F, 0x6A, 0xE0, 0x67, 0x82, 0x79, 0x60, 0x69, 0x0F, 0x4C, 0xE0, 0x69, 0x6B, 0x95, 0xE0, +0x6A, 0xEF, 0x2E, 0xE0, 0x6B, 0x4B, 0x77, 0xE0, 0x6C, 0xD8, 0x4B, 0x60, 0x6D, 0x2B, 0x59, 0xE0, +0x6E, 0xB8, 0x2D, 0x60, 0x6F, 0x0B, 0x3B, 0xE0, 0x70, 0x98, 0x0F, 0x60, 0x70, 0xEB, 0x1D, 0xE0, +0x72, 0x77, 0xF1, 0x60, 0x72, 0xCA, 0xFF, 0xE0, 0x74, 0x57, 0xD3, 0x60, 0x74, 0xB4, 0x1C, 0x60, +0x76, 0x40, 0xEF, 0xE0, 0x76, 0x93, 0xFE, 0x60, 0x78, 0x20, 0xD1, 0xE0, 0x78, 0x73, 0xE0, 0x60, +0x7A, 0x00, 0xB3, 0xE0, 0x7A, 0x53, 0xC2, 0x60, 0x7B, 0xE0, 0x95, 0xE0, 0x7C, 0x33, 0xA4, 0x60, +0x7D, 0xC0, 0x77, 0xE0, 0x7E, 0x1C, 0xC0, 0xE0, 0x7F, 0xA0, 0x59, 0xE0, 0x7F, 0xFC, 0xA2, 0xE0, +0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, -0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, -0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x3C, 0x2B, 0x31, -0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x2E, 0x32, 0x2E, -0x33, 0x2F, 0x39, 0x39, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82, 0x00, 0x00, 0x00, -0x00, +0x02, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, +0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, +0x9A, 0x13, 0xB1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x3B, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x36, 0xD7, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x24, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, +0x38, 0xB7, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x11, 0x2C, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x4B, 0xAE, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xC2, 0xEA, 0x60, 0x00, 0x00, 0x00, 0x00, +0x4D, 0x72, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA2, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x00, +0x4F, 0x1A, 0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x82, 0xAE, 0x60, 0x00, 0x00, 0x00, 0x00, +0x50, 0xFA, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6B, 0xCA, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x52, 0xDA, 0x7A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x54, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, +0x54, 0xBA, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x34, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, +0x56, 0x9A, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1D, 0xE5, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x58, 0x7A, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFD, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x5A, 0x5A, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDD, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x5C, 0x39, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xC6, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, +0x5E, 0x19, 0xD4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xDE, 0x07, 0x60, 0x00, 0x00, 0x00, 0x00, +0x60, 0x02, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6F, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x63, 0xC2, 0xB5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x4F, 0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x65, 0xA2, 0x97, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x2F, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x67, 0x82, 0x79, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0x0F, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x69, 0x6B, 0x95, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xEF, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x6B, 0x4B, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xD8, 0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, +0x6D, 0x2B, 0x59, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xB8, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, +0x6F, 0x0B, 0x3B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x98, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, +0x70, 0xEB, 0x1D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x77, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, +0x72, 0xCA, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x57, 0xD3, 0x60, 0x00, 0x00, 0x00, 0x00, +0x74, 0xB4, 0x1C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0x40, 0xEF, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x76, 0x93, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x20, 0xD1, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x78, 0x73, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0xB3, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x7A, 0x53, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x95, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x7C, 0x33, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xC0, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x7E, 0x1C, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xA0, 0x59, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x7F, 0xFC, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, +0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, +0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, +0x32, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, +0x31, 0x2E, 0x32, 0x2E, 0x33, 0x2F, 0x39, 0x39, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, +0x82, 0x00, 0x00, 0x00, 0x00, /* Pacific/Funafuti */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -69554,4 +69555,4 @@ const unsigned char timelib_timezone_db_data_builtin[703764] = { }; #endif -const timelib_tzdb timezonedb_builtin = { "2021.3", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2021.5", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From 0497b2bf4b5ff5566ededb4d368476da09314129 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 26 Sep 2021 06:58:48 +0100 Subject: [PATCH 0210/1346] Refactor php_com_cache_typelib() --- ext/com_dotnet/com_com.c | 2 +- ext/com_dotnet/com_typeinfo.c | 4 ++-- ext/com_dotnet/php_com_dotnet_internal.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index c068f642f44a3..23af460725d1a 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -253,7 +253,7 @@ PHP_METHOD(com, __construct) if (SUCCEEDED(ITypeLib_GetDocumentation(TL, -1, &name, NULL, NULL, NULL))) { zend_string *typelib_str = php_com_olestring_to_string(name, obj->code_page); - if (NULL != php_com_cache_typelib(TL, ZSTR_VAL(typelib_str), ZSTR_LEN(typelib_str))) { + if (NULL != php_com_cache_typelib(TL, typelib_str)) { php_com_import_typelib(TL, mode, obj->code_page); /* add a reference for the hash */ diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index ccdcc3ff7e8c8..9f681348bc0fa 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -250,13 +250,13 @@ void php_com_typelibrary_dtor(zval *pDest) ITypeLib_Release(Lib); } -ITypeLib *php_com_cache_typelib(ITypeLib* TL, char *cache_key, zend_long cache_key_len) { +ITypeLib *php_com_cache_typelib(ITypeLib* TL, zend_string *cache_key) { ITypeLib* result; #ifdef ZTS tsrm_mutex_lock(php_com_typelibraries_mutex); #endif - result = zend_hash_str_add_ptr(&php_com_typelibraries, cache_key, cache_key_len, TL); + result = zend_hash_add_ptr(&php_com_typelibraries, cache_key, TL); #ifdef ZTS tsrm_mutex_unlock(php_com_typelibraries_mutex); diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index f3405b5cb6a6b..4aa3bcf98734d 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -138,7 +138,7 @@ void php_com_typelibrary_dtor(zval *pDest); ITypeInfo *php_com_locate_typeinfo(zend_string *type_lib_name, php_com_dotnet_object *obj, zend_string *dispatch_name, bool sink); bool php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, bool printdef, GUID *guid, int codepage); -ITypeLib *php_com_cache_typelib(ITypeLib* TL, char *cache_key, zend_long cache_key_len); +ITypeLib *php_com_cache_typelib(ITypeLib* TL, zend_string *cache_key); PHP_MINIT_FUNCTION(com_typeinfo); PHP_MSHUTDOWN_FUNCTION(com_typeinfo); From 2b32cafd880786b038767d5d7a56ed117a47ed51 Mon Sep 17 00:00:00 2001 From: DmitryMaksimov Date: Mon, 25 Oct 2021 08:40:44 +0200 Subject: [PATCH 0211/1346] Use neutral language instead of default on Windows Most notably, this affects some Windows specific error messages, which are no longer in the default language of the system, to better match error messages provided by PHP which are not localized anyway. This also affects the com_dotnet extension, where it could fix some DCOM related issues. Furthermore, the constant `LOCALE_NEUTRAL` is added, which can be used for `variant_cmp()`. Closes GH-7613. --- UPGRADING | 7 +++++++ ext/com_dotnet/com_extension.c | 1 + ext/com_dotnet/com_handlers.c | 4 ++-- ext/com_dotnet/com_iterator.c | 2 +- win32/winutil.c | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/UPGRADING b/UPGRADING index a7ad6c4761a39..fe3340fd24b05 100644 --- a/UPGRADING +++ b/UPGRADING @@ -108,6 +108,9 @@ PHP 8.2 UPGRADE NOTES 10. New Global Constants ======================================== +- COM_DOTNET: + . LOCALE_NEUTRAL + ======================================== 11. Changes to INI File Handling ======================================== @@ -116,6 +119,10 @@ PHP 8.2 UPGRADE NOTES 12. Windows Support ======================================== +- Core: + . Windows specific error messages are no longer localized, but instead in + English to better match PHP error messages. + ======================================== 13. Other Changes ======================================== diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index 55b3c282aee37..88feefa617b4b 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -245,6 +245,7 @@ PHP_MINIT_FUNCTION(com_dotnet) COM_CONST(VARCMP_GT); COM_CONST(VARCMP_NULL); COM_CONST(LOCALE_SYSTEM_DEFAULT); + COM_CONST(LOCALE_NEUTRAL); COM_CONST(NORM_IGNORECASE); COM_CONST(NORM_IGNORENONSPACE); diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 7f8f0e8614a79..fe1b6f257b283 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -326,7 +326,7 @@ static zend_function *com_method_get(zend_object **object_ptr, zend_string *name if (SUCCEEDED(ITypeInfo_GetTypeComp(obj->typeinfo, &comp))) { olename = php_com_string_to_olestring(name->val, name->len, obj->code_page); - lhash = LHashValOfNameSys(SYS_WIN32, LOCALE_SYSTEM_DEFAULT, olename); + lhash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, olename); if (SUCCEEDED(ITypeComp_Bind(comp, olename, lhash, INVOKE_FUNC, &TI, &kind, &bindptr))) { switch (kind) { @@ -410,7 +410,7 @@ static int com_objects_compare(zval *object1, zval *object2) obja = CDNO_FETCH(object1); objb = CDNO_FETCH(object2); - switch (VarCmp(&obja->v, &objb->v, LOCALE_SYSTEM_DEFAULT, 0)) { + switch (VarCmp(&obja->v, &objb->v, LOCALE_NEUTRAL, 0)) { case VARCMP_LT: ret = -1; break; diff --git a/ext/com_dotnet/com_iterator.c b/ext/com_dotnet/com_iterator.c index 15e9b5df840c5..0bf4789b0ce41 100644 --- a/ext/com_dotnet/com_iterator.c +++ b/ext/com_dotnet/com_iterator.c @@ -200,7 +200,7 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int b } else { /* can we enumerate it? */ if (FAILED(IDispatch_Invoke(V_DISPATCH(&obj->v), DISPID_NEWENUM, - &IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD|DISPATCH_PROPERTYGET, + &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD|DISPATCH_PROPERTYGET, &dp, &v, NULL, NULL))) { goto fail; } diff --git a/win32/winutil.c b/win32/winutil.c index 5e959307d7365..3d41873310f6a 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -29,7 +29,7 @@ PHP_WINUTIL_API char *php_win32_error_to_msg(HRESULT error) DWORD ret = FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&bufw, 0, NULL + NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (LPWSTR)&bufw, 0, NULL ); if (!ret || !bufw) { From f6616846e101821f3388d6905dee6feeb2835d4b Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 3 Nov 2021 20:44:12 +0000 Subject: [PATCH 0212/1346] Revert "Refactor php_com_cache_typelib()" As php_com_typelibraries is a persistent HashTable we need to insert a persistent string, therefore initialising a new one. This reverts commit 0497b2bf4b5ff5566ededb4d368476da09314129. --- ext/com_dotnet/com_com.c | 2 +- ext/com_dotnet/com_typeinfo.c | 4 ++-- ext/com_dotnet/php_com_dotnet_internal.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/com_dotnet/com_com.c b/ext/com_dotnet/com_com.c index 23af460725d1a..c068f642f44a3 100644 --- a/ext/com_dotnet/com_com.c +++ b/ext/com_dotnet/com_com.c @@ -253,7 +253,7 @@ PHP_METHOD(com, __construct) if (SUCCEEDED(ITypeLib_GetDocumentation(TL, -1, &name, NULL, NULL, NULL))) { zend_string *typelib_str = php_com_olestring_to_string(name, obj->code_page); - if (NULL != php_com_cache_typelib(TL, typelib_str)) { + if (NULL != php_com_cache_typelib(TL, ZSTR_VAL(typelib_str), ZSTR_LEN(typelib_str))) { php_com_import_typelib(TL, mode, obj->code_page); /* add a reference for the hash */ diff --git a/ext/com_dotnet/com_typeinfo.c b/ext/com_dotnet/com_typeinfo.c index 9f681348bc0fa..ccdcc3ff7e8c8 100644 --- a/ext/com_dotnet/com_typeinfo.c +++ b/ext/com_dotnet/com_typeinfo.c @@ -250,13 +250,13 @@ void php_com_typelibrary_dtor(zval *pDest) ITypeLib_Release(Lib); } -ITypeLib *php_com_cache_typelib(ITypeLib* TL, zend_string *cache_key) { +ITypeLib *php_com_cache_typelib(ITypeLib* TL, char *cache_key, zend_long cache_key_len) { ITypeLib* result; #ifdef ZTS tsrm_mutex_lock(php_com_typelibraries_mutex); #endif - result = zend_hash_add_ptr(&php_com_typelibraries, cache_key, TL); + result = zend_hash_str_add_ptr(&php_com_typelibraries, cache_key, cache_key_len, TL); #ifdef ZTS tsrm_mutex_unlock(php_com_typelibraries_mutex); diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 4aa3bcf98734d..f3405b5cb6a6b 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -138,7 +138,7 @@ void php_com_typelibrary_dtor(zval *pDest); ITypeInfo *php_com_locate_typeinfo(zend_string *type_lib_name, php_com_dotnet_object *obj, zend_string *dispatch_name, bool sink); bool php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, bool printdef, GUID *guid, int codepage); -ITypeLib *php_com_cache_typelib(ITypeLib* TL, zend_string *cache_key); +ITypeLib *php_com_cache_typelib(ITypeLib* TL, char *cache_key, zend_long cache_key_len); PHP_MINIT_FUNCTION(com_typeinfo); PHP_MSHUTDOWN_FUNCTION(com_typeinfo); From 3f9331a83a216336b4114ea1fcd8885d53ca5678 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 3 Nov 2021 20:49:37 +0000 Subject: [PATCH 0213/1346] Enable more DBA drivers in CI (#7622) This now tests for the following drivers: - flatfile - inifile - in-built cdb - lmdb - TokyoCabinet - qdbm --- azure/apt.yml | 4 ++++ azure/configure.yml | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/azure/apt.yml b/azure/apt.yml index 9166509dccae7..c3b33050d6482 100644 --- a/azure/apt.yml +++ b/azure/apt.yml @@ -50,6 +50,10 @@ steps: dovecot-imapd \ sendmail \ firebird-dev \ + liblmdb-dev \ + libtokyocabinet-dev \ + libdb-dev \ + libqdbm-dev \ ${{ parameters.packages }} displayName: 'APT' - script: | diff --git a/azure/configure.yml b/azure/configure.yml index 9869de514e82c..a7a65845e1a56 100644 --- a/azure/configure.yml +++ b/azure/configure.yml @@ -56,6 +56,12 @@ steps: --with-mhash \ --with-sodium \ --enable-dba \ + --with-cdb \ + --enable-flatfile \ + --enable-inifile \ + --with-tcadb \ + --with-lmdb \ + --with-qdbm \ --with-snmp \ --with-unixODBC \ --with-imap \ From 1de405907df74424819aa24af1412553df8d403f Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Wed, 3 Nov 2021 22:26:43 +0000 Subject: [PATCH 0214/1346] fpm allow process tracing/core dump on solaris systems. (#7548) --- sapi/fpm/config.m4 | 13 +++++++++++++ sapi/fpm/fpm/fpm_unix.c | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index af6cae8ca957a..e2e4d3660be42 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -37,6 +37,18 @@ AC_DEFUN([AC_FPM_PROCCTL], ]) ]) +AC_DEFUN([AC_FPM_SETPFLAGS], +[ + AC_MSG_CHECKING([for setpflags]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[setpflags(0, 0);]])], [ + AC_DEFINE([HAVE_SETPFLAGS], 1, [do we have setpflags?]) + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) +]) + AC_DEFUN([AC_FPM_CLOCK], [ have_clock_gettime=no @@ -507,6 +519,7 @@ if test "$PHP_FPM" != "no"; then AC_FPM_STDLIBS AC_FPM_PRCTL AC_FPM_PROCCTL + AC_FPM_SETPFLAGS AC_FPM_CLOCK AC_FPM_TRACE AC_FPM_BUILTIN_ATOMIC diff --git a/sapi/fpm/fpm/fpm_unix.c b/sapi/fpm/fpm/fpm_unix.c index acf38ce660d67..dd8f8befd9870 100644 --- a/sapi/fpm/fpm/fpm_unix.c +++ b/sapi/fpm/fpm/fpm_unix.c @@ -19,6 +19,10 @@ #include #endif +#ifdef HAVE_SETPFLAGS +#include +#endif + #ifdef HAVE_APPARMOR #include #endif @@ -420,6 +424,12 @@ int fpm_unix_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ } #endif +#ifdef HAVE_SETPFLAGS + if (wp->config->process_dumpable && 0 > setpflags(__PROC_PROTECT, 0)) { + zlog(ZLOG_SYSERROR, "[pool %s] failed to setpflags(__PROC_PROTECT)", wp->config->name); + } +#endif + if (0 > fpm_clock_init()) { return -1; } From d5b97362bb80ff7b3f3ca8b5a049b63c740202c6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 4 Nov 2021 10:46:43 +0100 Subject: [PATCH 0215/1346] Always initialize iterator_funcs_ptr The behavior here depending on the order in which the class entry was initialized: If get_iterator was set first and Iterator or IteratorAggregate implemented later, we would not initialize iterator_funcs_ptr. If Iterator/IteratorAggregate were implemented first, we would initialize it. After the migration to stub-based class declarations, we always follow the latter order, but 3rd-party extension may not. To ensure that behavior is order-independent, always initialize iterator_funcs_ptr, as we have code (at least the MultipleIterator implementation) that depends on it being initialized for iterators with custom get_iterator as well. --- Zend/zend_interfaces.c | 63 ++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 595bc3924ffe4..a8cd9b534ed4c 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -276,8 +276,17 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr ZSTR_VAL(class_type->name)); } - zend_function *zf = zend_hash_str_find_ptr( + /* Always initialize iterator_funcs_ptr. */ + ZEND_ASSERT(!class_type->iterator_funcs_ptr && "Iterator funcs already set?"); + zend_class_iterator_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS + ? pemalloc(sizeof(zend_class_iterator_funcs), 1) + : zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs)); + class_type->iterator_funcs_ptr = funcs_ptr; + + memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); + funcs_ptr->zf_new_iterator = zend_hash_str_find_ptr( &class_type->function_table, "getiterator", sizeof("getiterator") - 1); + if (class_type->get_iterator && class_type->get_iterator != zend_user_it_get_new_iterator) { /* get_iterator was explicitly assigned for an internal class. */ if (!class_type->parent || class_type->parent->get_iterator != class_type->get_iterator) { @@ -286,23 +295,14 @@ static int zend_implement_aggregate(zend_class_entry *interface, zend_class_entr } /* The getIterator() method has not been overwritten, use inherited get_iterator(). */ - if (zf->common.scope != class_type) { + if (funcs_ptr->zf_new_iterator->common.scope != class_type) { return SUCCESS; } /* getIterator() has been overwritten, switch to zend_user_it_get_new_iterator. */ } - ZEND_ASSERT(!class_type->iterator_funcs_ptr && "Iterator funcs already set?"); - zend_class_iterator_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS - ? pemalloc(sizeof(zend_class_iterator_funcs), 1) - : zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs)); class_type->get_iterator = zend_user_it_get_new_iterator; - class_type->iterator_funcs_ptr = funcs_ptr; - - memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); - funcs_ptr->zf_new_iterator = zf; - return SUCCESS; } /* }}} */ @@ -316,16 +316,24 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry ZSTR_VAL(class_type->name)); } - zend_function *zf_rewind = zend_hash_str_find_ptr( + ZEND_ASSERT(!class_type->iterator_funcs_ptr && "Iterator funcs already set?"); + zend_class_iterator_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS + ? pemalloc(sizeof(zend_class_iterator_funcs), 1) + : zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs)); + class_type->iterator_funcs_ptr = funcs_ptr; + + memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); + funcs_ptr->zf_rewind = zend_hash_str_find_ptr( &class_type->function_table, "rewind", sizeof("rewind") - 1); - zend_function *zf_valid = zend_hash_str_find_ptr( + funcs_ptr->zf_valid = zend_hash_str_find_ptr( &class_type->function_table, "valid", sizeof("valid") - 1); - zend_function *zf_key = zend_hash_str_find_ptr( + funcs_ptr->zf_key = zend_hash_str_find_ptr( &class_type->function_table, "key", sizeof("key") - 1); - zend_function *zf_current = zend_hash_str_find_ptr( + funcs_ptr->zf_current = zend_hash_str_find_ptr( &class_type->function_table, "current", sizeof("current") - 1); - zend_function *zf_next = zend_hash_str_find_ptr( + funcs_ptr->zf_next = zend_hash_str_find_ptr( &class_type->function_table, "next", sizeof("next") - 1); + if (class_type->get_iterator && class_type->get_iterator != zend_user_it_get_iterator) { if (!class_type->parent || class_type->parent->get_iterator != class_type->get_iterator) { /* get_iterator was explicitly assigned for an internal class. */ @@ -334,30 +342,19 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry } /* None of the Iterator methods have been overwritten, use inherited get_iterator(). */ - if (zf_rewind->common.scope != class_type && zf_valid->common.scope != class_type && - zf_key->common.scope != class_type && zf_current->common.scope != class_type && - zf_next->common.scope != class_type) { + if (funcs_ptr->zf_rewind->common.scope != class_type && + funcs_ptr->zf_valid->common.scope != class_type && + funcs_ptr->zf_key->common.scope != class_type && + funcs_ptr->zf_current->common.scope != class_type && + funcs_ptr->zf_next->common.scope != class_type) { return SUCCESS; } /* One of the Iterator methods has been overwritten, - * switch to zend_user_it_get_new_iterator. */ + * switch to zend_user_it_get_iterator. */ } - ZEND_ASSERT(!class_type->iterator_funcs_ptr && "Iterator funcs already set?"); - zend_class_iterator_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS - ? pemalloc(sizeof(zend_class_iterator_funcs), 1) - : zend_arena_alloc(&CG(arena), sizeof(zend_class_iterator_funcs)); class_type->get_iterator = zend_user_it_get_iterator; - class_type->iterator_funcs_ptr = funcs_ptr; - - memset(funcs_ptr, 0, sizeof(zend_class_iterator_funcs)); - funcs_ptr->zf_rewind = zf_rewind; - funcs_ptr->zf_valid = zf_valid; - funcs_ptr->zf_key = zf_key; - funcs_ptr->zf_current = zf_current; - funcs_ptr->zf_next = zf_next; - return SUCCESS; } /* }}} */ From 9b433c2398b72ab4d7b4594fef306260dc15f0a2 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sat, 6 Nov 2021 20:46:04 +0000 Subject: [PATCH 0216/1346] Fix SKIP in mysqli tests --- ext/mysqli/tests/bug66124.phpt | 3 +-- ext/mysqli/tests/mysqli_poll.phpt | 3 +-- ext/mysqli/tests/mysqli_poll_kill.phpt | 3 +-- ext/mysqli/tests/mysqli_poll_mixing_insert_select.phpt | 3 +-- ext/mysqli/tests/mysqli_poll_reference.phpt | 3 +-- ext/mysqli/tests/mysqli_reap_async_query.phpt | 3 +-- ext/mysqli/tests/skipifconnectfailure.inc | 4 ++-- 7 files changed, 8 insertions(+), 14 deletions(-) diff --git a/ext/mysqli/tests/bug66124.phpt b/ext/mysqli/tests/bug66124.phpt index 39f5777977f47..c0059e1714387 100644 --- a/ext/mysqli/tests/bug66124.phpt +++ b/ext/mysqli/tests/bug66124.phpt @@ -4,8 +4,7 @@ Bug #66124 (mysqli under mysqlnd loses precision when bind_param with 'i') mysqli --SKIPIF-- --FILE-- Date: Wed, 3 Nov 2021 15:15:27 +0000 Subject: [PATCH 0217/1346] Remove XFAIL This was fixed in PHP 7 according to https://bugs.php.net/bug.php?id=61390 (which the linked commit points to) --- ext/dba/tests/dba_db4_018.phpt | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/dba/tests/dba_db4_018.phpt b/ext/dba/tests/dba_db4_018.phpt index 447c6b24cddf9..8c792e466cf83 100644 --- a/ext/dba/tests/dba_db4_018.phpt +++ b/ext/dba/tests/dba_db4_018.phpt @@ -54,8 +54,6 @@ echo dba_fetch("https://redirect.github.com/key2", $db_file1), "\n"; ---XFAIL-- -Test 6 crashes with dba pointer of NULL, bug http://bugs.php.net/bug.php?id=51278 --EXPECTF-- database handler: db4 Test 1 From 7db32add9be75421347af30b0ae9b908ea8944cf Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 6 Nov 2021 23:09:40 +0000 Subject: [PATCH 0218/1346] Refactor dba_(p)open() to be more sensible (#7610) Actually use ZPP Throw ValueErrors for invalid values Use dedicated struc members for file permission and map size instead of a zval stack --- UPGRADING | 2 + ext/dba/dba.c | 264 ++++++++++++++++++--------------- ext/dba/dba.stub.php | 20 +-- ext/dba/dba_arginfo.h | 11 +- ext/dba/dba_db1.c | 6 +- ext/dba/dba_db2.c | 6 +- ext/dba/dba_db3.c | 6 +- ext/dba/dba_db4.c | 6 +- ext/dba/dba_dbm.c | 6 +- ext/dba/dba_gdbm.c | 6 +- ext/dba/dba_lmdb.c | 24 +-- ext/dba/dba_ndbm.c | 6 +- ext/dba/php_dba.h | 5 +- ext/dba/tests/bug72157.phpt | 24 --- ext/dba/tests/dba011.phpt | 122 +++++++++++++-- ext/dba/tests/dba012.phpt | 2 +- ext/dba/tests/dba016.phpt | 27 ---- ext/dba/tests/dba_cdb_001.phpt | 4 +- ext/dba/tests/dba_db4_003.phpt | 2 +- ext/dba/tests/dba_db4_007.phpt | 2 +- ext/dba/tests/dba_db4_012.phpt | 2 +- ext/dba/tests/dba_db4_014.phpt | 2 +- 22 files changed, 293 insertions(+), 262 deletions(-) delete mode 100644 ext/dba/tests/bug72157.phpt delete mode 100644 ext/dba/tests/dba016.phpt diff --git a/UPGRADING b/UPGRADING index fe3340fd24b05..c19d4f74324a7 100644 --- a/UPGRADING +++ b/UPGRADING @@ -77,6 +77,8 @@ PHP 8.2 UPGRADE NOTES ======================================== - DBA + . dba_open() and dba_popen() now have the following enforced function signature + dba_open(string $path, string $mode, ?string $handler = null, int $permission = 0o644, int $map_size = 0) . dba_fetch()'s optional skip argument is now at the end in line with PHP userland semantics its signature now is: dba_fetch(string|array $key, $dba, int $skip = 0): string|false diff --git a/ext/dba/dba.c b/ext/dba/dba.c index a7a83bae2d4b2..0e43bc03f9626 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -433,8 +433,6 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode) } /* }}} */ -#define FREENOW if(args) {int i; for (i=0; itype != le_pdb) { + // TODO This should never happen RETURN_FALSE; } @@ -529,28 +535,29 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) GC_ADDREF(le); RETURN_RES(zend_register_resource(info, le_pdb)); - return; } } - if (ac==2) { + if (!handler_str) { hptr = DBA_G(default_hptr); if (!hptr) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "No default handler selected"); - FREENOW; + php_error_docref(NULL, E_WARNING, "No default handler selected"); + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } + ZEND_ASSERT(hptr->name); } else { - for (hptr = handler; hptr->name && strcasecmp(hptr->name, Z_STRVAL(args[2])); hptr++); - } + /* Loop through global static var handlers to see if such a handler exists */ + for (hptr = handler; hptr->name && strcasecmp(hptr->name, ZSTR_VAL(handler_str)); hptr++); - if (!hptr->name) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "No such handler: %s", Z_STRVAL(args[2])); - FREENOW; - RETURN_FALSE; + if (!hptr->name) { + php_error_docref(NULL, E_WARNING, "Handler \"%s\" is not available", ZSTR_VAL(handler_str)); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_FALSE; + } } - /* Check mode: [rwnc][fl]?t? + /* Check mode: [rwnc][dl-]?t? * r: Read * w: Write * n: Create/Truncate @@ -562,38 +569,68 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) * * t: test open database, warning if locked */ - strlcpy(mode, Z_STRVAL(args[1]), sizeof(mode)); - pmode = &mode[0]; - if (pmode[0] && (pmode[1]=='d' || pmode[1]=='l' || pmode[1]=='-')) { /* force lock on db file or lck file or disable locking */ - switch (pmode[1]) { - case 'd': - lock_dbf = 1; - if ((hptr->flags & DBA_LOCK_ALL) == 0) { - lock_flag = (hptr->flags & DBA_LOCK_ALL); + bool is_test_lock = false; + bool is_db_lock = false; + bool is_lock_ignored = false; + // bool is_file_lock = false; + + if (ZSTR_LEN(mode) == 0) { + zend_argument_value_error(2, "cannot be empty"); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_THROWS(); + } + if (ZSTR_LEN(mode) > 3) { + zend_argument_value_error(2, "must be at most 3 characters"); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_THROWS(); + } + if (ZSTR_LEN(mode) == 3) { + if (ZSTR_VAL(mode)[2] != 't') { + zend_argument_value_error(2, "third character must be \"t\""); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_THROWS(); + } + is_test_lock = true; + } + if (ZSTR_LEN(mode) >= 2) { + switch (ZSTR_VAL(mode)[1]) { + case 't': + is_test_lock = true; break; - } - ZEND_FALLTHROUGH; - case 'l': - lock_flag = DBA_LOCK_ALL; - if ((hptr->flags & DBA_LOCK_ALL) == 0) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_NOTICE, "Handler %s does locking internally", hptr->name); - } - break; - default: - case '-': - if ((hptr->flags & DBA_LOCK_ALL) == 0) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Locking cannot be disabled for handler %s", hptr->name); - FREENOW; - RETURN_FALSE; - } - lock_flag = 0; + case '-': + if ((hptr->flags & DBA_LOCK_ALL) == 0) { + php_error_docref(NULL, E_WARNING, "Locking cannot be disabled for handler %s", hptr->name); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_FALSE; + } + is_lock_ignored = true; + lock_flag = 0; break; + case 'd': + is_db_lock = true; + if ((hptr->flags & DBA_LOCK_ALL) == 0) { + lock_flag = (hptr->flags & DBA_LOCK_ALL); + break; + } + ZEND_FALLTHROUGH; + case 'l': + // is_file_lock = true; + lock_flag = DBA_LOCK_ALL; + if ((hptr->flags & DBA_LOCK_ALL) == 0) { + php_error_docref(NULL, E_NOTICE, "Handler %s does locking internally", hptr->name); + } + break; + default: + zend_argument_value_error(2, "second character must be one of \"d\", \"l\", \"-\", or \"t\""); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_THROWS(); } } else { lock_flag = (hptr->flags&DBA_LOCK_ALL); - lock_dbf = 1; + is_db_lock = true; } - switch (*pmode++) { + + switch (ZSTR_VAL(mode)[0]) { case 'r': modenr = DBA_READER; lock_mode = (lock_flag & DBA_LOCK_READER) ? LOCK_SH : 0; @@ -608,13 +645,13 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifdef PHP_WIN32 if (hptr->flags & (DBA_NO_APPEND|DBA_CAST_AS_FD)) { php_stream_statbuf ssb; - need_creation = (SUCCESS != php_stream_stat_path(Z_STRVAL(args[0]), &ssb)); + need_creation = (SUCCESS != php_stream_stat_path(ZSTR_VAL(path), &ssb)); } #endif modenr = DBA_CREAT; lock_mode = (lock_flag & DBA_LOCK_CREAT) ? LOCK_EX : 0; if (lock_mode) { - if (lock_dbf) { + if (is_db_lock) { /* the create/append check will be done on the lock * when the lib opens the file it is already created */ @@ -653,54 +690,45 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) file_mode = "w+b"; break; default: - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Illegal DBA mode"); - FREENOW; - RETURN_FALSE; + zend_argument_value_error(2, "first character must be one of \"r\", \"w\", \"c\", or \"n\""); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_THROWS(); } if (!lock_file_mode) { lock_file_mode = file_mode; } - if (*pmode=='d' || *pmode=='l' || *pmode=='-') { - pmode++; /* done already - skip here */ - } - if (*pmode=='t') { - pmode++; - if (!lock_flag) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "You cannot combine modifiers - (no lock) and t (test lock)"); - FREENOW; - RETURN_FALSE; + if (is_test_lock) { + if (is_lock_ignored) { + zend_argument_value_error(2, "cannot combine mode \"-\" (no lock) and \"t\" (test lock)"); + FREE_PERSISTENT_RESOURCE_KEY(); + RETURN_THROWS(); } if (!lock_mode) { if ((hptr->flags & DBA_LOCK_ALL) == 0) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Handler %s uses its own locking which doesn't support mode modifier t (test lock)", hptr->name); - FREENOW; + php_error_docref(NULL, E_WARNING, "Handler %s uses its own locking which doesn't support mode modifier t (test lock)", hptr->name); + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } else { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Handler %s doesn't uses locking for this mode which makes modifier t (test lock) obsolete", hptr->name); - FREENOW; + php_error_docref(NULL, E_WARNING, "Handler %s doesn't uses locking for this mode which makes modifier t (test lock) obsolete", hptr->name); + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } } else { lock_mode |= LOCK_NB; /* test =: non blocking */ } } - if (*pmode) { - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Illegal DBA mode"); - FREENOW; - RETURN_FALSE; - } info = pemalloc(sizeof(dba_info), persistent); memset(info, 0, sizeof(dba_info)); - info->path = pestrdup(Z_STRVAL(args[0]), persistent); + info->path = pestrdup(ZSTR_VAL(path), persistent); info->mode = modenr; - info->argc = ac - 3; - info->argv = args + 3; + info->file_permission = permission; + info->map_size = map_size; info->flags = (hptr->flags & ~DBA_LOCK_ALL) | (lock_flag & DBA_LOCK_ALL) | (persistent ? DBA_PERSISTENT : 0); info->lock.mode = lock_mode; /* if any open call is a locking call: - * check if we already habe a locking call open that should block this call + * check if we already have a locking call open that should block this call * the problem is some systems would allow read during write */ if (hptr->flags & DBA_LOCK_ALL) { @@ -717,8 +745,8 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) restart: #endif if (!error && lock_mode) { - if (lock_dbf) { - lock_name = Z_STRVAL(args[0]); + if (is_db_lock) { + lock_name = ZSTR_VAL(path); } else { spprintf(&lock_name, 0, "%s.lck", info->path); if (!strcmp(file_mode, "r")) { @@ -740,7 +768,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (!info->lock.fp) { info->lock.fp = php_stream_open_wrapper(lock_name, lock_file_mode, STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|persistent_flag, &opened_path); if (info->lock.fp) { - if (lock_dbf) { + if (is_db_lock) { /* replace the path info with the real path of the opened file */ pefree(info->path, persistent); info->path = pestrndup(ZSTR_VAL(opened_path), ZSTR_LEN(opened_path), persistent); @@ -750,13 +778,13 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) zend_string_release_ex(opened_path, 0); } } - if (!lock_dbf) { + if (!is_db_lock) { efree(lock_name); } if (!info->lock.fp) { dba_close(info); /* stream operation already wrote an error message */ - FREENOW; + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } if (!php_stream_supports_lock(info->lock.fp)) { @@ -769,7 +797,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) /* centralised open stream for builtin */ if (!error && (hptr->flags&DBA_STREAM_OPEN)==DBA_STREAM_OPEN) { - if (info->lock.fp && lock_dbf) { + if (info->lock.fp && is_db_lock) { info->fp = info->lock.fp; /* use the same stream for locking and database access */ } else { info->fp = php_stream_open_wrapper(info->path, file_mode, STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|persistent_flag, NULL); @@ -777,7 +805,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (!info->fp) { dba_close(info); /* stream operation already wrote an error message */ - FREENOW; + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } if (hptr->flags & (DBA_NO_APPEND|DBA_CAST_AS_FD)) { @@ -787,7 +815,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (SUCCESS != php_stream_cast(info->fp, PHP_STREAM_AS_FD, (void*)&info->fd, 1)) { php_error_docref(NULL, E_WARNING, "Could not cast stream"); dba_close(info); - FREENOW; + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; #ifdef F_SETFL } else if (modenr == DBA_CREAT) { @@ -819,29 +847,27 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (error || hptr->open(info, &error) != SUCCESS) { dba_close(info); - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Driver initialization failed for handler: %s%s%s", hptr->name, error?": ":"", error?error:""); - FREENOW; + php_error_docref(NULL, E_WARNING, "Driver initialization failed for handler: %s%s%s", hptr->name, error?": ":"", error?error:""); + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } info->hnd = hptr; - info->argc = 0; - info->argv = NULL; if (persistent) { - if (zend_register_persistent_resource(key, keylen, info, le_pdb) == NULL) { + ZEND_ASSERT(persistent_resource_key); + if (zend_register_persistent_resource_ex(persistent_resource_key, info, le_pdb) == NULL) { dba_close(info); - php_error_docref2(NULL, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Could not register persistent resource"); - FREENOW; + php_error_docref(NULL, E_WARNING, "Could not register persistent resource"); + FREE_PERSISTENT_RESOURCE_KEY(); RETURN_FALSE; } + FREE_PERSISTENT_RESOURCE_KEY(); } - RETVAL_RES(zend_register_resource(info, (persistent ? le_pdb : le_db))); - FREENOW; + RETURN_RES(zend_register_resource(info, (persistent ? le_pdb : le_db))); } /* }}} */ -#undef FREENOW /* {{{ Opens path using the specified handler in mode persistently */ PHP_FUNCTION(dba_popen) diff --git a/ext/dba/dba.stub.php b/ext/dba/dba.stub.php index 0ad373abf6f94..359da1b1b43e3 100644 --- a/ext/dba/dba.stub.php +++ b/ext/dba/dba.stub.php @@ -2,23 +2,11 @@ /** @generate-class-entries */ -/** - * @param string $path - * @param string $mode - * @param string $handler - * @param string $handler_params - * @return resource|false - */ -function dba_popen($path, $mode, $handler = UNKNOWN, ...$handler_params) {} +/** @return resource|false */ +function dba_popen(string $path, string $mode, ?string $handler = null, int $permission = 0o644, int $map_size = 0) {} -/** - * @param string $path - * @param string $mode - * @param string $handler - * @param string $handler_params - * @return resource|false - */ -function dba_open($path, $mode, $handler = UNKNOWN, ...$handler_params) {} +/** @return resource|false */ +function dba_open(string $path, string $mode, ?string $handler = null, int $permission = 0o644, int $map_size = 0) {} /** @param resource $dba */ function dba_close($dba): void {} diff --git a/ext/dba/dba_arginfo.h b/ext/dba/dba_arginfo.h index 35a70c0a01a11..1d56faa9af226 100644 --- a/ext/dba/dba_arginfo.h +++ b/ext/dba/dba_arginfo.h @@ -1,11 +1,12 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: b5e8100725ae7e93f3ae4a599d88e6578884d0d4 */ + * Stub hash: db8b6f51859bc3334abafcc0ee645e614c6f1c59 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2) - ZEND_ARG_INFO(0, path) - ZEND_ARG_INFO(0, mode) - ZEND_ARG_INFO(0, handler) - ZEND_ARG_VARIADIC_INFO(0, handler_params) + ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, mode, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, handler, IS_STRING, 1, "null") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, permission, IS_LONG, 0, "0644") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, map_size, IS_LONG, 0, "0") ZEND_END_ARG_INFO() #define arginfo_dba_open arginfo_dba_popen diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 94ba4f49ead2d..7c990bd4e35ac 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -41,11 +41,7 @@ DBA_OPEN_FUNC(db1) DB *db; int gmode; - int filemode = 0644; - - if (info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } + int filemode = info->file_permission; gmode = 0; switch (info->mode) { diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index 87ef98caabdec..ed0f17f7c9f0b 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -39,7 +39,7 @@ DBA_OPEN_FUNC(db2) DB *dbp; DBTYPE type; int gmode = 0; - int filemode = 0644; + int filemode = info->file_permission; struct stat check_stat; int s = VCWD_STAT(info->path, &check_stat); @@ -61,10 +61,6 @@ DBA_OPEN_FUNC(db2) return FAILURE;/* not possible */ } - if (info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } - if (db_open(info->path, type, gmode, filemode, NULL, NULL, &dbp)) { return FAILURE; } diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 5d7538d13bf8e..3f27e817dddd1 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -51,7 +51,7 @@ DBA_OPEN_FUNC(db3) DB *dbp = NULL; DBTYPE type; int gmode = 0, err; - int filemode = 0644; + int filemode = info->file_permission; struct stat check_stat; int s = VCWD_STAT(info->path, &check_stat); @@ -73,10 +73,6 @@ DBA_OPEN_FUNC(db3) return FAILURE; /* not possible */ } - if (info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } - #ifdef DB_FCNTL_LOCKING gmode |= DB_FCNTL_LOCKING; #endif diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index da9e6236dab20..ca275e533cdc2 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -65,7 +65,7 @@ DBA_OPEN_FUNC(db4) DB *dbp = NULL; DBTYPE type; int gmode = 0, err; - int filemode = 0644; + int filemode = info->file_permission; struct stat check_stat; int s = VCWD_STAT(info->path, &check_stat); @@ -106,10 +106,6 @@ DBA_OPEN_FUNC(db4) gmode |= DB_THREAD; } - if (info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } - if ((err=db_create(&dbp, NULL, 0)) == 0) { dbp->set_errcall(dbp, php_dba_db4_errcall_fcn); if ( diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 65512b75ef4d0..6c4842e5f1cfa 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -50,11 +50,7 @@ typedef struct { DBA_OPEN_FUNC(dbm) { int fd; - int filemode = 0644; - - if(info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } + int filemode = info->file_permission; if(info->mode == DBA_TRUNC) { char buf[MAXPATHLEN]; diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index aa7e889967aba..12b90cf2a2bf1 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -36,7 +36,7 @@ DBA_OPEN_FUNC(gdbm) { GDBM_FILE dbf; int gmode = 0; - int filemode = 0644; + int filemode = info->file_permission; gmode = info->mode == DBA_READER ? GDBM_READER : info->mode == DBA_WRITER ? GDBM_WRITER : @@ -46,10 +46,6 @@ DBA_OPEN_FUNC(gdbm) if(gmode == -1) return FAILURE; /* not possible */ - if(info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } - dbf = gdbm_open(info->path, 0, gmode, filemode, NULL); if(dbf) { diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index d78ba0f891fb3..f64a70e97bdf6 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -40,21 +40,11 @@ DBA_OPEN_FUNC(lmdb) { MDB_env *env; MDB_txn *txn; - int rc, mode = 0644, flags = MDB_NOSUBDIR; - zend_long mapsize = 0; - - if(info->argc > 0) { - mode = zval_get_long(&info->argv[0]); - - if (info->argc > 1) { - mapsize = zval_get_long(&info->argv[1]); - if (mapsize < 0) { - *error = "mapsize must be greater than or equal to zero"; - return FAILURE; - } - } - /* TODO implement handling of the additional flags. */ - } + int rc, flags = MDB_NOSUBDIR; + int mode = info->file_permission; + zend_long map_size = info->map_size; + + ZEND_ASSERT(map_size >= 0); rc = mdb_env_create(&env); if (rc) { @@ -62,8 +52,8 @@ DBA_OPEN_FUNC(lmdb) return FAILURE; } - if (mapsize > 0) { - rc = mdb_env_set_mapsize(env, (size_t) mapsize); + if (map_size > 0) { + rc = mdb_env_set_mapsize(env, (size_t) map_size); if (rc) { *error = mdb_strerror(rc); return FAILURE; diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index 3fd5d20db192a..08991d65c3f05 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -32,7 +32,7 @@ DBA_OPEN_FUNC(ndbm) { DBM *dbf; int gmode = 0; - int filemode = 0644; + int filemode = info->file_permission; dba_info *pinfo = (dba_info *) info; switch(info->mode) { @@ -52,10 +52,6 @@ DBA_OPEN_FUNC(ndbm) return FAILURE; /* not possible */ } - if(info->argc > 0) { - filemode = zval_get_long(&info->argv[0]); - } - dbf = dbm_open(info->path, gmode, filemode); pinfo->dbf = dbf; diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index d3f79794ea306..70f01b99073e4 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -43,9 +43,8 @@ typedef struct dba_info { dba_mode_t mode; php_stream *fp; /* this is the database stream for builtin handlers */ int fd; - /* arg[cv] are only available when the dba_open handler is called! */ - int argc; - zval *argv; + int file_permission; + zend_long map_size; /* private */ int flags; /* whether and how dba did locking and other flags*/ struct dba_handler *hnd; diff --git a/ext/dba/tests/bug72157.phpt b/ext/dba/tests/bug72157.phpt deleted file mode 100644 index c493f57b0cbf8..0000000000000 --- a/ext/dba/tests/bug72157.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Bug #72157 (use-after-free caused by dba_open) ---EXTENSIONS-- -dba ---SKIPIF-- - ---FILE-- - ---EXPECTF-- -Warning: dba_open(,Resource id #5): Illegal DBA mode in %sbug72157.php on line %d - -Warning: dba_open(,Resource id #5): Illegal DBA mode in %sbug72157.php on line %d - -Warning: dba_open(,Resource id #5): Illegal DBA mode in %sbug72157.php on line %d - -Warning: dba_open(Resource id #5,Resource id #5): Illegal DBA mode in %sbug72157.php on line %d diff --git a/ext/dba/tests/dba011.phpt b/ext/dba/tests/dba011.phpt index 2185edb93f48e..532aad1ee2717 100644 --- a/ext/dba/tests/dba011.phpt +++ b/ext/dba/tests/dba011.phpt @@ -12,10 +12,100 @@ die("info $HND handler used"); require_once(__DIR__ .'/test.inc'); echo "database handler: $handler\n"; var_dump(dba_open($db_file, 'n')); + +echo '=== Invalid arguments dba_open() ===', \PHP_EOL; var_dump(dba_open($db_file, 'n', 'bogus')); -var_dump(dba_open($db_file, 'q', $handler)); -var_dump(dba_open($db_file, 'nq', $handler)); -var_dump(dba_open($db_file, 'n', $handler, 2, 3, 4, 5, 6, 7, 8)); + +try { + var_dump(dba_open('', 'nq')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_open($db_file, '')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_open($db_file, 'nq', '')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} + + +try { + var_dump(dba_open($db_file, 'q')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_open($db_file, 'nq')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_open($db_file, 'rdq')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_open($db_file, 'n-t')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} + +try { + var_dump(dba_open($db_file, 'r', $handler, 0o644, -10)); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} + +echo '=== Invalid arguments dba_popen() ===', \PHP_EOL; +var_dump(dba_popen($db_file, 'n', 'bogus')); + +try { + var_dump(dba_popen('', 'nq')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_popen($db_file, '')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_popen($db_file, 'nq', '')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} + + +try { + var_dump(dba_popen($db_file, 'q')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_popen($db_file, 'nq')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_popen($db_file, 'rdq')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} +try { + var_dump(dba_popen($db_file, 'n-t')); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} + +try { + var_dump(dba_popen($db_file, 'r', $handler, 0o644, -10)); +} catch (\ValueError $e) { + echo $e->getMessage(), \PHP_EOL; +} ?> --CLEAN-- ---FILE-- - ---CLEAN-- - ---EXPECTF-- -database handler: flatfile - -Warning: dba_popen(%stest0.dbm,n-t): You cannot combine modifiers - (no lock) and t (test lock) in %sdba016.php on line %d diff --git a/ext/dba/tests/dba_cdb_001.phpt b/ext/dba/tests/dba_cdb_001.phpt index 6a14310635089..14b73d0d6c5b4 100644 --- a/ext/dba/tests/dba_cdb_001.phpt +++ b/ext/dba/tests/dba_cdb_001.phpt @@ -78,12 +78,12 @@ bool(true) bool(true) Test 1 -Warning: dba_open(%stest0.dbm,c): Driver initialization failed for handler: cdb: Update operations are not supported in %sdba_cdb_001.php on line %d +Warning: dba_open(): Driver initialization failed for handler: cdb: Update operations are not supported in %sdba_cdb_001.php on line %d Failed to open DB Test 2 Warning: dba_insert(): You cannot perform a modification to a database without proper access in %sdba_cdb_001.php on line %d Test 3 -Warning: dba_open(%stest0.dbm,w): Driver initialization failed for handler: cdb: Update operations are not supported in %sdba_cdb_001.php on line %d +Warning: dba_open(): Driver initialization failed for handler: cdb: Update operations are not supported in %sdba_cdb_001.php on line %d Failed to open DB diff --git a/ext/dba/tests/dba_db4_003.phpt b/ext/dba/tests/dba_db4_003.phpt index e1f750af03e57..397b336752144 100644 --- a/ext/dba/tests/dba_db4_003.phpt +++ b/ext/dba/tests/dba_db4_003.phpt @@ -41,6 +41,6 @@ require(__DIR__ .'/clean.inc'); database handler: db4 int(14) -Warning: dba_open(%stest0.dbm,c): Driver initialization failed for handler: db4: Invalid argument in %sdba_db4_003.php on line %d +Warning: dba_open(): Driver initialization failed for handler: db4: Invalid argument in %sdba_db4_003.php on line %d Error creating %stest0.dbm Dummy contents diff --git a/ext/dba/tests/dba_db4_007.phpt b/ext/dba/tests/dba_db4_007.phpt index daa995adf95b6..b62a5df2c2ebe 100644 --- a/ext/dba/tests/dba_db4_007.phpt +++ b/ext/dba/tests/dba_db4_007.phpt @@ -37,5 +37,5 @@ require(__DIR__ .'/clean.inc'); database handler: db4 int(14) -Warning: dba_popen(%stest0.dbm,c): Driver initialization failed for handler: db4: Invalid argument in %sdba_db4_007.php on line %d +Warning: dba_popen(): Driver initialization failed for handler: db4: Invalid argument in %sdba_db4_007.php on line %d Error creating %stest0.dbm diff --git a/ext/dba/tests/dba_db4_012.phpt b/ext/dba/tests/dba_db4_012.phpt index 1ab5dab7370d7..f5c29d993f0a2 100644 --- a/ext/dba/tests/dba_db4_012.phpt +++ b/ext/dba/tests/dba_db4_012.phpt @@ -29,5 +29,5 @@ require(__DIR__ .'/clean.inc'); --EXPECTF-- database handler: db4 -Warning: dba_open(%stest0.dbm,rl): Driver initialization failed for handler: db4: No such file or directory in %sdba_db4_012.php on line %d +Warning: dba_open(): Driver initialization failed for handler: db4: No such file or directory in %sdba_db4_012.php on line %d Error creating %stest0.dbm diff --git a/ext/dba/tests/dba_db4_014.phpt b/ext/dba/tests/dba_db4_014.phpt index 31e2530474efb..8ccceb5dcbeaf 100644 --- a/ext/dba/tests/dba_db4_014.phpt +++ b/ext/dba/tests/dba_db4_014.phpt @@ -30,5 +30,5 @@ require(__DIR__ .'/clean.inc'); --EXPECTF-- database handler: db4 -Warning: dba_open(%stest0.dbm,wl): Driver initialization failed for handler: db4: No such file or directory in %sdba_db4_014.php on line %d +Warning: dba_open(): Driver initialization failed for handler: db4: No such file or directory in %sdba_db4_014.php on line %d Error creating %stest0.dbm From 86379b6710f972e0d4a11c89ce28d5768d9824d3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 9 Nov 2021 10:24:41 +0100 Subject: [PATCH 0219/1346] Warn if return type on internal __toString() is missing --- Zend/zend_API.c | 2 ++ ext/zend_test/test.stub.php | 7 ++----- ext/zend_test/test_arginfo.h | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f06d2fbdef4de..08b9dffa54daa 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2716,6 +2716,8 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend * interface. */ if (scope && zend_string_equals_literal_ci(internal_function->function_name, "__tostring") && !(internal_function->fn_flags & ZEND_ACC_HAS_RETURN_TYPE)) { + zend_error(E_CORE_WARNING, "%s::__toString() implemented without string return type", + ZSTR_VAL(scope->name)); internal_function->arg_info = (zend_internal_arg_info *) arg_info_toString + 1; internal_function->fn_flags |= ZEND_ACC_HAS_RETURN_TYPE; internal_function->num_args = internal_function->required_num_args = 0; diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index e16a154a9c622..b8dff45c340de 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -21,11 +21,8 @@ class _ZendTestClass implements _ZendTestInterface { public static function is_object(): int {} - /** - * @deprecated - * @return string - */ - public function __toString() {} + /** @deprecated */ + public function __toString(): string {} public function returnsStatic(): static {} diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 153d7429985b7..21de886d8bf87 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: d0ffefd20355db472f4a8adc018bec959e670bb3 */ + * Stub hash: 7326163f8ce5340c12e74af72d47a8926eb39786 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -77,7 +77,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class__ZendTestClass_is_object, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class__ZendTestClass___toString, 0, 0, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class__ZendTestClass___toString, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class__ZendTestClass_returnsStatic, 0, 0, IS_STATIC, 0) From 2b1b384d9a58aea734933ebcbc9ec2f1aa14b946 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Fri, 3 Sep 2021 08:42:36 -0400 Subject: [PATCH 0220/1346] Fix inconsistency in true/false/null constant resolution when opcache is not used (#7441) Strangely, uses of eval and 'php -a' (or loading a file without opcache after a namespaced constant was declared) will not treat non-FQ true/false/null as magic keywords, while compiled php required from a file would do that. This may confuse people learning the language, and result in code loaded with eval() behaving differently from the same snippet in a file loaded by require. ``` Interactive shell php > define('foo\true', 'test'); php > namespace foo { var_dump(true); } string(4) "test" ``` This will make the same session instead properly emit `bool(true);` like it already would if running those statements in files when opcache was used. (cherry picked from commit 4c48fd22d7c02913cb9ebb1c578d6cb84b8aab5f) --- Zend/tests/eval_constant_resolution.phpt | 23 ++++++++++++++++ Zend/zend_compile.c | 34 +++++++++++------------- 2 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 Zend/tests/eval_constant_resolution.phpt diff --git a/Zend/tests/eval_constant_resolution.phpt b/Zend/tests/eval_constant_resolution.phpt new file mode 100644 index 0000000000000..d302d50a2c05c --- /dev/null +++ b/Zend/tests/eval_constant_resolution.phpt @@ -0,0 +1,23 @@ +--TEST-- +eval() constant resolution +--FILE-- + +--EXPECT-- +In eval +bool(true) +bool(true) +string(4) "test" +bool(true) +Outside eval +bool(true) +bool(true) +string(4) "test" +bool(true) \ No newline at end of file diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d51061394344a..62012bad9c29c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1396,28 +1396,26 @@ static bool can_ct_eval_const(zend_constant *c) { static bool zend_try_ct_eval_const(zval *zv, zend_string *name, bool is_fully_qualified) /* {{{ */ { - zend_constant *c = zend_hash_find_ptr(EG(zend_constants), name); + /* Substitute true, false and null (including unqualified usage in namespaces) + * before looking up the possibly namespaced name. */ + const char *lookup_name = ZSTR_VAL(name); + size_t lookup_len = ZSTR_LEN(name); + + if (!is_fully_qualified) { + zend_get_unqualified_name(name, &lookup_name, &lookup_len); + } + + zend_constant *c; + if ((c = zend_get_special_const(lookup_name, lookup_len))) { + ZVAL_COPY_VALUE(zv, &c->value); + return 1; + } + c = zend_hash_find_ptr(EG(zend_constants), name); if (c && can_ct_eval_const(c)) { ZVAL_COPY_OR_DUP(zv, &c->value); return 1; } - - { - /* Substitute true, false and null (including unqualified usage in namespaces) */ - const char *lookup_name = ZSTR_VAL(name); - size_t lookup_len = ZSTR_LEN(name); - - if (!is_fully_qualified) { - zend_get_unqualified_name(name, &lookup_name, &lookup_len); - } - - if ((c = zend_get_special_const(lookup_name, lookup_len))) { - ZVAL_COPY_VALUE(zv, &c->value); - return 1; - } - - return 0; - } + return 0; } /* }}} */ From 1b3a73bbd7e94279416afa50311b13c929bc8acc Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 7 Nov 2021 13:15:23 +0000 Subject: [PATCH 0221/1346] Refactor have_innodb function --- ext/mysqli/tests/connect.inc | 43 ++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc index be2d0856f5052..f21e1424ba9c7 100644 --- a/ext/mysqli/tests/connect.inc +++ b/ext/mysqli/tests/connect.inc @@ -101,32 +101,27 @@ } function have_innodb($link) { - if (($res = $link->query("SHOW VARIABLES LIKE 'have_innodb'")) && - ($row = $res->fetch_row()) && - !empty($row)) { - if ($row[1] == "DISABLED" || $row[1] == "NO") { - return false; - } - return true; - } else { - /* MySQL 5.6.1+ */ - if ($res = $link->query("SHOW ENGINES")) { - while ($row = $res->fetch_assoc()) { - if (!isset($row['Engine']) || !isset($row['Support'])) - return false; - - if (('InnoDB' == $row['Engine']) && - (('YES' == $row['Support']) || ('DEFAULT' == $row['Support'])) - ) { - return true; - } + if (($res = $link->query("SHOW VARIABLES LIKE 'have_innodb'")) + && ($row = $res->fetch_row()) + && !empty($row) + ) { + return !($row[1] == 'DISABLED' || $row[1] == 'NO'); + } + // MySQL 5.6.1+ + if ($res = $link->query('SHOW ENGINES')) { + while ($row = $res->fetch_assoc()) { + if (!isset($row['Engine']) || !isset($row['Support'])) { + return false; + } + + if (($row['Engine'] == 'InnoDB') + && (($row['Support'] == 'YES') || ($row['Support'] == 'DEFAULT')) + ) { + return true; } - return false; - } else { - return false; } - } - return false; + } + return false; } } else { From 97bef32976f4a2a04abb8e84ecd8c48f7f71fef4 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 7 Nov 2021 13:25:03 +0000 Subject: [PATCH 0222/1346] Invalid condition in connect.inc --- ext/mysqli/tests/connect.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc index f21e1424ba9c7..ca7caca013dd7 100644 --- a/ext/mysqli/tests/connect.inc +++ b/ext/mysqli/tests/connect.inc @@ -91,7 +91,7 @@ $flags = ($enable_env_flags) ? $connect_flags : 0; - if ($flags !== false) { + if ($flags !== 0) { parent::__construct(); $this->real_connect($host, $user, $passwd, $db, $port, $socket, $flags); } else { From 0ac7dacc236f42eacca44f43f98837dcc79657b7 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 7 Nov 2021 13:31:29 +0000 Subject: [PATCH 0223/1346] Fix PHP DocBlock --- ext/mysqli/tests/connect.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc index ca7caca013dd7..ce2de3e20d1e6 100644 --- a/ext/mysqli/tests/connect.inc +++ b/ext/mysqli/tests/connect.inc @@ -54,7 +54,7 @@ /** * Whenever possible, please use this wrapper to make testing of MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible * - * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)? + * @param bool $enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS)? */ function my_mysqli_connect($host, $user, $passwd, $db, $port, $socket, $enable_env_flags = true) { global $connect_flags; @@ -74,7 +74,7 @@ /** * Whenever possible, please use this wrapper to make testing of MYSQLI_CLIENT_COMPRESS (and potentially SSL) possible * - * @param enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS) + * @param bool $enable_env_flags Enable setting of connection flags through env(MYSQL_TEST_CONNECT_FLAGS) */ function my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags = 0, $enable_env_flags = true) { global $connect_flags; From c5cc4c813c90ad3fe4d03bb9e61a9f2c71c030ad Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 7 Nov 2021 13:59:06 +0000 Subject: [PATCH 0224/1346] Fix grammar in code comments --- ext/mysqli/tests/bug49442.phpt | 6 +++--- ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt | 2 +- ext/mysqli/tests/mysqli_poll.phpt | 6 +++--- ext/mysqli/tests/mysqli_poll_kill.phpt | 2 +- ext/mysqli/tests/mysqli_reap_async_query.phpt | 2 +- .../tests/mysqli_stmt_bind_param_check_param_no_change.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_bind_result.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_close.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_get_result_types.phpt | 2 +- ext/mysqli/tests/mysqli_stmt_num_rows.phpt | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ext/mysqli/tests/bug49442.phpt b/ext/mysqli/tests/bug49442.phpt index f8829ae31a203..58234798a3526 100644 --- a/ext/mysqli/tests/bug49442.phpt +++ b/ext/mysqli/tests/bug49442.phpt @@ -69,10 +69,10 @@ mysqli.max_persistent=1 At this point 'persistent' is not to be confused with what a user calls a 'persistent' - in this case 'persistent' means that mysqlnd uses malloc() instead of emalloc(). nothing else. ext/mysqli will not consider it as a 'persistent' connection in a user sense, ext/mysqli will not apply max_persistent etc. - Its only about malloc() vs. emalloc(). + It's only about malloc() vs. emalloc(). - However, the bug is about malloc() and efree(). You can make make mysqlnd use malloc() by either using - pconnect or mysql_init() - so we should test pconnect as well.. + However, the bug is about malloc() and efree(). You can make mysqlnd use malloc() by either using + pconnect or mysql_init() - so we should test pconnect as well. */ $host = 'p:' . $host; if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { diff --git a/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt b/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt index 8dc6a38527970..25feade40af9e 100644 --- a/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt +++ b/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt @@ -73,7 +73,7 @@ if (!$IS_MYSQLND) printf("[025] Timestamp not found. One reason could be that the test is borked and does not recognize the format of the gettimeofday() system call. Check manually (and fix the test, if needed :-)). First characters from trace are '%s'\n", substr($trace, 0, 80)); // i - add PID of the current process - // currently PHP is not multi-threaded, so it should be save to test for the PID of this PHP process + // currently PHP is not multi-threaded, so it should be safe to test for the PID of this PHP process if (false === ($pid = getmypid())) $pid = "[\d]+"; diff --git a/ext/mysqli/tests/mysqli_poll.phpt b/ext/mysqli/tests/mysqli_poll.phpt index d36dac5305aee..ac78ccbbf83d7 100644 --- a/ext/mysqli/tests/mysqli_poll.phpt +++ b/ext/mysqli/tests/mysqli_poll.phpt @@ -80,7 +80,7 @@ if (!$IS_MYSQLND) } - // Connections on which no query has been send - 1 + // Connections on which no query has been sent - 1 $link = get_connection(); $links = array($link); $errors = array($link); @@ -95,7 +95,7 @@ if (!$IS_MYSQLND) poll_async(13, $link, $links, $errors, $reject, 0, true); mysqli_close($link); - // Connections on which no query has been send - 2 + // Connections on which no query has been sent - 2 // Difference: pass $links twice $link = get_connection(); $links = array($link, $link); @@ -103,7 +103,7 @@ if (!$IS_MYSQLND) $reject = array(); poll_async(14, $link, $links, $errors, $reject, 0, false); - // Connections on which no query has been send - 3 + // Connections on which no query has been sent - 3 // Difference: pass two connections $link = get_connection(); $links = array($link, get_connection()); diff --git a/ext/mysqli/tests/mysqli_poll_kill.phpt b/ext/mysqli/tests/mysqli_poll_kill.phpt index 3b540f5d21fb7..88bfb62dc696d 100644 --- a/ext/mysqli/tests/mysqli_poll_kill.phpt +++ b/ext/mysqli/tests/mysqli_poll_kill.phpt @@ -60,7 +60,7 @@ if (!$IS_MYSQLND) if (!is_array($reject) || !empty($reject)) printf("[007] Expecting empty array got %s/%s\n", gettype($reject), var_export($reject, true)); - // Lets pass a dead connection + // Let's pass a dead connection $links = array($link); $errors = array($link); $reject = array($link); diff --git a/ext/mysqli/tests/mysqli_reap_async_query.phpt b/ext/mysqli/tests/mysqli_reap_async_query.phpt index c909f420a6340..7d538297623bc 100644 --- a/ext/mysqli/tests/mysqli_reap_async_query.phpt +++ b/ext/mysqli/tests/mysqli_reap_async_query.phpt @@ -57,7 +57,7 @@ if (!$IS_MYSQLND) } - // Connections on which no query has been send - 1 + // Connections on which no query has been sent - 1 $link = get_connection(); $link->query("SELECT 1 AS _one", MYSQLI_ASYNC | MYSQLI_STORE_RESULT); $links = array($link); diff --git a/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt b/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt index d7758dd4bac8b..f33076d64e14f 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_param_check_param_no_change.phpt @@ -31,7 +31,7 @@ require_once('skipifconnectfailure.inc'); echo("$one\n\n"); // it is getting worse. Binding the same var twice with different - // types you can get unexpected results (e.g. binary trash for the + // types you can get unexpected results e.g. binary trash for the // string and misc data for the integer. See next 2 tests. echo "Test 2:\n"; diff --git a/ext/mysqli/tests/mysqli_stmt_bind_result.phpt b/ext/mysqli/tests/mysqli_stmt_bind_result.phpt index 0459133cce18a..d673e2052ef12 100644 --- a/ext/mysqli/tests/mysqli_stmt_bind_result.phpt +++ b/ext/mysqli/tests/mysqli_stmt_bind_result.phpt @@ -202,7 +202,7 @@ require_once('skipifconnectfailure.inc'); func_mysqli_stmt_bind_result($link, $engine, "d", "FLOAT UNSIGNED", 18446744073709551615 + 1.1, 640); func_mysqli_stmt_bind_result($link, $engine, "d", "FLOAT UNSIGNED ", NULL, 660); - // Yes, we need the temporary variable. The PHP casting will fouls us otherwise. + // Yes, we need the temporary variable. The PHP casting will foul us otherwise. $tmp = strval('-99999999.99'); func_mysqli_stmt_bind_result($link, $engine, "d", "DOUBLE(10,2)", $tmp, 680, "string"); func_mysqli_stmt_bind_result($link, $engine, "d", "DOUBLE(10,2)", NULL, 700); diff --git a/ext/mysqli/tests/mysqli_stmt_close.phpt b/ext/mysqli/tests/mysqli_stmt_close.phpt index 39460fc9cd8c9..03788c0c0be2b 100644 --- a/ext/mysqli/tests/mysqli_stmt_close.phpt +++ b/ext/mysqli/tests/mysqli_stmt_close.phpt @@ -15,7 +15,7 @@ require_once('skipifconnectfailure.inc'); if (!$stmt = mysqli_stmt_init($link)) printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - // Yes, amazing, eh? AFAIK a work around of a constructor bug... + // Yes, amazing, eh? AFAIK a workaround of a constructor bug... try { mysqli_stmt_close($stmt); } catch (Error $exception) { diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt index b8e0a7a7750b9..d1ac2080ebf89 100644 --- a/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt +++ b/ext/mysqli/tests/mysqli_stmt_get_result_types.phpt @@ -164,7 +164,7 @@ mysqli func_mysqli_stmt_get_result($link, $engine, "d", "FLOAT UNSIGNED", 18446744073709551615 + 1.1, 640); func_mysqli_stmt_get_result($link, $engine, "d", "FLOAT UNSIGNED ", NULL, 660); - // Yes, we need the temporary variable. The PHP casting will fouls us otherwise. + // Yes, we need the temporary variable. The PHP casting will foul us otherwise. $tmp = strval('-99999999.99'); func_mysqli_stmt_get_result($link, $engine, "d", "DOUBLE(10,2)", $tmp, 680, "string"); func_mysqli_stmt_get_result($link, $engine, "d", "DOUBLE(10,2)", NULL, 700); diff --git a/ext/mysqli/tests/mysqli_stmt_num_rows.phpt b/ext/mysqli/tests/mysqli_stmt_num_rows.phpt index 252f3954de538..c15061afb13c8 100644 --- a/ext/mysqli/tests/mysqli_stmt_num_rows.phpt +++ b/ext/mysqli/tests/mysqli_stmt_num_rows.phpt @@ -80,7 +80,7 @@ require_once('skipifconnectfailure.inc'); What the test does is cover an implementation detail of the mysqlnd library. This implementation detail may, at any time, change without prior notice. On the contrary, the mysqlnd way is a reasonable one and, maybe, one fine - day, after Klingons visited earh, becomes the official one. Meanwhile do + day, after Klingons visited earth, becomes the official one. Meanwhile, do not rely on it. */ if ($IS_MYSQLND && (7 !== ($tmp = mysqli_stmt_num_rows($stmt)))) From 304f758bf88cc347ec278387ddd505ca249029dd Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 7 Nov 2021 14:03:20 +0000 Subject: [PATCH 0225/1346] Remove redundant checks I am unsure what this condition was actually supposed to do, but it seems like it was only checking for 1 (loose check) --- ext/mysqli/tests/connect.inc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/mysqli/tests/connect.inc b/ext/mysqli/tests/connect.inc index ce2de3e20d1e6..28faab4c88ff4 100644 --- a/ext/mysqli/tests/connect.inc +++ b/ext/mysqli/tests/connect.inc @@ -23,9 +23,7 @@ } /* Development setting: test experimental features and/or feature requests that never worked before? */ - $TEST_EXPERIMENTAL = (in_array(getenv("MYSQL_TEST_EXPERIMENTAL"), array(0, 1))) ? - ((1 == getenv("MYSQL_TEST_EXPERIMENTAL")) ? true : false) : - false; + $TEST_EXPERIMENTAL = 1 == getenv("MYSQL_TEST_EXPERIMENTAL"); $IS_MYSQLND = stristr(mysqli_get_client_info(), "mysqlnd"); From 6e3f3cbaee6321ad2ad7983bde33590f322674dd Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 9 Nov 2021 17:32:27 +0300 Subject: [PATCH 0226/1346] Improve strtr() performance using SSE2 instructions --- ext/standard/string.c | 65 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 11 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 0f29cbb038a73..4abafb6eb3f34 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -46,6 +46,10 @@ /* For php_next_utf8_char() */ #include "ext/standard/html.h" +#ifdef __SSE2__ +#include +#endif + #define STR_PAD_LEFT 0 #define STR_PAD_RIGHT 1 #define STR_PAD_BOTH 2 @@ -2782,17 +2786,59 @@ static zend_string *php_strtr_ex(zend_string *str, const char *str_from, const c } else if (trlen == 1) { char ch_from = *str_from; char ch_to = *str_to; + char *output; + char *input = ZSTR_VAL(str); + size_t len = ZSTR_LEN(str); - for (i = 0; i < ZSTR_LEN(str); i++) { - if (ZSTR_VAL(str)[i] == ch_from) { +#ifdef __SSE2__ + if (ZSTR_LEN(str) >= sizeof(__m128i)) { + __m128i search = _mm_set1_epi8(ch_from); + __m128i delta = _mm_set1_epi8(ch_to - ch_from); + + do { + __m128i src = _mm_loadu_si128((__m128i*)(input)); + __m128i mask = _mm_cmpeq_epi8(src, search); + if (_mm_movemask_epi8(mask)) { + new_str = zend_string_alloc(ZSTR_LEN(str), 0); + memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), input - ZSTR_VAL(str)); + output = ZSTR_VAL(new_str) + (input - ZSTR_VAL(str)); + _mm_storeu_si128((__m128i *)(output), + _mm_add_epi8(src, + _mm_and_si128(mask, delta))); + input += sizeof(__m128i); + output += sizeof(__m128i); + len -= sizeof(__m128i); + for (; len >= sizeof(__m128i); input += sizeof(__m128i), output += sizeof(__m128i), len -= sizeof(__m128i)) { + src = _mm_loadu_si128((__m128i*)(input)); + mask = _mm_cmpeq_epi8(src, search); + _mm_storeu_si128((__m128i *)(output), + _mm_add_epi8(src, + _mm_and_si128(mask, delta))); + } + for (; len > 0; input++, output++, len--) { + *output = (*input == ch_from) ? ch_to : *input; + } + *output = 0; + return new_str; + } + input += sizeof(__m128i); + len -= sizeof(__m128i); + } while (len >= sizeof(__m128i)); + } +#endif + for (; len > 0; input++, len--) { + if (*input == ch_from) { new_str = zend_string_alloc(ZSTR_LEN(str), 0); - memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), i); - ZSTR_VAL(new_str)[i] = ch_to; - i++; - for (; i < ZSTR_LEN(str); i++) { - ZSTR_VAL(new_str)[i] = (ZSTR_VAL(str)[i] != ch_from) ? ZSTR_VAL(str)[i] : ch_to; + memcpy(ZSTR_VAL(new_str), ZSTR_VAL(str), input - ZSTR_VAL(str)); + output = ZSTR_VAL(new_str) + (input - ZSTR_VAL(str)); + *output = ch_to; + input++; + output++; + len--; + for (; len > 0; input++, output++, len--) { + *output = (*input == ch_from) ? ch_to : *input; } - ZSTR_VAL(new_str)[i] = 0; + *output = 0; return new_str; } } @@ -5666,9 +5712,6 @@ PHP_FUNCTION(sscanf) /* }}} */ /* static zend_string *php_str_rot13(zend_string *str) {{{ */ -#ifdef __SSE2__ -#include -#endif static zend_string *php_str_rot13(zend_string *str) { zend_string *ret; From cd3fbb1b15bb5b579b78704f4a754911716c813a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 9 Nov 2021 15:52:10 +0100 Subject: [PATCH 0227/1346] Fix file name clash in phar test --- ext/phar/tests/zip/phar_setalias.phpt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ext/phar/tests/zip/phar_setalias.phpt b/ext/phar/tests/zip/phar_setalias.phpt index 46922279ffe57..dc324ea6bf1a2 100644 --- a/ext/phar/tests/zip/phar_setalias.phpt +++ b/ext/phar/tests/zip/phar_setalias.phpt @@ -11,8 +11,8 @@ phar.readonly=0 setStub(''); @@ -49,9 +49,8 @@ echo $p3->getAlias(), "\n"; --CLEAN-- --EXPECT-- hio From 085b360abb622abc18b955a23cea12f752feea3d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 9 Nov 2021 22:26:37 +0300 Subject: [PATCH 0228/1346] Improve strtr(), str_replace() and substr_count() performance Use SSE2 to calculate number of occurrences of a given character in a string --- ext/standard/string.c | 111 +++++++++++++++++++++++++++++------------- 1 file changed, 78 insertions(+), 33 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 4abafb6eb3f34..c7c4e193ec378 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3007,23 +3007,69 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p } /* }}} */ +/* {{{ count_chars */ +static zend_always_inline zend_long count_chars(const char *p, zend_long length, char ch) +{ + zend_long count = 0; + const char *endp; + +#ifdef __SSE2__ + if (length >= sizeof(__m128i)) { + __m128i search = _mm_set1_epi8(ch); + + do { + __m128i src = _mm_loadu_si128((__m128i*)(p)); + uint32_t mask = _mm_movemask_epi8(_mm_cmpeq_epi8(src, search)); + // TODO: It would be great to use POPCNT, but it's available only with SSE4.1 +#if 1 + while (mask != 0) { + count++; + mask = mask & (mask - 1); + } +#else + if (mask) { + mask = mask - ((mask >> 1) & 0x5555); + mask = (mask & 0x3333) + ((mask >> 2) & 0x3333); + mask = (mask + (mask >> 4)) & 0x0F0F; + mask = (mask + (mask >> 8)) & 0x00ff; + count += mask; + } +#endif + p += sizeof(__m128i); + length -= sizeof(__m128i); + } while (length >= sizeof(__m128i)); + } + endp = p + length; + while (p != endp) { + count += (*p == ch); + p++; + } +#else + endp = p + length; + while ((p = memchr(p, ch, endp-p))) { + count++; + p++; + } +#endif + return count; +} +/* }}} */ + /* {{{ php_char_to_str_ex */ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, size_t to_len, int case_sensitivity, zend_long *replace_count) { zend_string *result; - size_t char_count = 0; + size_t char_count; int lc_from = 0; - const char *source, *source_end= ZSTR_VAL(str) + ZSTR_LEN(str); + const char *source, *source_end; char *target; if (case_sensitivity) { - char *p = ZSTR_VAL(str), *e = p + ZSTR_LEN(str); - while ((p = memchr(p, from, (e - p)))) { - char_count++; - p++; - } + char_count = count_chars(ZSTR_VAL(str), ZSTR_LEN(str), from); } else { lc_from = tolower(from); + char_count = 0; + source_end = ZSTR_VAL(str) + ZSTR_LEN(str); for (source = ZSTR_VAL(str); source < source_end; source++) { if (tolower(*source) == lc_from) { char_count++; @@ -3035,6 +3081,10 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si return zend_string_copy(str); } + if (replace_count) { + *replace_count += char_count; + } + if (to_len > 0) { result = zend_string_safe_alloc(char_count, to_len - 1, ZSTR_LEN(str), 0); } else { @@ -3044,6 +3094,7 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si if (case_sensitivity) { char *p = ZSTR_VAL(str), *e = p + ZSTR_LEN(str), *s = ZSTR_VAL(str); + while ((p = memchr(p, from, (e - p)))) { memcpy(target, s, (p - s)); target += p - s; @@ -3051,20 +3102,16 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si target += to_len; p++; s = p; - if (replace_count) { - *replace_count += 1; - } + if (--char_count == 0) break; } if (s < e) { memcpy(target, s, (e - s)); target += e - s; } } else { + source_end = ZSTR_VAL(str) + ZSTR_LEN(str); for (source = ZSTR_VAL(str); source < source_end; source++) { if (tolower(*source) == lc_from) { - if (replace_count) { - *replace_count += 1; - } memcpy(target, to, to_len); target += to_len; } else { @@ -5550,10 +5597,9 @@ PHP_FUNCTION(substr_count) char *haystack, *needle; zend_long offset = 0, length = 0; bool length_is_null = 1; - zend_long count = 0; + zend_long count; size_t haystack_len, needle_len; const char *p, *endp; - char cmp; ZEND_PARSE_PARAMETERS_START(2, 4) Z_PARAM_STRING(haystack, haystack_len) @@ -5569,37 +5615,36 @@ PHP_FUNCTION(substr_count) } p = haystack; - endp = p + haystack_len; - if (offset < 0) { - offset += (zend_long)haystack_len; - } - if ((offset < 0) || ((size_t)offset > haystack_len)) { - zend_argument_value_error(3, "must be contained in argument #1 ($haystack)"); - RETURN_THROWS(); + if (offset) { + if (offset < 0) { + offset += (zend_long)haystack_len; + } + if ((offset < 0) || ((size_t)offset > haystack_len)) { + zend_argument_value_error(3, "must be contained in argument #1 ($haystack)"); + RETURN_THROWS(); + } + p += offset; + haystack_len -= offset; } - p += offset; if (!length_is_null) { - if (length < 0) { - length += (haystack_len - offset); + length += haystack_len; } - if (length < 0 || ((size_t)length > (haystack_len - offset))) { + if (length < 0 || ((size_t)length > haystack_len)) { zend_argument_value_error(4, "must be contained in argument #1 ($haystack)"); RETURN_THROWS(); } - endp = p + length; + } else { + length = haystack_len; } if (needle_len == 1) { - cmp = needle[0]; - - while ((p = memchr(p, cmp, endp - p))) { - count++; - p++; - } + count = count_chars(p, length, needle[0]); } else { + count = 0; + endp = p + length; while ((p = (char*)php_memnstr(p, needle, needle_len, endp))) { p += needle_len; count++; From c7484ef9563ecded07d658e5f4c5722e633063a6 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 10 Nov 2021 10:19:05 +0300 Subject: [PATCH 0229/1346] zend_memnstr() micro-optimization --- Zend/zend_operators.h | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index a09e821373868..ce9d852819e18 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -172,19 +172,17 @@ static zend_always_inline const char * zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const char *end) { const char *p = haystack; - ptrdiff_t off_p; size_t off_s; - if (needle_len == 0) { - return p; - } + ZEND_ASSERT(end >= p); if (needle_len == 1) { return (const char *)memchr(p, *needle, (end-p)); + } else if (UNEXPECTED(needle_len == 0)) { + return p; } - off_p = end - haystack; - off_s = (off_p > 0) ? (size_t)off_p : 0; + off_s = (size_t)(end - p); if (needle_len > off_s) { return NULL; @@ -195,16 +193,13 @@ zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const end -= needle_len; while (p <= end) { - if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) { - if (!memcmp(needle+1, p+1, needle_len-2)) { + if ((p = (const char *)memchr(p, *needle, (end-p+1)))) { + if (ne == p[needle_len-1] && !memcmp(needle+1, p+1, needle_len-2)) { return p; } - } - - if (p == NULL) { + } else { return NULL; } - p++; } From 1a4f49f1fe8c7e81ec974f6b51c2cc85f6696b70 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 10 Nov 2021 10:19:49 +0300 Subject: [PATCH 0230/1346] Use cheaper memchr() instead of php_memnstr() --- ext/mbstring/mbstring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index e463e692bf062..548ba79bf3fc6 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -292,7 +292,7 @@ static zend_result php_mb_parse_encoding_list(const char *value, size_t value_le included_auto = 0; p1 = tmpstr; while (1) { - char *comma = (char *) php_memnstr(p1, ",", 1, endp); + char *comma = memchr(p1, ',', endp - p1); char *p = comma ? comma : endp; *p = '\0'; /* trim spaces */ From 8b561d33dc2a5902f2329a6240a79b4967ebcb79 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 10 Nov 2021 10:40:33 +0100 Subject: [PATCH 0231/1346] Declare properties in SOAP tests In preparation for https://wiki.php.net/rfc/deprecate_dynamic_properties. --- ext/soap/tests/any.phpt | 16 ++++++------- ext/soap/tests/bugs/bug28969.phpt | 1 + ext/soap/tests/bugs/bug29839.phpt | 1 + ext/soap/tests/bugs/bug29844.phpt | 1 + ext/soap/tests/bugs/bug30045.phpt | 1 + ext/soap/tests/bugs/bug30106.phpt | 2 ++ ext/soap/tests/bugs/bug30928.phpt | 1 + ext/soap/tests/bugs/bug31695.phpt | 4 +++- ext/soap/tests/bugs/bug32776.phpt | 1 + ext/soap/tests/bugs/bug34453.phpt | 1 + ext/soap/tests/bugs/bug34643.phpt | 1 + ext/soap/tests/bugs/bug35142.phpt | 1 + ext/soap/tests/bugs/bug36226-2.phpt | 2 ++ ext/soap/tests/bugs/bug36226.phpt | 1 + ext/soap/tests/bugs/bug36999.phpt | 1 + ext/soap/tests/bugs/bug38004.phpt | 2 ++ ext/soap/tests/bugs/bug38005.phpt | 2 ++ ext/soap/tests/bugs/bug38055.phpt | 2 ++ ext/soap/tests/bugs/bug38067.phpt | 2 ++ ext/soap/tests/bugs/bug42692.phpt | 1 + ext/soap/tests/bugs/bug43045.phpt | 2 ++ ext/soap/tests/bugs/bug46419.phpt | 1 + ext/soap/tests/bugs/bug50762.phpt | 7 +++--- ext/soap/tests/classmap003.phpt | 1 + ext/soap/tests/classmap004.phpt | 1 + .../interop/Round2/Base/r2_base_014p.phpt | 6 +---- .../interop/Round2/Base/r2_base_014w.phpt | 6 +---- .../interop/Round2/Base/r2_base_015p.phpt | 6 +---- .../interop/Round2/Base/r2_base_015w.phpt | 6 +---- .../GroupD/r3_groupD_compound1_001w.phpt | 7 +----- .../GroupD/r3_groupD_compound2_001w.phpt | 13 ++-------- .../Round3/GroupD/r3_groupD_doclit_003w.phpt | 6 +---- .../GroupD/r3_groupD_doclitparams_003w.phpt | 6 +---- .../Round3/GroupD/r3_groupD_import2_001w.phpt | 6 +---- .../Round3/GroupD/r3_groupD_import3_001w.phpt | 6 +---- .../Round3/GroupD/r3_groupD_import3_002w.phpt | 6 +---- .../Round3/GroupD/r3_groupD_rpcenc_003w.phpt | 6 +---- .../Round3/GroupE/r3_groupE_list_001w.phpt | 6 +---- .../Round3/GroupE/r3_groupE_list_002w.phpt | 6 +---- .../Round3/GroupE/r3_groupE_list_003w.phpt | 6 +---- .../Round3/GroupE/r3_groupE_list_005w.phpt | 6 +---- .../Round3/GroupE/r3_groupE_list_006w.phpt | 6 +---- .../GroupH/r4_groupH_complex_doclit_001w.phpt | 6 +---- .../GroupH/r4_groupH_complex_doclit_002w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_doclit_003w.phpt | 21 ++++++---------- .../GroupH/r4_groupH_complex_doclit_004w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_doclit_005w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_doclit_006w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_doclit_007w.phpt | 24 +++++++------------ .../GroupH/r4_groupH_complex_doclit_008w.phpt | 24 +++++++------------ .../GroupH/r4_groupH_complex_doclit_009w.phpt | 24 +++++++------------ .../GroupH/r4_groupH_complex_doclit_010w.phpt | 24 +++++++------------ .../GroupH/r4_groupH_complex_rpcenc_001w.phpt | 6 +---- .../GroupH/r4_groupH_complex_rpcenc_002w.phpt | 5 +--- .../GroupH/r4_groupH_complex_rpcenc_003w.phpt | 15 +++++------- .../GroupH/r4_groupH_complex_rpcenc_004w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_rpcenc_005w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_rpcenc_006w.phpt | 11 ++------- .../GroupH/r4_groupH_complex_rpcenc_007w.phpt | 18 ++++++-------- .../GroupH/r4_groupH_complex_rpcenc_008w.phpt | 18 ++++++-------- .../GroupH/r4_groupH_complex_rpcenc_009w.phpt | 18 ++++++-------- .../GroupH/r4_groupH_complex_rpcenc_010w.phpt | 18 ++++++-------- .../Round4/GroupI/r4_groupI_xsd_008w.phpt | 6 +---- .../Round4/GroupI/r4_groupI_xsd_009w.phpt | 6 +---- .../Round4/GroupI/r4_groupI_xsd_014w.phpt | 6 +---- .../Round4/GroupI/r4_groupI_xsd_015w.phpt | 6 +---- .../Round4/GroupI/r4_groupI_xsd_019w.phpt | 6 +---- .../Round4/GroupI/r4_groupI_xsd_020w.phpt | 6 +---- .../Round4/GroupI/r4_groupI_xsd_023w.phpt | 15 ++++-------- .../Round4/GroupI/r4_groupI_xsd_024w.phpt | 9 +++---- .../Round4/GroupI/r4_groupI_xsd_025w.phpt | 9 +++---- .../Round4/GroupI/r4_groupI_xsd_028w.phpt | 6 +---- ext/soap/tests/transport001.phpt | 1 + 73 files changed, 168 insertions(+), 372 deletions(-) diff --git a/ext/soap/tests/any.phpt b/ext/soap/tests/any.phpt index 859cf3bdfb6e6..eeb1831080678 100644 --- a/ext/soap/tests/any.phpt +++ b/ext/soap/tests/any.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPComplexType('arg',34,325.325); @@ -29,6 +25,8 @@ function echoAnyElement($x) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $options) { parent::__construct($wsdl, $options); $this->server = new SoapServer($wsdl, $options); @@ -63,10 +61,10 @@ object(stdClass)#5 (1) { array(1) { ["SOAPComplexType"]=> object(SOAPComplexType)#7 (3) { - ["varInt"]=> - int(34) ["varString"]=> string(3) "arg" + ["varInt"]=> + int(34) ["varFloat"]=> float(325.325) } @@ -80,10 +78,10 @@ object(stdClass)#8 (1) { array(1) { ["SOAPComplexType"]=> object(SOAPComplexType)#10 (3) { - ["varInt"]=> - int(34) ["varString"]=> string(3) "arg" + ["varInt"]=> + int(34) ["varFloat"]=> float(325.325) } diff --git a/ext/soap/tests/bugs/bug28969.phpt b/ext/soap/tests/bugs/bug28969.phpt index dff895017ab30..89477cc09486d 100644 --- a/ext/soap/tests/bugs/bug28969.phpt +++ b/ext/soap/tests/bugs/bug28969.phpt @@ -10,6 +10,7 @@ function test() { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug29839.phpt b/ext/soap/tests/bugs/bug29839.phpt index b5aa0e88b11f6..468d05f495e04 100644 --- a/ext/soap/tests/bugs/bug29839.phpt +++ b/ext/soap/tests/bugs/bug29839.phpt @@ -12,6 +12,7 @@ function EchoString($s) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug29844.phpt b/ext/soap/tests/bugs/bug29844.phpt index 7b403374158e7..93b2bb12a4f06 100644 --- a/ext/soap/tests/bugs/bug29844.phpt +++ b/ext/soap/tests/bugs/bug29844.phpt @@ -14,6 +14,7 @@ class hello_world { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug30045.phpt b/ext/soap/tests/bugs/bug30045.phpt index debb613fc9e4d..0c593f9508ced 100644 --- a/ext/soap/tests/bugs/bug30045.phpt +++ b/ext/soap/tests/bugs/bug30045.phpt @@ -13,6 +13,7 @@ function foo($type, $num) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug30106.phpt b/ext/soap/tests/bugs/bug30106.phpt index 023bd44272861..5a5d9889fa9f2 100644 --- a/ext/soap/tests/bugs/bug30106.phpt +++ b/ext/soap/tests/bugs/bug30106.phpt @@ -13,6 +13,8 @@ function getContinentList() { } class LocalSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $options=array()) { parent::__construct($wsdl, $options); $this->server = new SoapServer($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug30928.phpt b/ext/soap/tests/bugs/bug30928.phpt index 4abb951964e5c..b15997c079f8d 100644 --- a/ext/soap/tests/bugs/bug30928.phpt +++ b/ext/soap/tests/bugs/bug30928.phpt @@ -17,6 +17,7 @@ function test($x) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug31695.phpt b/ext/soap/tests/bugs/bug31695.phpt index 3ea026415097c..635dc9a6be3b6 100644 --- a/ext/soap/tests/bugs/bug31695.phpt +++ b/ext/soap/tests/bugs/bug31695.phpt @@ -11,10 +11,12 @@ function Test($x) { } class LocalSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $options=array()) { parent::__construct($wsdl, $options); $this->server = new SoapServer($wsdl, $options); - $this->server->addFunction("Test"); + $this->server->addFunction("Test"); } function __doRequest($request, $location, $action, $version, $one_way = 0): ?string { diff --git a/ext/soap/tests/bugs/bug32776.phpt b/ext/soap/tests/bugs/bug32776.phpt index 245ea224f9051..242bf6fc620c0 100644 --- a/ext/soap/tests/bugs/bug32776.phpt +++ b/ext/soap/tests/bugs/bug32776.phpt @@ -15,6 +15,7 @@ function test($x) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug34453.phpt b/ext/soap/tests/bugs/bug34453.phpt index e6966478d0b95..b3dbb672996d2 100644 --- a/ext/soap/tests/bugs/bug34453.phpt +++ b/ext/soap/tests/bugs/bug34453.phpt @@ -12,6 +12,7 @@ function EchoString($s) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug34643.phpt b/ext/soap/tests/bugs/bug34643.phpt index c33b1336cfc3a..f0795e187eeff 100644 --- a/ext/soap/tests/bugs/bug34643.phpt +++ b/ext/soap/tests/bugs/bug34643.phpt @@ -15,6 +15,7 @@ class fp { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug35142.phpt b/ext/soap/tests/bugs/bug35142.phpt index fea08d33c5800..d02ebf82c5d8e 100644 --- a/ext/soap/tests/bugs/bug35142.phpt +++ b/ext/soap/tests/bugs/bug35142.phpt @@ -17,6 +17,7 @@ function PostEvents($x) { } class TestSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug36226-2.phpt b/ext/soap/tests/bugs/bug36226-2.phpt index 67bec3d3d52e4..6776b1a7ba1a3 100644 --- a/ext/soap/tests/bugs/bug36226-2.phpt +++ b/ext/soap/tests/bugs/bug36226-2.phpt @@ -16,6 +16,8 @@ function PostEvents($x) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $options) { parent::__construct($wsdl, $options); $this->server = new SoapServer($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug36226.phpt b/ext/soap/tests/bugs/bug36226.phpt index a0eac843a21df..73ce6ea80aa48 100644 --- a/ext/soap/tests/bugs/bug36226.phpt +++ b/ext/soap/tests/bugs/bug36226.phpt @@ -17,6 +17,7 @@ function PostEvents($x) { } class TestSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug36999.phpt b/ext/soap/tests/bugs/bug36999.phpt index 3bb5561fa67ad..6800e5aac6235 100644 --- a/ext/soap/tests/bugs/bug36999.phpt +++ b/ext/soap/tests/bugs/bug36999.phpt @@ -12,6 +12,7 @@ function echoLong($num) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl) { parent::__construct($wsdl); diff --git a/ext/soap/tests/bugs/bug38004.phpt b/ext/soap/tests/bugs/bug38004.phpt index 9459faa6493bf..0526390bd9f4d 100644 --- a/ext/soap/tests/bugs/bug38004.phpt +++ b/ext/soap/tests/bugs/bug38004.phpt @@ -13,6 +13,8 @@ function Test($param) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl) { parent::__construct($wsdl); $this->server = new SoapServer($wsdl); diff --git a/ext/soap/tests/bugs/bug38005.phpt b/ext/soap/tests/bugs/bug38005.phpt index c025c14c12946..db4d76539586f 100644 --- a/ext/soap/tests/bugs/bug38005.phpt +++ b/ext/soap/tests/bugs/bug38005.phpt @@ -11,6 +11,8 @@ function Test($param=NULL) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $opt) { parent::__construct($wsdl, $opt); $this->server = new SoapServer($wsdl, $opt); diff --git a/ext/soap/tests/bugs/bug38055.phpt b/ext/soap/tests/bugs/bug38055.phpt index 6c8744cc8bb89..33596c2433b26 100644 --- a/ext/soap/tests/bugs/bug38055.phpt +++ b/ext/soap/tests/bugs/bug38055.phpt @@ -14,6 +14,8 @@ function Test($param) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl) { parent::__construct($wsdl); $this->server = new SoapServer($wsdl); diff --git a/ext/soap/tests/bugs/bug38067.phpt b/ext/soap/tests/bugs/bug38067.phpt index 778d429373f2a..75a5cece76072 100644 --- a/ext/soap/tests/bugs/bug38067.phpt +++ b/ext/soap/tests/bugs/bug38067.phpt @@ -13,6 +13,8 @@ function Test($param) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $opt) { parent::__construct($wsdl, $opt); $this->server = new SoapServer($wsdl, $opt); diff --git a/ext/soap/tests/bugs/bug42692.phpt b/ext/soap/tests/bugs/bug42692.phpt index e132672342e8f..e0f421e61f440 100644 --- a/ext/soap/tests/bugs/bug42692.phpt +++ b/ext/soap/tests/bugs/bug42692.phpt @@ -11,6 +11,7 @@ function checkAuth($peid,$auth) { } class TestSoap extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug43045.phpt b/ext/soap/tests/bugs/bug43045.phpt index 633b22ef35388..34d60df0966b7 100644 --- a/ext/soap/tests/bugs/bug43045.phpt +++ b/ext/soap/tests/bugs/bug43045.phpt @@ -9,6 +9,8 @@ function test($x) { } class TestSoapClient extends SoapClient { + private $server; + function __construct($wsdl, $options) { parent::__construct($wsdl, $options); $this->server = new SoapServer($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug46419.phpt b/ext/soap/tests/bugs/bug46419.phpt index 092cbaa7797f1..159ae2379f736 100644 --- a/ext/soap/tests/bugs/bug46419.phpt +++ b/ext/soap/tests/bugs/bug46419.phpt @@ -9,6 +9,7 @@ function bar() { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/bugs/bug50762.phpt b/ext/soap/tests/bugs/bug50762.phpt index 79af58b641eac..e73f48a7631d5 100644 --- a/ext/soap/tests/bugs/bug50762.phpt +++ b/ext/soap/tests/bugs/bug50762.phpt @@ -15,6 +15,7 @@ class testSoap { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); @@ -34,10 +35,8 @@ class LocalSoapClient extends SoapClient { $cl = new LocalSoapClient(__DIR__.'/bug50762.wsdl', array('cache_wsdl'=>WSDL_CACHE_NONE, 'trace'=>true)); -class authToken{ - public function __construct($token){ - $this->authToken=$token; - } +class authToken { + public function __construct(public $authToken) {} } $cl->__setSoapHeaders(array(new SoapHeader('http://sova.pronto.ru/', 'authToken', new authToken('tokendata')))); diff --git a/ext/soap/tests/classmap003.phpt b/ext/soap/tests/classmap003.phpt index c3181bb95249e..98570cfd23ce6 100644 --- a/ext/soap/tests/classmap003.phpt +++ b/ext/soap/tests/classmap003.phpt @@ -26,6 +26,7 @@ function f(){ } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/classmap004.phpt b/ext/soap/tests/classmap004.phpt index 541a336437868..b183be4bc2735 100644 --- a/ext/soap/tests/classmap004.phpt +++ b/ext/soap/tests/classmap004.phpt @@ -34,6 +34,7 @@ function f(){ } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_014p.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_014p.phpt index 23f44ac6e8193..06e0e55d0b820 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_014p.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_014p.phpt @@ -7,11 +7,7 @@ precision=14 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $client = new SoapClient(NULL,array("location"=>"test://","uri"=>"http://soapinterop.org/","trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_014w.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_014w.phpt index e48e151551c75..5314c46c89769 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_014w.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_014w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $client = new SoapClient(__DIR__."/round2_base.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_015p.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_015p.phpt index e206f3f0615b6..78ddfe83c8070 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_015p.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_015p.phpt @@ -7,11 +7,7 @@ precision=14 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct1 = new SOAPStruct('arg',34,325.325); diff --git a/ext/soap/tests/interop/Round2/Base/r2_base_015w.phpt b/ext/soap/tests/interop/Round2/Base/r2_base_015w.phpt index 4ee706ffbb849..2481f818675eb 100644 --- a/ext/soap/tests/interop/Round2/Base/r2_base_015w.phpt +++ b/ext/soap/tests/interop/Round2/Base/r2_base_015w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct1 = new SOAPStruct('arg',34,325.325); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound1_001w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound1_001w.phpt index 353741948f156..3be8e12536e6d 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound1_001w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound1_001w.phpt @@ -8,12 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- Age = $a; - $this->ID = $i; - $this->Name = $n; - $this->Male = $m; - } + function __construct(public $Age, public $ID, public $Name, public $Male) {} } $person = new Person(32,12345,'Shane',TRUE); $client = new SoapClient(__DIR__."/round3_groupD_compound1.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound2_001w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound2_001w.phpt index 44ff8346ff3ec..733a20b1a41a8 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound2_001w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_compound2_001w.phpt @@ -8,19 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- Age = $a; - $this->ID = $i; - $this->Name = $n; - $this->Male = $m; - } + function __construct(public $Age, public $ID, public $Name, public $Male) {} } class Employee { - function __construct($person=NULL,$id=NULL,$salary=NULL) { - $this->person = $person; - $this->ID = $id; - $this->salary = $salary; - } + function __construct(public $person, public $ID, public $salary) {} } $person = new Person(32,12345,'Shane',TRUE); $employee = new Employee($person,12345,1000000.00); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclit_003w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclit_003w.phpt index 8c6e3af3c2009..1e9a139a674e7 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclit_003w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclit_003w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round3_groupD_doclit.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclitparams_003w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclitparams_003w.phpt index c22e990fb1a64..307b73dc72c71 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclitparams_003w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_doclitparams_003w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round3_groupD_doclitparams.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import2_001w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import2_001w.phpt index eab06d57657b1..15b659246d436 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import2_001w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import2_001w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round3_groupD_import2.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_001w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_001w.phpt index 01654c6dc5c5e..b0715e39b7b4e 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_001w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_001w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round3_groupD_import3.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_002w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_002w.phpt index cac0dcab803a1..590e0b114e6c9 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_002w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_import3_002w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct1 = new SOAPStruct('arg',34,325.325); $struct2 = new SOAPStruct('arg',34,325.325); diff --git a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_rpcenc_003w.phpt b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_rpcenc_003w.phpt index 2867d1f9c2675..0378d698f7a69 100644 --- a/ext/soap/tests/interop/Round3/GroupD/r3_groupD_rpcenc_003w.phpt +++ b/ext/soap/tests/interop/Round3/GroupD/r3_groupD_rpcenc_003w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round3_groupD_rpcenc.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_001w.phpt b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_001w.phpt index 8dfbc01ba7241..d8de69e4a8e84 100644 --- a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_001w.phpt +++ b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_001w.phpt @@ -7,11 +7,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->child = $c; - } + function __construct(public $varString, public $varInt, public $child) {} } $struct = new SOAPList('arg1',1,NULL); $client = new SoapClient(__DIR__."/round3_groupE_list.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_002w.phpt b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_002w.phpt index 12b13c345b3eb..8d87f59352c94 100644 --- a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_002w.phpt +++ b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_002w.phpt @@ -7,11 +7,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->child = $c; - } + function __construct(public $varString, public $varInt, public $child) {} } $struct = new SOAPList('arg1',1, new SOAPList('arg2',2,NULL)); $client = new SoapClient(__DIR__."/round3_groupE_list.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_003w.phpt b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_003w.phpt index bd83ba071664f..326854241a0d7 100644 --- a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_003w.phpt +++ b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_003w.phpt @@ -7,11 +7,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->child = $c; - } + function __construct(public $varString, public $varInt, public $child) {} } $struct = new SOAPList('arg1',1,new SOAPList('arg2',2,new SOAPList('arg3',3,NULL))); $client = new SoapClient(__DIR__."/round3_groupE_list.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_005w.phpt b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_005w.phpt index 723ed89d39151..23314a976eea8 100644 --- a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_005w.phpt +++ b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_005w.phpt @@ -7,11 +7,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->child = $c; - } + function __construct(public $varString, public $varInt, public $child) {} } $struct = new SOAPList('arg1',1,new SOAPList('arg2',2,new SOAPList('arg3',3,NULL))); $struct->child->child->child = $struct; diff --git a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_006w.phpt b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_006w.phpt index 3c82f32572641..203b5a5df54c8 100644 --- a/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_006w.phpt +++ b/ext/soap/tests/interop/Round3/GroupE/r3_groupE_list_006w.phpt @@ -7,11 +7,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->child = $c; - } + function __construct(public $varString, public $varInt, public $child) {} } $struct = new SOAPList('arg1',1,new SOAPList('arg2',2,new SOAPList('arg3',3,NULL))); $struct->child->child->child = $struct->child; diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_001w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_001w.phpt index df5074bacaed2..13c484c573da3 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_001w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_001w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round4_groupH_complex_doclit.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_002w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_002w.phpt index a9902a851b1ef..d93d9b05c27f5 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_002w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_002w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } $struct = new BaseStruct(new SOAPStruct("a1",11,12.345),11); $client = new SoapClient(__DIR__."/round4_groupH_complex_doclit.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_003w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_003w.phpt index eed61a52e05fd..093e7c04ce99b 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_003w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_003w.phpt @@ -8,24 +8,17 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $structMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage + ) { + parent::__construct($structMessage, $shortMessage); } } $struct = new ExtendedStruct(new SOAPStruct("a1",11,12.345),12,"arg",-3,5); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_004w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_004w.phpt index 515770713e664..6a5fbffe0fff3 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_004w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_004w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } $s1 = new SOAPStruct('arg1',34,325.325); $s2 = new BaseStruct(new SOAPStruct('arg2',34,325.325),12); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_005w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_005w.phpt index af96c1d0b53da..b3c09c43fb966 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_005w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_005w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } $s1 = new SOAPStruct('arg1',34,325.325); $s2 = new BaseStruct(new SOAPStruct('arg2',34,325.325),12); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_006w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_006w.phpt index ea13c5e0fd4df..2c7b488dfda44 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_006w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_006w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } $s1 = new SOAPStruct('arg1',34,325.325); $s2 = new BaseStruct(new SOAPStruct('arg2',34,325.325),12); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_007w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_007w.phpt index 27ef31622f981..85414a55672c1 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_007w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_007w.phpt @@ -7,30 +7,22 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $structMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage) + { + parent::__construct($structMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(new SOAPStruct("s1",1,1.1),1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_008w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_008w.phpt index be7ee1be5fa36..7bb19ae618d4c 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_008w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_008w.phpt @@ -7,30 +7,22 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $structMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage + ) { + parent::__construct($structMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(new SOAPStruct("s1",1,1.1),1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_009w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_009w.phpt index d703ff9febcfd..ed4e8e2cdd6f3 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_009w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_009w.phpt @@ -7,30 +7,22 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $structMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage) + { + parent::__construct($structMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(new SOAPStruct("s1",1,1.1),1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_010w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_010w.phpt index ee368eb2f29e7..315ddd201e4b3 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_010w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_doclit_010w.phpt @@ -7,30 +7,22 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->structMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $structMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $structMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage) + { + parent::__construct($structMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(new SOAPStruct("s1",1,1.1),1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_001w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_001w.phpt index 5fced6f1a5aae..84949d4ecee0b 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_001w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_001w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPStruct('arg',34,325.325); $client = new SoapClient(__DIR__."/round4_groupH_complex_rpcenc.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_002w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_002w.phpt index 369243af1b58b..a53fd36c57c07 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_002w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_002w.phpt @@ -8,10 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } $struct = new BaseStruct(12.345,12); $client = new SoapClient(__DIR__."/round4_groupH_complex_rpcenc.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_003w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_003w.phpt index 8a093e8a7dac3..d407314786a5d 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_003w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_003w.phpt @@ -8,17 +8,14 @@ soap.wsdl_cache_enabled=0 --FILE-- floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $floatMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage) + { + parent::__construct($floatMessage, $shortMessage); } } $struct = new ExtendedStruct(12.345,12,"arg",-3,5); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_004w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_004w.phpt index 1a59813da23ea..a9975a8673156 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_004w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_004w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } $s1 = new SOAPStruct('arg',34,325.325); $s2 = new BaseStruct(12.345,12); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_005w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_005w.phpt index cdb73625a2944..2232374657449 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_005w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_005w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } $s1 = new SOAPStruct('arg',34,325.325); $s2 = new BaseStruct(12.345,12); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_006w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_006w.phpt index 8fa40c505125d..763ac692a0d66 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_006w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_006w.phpt @@ -8,17 +8,10 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class BaseStruct { - function __construct($f, $s) { - $this->floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } $s1 = new SOAPStruct('arg',34,325.325); $s2 = new BaseStruct(12.345,12); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_007w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_007w.phpt index 68106a36481ab..da3aa1ae8b112 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_007w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_007w.phpt @@ -8,23 +8,19 @@ soap.wsdl_cache_enabled=0 --FILE-- floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $floatMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage + ) { + parent::__construct($floatMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(12.345,1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_008w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_008w.phpt index e081ec3b3690d..57ebda31987dd 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_008w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_008w.phpt @@ -8,23 +8,19 @@ soap.wsdl_cache_enabled=0 --FILE-- floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $floatMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage + ) { + parent::__construct($floatMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(12.345,1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_009w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_009w.phpt index 272b64d1ef02f..0608d3f536fdf 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_009w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_009w.phpt @@ -8,23 +8,19 @@ soap.wsdl_cache_enabled=0 --FILE-- floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $floatMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage + ) { + parent::__construct($floatMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(12.345,1); diff --git a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_010w.phpt b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_010w.phpt index a0139e3bdf191..853f92f7f8618 100644 --- a/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_010w.phpt +++ b/ext/soap/tests/interop/Round4/GroupH/r4_groupH_complex_rpcenc_010w.phpt @@ -8,23 +8,19 @@ soap.wsdl_cache_enabled=0 --FILE-- floatMessage = $f; - $this->shortMessage = $s; - } + function __construct(public $floatMessage, public $shortMessage) {} } class ExtendedStruct extends BaseStruct { - function __construct($f, $s, $x1, $x2, $x3) { - parent::__construct($f,$s); - $this->stringMessage = $x1; - $this->intMessage = $x2; - $this->anotherIntMessage = $x3; + function __construct( + $floatMessage, $shortMessage, + public $stringMessage, public $intMessage, public $anotherIntMessage + ) { + parent::__construct($floatMessage, $shortMessage); } } class MoreExtendedStruct extends ExtendedStruct { - function __construct($f, $s, $x1, $x2, $x3, $b) { + function __construct($f, $s, $x1, $x2, $x3, public $booleanMessage) { parent::__construct($f, $s, $x1, $x2, $x3); - $this->booleanMessage = $b; } } $s1 = new BaseStruct(12.345,1); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_008w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_008w.phpt index 17b9760a3caf9..197cb07e8b06c 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_008w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_008w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPComplexType('arg',34,325.325); $client = new SoapClient(__DIR__."/round4_groupI_xsd.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_009w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_009w.phpt index 0ec0923bbad0e..81fd4d37a088a 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_009w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_009w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPComplexType('arg',34,325.325); unset($struct->varString); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_014w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_014w.phpt index ef0b728637130..5f8d8a8e5c7ff 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_014w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_014w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct1 = new SOAPComplexType('arg',34,325.325); $struct2 = new SOAPComplexType('arg',34,325.325); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_015w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_015w.phpt index 3f3345db99cf9..ee80b0aceb3dc 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_015w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_015w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct1 = new SOAPComplexType('arg',34,325.325); $struct2 = new SOAPComplexType('arg',34,325.325); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_019w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_019w.phpt index 8cf4dfec193b2..f3c1c97227a48 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_019w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_019w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPComplexType('arg',34,325.325); $client = new SoapClient(__DIR__."/round4_groupI_xsd.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_020w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_020w.phpt index 13ca8d044fba8..43f5ceb2f4695 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_020w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_020w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPComplexType('arg',34,325.325); unset($struct->varString); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_023w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_023w.phpt index c2f814252db7d..fb1b62426f3fc 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_023w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_023w.phpt @@ -8,19 +8,12 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } class SOAPComplexTypeComplexType { - function __construct($s, $i, $f, $c) { - $this->varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - $this->varComplexType = $c; - } + function __construct( + public $varString, public $varInt, public $varFloat, public $varComplexType + ) {} } $struct = new SOAPComplexTypeComplexType("arg",34,12.345,new SOAPComplexType("arg",43,54.321)); $client = new SoapClient(__DIR__."/round4_groupI_xsd.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_024w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_024w.phpt index 57fa06af286ff..081bee0e05b6e 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_024w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_024w.phpt @@ -8,12 +8,9 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - $this->varComplexType = $c; - } + function __construct( + public $varString, public $varInt, public $varFloat, public $varComplexType + ) {} } $struct = new SOAPComplexTypeComplexType("arg",34,12.345,NULL); unset($struct->varComplexType); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_025w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_025w.phpt index 29ce5837399df..a55e7bf42fe1d 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_025w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_025w.phpt @@ -8,12 +8,9 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - $this->varMultiOccurs = $c; - } + function __construct( + public $varString, public $varInt, public $varFloat, public $varMultiOccurs + ) {} } $struct = new SOAPMultiOccursComplexType("arg",34,12.345,array("red","green","blue")); $client = new SoapClient(__DIR__."/round4_groupI_xsd.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_028w.phpt b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_028w.phpt index c0346d8117966..d717349e4f0ce 100644 --- a/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_028w.phpt +++ b/ext/soap/tests/interop/Round4/GroupI/r4_groupI_xsd_028w.phpt @@ -8,11 +8,7 @@ soap.wsdl_cache_enabled=0 --FILE-- varString = $s; - $this->varInt = $i; - $this->varFloat = $f; - } + function __construct(public $varString, public $varInt, public $varFloat) {} } $struct = new SOAPComplexType('arg',34,325.325); $client = new SoapClient(__DIR__."/round4_groupI_xsd.wsdl",array("trace"=>1,"exceptions"=>0)); diff --git a/ext/soap/tests/transport001.phpt b/ext/soap/tests/transport001.phpt index c2ceb913fd79c..9789c415d1162 100644 --- a/ext/soap/tests/transport001.phpt +++ b/ext/soap/tests/transport001.phpt @@ -9,6 +9,7 @@ function Add($x,$y) { } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); From 888bec1be33818c91a3359319d6395fe5b700053 Mon Sep 17 00:00:00 2001 From: hassan Date: Wed, 10 Nov 2021 14:21:04 +0200 Subject: [PATCH 0232/1346] Merge duplicate identical conditions in PDO (#7638) --- ext/pdo/pdo_stmt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 5320d50cf9c9f..61e88ff84ac09 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -1377,9 +1377,9 @@ PHP_METHOD(PDOStatement, fetchAll) } if (!error) { - if ((how & PDO_FETCH_GROUP)) { - while (do_fetch(stmt, &data, how | flags, PDO_FETCH_ORI_NEXT, /* offset */ 0, return_all)); - } else if (how == PDO_FETCH_KEY_PAIR || (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR)) { + if ((how & PDO_FETCH_GROUP) || how == PDO_FETCH_KEY_PAIR || + (how == PDO_FETCH_USE_DEFAULT && stmt->default_fetch_type == PDO_FETCH_KEY_PAIR) + ) { while (do_fetch(stmt, &data, how | flags, PDO_FETCH_ORI_NEXT, /* offset */ 0, return_all)); } else { array_init(return_value); From edb6e3348c349e5e2f0c85957003d9a6398a26bd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 10 Nov 2021 15:15:49 +0100 Subject: [PATCH 0233/1346] Fix property name typo in var_export tests --- .../general_functions/var_export-locale.phpt | 24 +++++++----------- .../general_functions/var_export_basic6.phpt | 25 +++++++------------ 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/ext/standard/tests/general_functions/var_export-locale.phpt b/ext/standard/tests/general_functions/var_export-locale.phpt index c9b0fa8d8750d..0b22a4f4678d3 100644 --- a/ext/standard/tests/general_functions/var_export-locale.phpt +++ b/ext/standard/tests/general_functions/var_export-locale.phpt @@ -236,7 +236,7 @@ class myClass $this->public_var = 10; $this->public_var1 = new foo(); $this->private_var = new foo(); - $this->proected_var = new foo(); + $this->protected_var = new foo(); } } @@ -961,8 +961,7 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) @@ -977,12 +976,11 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) -string(293) "myClass::__set_state(array( +string(266) "myClass::__set_state(array( 'foo_object' => foo::__set_state(array( )), @@ -993,8 +991,7 @@ string(293) "myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), ))" @@ -1012,8 +1009,7 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) @@ -1028,12 +1024,11 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) -string(293) "myClass::__set_state(array( +string(266) "myClass::__set_state(array( 'foo_object' => foo::__set_state(array( )), @@ -1044,8 +1039,7 @@ string(293) "myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), ))" diff --git a/ext/standard/tests/general_functions/var_export_basic6.phpt b/ext/standard/tests/general_functions/var_export_basic6.phpt index a3d3ae639b0b1..3f60e08e9fcc0 100644 --- a/ext/standard/tests/general_functions/var_export_basic6.phpt +++ b/ext/standard/tests/general_functions/var_export_basic6.phpt @@ -60,7 +60,7 @@ class myClass $this->public_var = 10; $this->public_var1 = new foo(); $this->private_var = new foo(); - $this->proected_var = new foo(); + $this->protected_var = new foo(); } } @@ -157,8 +157,7 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) @@ -173,12 +172,11 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) -string(293) "myClass::__set_state(array( +string(266) "myClass::__set_state(array( 'foo_object' => foo::__set_state(array( )), @@ -189,8 +187,7 @@ string(293) "myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), ))" @@ -208,8 +205,7 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) @@ -224,12 +220,11 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) -string(293) "myClass::__set_state(array( +string(266) "myClass::__set_state(array( 'foo_object' => foo::__set_state(array( )), @@ -240,8 +235,7 @@ string(293) "myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), ))" @@ -299,4 +293,3 @@ concreteClass::__set_state(array( )) string(36) "concreteClass::__set_state(array( ))" - From c42336b8b8aa151b0e8b2e30fc272638f68d5969 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 6 Nov 2021 23:55:34 +0000 Subject: [PATCH 0234/1346] Drop dba_lock.name element This is unused --- ext/dba/dba.c | 15 +++------------ ext/dba/php_dba.h | 1 - 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 0e43bc03f9626..bdc119904795a 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -279,9 +279,6 @@ static void dba_close(dba_info *info) php_stream_close(info->lock.fp); } } - if (info->lock.name) { - pefree(info->lock.name, info->flags&DBA_PERSISTENT); - } pefree(info, info->flags&DBA_PERSISTENT); } /* }}} */ @@ -754,15 +751,13 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent) /* do not log errors for .lck file while in read only mode on .lck file */ lock_file_mode = "rb"; info->lock.fp = php_stream_open_wrapper(lock_name, lock_file_mode, STREAM_MUST_SEEK|IGNORE_PATH|persistent_flag, &opened_path); + if (opened_path) { + zend_string_release_ex(opened_path, 0); + } } if (!info->lock.fp) { /* when not in read mode or failed to open .lck file read only. now try again in create(write) mode and log errors */ lock_file_mode = "a+b"; - } else { - if (opened_path) { - info->lock.name = pestrndup(ZSTR_VAL(opened_path), ZSTR_LEN(opened_path), persistent); - zend_string_release_ex(opened_path, 0); - } } } if (!info->lock.fp) { @@ -773,8 +768,6 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent) pefree(info->path, persistent); info->path = pestrndup(ZSTR_VAL(opened_path), ZSTR_LEN(opened_path), persistent); } - /* now store the name of the lock */ - info->lock.name = pestrndup(ZSTR_VAL(opened_path), ZSTR_LEN(opened_path), persistent); zend_string_release_ex(opened_path, 0); } } @@ -834,8 +827,6 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent) info->lock.fp = NULL; info->fd = -1; - pefree(info->lock.name, persistent); - lock_file_mode = "r+b"; restarted = 1; diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index 70f01b99073e4..d71a886fa9178 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -32,7 +32,6 @@ typedef enum { typedef struct dba_lock { php_stream *fp; - char *name; int mode; /* LOCK_EX,LOCK_SH */ } dba_lock; From f8e15f1ed623a5eaedbb56045bad9cb80ca7a71f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 7 Nov 2021 00:52:27 +0000 Subject: [PATCH 0235/1346] Use zend_string for DBA fetch handler --- ext/dba/dba.c | 8 +++----- ext/dba/dba_cdb.c | 18 ++++++++---------- ext/dba/dba_db1.c | 7 +++---- ext/dba/dba_db2.c | 7 +++---- ext/dba/dba_db3.c | 9 ++++----- ext/dba/dba_db4.c | 11 +++++------ ext/dba/dba_dbm.c | 12 +++++------- ext/dba/dba_flatfile.c | 13 +++++-------- ext/dba/dba_gdbm.c | 14 +++++++------- ext/dba/dba_inifile.c | 10 +++++++--- ext/dba/dba_lmdb.c | 13 ++++++------- ext/dba/dba_ndbm.c | 12 +++++------- ext/dba/dba_qdbm.c | 10 +++++----- ext/dba/dba_tcadb.c | 12 +++++------- ext/dba/php_dba.h | 4 ++-- 15 files changed, 73 insertions(+), 87 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index bdc119904795a..39eec31e0f8dd 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -979,15 +979,13 @@ PHP_FUNCTION(dba_fetch) } } - char *val; - size_t len = 0; - if ((val = info->hnd->fetch(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str), skip, &len)) == NULL) { + zend_string *val; + if ((val = info->hnd->fetch(info, key_str, skip)) == NULL) { DBA_RELEASE_HT_KEY_CREATION(); RETURN_FALSE; } DBA_RELEASE_HT_KEY_CREATION(); - RETVAL_STRINGL(val, len); - efree(val); + RETURN_STR(val); } /* }}} */ diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index 445178111d26c..e7403a3ad61d2 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -145,32 +145,30 @@ DBA_CLOSE_FUNC(cdb) DBA_FETCH_FUNC(cdb) { CDB_INFO; + zend_string *fetched_val = NULL; unsigned int len; - char *new_entry = NULL; #if DBA_CDB_BUILTIN if (cdb->make) return NULL; /* database was opened writeonly */ #endif - if (php_cdb_find(&cdb->c, key, keylen) == 1) { + if (php_cdb_find(&cdb->c, ZSTR_VAL(key), ZSTR_LEN(key)) == 1) { while(skip--) { - if (php_cdb_findnext(&cdb->c, key, keylen) != 1) { + if (php_cdb_findnext(&cdb->c, ZSTR_VAL(key), ZSTR_LEN(key)) != 1) { return NULL; } } len = cdb_datalen(&cdb->c); - new_entry = safe_emalloc(len, 1, 1); + fetched_val = zend_string_alloc(len, /* persistent */ false); - if (php_cdb_read(&cdb->c, new_entry, len, cdb_datapos(&cdb->c)) == -1) { - efree(new_entry); + if (php_cdb_read(&cdb->c, ZSTR_VAL(fetched_val), len, cdb_datapos(&cdb->c)) == -1) { + zend_string_release_ex(fetched_val, /* persistent */ false); return NULL; } - new_entry[len] = 0; - if (newlen) - *newlen = len; + ZSTR_VAL(fetched_val)[len] = 0; } - return new_entry; + return fetched_val; } DBA_UPDATE_FUNC(cdb) diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 7c990bd4e35ac..58df65b774c9d 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -88,13 +88,12 @@ DBA_FETCH_FUNC(db1) DBT gval; DBT gkey; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); if (dba->dbp->get(dba->dbp, &gkey, &gval, 0) == RET_SUCCESS) { - if (newlen) *newlen = gval.size; - return estrndup(gval.data, gval.size); + return zend_string_init(gval.data, gval.size, /* persistent */ false); } return NULL; } diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index ed0f17f7c9f0b..d6c5122e87109 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -87,15 +87,14 @@ DBA_FETCH_FUNC(db2) DBT gval = {0}; DBT gkey = {0}; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); if (dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { return NULL; } - if (newlen) *newlen = gval.size; - return estrndup(gval.data, gval.size); + return zend_string_init(gval.data, gval.size, /* persistent */ false); } DBA_UPDATE_FUNC(db2) diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 3f27e817dddd1..687dda3eab34e 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -117,18 +117,17 @@ DBA_FETCH_FUNC(db3) { dba_db3_data *dba = info->dbf; DBT gval; - char *new = NULL; DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { - if (newlen) *newlen = gval.size; - new = estrndup(gval.data, gval.size); + return zend_string_init(gval.data, gval.size, /* persistent */ false); } - return new; + return NULL; } DBA_UPDATE_FUNC(db3) diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index ca275e533cdc2..0755bcf465f78 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -146,25 +146,24 @@ DBA_FETCH_FUNC(db4) { dba_db4_data *dba = info->dbf; DBT gval; - char *new = NULL; DBT gkey; + zend_string *fetched_value = NULL; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); if (info->flags & DBA_PERSISTENT) { gval.flags |= DB_DBT_MALLOC; } if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { - if (newlen) *newlen = gval.size; - new = estrndup(gval.data, gval.size); + fetched_value = zend_string_init(gval.data, gval.size, /* persistent */ false); if (info->flags & DBA_PERSISTENT) { free(gval.data); } } - return new; + return fetched_value; } DBA_UPDATE_FUNC(db4) diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 6c4842e5f1cfa..15355faea87cd 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -85,17 +85,15 @@ DBA_CLOSE_FUNC(dbm) DBA_FETCH_FUNC(dbm) { datum gval; - char *new = NULL; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); gval = fetch(gkey); - if(gval.dptr) { - if(newlen) *newlen = gval.dsize; - new = estrndup(gval.dptr, gval.dsize); + if (gval.dptr) { + return zend_string_init(gval.dptr, gval.dsize, /* persistent */ false); } - return new; + return NULL; } DBA_UPDATE_FUNC(dbm) diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index b9d43958ce0ba..caaf8c2dbd0f6 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -56,21 +56,18 @@ DBA_FETCH_FUNC(flatfile) { flatfile *dba = info->dbf; datum gval; - char *new = NULL; datum gkey; + zend_string *fetched_val = NULL; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); gval = flatfile_fetch(dba, gkey); if (gval.dptr) { - if (newlen) { - *newlen = gval.dsize; - } - new = estrndup(gval.dptr, gval.dsize); + fetched_val = zend_string_init(gval.dptr, gval.dsize, /* persistent */ false); efree(gval.dptr); } - return new; + return fetched_val; } DBA_UPDATE_FUNC(flatfile) diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index 12b90cf2a2bf1..e256088842bee 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -71,18 +71,18 @@ DBA_FETCH_FUNC(gdbm) { dba_gdbm_data *dba = info->dbf; datum gval; - char *new = NULL; datum gkey; + zend_string *fetched_val = NULL; + + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); - gkey.dptr = (char *) key; - gkey.dsize = keylen; gval = gdbm_fetch(dba->dbf, gkey); - if(gval.dptr) { - if(newlen) *newlen = gval.dsize; - new = estrndup(gval.dptr, gval.dsize); + if (gval.dptr) { + fetched_val = zend_string_init(gval.dptr, gval.dsize, /* persistent */ false); free(gval.dptr); } - return new; + return fetched_val; } DBA_UPDATE_FUNC(gdbm) diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index 6f2bada077a10..0db100079899e 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -51,17 +51,21 @@ DBA_FETCH_FUNC(inifile) inifile *dba = info->dbf; val_type ini_val; key_type ini_key; + zend_string *fetched_val = NULL; if (!key) { php_error_docref(NULL, E_WARNING, "No key specified"); return 0; } - ini_key = inifile_key_split((char*)key); /* keylen not needed here */ + ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */ ini_val = inifile_fetch(dba, &ini_key, skip); - *newlen = ini_val.value ? strlen(ini_val.value) : 0; inifile_key_free(&ini_key); - return ini_val.value; + if (ini_val.value) { + fetched_val = zend_string_init(ini_val.value, strlen(ini_val.value), /* persistent */ false); + inifile_val_free(&ini_val); + } + return fetched_val; } DBA_UPDATE_FUNC(inifile) diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index f64a70e97bdf6..d119980a97a25 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -108,7 +108,7 @@ DBA_FETCH_FUNC(lmdb) { int rc; MDB_val k, v; - char *ret = NULL; + zend_string *ret = NULL; if (LMDB_IT(cur)) { rc = mdb_txn_renew(LMDB_IT(txn)); @@ -116,25 +116,24 @@ DBA_FETCH_FUNC(lmdb) rc = mdb_txn_begin(LMDB_IT(env), NULL, MDB_RDONLY, &LMDB_IT(txn)); } if (rc) { - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); return NULL; } - k.mv_size = keylen; - k.mv_data = key; + k.mv_size = ZSTR_LEN(key); + k.mv_data = ZSTR_VAL(key); rc = mdb_get(LMDB_IT(txn), LMDB_IT(dbi), &k, &v); if (rc) { if (MDB_NOTFOUND != rc) { - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); } mdb_txn_abort(LMDB_IT(txn)); return NULL; } if (v.mv_data) { - if(newlen) *newlen = v.mv_size; - ret = estrndup(v.mv_data, v.mv_size); + ret = zend_string_init(v.mv_data, v.mv_size, /* persistent */ false); } if (LMDB_IT(cur)) { diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index 08991d65c3f05..7453b9ed3448c 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -66,17 +66,15 @@ DBA_CLOSE_FUNC(ndbm) DBA_FETCH_FUNC(ndbm) { datum gval; - char *new = NULL; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); gval = dbm_fetch(info->dbf, gkey); - if(gval.dptr) { - if(newlen) *newlen = gval.dsize; - new = estrndup(gval.dptr, gval.dsize); + if (gval.dptr) { + return zend_string_init(gval.dptr, gval.dsize, /* persistent */ false); } - return new; + return NULL; } DBA_UPDATE_FUNC(ndbm) diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index 7a78662b65f36..000fe3f031c78 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -74,17 +74,17 @@ DBA_CLOSE_FUNC(qdbm) DBA_FETCH_FUNC(qdbm) { dba_qdbm_data *dba = info->dbf; - char *value, *new = NULL; + char *value; int value_size; + zend_string *fetched_val = NULL; - value = dpget(dba->dbf, key, keylen, 0, -1, &value_size); + value = dpget(dba->dbf, ZSTR_VAL(key), ZSTR_LEN(key), 0, -1, &value_size); if (value) { - if (newlen) *newlen = value_size; - new = estrndup(value, value_size); + fetched_val = zend_string_init(value, value_size, /* persistent */ false); free(value); } - return new; + return fetched_val; } DBA_UPDATE_FUNC(qdbm) diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index f1644b519bfbd..73791d62d9ccf 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -84,19 +84,17 @@ DBA_CLOSE_FUNC(tcadb) DBA_FETCH_FUNC(tcadb) { dba_tcadb_data *dba = info->dbf; - char *value, *new = NULL; + char *value; int value_size; + zend_string *fetched_val = NULL; - value = tcadbget(dba->tcadb, key, keylen, &value_size); + value = tcadbget(dba->tcadb, ZSTR_VAL(key), ZSTR_LEN(key), &value_size); if (value) { - if (newlen) { - *newlen = value_size; - } - new = estrndup(value, value_size); + fetched_val = zend_string_init(value, value_size, /* persistent */ false); tcfree(value); } - return new; + return fetched_val; } DBA_UPDATE_FUNC(tcadb) diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index d71a886fa9178..4382da29699ac 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -73,7 +73,7 @@ typedef struct dba_handler { int flags; /* whether and how dba does locking and other flags*/ zend_result (*open)(dba_info *, char **error); void (*close)(dba_info *); - char* (*fetch)(dba_info *, char *, size_t, int, size_t *); + zend_string* (*fetch)(dba_info *, zend_string *, int); zend_result (*update)(dba_info *, char *, size_t, char *, size_t, int); zend_result (*exists)(dba_info *, char *, size_t); zend_result (*delete)(dba_info *, char *, size_t); @@ -92,7 +92,7 @@ typedef struct dba_handler { #define DBA_CLOSE_FUNC(x) \ void dba_close_##x(dba_info *info) #define DBA_FETCH_FUNC(x) \ - char *dba_fetch_##x(dba_info *info, char *key, size_t keylen, int skip, size_t *newlen) + zend_string *dba_fetch_##x(dba_info *info, zend_string *key, int skip) #define DBA_UPDATE_FUNC(x) \ zend_result dba_update_##x(dba_info *info, char *key, size_t keylen, char *val, size_t vallen, int mode) #define DBA_EXISTS_FUNC(x) \ From 0eb0f644557c6bca984baf5680691fc0c02dff9e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 7 Nov 2021 01:10:38 +0000 Subject: [PATCH 0236/1346] Use zend_string for DBA update handler --- ext/dba/dba.c | 3 +-- ext/dba/dba_cdb.c | 2 +- ext/dba/dba_db1.c | 8 ++++---- ext/dba/dba_db2.c | 8 ++++---- ext/dba/dba_db3.c | 7 ++++--- ext/dba/dba_db4.c | 8 ++++---- ext/dba/dba_dbm.c | 10 +++++----- ext/dba/dba_flatfile.c | 14 ++++++++------ ext/dba/dba_gdbm.c | 14 ++++++++------ ext/dba/dba_inifile.c | 7 ++++--- ext/dba/dba_lmdb.c | 14 +++++++------- ext/dba/dba_ndbm.c | 8 ++++---- ext/dba/dba_qdbm.c | 4 ++-- ext/dba/dba_tcadb.c | 6 +++--- ext/dba/php_dba.h | 4 ++-- 15 files changed, 61 insertions(+), 56 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 39eec31e0f8dd..15b8caa545676 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -424,8 +424,7 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode) } } - RETVAL_BOOL(info->hnd->update(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str), - ZSTR_VAL(value), ZSTR_LEN(value), mode) == SUCCESS); + RETVAL_BOOL(info->hnd->update(info, key_str, value, mode) == SUCCESS); DBA_RELEASE_HT_KEY_CREATION(); } /* }}} */ diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index e7403a3ad61d2..ccda3b159f304 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -180,7 +180,7 @@ DBA_UPDATE_FUNC(cdb) return FAILURE; /* database was opened readonly */ if (!mode) return FAILURE; /* cdb_make doesn't know replace */ - if (cdb_make_add(&cdb->m, key, keylen, val, vallen) != -1) + if (cdb_make_add(&cdb->m, ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(val), ZSTR_LEN(val)) != -1) return SUCCESS; #endif return FAILURE; diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 58df65b774c9d..fed32c6a76f1b 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -104,11 +104,11 @@ DBA_UPDATE_FUNC(db1) DBT gval; DBT gkey; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); - gval.data = (char *) val; - gval.size = vallen; + gval.data = ZSTR_VAL(val); + gval.size = ZSTR_LEN(val); return dba->dbp->put(dba->dbp, &gkey, &gval, mode == 1 ? R_NOOVERWRITE : 0) != RET_SUCCESS ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index d6c5122e87109..f4c445a452135 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -103,11 +103,11 @@ DBA_UPDATE_FUNC(db2) DBT gval = {0}; DBT gkey = {0}; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); - gval.data = (char *) val; - gval.size = vallen; + gval.data = ZSTR_VAL(val); + gval.size = ZSTR_LEN(val); if (dba->dbp->put(dba->dbp, NULL, &gkey, &gval, mode == 1 ? DB_NOOVERWRITE : 0)) { diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 687dda3eab34e..23e4a995e667c 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -137,11 +137,12 @@ DBA_UPDATE_FUNC(db3) DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); - gval.data = (char *) val; - gval.size = vallen; + gval.data = ZSTR_VAL(val); + gval.size = ZSTR_LEN(val); if (!dba->dbp->put(dba->dbp, NULL, &gkey, &gval, mode == 1 ? DB_NOOVERWRITE : 0)) { diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index 0755bcf465f78..24dd8e27225f7 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -173,12 +173,12 @@ DBA_UPDATE_FUNC(db4) DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); - gval.data = (char *) val; - gval.size = vallen; + gval.data = ZSTR_VAL(val); + gval.size = ZSTR_LEN(val); if (!dba->dbp->put(dba->dbp, NULL, &gkey, &gval, mode == 1 ? DB_NOOVERWRITE : 0)) { diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 15355faea87cd..7b62483aa5cb4 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -101,18 +101,18 @@ DBA_UPDATE_FUNC(dbm) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); if (mode == 1) { /* insert */ gval = fetch(gkey); - if(gval.dptr) { + if (gval.dptr) { return FAILURE; } } - gval.dptr = (char *) val; - gval.dsize = vallen; + gval.dptr = ZSTR_VAL(val); + gval.dsize = ZSTR_LEN(val); return (store(gkey, gval) == -1 ? FAILURE : SUCCESS); } diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index caaf8c2dbd0f6..095b945c62e17 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -76,10 +76,10 @@ DBA_UPDATE_FUNC(flatfile) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; - gval.dptr = (char *) val; - gval.dsize = vallen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); + gval.dptr = ZSTR_VAL(val); + gval.dsize = ZSTR_LEN(val); switch(flatfile_store(dba, gkey, gval, mode==1 ? FLATFILE_INSERT : FLATFILE_REPLACE)) { case 0: @@ -87,10 +87,12 @@ DBA_UPDATE_FUNC(flatfile) case 1: return FAILURE; case -1: - php_error_docref1(NULL, key, E_WARNING, "Operation not possible"); + // TODO Check when this happens and confirm this can even happen + php_error_docref(NULL, E_WARNING, "Operation not possible"); return FAILURE; default: - php_error_docref2(NULL, key, val, E_WARNING, "Unknown return value"); + // TODO Convert this to an assertion failure + php_error_docref(NULL, E_WARNING, "Unknown return value"); return FAILURE; } } diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index e256088842bee..e89ee41db5e9f 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -91,10 +91,10 @@ DBA_UPDATE_FUNC(gdbm) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; - gval.dptr = (char *) val; - gval.dsize = vallen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); + gval.dptr = ZSTR_VAL(val); + gval.dsize = ZSTR_LEN(val); switch (gdbm_store(dba->dbf, gkey, gval, mode == 1 ? GDBM_INSERT : GDBM_REPLACE)) { case 0: @@ -102,10 +102,12 @@ DBA_UPDATE_FUNC(gdbm) case 1: return FAILURE; case -1: - php_error_docref2(NULL, key, val, E_WARNING, "%s", gdbm_strerror(gdbm_errno)); + // TODO Check when this happens and confirm this can even happen + php_error_docref(NULL, E_WARNING, "%s", gdbm_strerror(gdbm_errno)); return FAILURE; default: - php_error_docref2(NULL, key, val, E_WARNING, "Unknown return value"); + // TODO Convert this to an assertion failure + php_error_docref(NULL, E_WARNING, "Unknown return value"); return FAILURE; } } diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index 0db100079899e..e3373e3e771a6 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -79,9 +79,9 @@ DBA_UPDATE_FUNC(inifile) php_error_docref(NULL, E_WARNING, "No key specified"); return 0; } - ini_key = inifile_key_split((char*)key); /* keylen not needed here */ + ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */ - ini_val.value = val; + ini_val.value = ZSTR_VAL(val); if (mode == 1) { res = inifile_append(dba, &ini_key, &ini_val); @@ -91,7 +91,8 @@ DBA_UPDATE_FUNC(inifile) inifile_key_free(&ini_key); switch(res) { case -1: - php_error_docref1(NULL, key, E_WARNING, "Operation not possible"); + // TODO Check when this happens and confirm this can even happen + php_error_docref(NULL, E_WARNING, "Operation not possible"); return FAILURE; default: case 0: diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index d119980a97a25..db4264168536f 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -152,19 +152,19 @@ DBA_UPDATE_FUNC(lmdb) rc = mdb_txn_begin(LMDB_IT(env), NULL, 0, &LMDB_IT(txn)); if (rc) { - php_error_docref2(NULL, key, val, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); return FAILURE; } - k.mv_size = keylen; - k.mv_data = key; - v.mv_size = vallen; - v.mv_data = val; + k.mv_size = ZSTR_LEN(key); + k.mv_data = ZSTR_VAL(key); + v.mv_size = ZSTR_LEN(val); + v.mv_data = ZSTR_VAL(val); rc = mdb_put(LMDB_IT(txn), LMDB_IT(dbi), &k, &v, mode == 1 ? MDB_NOOVERWRITE : 0); if (rc) { if (MDB_KEYEXIST != rc) { - php_error_docref2(NULL, key, val, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); } mdb_txn_abort(LMDB_IT(txn)); return FAILURE; @@ -172,7 +172,7 @@ DBA_UPDATE_FUNC(lmdb) rc = mdb_txn_commit(LMDB_IT(txn)); if (rc) { - php_error_docref2(NULL, key, val, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); mdb_txn_abort(LMDB_IT(txn)); return FAILURE; } diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index 7453b9ed3448c..745c725692cb8 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -82,10 +82,10 @@ DBA_UPDATE_FUNC(ndbm) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; - gval.dptr = (char *) val; - gval.dsize = vallen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); + gval.dptr = ZSTR_VAL(val); + gval.dsize = ZSTR_LEN(val); if(!dbm_store(info->dbf, gkey, gval, mode == 1 ? DBM_INSERT : DBM_REPLACE)) return SUCCESS; diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index 000fe3f031c78..0e56757c73f2f 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -91,12 +91,12 @@ DBA_UPDATE_FUNC(qdbm) { dba_qdbm_data *dba = info->dbf; - if (dpput(dba->dbf, key, keylen, val, vallen, mode == 1 ? DP_DKEEP : DP_DOVER)) { + if (dpput(dba->dbf, ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(val), ZSTR_LEN(val), mode == 1 ? DP_DKEEP : DP_DOVER)) { return SUCCESS; } if (dpecode != DP_EKEEP) { - php_error_docref2(NULL, key, val, E_WARNING, "%s", dperrmsg(dpecode)); + php_error_docref(NULL, E_WARNING, "%s", dperrmsg(dpecode)); } return FAILURE; diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index 73791d62d9ccf..02449d991b0c8 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -104,18 +104,18 @@ DBA_UPDATE_FUNC(tcadb) if (mode == 1) { /* Insert */ - if (tcadbvsiz(dba->tcadb, key, keylen) > -1) { + if (tcadbvsiz(dba->tcadb, ZSTR_VAL(key), ZSTR_LEN(key)) > -1) { return FAILURE; } } - result = tcadbput(dba->tcadb, key, keylen, val, vallen); + result = tcadbput(dba->tcadb, ZSTR_VAL(key), ZSTR_LEN(key), ZSTR_VAL(val), ZSTR_LEN(val)); if (result) { return SUCCESS; } - php_error_docref2(NULL, key, val, E_WARNING, "Error updating data"); + php_error_docref(NULL, E_WARNING, "Error updating data"); return FAILURE; } diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index 4382da29699ac..feeb16b612d26 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -74,7 +74,7 @@ typedef struct dba_handler { zend_result (*open)(dba_info *, char **error); void (*close)(dba_info *); zend_string* (*fetch)(dba_info *, zend_string *, int); - zend_result (*update)(dba_info *, char *, size_t, char *, size_t, int); + zend_result (*update)(dba_info *, zend_string *, zend_string *, int); zend_result (*exists)(dba_info *, char *, size_t); zend_result (*delete)(dba_info *, char *, size_t); char* (*firstkey)(dba_info *, size_t *); @@ -94,7 +94,7 @@ typedef struct dba_handler { #define DBA_FETCH_FUNC(x) \ zend_string *dba_fetch_##x(dba_info *info, zend_string *key, int skip) #define DBA_UPDATE_FUNC(x) \ - zend_result dba_update_##x(dba_info *info, char *key, size_t keylen, char *val, size_t vallen, int mode) + zend_result dba_update_##x(dba_info *info, zend_string *key, zend_string *val, int mode) #define DBA_EXISTS_FUNC(x) \ zend_result dba_exists_##x(dba_info *info, char *key, size_t keylen) #define DBA_DELETE_FUNC(x) \ From cd98e4658354356d6a4dd4990130ce98b7feb74c Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 7 Nov 2021 01:20:06 +0000 Subject: [PATCH 0237/1346] Use zend_string for DBA exist handler --- ext/dba/dba.c | 2 +- ext/dba/dba_cdb.c | 2 +- ext/dba/dba_db1.c | 4 ++-- ext/dba/dba_db2.c | 4 ++-- ext/dba/dba_db3.c | 3 ++- ext/dba/dba_db4.c | 4 ++-- ext/dba/dba_dbm.c | 6 +++--- ext/dba/dba_flatfile.c | 4 ++-- ext/dba/dba_gdbm.c | 4 ++-- ext/dba/dba_inifile.c | 2 +- ext/dba/dba_lmdb.c | 8 ++++---- ext/dba/dba_ndbm.c | 6 +++--- ext/dba/dba_qdbm.c | 2 +- ext/dba/dba_tcadb.c | 2 +- ext/dba/php_dba.h | 4 ++-- 15 files changed, 29 insertions(+), 28 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 15b8caa545676..5841da8df0a18 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -912,7 +912,7 @@ PHP_FUNCTION(dba_exists) } } - RETVAL_BOOL(info->hnd->exists(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str)) == SUCCESS); + RETVAL_BOOL(info->hnd->exists(info, key_str) == SUCCESS); DBA_RELEASE_HT_KEY_CREATION(); } /* }}} */ diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index ccda3b159f304..780f9f3b44266 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -194,7 +194,7 @@ DBA_EXISTS_FUNC(cdb) if (cdb->make) return FAILURE; /* database was opened writeonly */ #endif - if (php_cdb_find(&cdb->c, key, keylen) == 1) + if (php_cdb_find(&cdb->c, ZSTR_VAL(key), ZSTR_LEN(key)) == 1) return SUCCESS; return FAILURE; } diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index fed32c6a76f1b..ac1ee89e517c4 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -119,8 +119,8 @@ DBA_EXISTS_FUNC(db1) DBT gval; DBT gkey; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); return dba->dbp->get(dba->dbp, &gkey, &gval, 0) != RET_SUCCESS ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index f4c445a452135..03be0b8071a50 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -122,8 +122,8 @@ DBA_EXISTS_FUNC(db2) DBT gval = {0}; DBT gkey = {0}; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); if (dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { return FAILURE; diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 23e4a995e667c..a42302a1afb25 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -158,7 +158,8 @@ DBA_EXISTS_FUNC(db3) DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); if (!dba->dbp->get(dba->dbp, NULL, &gkey, &gval, 0)) { diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index 24dd8e27225f7..303381e0407c9 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -194,8 +194,8 @@ DBA_EXISTS_FUNC(db4) DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); memset(&gval, 0, sizeof(gval)); diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 7b62483aa5cb4..d211bff48935b 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -122,11 +122,11 @@ DBA_EXISTS_FUNC(dbm) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); gval = fetch(gkey); - if(gval.dptr) { + if (gval.dptr) { return SUCCESS; } return FAILURE; diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index 095b945c62e17..185e9931797f2 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -103,8 +103,8 @@ DBA_EXISTS_FUNC(flatfile) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); gval = flatfile_fetch(dba, gkey); if (gval.dptr) { efree(gval.dptr); diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index e89ee41db5e9f..c24bc1d282787 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -117,8 +117,8 @@ DBA_EXISTS_FUNC(gdbm) dba_gdbm_data *dba = info->dbf; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); return gdbm_exists(dba->dbf, gkey) ? SUCCESS : FAILURE; } diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index e3373e3e771a6..6cea7fa568810 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -112,7 +112,7 @@ DBA_EXISTS_FUNC(inifile) php_error_docref(NULL, E_WARNING, "No key specified"); return 0; } - ini_key = inifile_key_split((char*)key); /* keylen not needed here */ + ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */ ini_val = inifile_fetch(dba, &ini_key, 0); inifile_key_free(&ini_key); diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index db4264168536f..f6df47236fa79 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -191,17 +191,17 @@ DBA_EXISTS_FUNC(lmdb) rc = mdb_txn_begin(LMDB_IT(env), NULL, MDB_RDONLY, &LMDB_IT(txn)); } if (rc) { - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); return FAILURE; } - k.mv_size = keylen; - k.mv_data = key; + k.mv_size = ZSTR_LEN(key); + k.mv_data = ZSTR_VAL(key); rc = mdb_get(LMDB_IT(txn), LMDB_IT(dbi), &k, &v); if (rc) { if (MDB_NOTFOUND != rc) { - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); } mdb_txn_abort(LMDB_IT(txn)); return FAILURE; diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index 745c725692cb8..dc1fb0dab2a8c 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -97,10 +97,10 @@ DBA_EXISTS_FUNC(ndbm) datum gval; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); gval = dbm_fetch(info->dbf, gkey); - if(gval.dptr) { + if (gval.dptr) { return SUCCESS; } return FAILURE; diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index 0e56757c73f2f..ff484fe7f3a7d 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -107,7 +107,7 @@ DBA_EXISTS_FUNC(qdbm) dba_qdbm_data *dba = info->dbf; char *value; - value = dpget(dba->dbf, key, keylen, 0, -1, NULL); + value = dpget(dba->dbf, ZSTR_VAL(key), ZSTR_LEN(key), 0, -1, NULL); if (value) { free(value); return SUCCESS; diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index 02449d991b0c8..00d73a89f1d05 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -125,7 +125,7 @@ DBA_EXISTS_FUNC(tcadb) char *value; int value_len; - value = tcadbget(dba->tcadb, key, keylen, &value_len); + value = tcadbget(dba->tcadb, ZSTR_VAL(key), ZSTR_LEN(key), &value_len); if (value) { tcfree(value); return SUCCESS; diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index feeb16b612d26..c181f87f88889 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -75,7 +75,7 @@ typedef struct dba_handler { void (*close)(dba_info *); zend_string* (*fetch)(dba_info *, zend_string *, int); zend_result (*update)(dba_info *, zend_string *, zend_string *, int); - zend_result (*exists)(dba_info *, char *, size_t); + zend_result (*exists)(dba_info *, zend_string *); zend_result (*delete)(dba_info *, char *, size_t); char* (*firstkey)(dba_info *, size_t *); char* (*nextkey)(dba_info *, size_t *); @@ -96,7 +96,7 @@ typedef struct dba_handler { #define DBA_UPDATE_FUNC(x) \ zend_result dba_update_##x(dba_info *info, zend_string *key, zend_string *val, int mode) #define DBA_EXISTS_FUNC(x) \ - zend_result dba_exists_##x(dba_info *info, char *key, size_t keylen) + zend_result dba_exists_##x(dba_info *info, zend_string *key) #define DBA_DELETE_FUNC(x) \ zend_result dba_delete_##x(dba_info *info, char *key, size_t keylen) #define DBA_FIRSTKEY_FUNC(x) \ From 96ff88ec3897225a87a5c76cc4aaaa96b5ab68bc Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 7 Nov 2021 01:24:32 +0000 Subject: [PATCH 0238/1346] Use zend_string for DBA delete handler --- ext/dba/dba.c | 2 +- ext/dba/dba_db1.c | 4 ++-- ext/dba/dba_db2.c | 4 ++-- ext/dba/dba_db3.c | 3 ++- ext/dba/dba_db4.c | 4 ++-- ext/dba/dba_dbm.c | 4 ++-- ext/dba/dba_flatfile.c | 4 ++-- ext/dba/dba_gdbm.c | 4 ++-- ext/dba/dba_inifile.c | 2 +- ext/dba/dba_lmdb.c | 10 +++++----- ext/dba/dba_ndbm.c | 4 ++-- ext/dba/dba_qdbm.c | 2 +- ext/dba/dba_tcadb.c | 2 +- ext/dba/php_dba.h | 4 ++-- 14 files changed, 27 insertions(+), 26 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 5841da8df0a18..0da6c15bd270f 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -1094,7 +1094,7 @@ PHP_FUNCTION(dba_delete) } } - RETVAL_BOOL(info->hnd->delete(info, ZSTR_VAL(key_str), ZSTR_LEN(key_str)) == SUCCESS); + RETVAL_BOOL(info->hnd->delete(info, key_str) == SUCCESS); DBA_RELEASE_HT_KEY_CREATION(); } /* }}} */ diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index ac1ee89e517c4..50a26737a6f62 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -130,8 +130,8 @@ DBA_DELETE_FUNC(db1) dba_db1_data *dba = info->dbf; DBT gkey; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); return dba->dbp->del(dba->dbp, &gkey, 0) != RET_SUCCESS ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index 03be0b8071a50..c4108399546f8 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -136,8 +136,8 @@ DBA_DELETE_FUNC(db2) dba_db2_data *dba = info->dbf; DBT gkey = {0}; - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index a42302a1afb25..d98d358aaecf3 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -174,7 +174,8 @@ DBA_DELETE_FUNC(db3) DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index 303381e0407c9..a5226c521e368 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -218,8 +218,8 @@ DBA_DELETE_FUNC(db4) DBT gkey; memset(&gkey, 0, sizeof(gkey)); - gkey.data = (char *) key; - gkey.size = keylen; + gkey.data = ZSTR_VAL(key); + gkey.size = ZSTR_LEN(key); return dba->dbp->del(dba->dbp, NULL, &gkey, 0) ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index d211bff48935b..e3dc7c358d1aa 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -136,8 +136,8 @@ DBA_DELETE_FUNC(dbm) { datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); return(delete(gkey) == -1 ? FAILURE : SUCCESS); } diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index 185e9931797f2..6ce0db53eaf70 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -118,8 +118,8 @@ DBA_DELETE_FUNC(flatfile) flatfile *dba = info->dbf; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); return(flatfile_delete(dba, gkey) == -1 ? FAILURE : SUCCESS); } diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index c24bc1d282787..0ebddb7f8369c 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -128,8 +128,8 @@ DBA_DELETE_FUNC(gdbm) dba_gdbm_data *dba = info->dbf; datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); return gdbm_delete(dba->dbf, gkey) == -1 ? FAILURE : SUCCESS; } diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index 6cea7fa568810..33e4c291d3eb0 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -134,7 +134,7 @@ DBA_DELETE_FUNC(inifile) php_error_docref(NULL, E_WARNING, "No key specified"); return 0; } - ini_key = inifile_key_split((char*)key); /* keylen not needed here */ + ini_key = inifile_key_split(ZSTR_VAL(key)); /* keylen not needed here */ res = inifile_delete_ex(dba, &ini_key, &found); diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index f6df47236fa79..9aa5c9916423c 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -223,25 +223,25 @@ DBA_DELETE_FUNC(lmdb) rc = mdb_txn_begin(LMDB_IT(env), NULL, 0, &LMDB_IT(txn)); if (rc) { - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); return FAILURE; } - k.mv_size = keylen; - k.mv_data = key; + k.mv_size = ZSTR_LEN(key); + k.mv_data = ZSTR_VAL(key); rc = mdb_del(LMDB_IT(txn), LMDB_IT(dbi), &k, NULL); if (!rc) { rc = mdb_txn_commit(LMDB_IT(txn)); if (rc) { - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); mdb_txn_abort(LMDB_IT(txn)); return FAILURE; } return SUCCESS; } - php_error_docref1(NULL, key, E_WARNING, "%s", mdb_strerror(rc)); + php_error_docref(NULL, E_WARNING, "%s", mdb_strerror(rc)); return FAILURE; } diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index dc1fb0dab2a8c..fd92e29acabed 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -110,8 +110,8 @@ DBA_DELETE_FUNC(ndbm) { datum gkey; - gkey.dptr = (char *) key; - gkey.dsize = keylen; + gkey.dptr = ZSTR_VAL(key); + gkey.dsize = ZSTR_LEN(key); return(dbm_delete(info->dbf, gkey) == -1 ? FAILURE : SUCCESS); } diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index ff484fe7f3a7d..1e791430993f2 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -120,7 +120,7 @@ DBA_DELETE_FUNC(qdbm) { dba_qdbm_data *dba = info->dbf; - return dpout(dba->dbf, key, keylen) ? SUCCESS : FAILURE; + return dpout(dba->dbf, ZSTR_VAL(key), ZSTR_LEN(key)) ? SUCCESS : FAILURE; } DBA_FIRSTKEY_FUNC(qdbm) diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index 00d73a89f1d05..efd9458c63e60 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -138,7 +138,7 @@ DBA_DELETE_FUNC(tcadb) { dba_tcadb_data *dba = info->dbf; - return tcadbout(dba->tcadb, key, keylen) ? SUCCESS : FAILURE; + return tcadbout(dba->tcadb, ZSTR_VAL(key), ZSTR_LEN(key)) ? SUCCESS : FAILURE; } DBA_FIRSTKEY_FUNC(tcadb) diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index c181f87f88889..8c83b5b136c54 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -76,7 +76,7 @@ typedef struct dba_handler { zend_string* (*fetch)(dba_info *, zend_string *, int); zend_result (*update)(dba_info *, zend_string *, zend_string *, int); zend_result (*exists)(dba_info *, zend_string *); - zend_result (*delete)(dba_info *, char *, size_t); + zend_result (*delete)(dba_info *, zend_string *); char* (*firstkey)(dba_info *, size_t *); char* (*nextkey)(dba_info *, size_t *); zend_result (*optimize)(dba_info *); @@ -98,7 +98,7 @@ typedef struct dba_handler { #define DBA_EXISTS_FUNC(x) \ zend_result dba_exists_##x(dba_info *info, zend_string *key) #define DBA_DELETE_FUNC(x) \ - zend_result dba_delete_##x(dba_info *info, char *key, size_t keylen) + zend_result dba_delete_##x(dba_info *info, zend_string *key) #define DBA_FIRSTKEY_FUNC(x) \ char *dba_firstkey_##x(dba_info *info, size_t *newlen) #define DBA_NEXTKEY_FUNC(x) \ From d71d0cf0bb14c706e8795bd9e56777ad23fd9061 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 7 Nov 2021 20:15:54 +0000 Subject: [PATCH 0239/1346] Use zend_string for DBA first/next key handlers --- ext/dba/dba.c | 16 ++++------------ ext/dba/dba_cdb.c | 22 ++++++++++------------ ext/dba/dba_db1.c | 6 ++---- ext/dba/dba_db2.c | 9 ++++----- ext/dba/dba_db3.c | 9 +++------ ext/dba/dba_db4.c | 10 ++++------ ext/dba/dba_dbm.c | 24 ++++++++++++------------ ext/dba/dba_flatfile.c | 10 ++-------- ext/dba/dba_gdbm.c | 20 +++++++++----------- ext/dba/dba_inifile.c | 10 ++++++---- ext/dba/dba_lmdb.c | 14 ++++++-------- ext/dba/dba_ndbm.c | 16 ++++++---------- ext/dba/dba_qdbm.c | 16 ++++++++-------- ext/dba/dba_tcadb.c | 20 ++++++++------------ ext/dba/php_dba.h | 8 ++++---- 15 files changed, 88 insertions(+), 122 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 0da6c15bd270f..b01d11e165f61 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -1020,8 +1020,6 @@ PHP_FUNCTION(dba_key_split) /* {{{ Resets the internal key pointer and returns the first key */ PHP_FUNCTION(dba_firstkey) { - char *fkey; - size_t len; zval *id; dba_info *info = NULL; @@ -1031,12 +1029,10 @@ PHP_FUNCTION(dba_firstkey) DBA_FETCH_RESOURCE(info, id); - fkey = info->hnd->firstkey(info, &len); + zend_string *fkey = info->hnd->firstkey(info); if (fkey) { - RETVAL_STRINGL(fkey, len); - efree(fkey); - return; + RETURN_STR(fkey); } RETURN_FALSE; @@ -1046,8 +1042,6 @@ PHP_FUNCTION(dba_firstkey) /* {{{ Returns the next key */ PHP_FUNCTION(dba_nextkey) { - char *nkey; - size_t len; zval *id; dba_info *info = NULL; @@ -1057,12 +1051,10 @@ PHP_FUNCTION(dba_nextkey) DBA_FETCH_RESOURCE(info, id); - nkey = info->hnd->nextkey(info, &len); + zend_string *nkey = info->hnd->nextkey(info); if (nkey) { - RETVAL_STRINGL(nkey, len); - efree(nkey); - return; + RETURN_STR(nkey); } RETURN_FALSE; diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index 780f9f3b44266..6b5013961f760 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -241,7 +241,7 @@ DBA_FIRSTKEY_FUNC(cdb) CDB_INFO; uint32 klen, dlen; char buf[8]; - char *key; + zend_string *key; #if DBA_CDB_BUILTIN if (cdb->make) @@ -262,13 +262,12 @@ DBA_FIRSTKEY_FUNC(cdb) uint32_unpack(buf, &klen); uint32_unpack(buf + 4, &dlen); - key = safe_emalloc(klen, 1, 1); - if (cdb_file_read(cdb->file, key, klen) < klen) { - efree(key); + key = zend_string_alloc(klen, /* persistent */ false); + if (cdb_file_read(cdb->file, ZSTR_VAL(key), klen) < klen) { + zend_string_release_ex(key, /* persistent */ false); key = NULL; } else { - key[klen] = '\0'; - if (newlen) *newlen = klen; + ZSTR_VAL(key)[klen] = 0; } /* header + klenlen + dlenlen + klen + dlen */ @@ -282,7 +281,7 @@ DBA_NEXTKEY_FUNC(cdb) CDB_INFO; uint32 klen, dlen; char buf[8]; - char *key; + zend_string *key; #if DBA_CDB_BUILTIN if (cdb->make) @@ -294,13 +293,12 @@ DBA_NEXTKEY_FUNC(cdb) uint32_unpack(buf, &klen); uint32_unpack(buf + 4, &dlen); - key = safe_emalloc(klen, 1, 1); - if (cdb_file_read(cdb->file, key, klen) < klen) { - efree(key); + key = zend_string_alloc(klen, /* persistent */ false); + if (cdb_file_read(cdb->file, ZSTR_VAL(key), klen) < klen) { + zend_string_release_ex(key, /* persistent */ false); key = NULL; } else { - key[klen] = '\0'; - if (newlen) *newlen = klen; + ZSTR_VAL(key)[klen] = 0; } cdb->pos += 8 + klen + dlen; diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 50a26737a6f62..6f0f402b8d350 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -146,8 +146,7 @@ DBA_FIRSTKEY_FUNC(db1) memset(&gval, 0, sizeof(gval)); if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_FIRST) == RET_SUCCESS) { - if (newlen) *newlen = gkey.size; - return estrndup(gkey.data, gkey.size); + return zend_string_init(gkey.data, gkey.size, /* persistent */ false); } return NULL; } @@ -162,8 +161,7 @@ DBA_NEXTKEY_FUNC(db1) memset(&gval, 0, sizeof(gval)); if (dba->dbp->seq(dba->dbp, &gkey, &gval, R_NEXT) == RET_SUCCESS) { - if (newlen) *newlen = gkey.size; - return estrndup(gkey.data, gkey.size); + return zend_string_init(gkey.data, gkey.size, /* persistent */ false); } return NULL; } diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index c4108399546f8..373464f80ec9b 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -159,8 +159,7 @@ DBA_FIRSTKEY_FUNC(db2) return NULL; } - /* we should introduce something like PARAM_PASSTHRU... */ - return dba_nextkey_db2(info, newlen); + return dba_nextkey_db2(info); } DBA_NEXTKEY_FUNC(db2) @@ -169,11 +168,11 @@ DBA_NEXTKEY_FUNC(db2) DBT gkey = {0}, gval = {0}; if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) - || !gkey.data) + || !gkey.data) { return NULL; + } - if (newlen) *newlen = gkey.size; - return estrndup(gkey.data, gkey.size); + return zend_string_init(gkey.data, gkey.size, /* persistent */ false); } DBA_OPTIMIZE_FUNC(db2) diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index d98d358aaecf3..8d25c7463ac84 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -193,27 +193,24 @@ DBA_FIRSTKEY_FUNC(db3) return NULL; } - /* we should introduce something like PARAM_PASSTHRU... */ - return dba_nextkey_db3(info, newlen); + return dba_nextkey_db3(info); } DBA_NEXTKEY_FUNC(db3) { dba_db3_data *dba = info->dbf; DBT gkey, gval; - char *nkey = NULL; memset(&gkey, 0, sizeof(gkey)); memset(&gval, 0, sizeof(gval)); if (dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) { if (gkey.data) { - nkey = estrndup(gkey.data, gkey.size); - if (newlen) *newlen = gkey.size; + return zend_string_init(gkey.data, gkey.size, /* persistent */ false); } } - return nkey; + return NULL; } DBA_OPTIMIZE_FUNC(db3) diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index a5226c521e368..3e9aaa13d4300 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -237,15 +237,14 @@ DBA_FIRSTKEY_FUNC(db4) return NULL; } - /* we should introduce something like PARAM_PASSTHRU... */ - return dba_nextkey_db4(info, newlen); + return dba_nextkey_db4(info); } DBA_NEXTKEY_FUNC(db4) { dba_db4_data *dba = info->dbf; DBT gkey, gval; - char *nkey = NULL; + zend_string *key = NULL; memset(&gkey, 0, sizeof(gkey)); memset(&gval, 0, sizeof(gval)); @@ -256,8 +255,7 @@ DBA_NEXTKEY_FUNC(db4) } if (dba->cursor && dba->cursor->c_get(dba->cursor, &gkey, &gval, DB_NEXT) == 0) { if (gkey.data) { - nkey = estrndup(gkey.data, gkey.size); - if (newlen) *newlen = gkey.size; + key = zend_string_init(gkey.data, gkey.size, /* persistent */ false); } if (info->flags & DBA_PERSISTENT) { if (gkey.data) { @@ -269,7 +267,7 @@ DBA_NEXTKEY_FUNC(db4) } } - return nkey; + return key; } DBA_OPTIMIZE_FUNC(db4) diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index e3dc7c358d1aa..316398e6ac736 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -145,15 +145,15 @@ DBA_FIRSTKEY_FUNC(dbm) { dba_dbm_data *dba = info->dbf; datum gkey; - char *key = NULL; + zend_string *key = NULL; gkey = firstkey(); - if(gkey.dptr) { - if(newlen) *newlen = gkey.dsize; - key = estrndup(gkey.dptr, gkey.dsize); + if (gkey.dptr) { + key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false); dba->nextkey = gkey; - } else + } else { dba->nextkey.dptr = NULL; + } return key; } @@ -161,18 +161,18 @@ DBA_NEXTKEY_FUNC(dbm) { dba_dbm_data *dba = info->dbf; datum gkey; - char *nkey = NULL; + zend_string *key = NULL; - if(!dba->nextkey.dptr) return NULL; + if (!dba->nextkey.dptr) { return NULL; } gkey = nextkey(dba->nextkey); - if(gkey.dptr) { - if(newlen) *newlen = gkey.dsize; - nkey = estrndup(gkey.dptr, gkey.dsize); + if (gkey.dptr) { + key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false); dba->nextkey = gkey; - } else + } else { dba->nextkey.dptr = NULL; - return nkey; + } + return key; } DBA_OPTIMIZE_FUNC(dbm) diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index 6ce0db53eaf70..b631fe9352baa 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -132,10 +132,7 @@ DBA_FIRSTKEY_FUNC(flatfile) } dba->nextkey = flatfile_firstkey(dba); if (dba->nextkey.dptr) { - if (newlen) { - *newlen = dba->nextkey.dsize; - } - return estrndup(dba->nextkey.dptr, dba->nextkey.dsize); + return zend_string_init(dba->nextkey.dptr, dba->nextkey.dsize, /* persistent */ false); } return NULL; } @@ -153,10 +150,7 @@ DBA_NEXTKEY_FUNC(flatfile) } dba->nextkey = flatfile_nextkey(dba); if (dba->nextkey.dptr) { - if (newlen) { - *newlen = dba->nextkey.dsize; - } - return estrndup(dba->nextkey.dptr, dba->nextkey.dsize); + return zend_string_init(dba->nextkey.dptr, dba->nextkey.dsize, /* persistent */ false); } return NULL; } diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index 0ebddb7f8369c..1a47d1d708aa4 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -138,16 +138,15 @@ DBA_FIRSTKEY_FUNC(gdbm) { dba_gdbm_data *dba = info->dbf; datum gkey; - char *key = NULL; + zend_string *key = NULL; - if(dba->nextkey.dptr) { + if (dba->nextkey.dptr) { free(dba->nextkey.dptr); } gkey = gdbm_firstkey(dba->dbf); - if(gkey.dptr) { - key = estrndup(gkey.dptr, gkey.dsize); - if(newlen) *newlen = gkey.dsize; + if (gkey.dptr) { + key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false); dba->nextkey = gkey; } else { dba->nextkey.dptr = NULL; @@ -158,21 +157,20 @@ DBA_FIRSTKEY_FUNC(gdbm) DBA_NEXTKEY_FUNC(gdbm) { dba_gdbm_data *dba = info->dbf; - char *nkey = NULL; + zend_string *key = NULL; datum gkey; - if(!dba->nextkey.dptr) return NULL; + if(!dba->nextkey.dptr) { return NULL; } gkey = gdbm_nextkey(dba->dbf, dba->nextkey); free(dba->nextkey.dptr); - if(gkey.dptr) { - nkey = estrndup(gkey.dptr, gkey.dsize); - if(newlen) *newlen = gkey.dsize; + if (gkey.dptr) { + key = zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false); dba->nextkey = gkey; } else { dba->nextkey.dptr = NULL; } - return nkey; + return key; } DBA_OPTIMIZE_FUNC(gdbm) diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index 33e4c291d3eb0..dd0bc30f3d349 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -148,8 +148,9 @@ DBA_FIRSTKEY_FUNC(inifile) if (inifile_firstkey(dba)) { char *result = inifile_key_string(&dba->curr.key); - *newlen = strlen(result); - return result; + zend_string *key = zend_string_init(result, strlen(result), /* persistent */ false); + efree(result); + return key; } else { return NULL; } @@ -165,8 +166,9 @@ DBA_NEXTKEY_FUNC(inifile) if (inifile_nextkey(dba)) { char *result = inifile_key_string(&dba->curr.key); - *newlen = strlen(result); - return result; + zend_string *key = zend_string_init(result, strlen(result), /* persistent */ false); + efree(result); + return key; } else { return NULL; } diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index 9aa5c9916423c..b7c8151204d5c 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -250,7 +250,7 @@ DBA_FIRSTKEY_FUNC(lmdb) { int rc; MDB_val k, v; - char *ret = NULL; + zend_string *ret = NULL; rc = mdb_txn_begin(LMDB_IT(env), NULL, MDB_RDONLY, &LMDB_IT(txn)); if (rc) { @@ -276,9 +276,8 @@ DBA_FIRSTKEY_FUNC(lmdb) return NULL; } - if(k.mv_data) { - if(newlen) *newlen = k.mv_size; - ret = estrndup(k.mv_data, k.mv_size); + if (k.mv_data) { + ret = zend_string_init(k.mv_data, k.mv_size, /* persistent */ false); } mdb_txn_reset(LMDB_IT(txn)); @@ -290,7 +289,7 @@ DBA_NEXTKEY_FUNC(lmdb) { int rc; MDB_val k, v; - char *ret = NULL; + zend_string *ret = NULL; rc = mdb_txn_renew(LMDB_IT(txn)); if (rc) { @@ -309,9 +308,8 @@ DBA_NEXTKEY_FUNC(lmdb) return NULL; } - if(k.mv_data) { - if(newlen) *newlen = k.mv_size; - ret = estrndup(k.mv_data, k.mv_size); + if (k.mv_data) { + ret = zend_string_init(k.mv_data, k.mv_size, /* persistent */ false); } mdb_txn_reset(LMDB_IT(txn)); diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index fd92e29acabed..a97d3595a0cda 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -118,27 +118,23 @@ DBA_DELETE_FUNC(ndbm) DBA_FIRSTKEY_FUNC(ndbm) { datum gkey; - char *key = NULL; gkey = dbm_firstkey(info->dbf); - if(gkey.dptr) { - if(newlen) *newlen = gkey.dsize; - key = estrndup(gkey.dptr, gkey.dsize); + if (gkey.dptr) { + return zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false); } - return key; + return NULL; } DBA_NEXTKEY_FUNC(ndbm) { datum gkey; - char *nkey = NULL; gkey = dbm_nextkey(info->dbf); - if(gkey.dptr) { - if(newlen) *newlen = gkey.dsize; - nkey = estrndup(gkey.dptr, gkey.dsize); + if (gkey.dptr) { + return zend_string_init(gkey.dptr, gkey.dsize, /* persistent */ false); } - return nkey; + return NULL; } DBA_OPTIMIZE_FUNC(ndbm) diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index 1e791430993f2..129b40915fab3 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -127,34 +127,34 @@ DBA_FIRSTKEY_FUNC(qdbm) { dba_qdbm_data *dba = info->dbf; int value_size; - char *value, *new = NULL; + char *value; + zend_string *key = NULL; dpiterinit(dba->dbf); value = dpiternext(dba->dbf, &value_size); if (value) { - if (newlen) *newlen = value_size; - new = estrndup(value, value_size); + key = zend_string_init(value, value_size, /* persistent */ false); free(value); } - return new; + return key; } DBA_NEXTKEY_FUNC(qdbm) { dba_qdbm_data *dba = info->dbf; int value_size; - char *value, *new = NULL; + char *value; + zend_string *key = NULL; value = dpiternext(dba->dbf, &value_size); if (value) { - if (newlen) *newlen = value_size; - new = estrndup(value, value_size); + key = zend_string_init(value, value_size, /* persistent */ false); free(value); } - return new; + return key; } DBA_OPTIMIZE_FUNC(qdbm) diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index efd9458c63e60..4d0d65bf91529 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -145,38 +145,34 @@ DBA_FIRSTKEY_FUNC(tcadb) { dba_tcadb_data *dba = info->dbf; int value_size; - char *value, *new = NULL; + char *value; + zend_string *key = NULL; tcadbiterinit(dba->tcadb); value = tcadbiternext(dba->tcadb, &value_size); if (value) { - if (newlen) { - *newlen = value_size; - } - new = estrndup(value, value_size); + key = zend_string_init(value, value_size, /* persistent */ false); tcfree(value); } - return new; + return key; } DBA_NEXTKEY_FUNC(tcadb) { dba_tcadb_data *dba = info->dbf; int value_size; - char *value, *new = NULL; + char *value; + zend_string *key = NULL; value = tcadbiternext(dba->tcadb, &value_size); if (value) { - if (newlen) { - *newlen = value_size; - } - new = estrndup(value, value_size); + key = zend_string_init(value, value_size, /* persistent */ false); tcfree(value); } - return new; + return key; } DBA_OPTIMIZE_FUNC(tcadb) diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index 8c83b5b136c54..a2ad7fad60466 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -77,8 +77,8 @@ typedef struct dba_handler { zend_result (*update)(dba_info *, zend_string *, zend_string *, int); zend_result (*exists)(dba_info *, zend_string *); zend_result (*delete)(dba_info *, zend_string *); - char* (*firstkey)(dba_info *, size_t *); - char* (*nextkey)(dba_info *, size_t *); + zend_string* (*firstkey)(dba_info *); + zend_string* (*nextkey)(dba_info *); zend_result (*optimize)(dba_info *); zend_result (*sync)(dba_info *); char* (*info)(struct dba_handler *hnd, dba_info *); @@ -100,9 +100,9 @@ typedef struct dba_handler { #define DBA_DELETE_FUNC(x) \ zend_result dba_delete_##x(dba_info *info, zend_string *key) #define DBA_FIRSTKEY_FUNC(x) \ - char *dba_firstkey_##x(dba_info *info, size_t *newlen) + zend_string *dba_firstkey_##x(dba_info *info) #define DBA_NEXTKEY_FUNC(x) \ - char *dba_nextkey_##x(dba_info *info, size_t *newlen) + zend_string *dba_nextkey_##x(dba_info *info) #define DBA_OPTIMIZE_FUNC(x) \ zend_result dba_optimize_##x(dba_info *info) #define DBA_SYNC_FUNC(x) \ From 9cd7f41fac87a83766d54d73dd08ccb5ee11176e Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Fri, 12 Nov 2021 17:59:22 +1100 Subject: [PATCH 0240/1346] Add oci8.prefetch_lob_size --- NEWS | 3 + UPGRADING | 5 + ext/oci8/oci8.c | 1 + ext/oci8/oci8_statement.c | 22 ++--- ext/oci8/package.xml | 25 ++++- ext/oci8/php_oci8.h | 2 +- ext/oci8/php_oci8_int.h | 2 +- ext/oci8/tests/driver_name.phpt | 6 +- ext/oci8/tests/lob_prefetch.phpt | 163 +++++++++++++++++++++++++++++++ php.ini-development | 11 ++- php.ini-production | 9 +- 11 files changed, 226 insertions(+), 23 deletions(-) create mode 100755 ext/oci8/tests/lob_prefetch.phpt diff --git a/NEWS b/NEWS index d0d6ac06a9b3c..341b29b808809 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ PHP NEWS - Core: . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) +- OCI8: + . Added oci8.prefetch_lob_size directive to tune LOB query performance + - Zip: . add ZipArchive::clearError() method . add ZipArchive::getStreamName() method diff --git a/UPGRADING b/UPGRADING index c19d4f74324a7..e3c3eed59765f 100644 --- a/UPGRADING +++ b/UPGRADING @@ -27,6 +27,11 @@ PHP 8.2 UPGRADE NOTES . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective HTTP method in curl_getinfo() return value. +- OCI8: + . Added an oci8.prefetch_lob_size directive to tune LOB query performance + by reducing the number of round-trips between PHP and Oracle Database when + fetching LOBS. This is usable with Oracle Database 12.2 or later. + - PCRE: . Added support for the "n" (NO_AUTO_CAPTURE) modifier, which makes simple `(xyz)` groups non-capturing. Only named groups like `(?xyz)` are diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 8c71d5746218a..8efb04ea0f629 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -174,6 +174,7 @@ PHP_INI_BEGIN() #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) STD_PHP_INI_BOOLEAN("oci8.events", "0", PHP_INI_SYSTEM, OnUpdateBool, events, zend_oci_globals, oci_globals) #endif + STD_PHP_INI_ENTRY( "oci8.prefetch_lob_size", "0", PHP_INI_ALL, OnUpdateLong, prefetch_lob_size, zend_oci_globals, oci_globals) PHP_INI_END() /* }}} */ diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index e76f8a54002e2..5ee04a6168e9e 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -359,7 +359,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows) if (errstatus == OCI_SUCCESS_WITH_INFO || errstatus == OCI_SUCCESS) { statement->has_data = 1; - /* do the stuff needed for OCIDefineByName */ + /* do the stuff needed for OCIDefineByPos */ for (i = 0; i < statement->ncolumns; i++) { column = php_oci_statement_get_column(statement, i + 1, NULL, 0); if (column == NULL) { @@ -794,7 +794,6 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode) OCI_DYNAMIC_FETCH /* IN mode (OCI_DEFAULT, OCI_DYNAMIC_FETCH) */ ) ); - } else { PHP_OCI_CALL_RETURN(errstatus, OCIDefineByPos, @@ -821,12 +820,19 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode) return 1; } - /* additional OCIDefineDynamic() call */ + /* additional define setup */ switch (outcol->data_type) { - case SQLT_RSET: - case SQLT_RDD: case SQLT_BLOB: case SQLT_CLOB: + if (OCI_G(prefetch_lob_size) > 0) { + int get_lob_len = 1; /* == true */ + ub4 prefetch_size = OCI_G(prefetch_lob_size); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &get_lob_len, 0, OCI_ATTR_LOBPREFETCH_LENGTH, statement->err)); + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &prefetch_size, 0, OCI_ATTR_LOBPREFETCH_SIZE, statement->err)); + } + ZEND_FALLTHROUGH; + case SQLT_RSET: + case SQLT_RDD: case SQLT_BFILE: PHP_OCI_CALL_RETURN(errstatus, OCIDefineDynamic, @@ -1483,12 +1489,6 @@ sb4 php_oci_bind_out_callback( ZVAL_STRINGL(val, p, PHP_OCI_PIECE_SIZE); efree(p); } -#if 0 - Z_STRLEN_P(val) = PHP_OCI_PIECE_SIZE; /* 64K-1 is max XXX */ - Z_STRVAL_P(val) = ecalloc(1, Z_STRLEN_P(val) + 1); - /* XXX is this right? */ - ZVAL_STRINGL(val, NULL, Z_STRLEN(val) + 1); -#endif /* XXX we assume that zend-zval len has 4 bytes */ *alenpp = (ub4*) &Z_STRLEN_P(val); diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 9134a2a655baa..25de0a9867d40 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -53,12 +53,12 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin no - 2021-08-02 + 2021-11-15 - 3.1.0 - 3.1.0 + 3.2.0 + 3.2.0 stable @@ -68,7 +68,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin This version is for PHP 8 only. - Deprecated directive oci8.old_oci_close_semantics + Added oci8.prefetch_lob_size directive to improve LOB query performance.
@@ -448,6 +448,23 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin + + + 3.1.0 + 3.1.0 + + + stable + stable + + PHP + + This version is for PHP 8 only. + + Deprecated directive oci8.old_oci_close_semantics + + + 3.0.1 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 0d0da8d0829a8..e447600441655 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -41,7 +41,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "3.1.0" +#define PHP_OCI8_VERSION "3.2.0" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 08bec33193ae0..b2e5f88c26b87 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -519,9 +519,9 @@ ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ Module globals */ zend_long persistent_timeout; /* time period after which idle persistent connection is considered expired */ zend_long statement_cache_size; /* statement cache size. used with 9i+ clients only*/ zend_long default_prefetch; /* default prefetch setting */ + zend_long prefetch_lob_size; /* amount of LOB data to read when initially getting a LOB locator */ bool privileged_connect; /* privileged connect flag (On/Off) */ bool old_oci_close_semantics; /* old_oci_close_semantics flag (to determine the way oci_close() should behave) */ - int shutdown; /* in shutdown flag */ OCIEnv *env; /* global environment handle */ diff --git a/ext/oci8/tests/driver_name.phpt b/ext/oci8/tests/driver_name.phpt index 1263922752669..0b32c4bd1f6be 100644 --- a/ext/oci8/tests/driver_name.phpt +++ b/ext/oci8/tests/driver_name.phpt @@ -57,11 +57,11 @@ function get_attr($conn) ?> --EXPECT-- **Test 1.1 - Default values for the attribute ************** -The value of DRIVER_NAME is PHP OCI8 : 3.1.0 +The value of DRIVER_NAME is PHP OCI8 : 3.2.0 ***Test 1.2 - Get the values from different connections ************** Testing with oci_pconnect() -The value of DRIVER_NAME is PHP OCI8 : 3.1.0 +The value of DRIVER_NAME is PHP OCI8 : 3.2.0 Testing with oci_new_connect() -The value of DRIVER_NAME is PHP OCI8 : 3.1.0 +The value of DRIVER_NAME is PHP OCI8 : 3.2.0 Done diff --git a/ext/oci8/tests/lob_prefetch.phpt b/ext/oci8/tests/lob_prefetch.phpt new file mode 100755 index 0000000000000..0fbdb1603300a --- /dev/null +++ b/ext/oci8/tests/lob_prefetch.phpt @@ -0,0 +1,163 @@ +--TEST-- +LOB prefetching +--EXTENSIONS-- +oci8 +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(__DIR__.'/skipif.inc'); +?> +--FILE-- +load(); + $row['CLOB']->free(); + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + +function get_clob_inline($c, $sql) { + $stid = oci_parse($c, $sql); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) != false) { + $l[] = $row['CLOB']; + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + +function check_clobs($locarr, $inlinearr) { + print("Comparing CLOBS\n"); + for ($i = 0; $i < NUMROWS; ++$i) { + if (strlen($locarr[$i]) != LOBSIZE) { + trigger_error("size mismatch at $i " . strlen($locarr[$i]), E_USER_ERROR); + exit; + } + if (strcmp($locarr[$i], $inlinearr[$i])) { + trigger_error("data mismatch at $i " . strlen($locarr[$i]) . " " . strlen($inlinearr[$i]), E_USER_ERROR); + exit; + } + } +} + +function get_blob_loc($c, $sql) { + $stid = oci_parse($c, $sql); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { + $l[] = $row['BLOB']->load(); + $row['BLOB']->free(); + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + + +print("Test 1\n"); + +$ig = ini_get("oci8.prefetch_lob_size"); +var_dump($ig); + +$ig = ini_set("oci8.prefetch_lob_size", "100000"); +var_dump($ig); + +$ig = ini_get("oci8.prefetch_lob_size"); +var_dump($ig); + +print("Test 2 - CLOB prefetch_lob_size 100000\n"); + +$sql = "select clob from ${schema}${table_name}" . " order by id"; +$locarr = get_clob_loc($c, $sql); +$inlinearr = get_clob_inline($c, $sql); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 3 - CLOB prefetch_lob_size 100\n"); + +ini_set("oci8.prefetch_lob_size", "100"); +$ig = ini_get("oci8.prefetch_lob_size"); +var_dump($ig); + +$locarr = get_clob_loc($c, $sql); +$inlinearr = get_clob_inline($c, $sql); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 4 - BLOB prefetch_lob_size 100000\n"); + +ini_set("oci8.prefetch_lob_size", "100000"); +$ig = ini_get("oci8.prefetch_lob_size"); +var_dump($ig); + +$sql = "select blob from ${schema}${table_name}" . " order by id"; +$locarr = get_blob_loc($c, $sql); + +print(count($locarr) . "\n"); + +require __DIR__.'/drop_table.inc'; + +?> +DONE +--EXPECTF-- +Test 1 +string(1) "0" +string(1) "0" +string(6) "100000" +Test 2 - CLOB prefetch_lob_size 100000 +500 +500 +Comparing CLOBS +Test 3 - CLOB prefetch_lob_size 100 +string(3) "100" +500 +500 +Comparing CLOBS +Test 4 - BLOB prefetch_lob_size 100000 +string(6) "100000" +500 +DONE diff --git a/php.ini-development b/php.ini-development index 604059bfb6854..768b22a933d2e 100644 --- a/php.ini-development +++ b/php.ini-development @@ -1254,7 +1254,7 @@ mysqlnd.collect_memory_statistics = On ;oci8.ping_interval = 60 ; Connection: Set this to a user chosen connection class to be used -; for all pooled server requests with Oracle 11g Database Resident +; for all pooled server requests with Oracle Database Resident ; Connection Pooling (DRCP). To use DRCP, this value should be set to ; the same string for all web servers running the same application, ; the database pool must be configured, and the connection string must @@ -1271,11 +1271,18 @@ mysqlnd.collect_memory_statistics = On ; https://php.net/oci8.statement-cache-size ;oci8.statement_cache_size = 20 -; Tuning: Enables statement prefetching and sets the default number of +; Tuning: Enables row prefetching and sets the default number of ; rows that will be fetched automatically after statement execution. ; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100 +; Tuning: Sets the amount of LOB data that is internally returned from +; Oracle Database when an Oracle LOB locator is initially retrieved as +; part of a query. Setting this can improve performance by reducing +; round-trips. +; https://php.net/oci8.prefetch-lob-size +; oci8.prefetch_lob_size = 0 + ; Compatibility. Using On means oci_close() will not close ; oci_connect() and oci_new_connect() connections. ; https://php.net/oci8.old-oci-close-semantics diff --git a/php.ini-production b/php.ini-production index b39a960f302f2..e25092e688f59 100644 --- a/php.ini-production +++ b/php.ini-production @@ -1256,7 +1256,7 @@ mysqlnd.collect_memory_statistics = Off ;oci8.ping_interval = 60 ; Connection: Set this to a user chosen connection class to be used -; for all pooled server requests with Oracle 11g Database Resident +; for all pooled server requests with Oracle Database Resident ; Connection Pooling (DRCP). To use DRCP, this value should be set to ; the same string for all web servers running the same application, ; the database pool must be configured, and the connection string must @@ -1278,6 +1278,13 @@ mysqlnd.collect_memory_statistics = Off ; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100 +; Tuning: Sets the amount of LOB data that is internally returned from +; Oracle Database when an Oracle LOB locator is initially retrieved as +; part of a query. Setting this can improve performance by reducing +; round-trips. +; https://php.net/oci8.prefetch-lob-size +; oci8.prefetch_lob_size = 0 + ; Compatibility. Using On means oci_close() will not close ; oci_connect() and oci_new_connect() connections. ; https://php.net/oci8.old-oci-close-semantics From 07fcf5e2d63eafc94879e5c1bce2a8c10742bbd8 Mon Sep 17 00:00:00 2001 From: Ben Ramsey Date: Thu, 11 Nov 2021 00:26:04 -0600 Subject: [PATCH 0241/1346] intl: Update grandfathered and redundant language tags Closes GH-7641. --- NEWS | 3 + ext/intl/locale/locale_methods.c | 144 ++++++-- .../tests/locale_get_display_language3.phpt | 338 ++++++++++++++++++ 3 files changed, 460 insertions(+), 25 deletions(-) create mode 100644 ext/intl/tests/locale_get_display_language3.phpt diff --git a/NEWS b/NEWS index 341b29b808809..4aa580dd20519 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,9 @@ PHP NEWS - Core: . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) +- Intl: + . Update all grandfathered language tags with preferred values + - OCI8: . Added oci8.prefetch_lob_size directive to tune LOB query performance diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c index 159b3ea0a1924..d6053b6be56d3 100644 --- a/ext/intl/locale/locale_methods.c +++ b/ext/intl/locale/locale_methods.c @@ -55,31 +55,125 @@ ZEND_EXTERN_MODULE_GLOBALS( intl ) #define EXTLANG_KEYNAME_LEN 10 #define PRIVATE_KEYNAME_LEN 11 -/* Based on IANA registry at the time of writing this code -* -*/ +/* Based on the IANA language subtag registry (File-Date: 2021-08-06) + * https://www.iana.org/assignments/language-subtag-registry + * + * This list includes all grandfathered tags, as well as redundant + * tags that have a Preferred-Value. + */ static const char * const LOC_GRANDFATHERED[] = { - "art-lojban", "i-klingon", "i-lux", "i-navajo", "no-bok", "no-nyn", - "cel-gaulish", "en-GB-oed", "i-ami", - "i-bnn", "i-default", "i-enochian", - "i-mingo", "i-pwn", "i-tao", - "i-tay", "i-tsu", "sgn-BE-fr", - "sgn-BE-nl", "sgn-CH-de", "zh-cmn", - "zh-cmn-Hans", "zh-cmn-Hant", "zh-gan" , - "zh-guoyu", "zh-hakka", "zh-min", - "zh-min-nan", "zh-wuu", "zh-xiang", - "zh-yue", NULL + "art-lojban", + "cel-gaulish", + "en-GB-oed", + "i-ami", + "i-bnn", + "i-default", + "i-enochian", + "i-hak", + "i-klingon", + "i-lux", + "i-mingo", + "i-navajo", + "i-pwn", + "i-tao", + "i-tay", + "i-tsu", + "no-bok", + "no-nyn", + "sgn-BE-FR", + "sgn-BE-NL", + "sgn-BR", + "sgn-CH-DE", + "sgn-CO", + "sgn-DE", + "sgn-DK", + "sgn-ES", + "sgn-FR", + "sgn-GB", + "sgn-GR", + "sgn-IE", + "sgn-IT", + "sgn-JP", + "sgn-MX", + "sgn-NI", + "sgn-NL", + "sgn-NO", + "sgn-PT", + "sgn-SE", + "sgn-US", + "sgn-ZA", + "zh-cmn", + "zh-cmn-Hans", + "zh-cmn-Hant", + "zh-gan", + "zh-guoyu", + "zh-hakka", + "zh-min", + "zh-min-nan", + "zh-wuu", + "zh-xiang", + NULL }; -/* Based on IANA registry at the time of writing this code -* This array lists the preferred values for the grandfathered tags if applicable -* This is in sync with the array LOC_GRANDFATHERED -* e.g. the offsets of the grandfathered tags match the offset of the preferred value -*/ -static const int LOC_PREFERRED_GRANDFATHERED_LEN = 6; -static const char * const LOC_PREFERRED_GRANDFATHERED[] = { - "jbo", "tlh", "lb", - "nv", "nb", "nn", +/* Based on the IANA language subtag registry (File-Date: 2021-08-06) + * + * This array lists the preferred values for the grandfathered and redundant + * tags listed in LOC_GRANDFATHERED. This is in sync with the array + * LOC_GRANDFATHERED, i.e., the offsets of the grandfathered tags match the + * offsets of the preferred value. If a value in LOC_PREFERRED_GRANDFATHERED is + * NULL, then the matching offset in LOC_GRANDFATHERED has no preferred value. + */ +static const char * const LOC_PREFERRED_GRANDFATHERED[] = { + "jbo", + NULL, + "en-GB-oxendict", + "ami", + "bnn", + NULL, + NULL, + "hak", + "tlh", + "lb", + NULL, + "nv", + "pwn", + "tao", + "tay", + "tsu", + "nb", + "nn", + "sfb", + "vgt", + "bzs", + "sgg", + "csn", + "gsg", + "dsl", + "ssp", + "fsl", + "bfi", + "gss", + "isg", + "ise", + "jsl", + "mfs", + "ncs", + "dse", + "nsl", + "psr", + "swl", + "ase", + "sfs", + "cmn", + "cmn-Hans", + "cmn-Hant", + "gan", + "cmn", + "hak", + NULL, + "nan", + "wuu", + "hsn", NULL }; @@ -105,7 +199,7 @@ static int16_t findOffset(const char* const* list, const char* key) { const char* const* anchor = list; while (*list != NULL) { - if (strcmp(key, *list) == 0) { + if (strcasecmp(key, *list) == 0) { return (int16_t)(list - anchor); } list++; @@ -125,7 +219,7 @@ static char* getPreferredTag(const char* gf_tag) if(grOffset < 0) { return NULL; } - if( grOffset < LOC_PREFERRED_GRANDFATHERED_LEN ){ + if( LOC_PREFERRED_GRANDFATHERED[grOffset] != NULL ){ /* return preferred tag */ result = estrdup( LOC_PREFERRED_GRANDFATHERED[grOffset] ); } else { @@ -503,7 +597,7 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME if( strcmp(tag_name , LOC_LANG_TAG)==0 ){ mod_loc_name = getPreferredTag( loc_name ); } else { - /* Since Grandfathered, no value, do nothing, retutn NULL */ + /* Since Grandfathered, no value, do nothing, return NULL */ RETURN_FALSE; } } diff --git a/ext/intl/tests/locale_get_display_language3.phpt b/ext/intl/tests/locale_get_display_language3.phpt new file mode 100644 index 0000000000000..9924e543cb611 --- /dev/null +++ b/ext/intl/tests/locale_get_display_language3.phpt @@ -0,0 +1,338 @@ +--TEST-- +locale_get_display_language() for grandfathered and redundant tags +--EXTENSIONS-- +intl +--FILE-- + +--EXPECTREGEX-- +locale='art-lojban' +disp_locale=en : display_language=Lojban +disp_locale=fr : display_language=lojban +disp_locale=de : display_language=Lojban +----------------- +locale='cel-gaulish' +disp_locale=en : display_language=cel +disp_locale=fr : display_language=cel +disp_locale=de : display_language=cel +----------------- +locale='en-GB-oed' +disp_locale=en : display_language=English +disp_locale=fr : display_language=anglais +disp_locale=de : display_language=Englisch +----------------- +locale='i-ami' +disp_locale=en : display_language=ami +disp_locale=fr : display_language=ami +disp_locale=de : display_language=ami +----------------- +locale='i-bnn' +disp_locale=en : display_language=bnn +disp_locale=fr : display_language=bnn +disp_locale=de : display_language=bnn +----------------- +locale='i-default' +disp_locale=en : display_language=i-default +disp_locale=fr : display_language=i-default +disp_locale=de : display_language=i-default +----------------- +locale='i-enochian' +disp_locale=en : display_language=i-enochian +disp_locale=fr : display_language=i-enochian +disp_locale=de : display_language=i-enochian +----------------- +locale='i-hak' +disp_locale=en : display_language=Hakka Chinese +disp_locale=fr : display_language=hakka +disp_locale=de : display_language=Hakka +----------------- +locale='i-klingon' +disp_locale=en : display_language=Klingon +disp_locale=fr : display_language=klingon +disp_locale=de : display_language=Klingonisch +----------------- +locale='i-lux' +disp_locale=en : display_language=Luxembourgish +disp_locale=fr : display_language=luxembourgeois +disp_locale=de : display_language=Luxemburgisch +----------------- +locale='i-mingo' +disp_locale=en : display_language=i-mingo +disp_locale=fr : display_language=i-mingo +disp_locale=de : display_language=i-mingo +----------------- +locale='i-navajo' +disp_locale=en : display_language=Navajo +disp_locale=fr : display_language=navajo +disp_locale=de : display_language=Navajo +----------------- +locale='i-pwn' +disp_locale=en : display_language=pwn +disp_locale=fr : display_language=pwn +disp_locale=de : display_language=pwn +----------------- +locale='i-tao' +disp_locale=en : display_language=tao +disp_locale=fr : display_language=tao +disp_locale=de : display_language=tao +----------------- +locale='i-tay' +disp_locale=en : display_language=tay +disp_locale=fr : display_language=tay +disp_locale=de : display_language=tay +----------------- +locale='i-tsu' +disp_locale=en : display_language=tsu +disp_locale=fr : display_language=tsu +disp_locale=de : display_language=tsu +----------------- +locale='no-bok' +disp_locale=en : display_language=Norwegian Bokmål +disp_locale=fr : display_language=norvégien bokmål +disp_locale=de : display_language=Norwegisch \(?Bokmål\)? +----------------- +locale='no-nyn' +disp_locale=en : display_language=Norwegian Nynorsk +disp_locale=fr : display_language=norvégien nynorsk +disp_locale=de : display_language=Norwegisch \(?Nynorsk\)? +----------------- +locale='sgn-BE-FR' +disp_locale=en : display_language=sfb +disp_locale=fr : display_language=sfb +disp_locale=de : display_language=sfb +----------------- +locale='sgn-BE-NL' +disp_locale=en : display_language=vgt +disp_locale=fr : display_language=vgt +disp_locale=de : display_language=vgt +----------------- +locale='sgn-BR' +disp_locale=en : display_language=bzs +disp_locale=fr : display_language=bzs +disp_locale=de : display_language=bzs +----------------- +locale='sgn-CH-DE' +disp_locale=en : display_language=sgg +disp_locale=fr : display_language=sgg +disp_locale=de : display_language=sgg +----------------- +locale='sgn-CO' +disp_locale=en : display_language=csn +disp_locale=fr : display_language=csn +disp_locale=de : display_language=csn +----------------- +locale='sgn-DE' +disp_locale=en : display_language=gsg +disp_locale=fr : display_language=gsg +disp_locale=de : display_language=gsg +----------------- +locale='sgn-DK' +disp_locale=en : display_language=dsl +disp_locale=fr : display_language=dsl +disp_locale=de : display_language=dsl +----------------- +locale='sgn-ES' +disp_locale=en : display_language=ssp +disp_locale=fr : display_language=ssp +disp_locale=de : display_language=ssp +----------------- +locale='sgn-FR' +disp_locale=en : display_language=fsl +disp_locale=fr : display_language=fsl +disp_locale=de : display_language=fsl +----------------- +locale='sgn-GB' +disp_locale=en : display_language=bfi +disp_locale=fr : display_language=bfi +disp_locale=de : display_language=bfi +----------------- +locale='sgn-GR' +disp_locale=en : display_language=gss +disp_locale=fr : display_language=gss +disp_locale=de : display_language=gss +----------------- +locale='sgn-IE' +disp_locale=en : display_language=isg +disp_locale=fr : display_language=isg +disp_locale=de : display_language=isg +----------------- +locale='sgn-IT' +disp_locale=en : display_language=ise +disp_locale=fr : display_language=ise +disp_locale=de : display_language=ise +----------------- +locale='sgn-JP' +disp_locale=en : display_language=jsl +disp_locale=fr : display_language=jsl +disp_locale=de : display_language=jsl +----------------- +locale='sgn-MX' +disp_locale=en : display_language=mfs +disp_locale=fr : display_language=mfs +disp_locale=de : display_language=mfs +----------------- +locale='sgn-NI' +disp_locale=en : display_language=ncs +disp_locale=fr : display_language=ncs +disp_locale=de : display_language=ncs +----------------- +locale='sgn-NL' +disp_locale=en : display_language=dse +disp_locale=fr : display_language=dse +disp_locale=de : display_language=dse +----------------- +locale='sgn-NO' +disp_locale=en : display_language=nsl +disp_locale=fr : display_language=nsl +disp_locale=de : display_language=nsl +----------------- +locale='sgn-PT' +disp_locale=en : display_language=psr +disp_locale=fr : display_language=psr +disp_locale=de : display_language=psr +----------------- +locale='sgn-SE' +disp_locale=en : display_language=swl +disp_locale=fr : display_language=swl +disp_locale=de : display_language=swl +----------------- +locale='sgn-US' +disp_locale=en : display_language=American Sign Language +disp_locale=fr : display_language=langue des signes américaine +disp_locale=de : display_language=Amerikanische Gebärdensprache +----------------- +locale='sgn-ZA' +disp_locale=en : display_language=sfs +disp_locale=fr : display_language=sfs +disp_locale=de : display_language=sfs +----------------- +locale='zh-cmn' +disp_locale=en : display_language=(cmn|Chinese) +disp_locale=fr : display_language=(cmn|chinois) +disp_locale=de : display_language=(cmn|Chinesisch) +----------------- +locale='zh-cmn-Hans' +disp_locale=en : display_language=(cmn|Chinese) +disp_locale=fr : display_language=(cmn|chinois) +disp_locale=de : display_language=(cmn|Chinesisch) +----------------- +locale='zh-cmn-Hant' +disp_locale=en : display_language=(cmn|Chinese) +disp_locale=fr : display_language=(cmn|chinois) +disp_locale=de : display_language=(cmn|Chinesisch) +----------------- +locale='zh-gan' +disp_locale=en : display_language=Gan Chinese +disp_locale=fr : display_language=gan +disp_locale=de : display_language=Gan +----------------- +locale='zh-guoyu' +disp_locale=en : display_language=(cmn|Chinese) +disp_locale=fr : display_language=(cmn|chinois) +disp_locale=de : display_language=(cmn|Chinesisch) +----------------- +locale='zh-hakka' +disp_locale=en : display_language=Hakka Chinese +disp_locale=fr : display_language=hakka +disp_locale=de : display_language=Hakka +----------------- +locale='zh-min' +disp_locale=en : display_language=Chinese +disp_locale=fr : display_language=chinois +disp_locale=de : display_language=Chinesisch +----------------- +locale='zh-min-nan' +disp_locale=en : display_language=Min Nan Chinese +disp_locale=fr : display_language=minnan +disp_locale=de : display_language=Min Nan +----------------- +locale='zh-wuu' +disp_locale=en : display_language=Wu Chinese +disp_locale=fr : display_language=wu +disp_locale=de : display_language=Wu +----------------- +locale='zh-xiang' +disp_locale=en : display_language=Xiang Chinese +disp_locale=fr : display_language=xiang +disp_locale=de : display_language=Xiang +----------------- From ab5e908017c40e3f1591129c9ec69d8ee0148288 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 15 Nov 2021 10:20:03 +0300 Subject: [PATCH 0242/1346] Fixed compilation warnings in 32-bit build --- sapi/phpdbg/phpdbg_watch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sapi/phpdbg/phpdbg_watch.c b/sapi/phpdbg/phpdbg_watch.c index 6e7494c931760..86cd64a5721ff 100644 --- a/sapi/phpdbg/phpdbg_watch.c +++ b/sapi/phpdbg/phpdbg_watch.c @@ -240,7 +240,7 @@ static void phpdbg_change_watchpoint_access(phpdbg_watchpoint_t *watch, int acce #ifdef HAVE_USERFAULTFD_WRITEFAULT if (PHPDBG_G(watch_userfaultfd)) { struct uffdio_range range = { - .start = (__u64) page_addr, + .start = (__u64)(uintptr_t) page_addr, .len = size }; if (access == PROT_READ) { @@ -312,12 +312,12 @@ void *phpdbg_watchpoint_userfaultfd_thread(void *phpdbg_globals) { struct uffd_msg fault_msg = {0}; while (read(globals->watch_userfaultfd, &fault_msg, sizeof(fault_msg)) == sizeof(fault_msg)) { - void *page = phpdbg_get_page_boundary((char *) fault_msg.arg.pagefault.address); + void *page = phpdbg_get_page_boundary((char *)(uintptr_t) fault_msg.arg.pagefault.address); zend_hash_index_add_empty_element(globals->watchlist_mem, (zend_ulong) page); struct uffdio_writeprotect unprotect = { .mode = 0, .range = { - .start = (__u64) page, + .start = (__u64)(uintptr_t) page, .len = phpdbg_pagesize } }; From 0993821c16f4e4ffaad3ca9d6dbcbdc2234906bb Mon Sep 17 00:00:00 2001 From: Anton Vasiliev Date: Sat, 13 Nov 2021 20:14:30 +0000 Subject: [PATCH 0243/1346] Remove unused `check_flags` argument from `zend_is_callable_check_func()` --- Zend/zend_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 08b9dffa54daa..2ecfc6db2d913 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3434,7 +3434,7 @@ ZEND_API void zend_release_fcall_info_cache(zend_fcall_info_cache *fcc) { } } -static zend_always_inline bool zend_is_callable_check_func(int check_flags, zval *callable, zend_execute_data *frame, zend_fcall_info_cache *fcc, bool strict_class, char **error) /* {{{ */ +static zend_always_inline bool zend_is_callable_check_func(zval *callable, zend_execute_data *frame, zend_fcall_info_cache *fcc, bool strict_class, char **error) /* {{{ */ { zend_class_entry *ce_org = fcc->calling_scope; bool retval = 0; @@ -3772,7 +3772,7 @@ ZEND_API bool zend_is_callable_at_frame( } check_func: - ret = zend_is_callable_check_func(check_flags, callable, frame, fcc, strict_class, error); + ret = zend_is_callable_check_func(callable, frame, fcc, strict_class, error); if (fcc == &fcc_local) { zend_release_fcall_info_cache(fcc); } From a8b9dbc632685bfb000615c2599f252b417a61b6 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 18 Nov 2021 00:10:28 +0100 Subject: [PATCH 0244/1346] Fix ZEND_HASH_REVERSE_FOREACH_PTR definition --- Zend/zend_hash.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index b7559257d27e5..e004439029f6e 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -1093,7 +1093,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht, _ptr = Z_PTR_P(_z); #define ZEND_HASH_REVERSE_FOREACH_PTR(ht, _ptr) \ - _ZEND_HASH_REVERSE_FOREACH_VAL(ht, 0); \ + _ZEND_HASH_REVERSE_FOREACH_VAL(ht); \ _ptr = Z_PTR_P(_z); #define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \ From 1845b712e71a60484fb48f6f04a08ecaca33dc57 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 18 Nov 2021 14:50:49 +0100 Subject: [PATCH 0245/1346] Remove commented code in pass1 This has been disabled for a long time, and the whole optimization is no longer relevant given changes in PHP 8.1 --- Zend/Optimizer/pass1.c | 47 ------------------------------------------ 1 file changed, 47 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 8f3c263833dd6..3579ea1c6bfc8 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -25,7 +25,6 @@ * - constant expression evaluation * - optimize constant conditional JMPs * - pre-evaluate constant function calls - * - eliminate FETCH $GLOBALS followed by FETCH_DIM/UNSET_DIM/ISSET_ISEMPTY_DIM */ #include "php.h" @@ -531,52 +530,6 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) zend_optimizer_collect_constant(ctx, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)); } break; -#if 0 - /* see ext/opcache/tests/bug78961.phpt */ -// case ZEND_FETCH_R: - case ZEND_FETCH_W: -// case ZEND_FETCH_RW: - case ZEND_FETCH_IS: -// case ZEND_FETCH_FUNC_ARG: - case ZEND_FETCH_UNSET: - /* convert FETCH $GLOBALS (global), FETCH_DIM $x into FETCH $x (global) */ - if ((opline->extended_value & ZEND_FETCH_GLOBAL) != 0 && - opline->op1_type == IS_CONST && - Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING && - zend_string_equals_literal(Z_STR(ZEND_OP1_LITERAL(opline)), "GLOBALS") && - ((opline + 1)->opcode == opline->opcode + 1 || - ((opline + 1)->opcode == ZEND_UNSET_DIM && - opline->opcode == ZEND_FETCH_UNSET) || - ((opline + 1)->opcode == ZEND_ISSET_ISEMPTY_DIM_OBJ && - opline->opcode == ZEND_FETCH_IS)) && - (opline + 1)->op1_type == opline->result_type && - (opline + 1)->op1.var == opline->result.var && - ((opline + 1)->op2_type != IS_CONST || - Z_TYPE(ZEND_OP2_LITERAL(opline + 1)) < IS_ARRAY)) { - - if ((opline + 1)->opcode == ZEND_UNSET_DIM) { - (opline + 1)->opcode = ZEND_UNSET_VAR; - (opline + 1)->extended_value = ZEND_FETCH_GLOBAL; - } else if ((opline + 1)->opcode == ZEND_ISSET_ISEMPTY_DIM_OBJ) { - (opline + 1)->opcode = ZEND_ISSET_ISEMPTY_VAR; - (opline + 1)->extended_value |= ZEND_FETCH_GLOBAL; - } else { - (opline + 1)->opcode = opline->opcode; - (opline + 1)->extended_value = ZEND_FETCH_GLOBAL; - } - (opline + 1)->op1_type = (opline + 1)->op2_type; - (opline + 1)->op1 = (opline + 1)->op2; - if ((opline + 1)->op1_type == IS_CONST && - Z_TYPE(ZEND_OP1_LITERAL(opline + 1)) != IS_STRING) { - - convert_to_string(&ZEND_OP1_LITERAL(opline + 1)); - zend_string_hash_val(Z_STR(ZEND_OP1_LITERAL(opline + 1))); - } - SET_UNUSED((opline + 1)->op2); - MAKE_NOP(opline); - } - break; -#endif case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: From b6419f919a556c12de18bd19b6ed53eed589563c Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sat, 20 Nov 2021 11:55:04 -0500 Subject: [PATCH 0246/1346] Micro-optimizations for WeakMap Skip WeakMap lookup check used only for debug assertion in non-debug builds Use the `zend_hash_lookup` helper to optimize adding a WeakMap entry if the entry doesn't already exist. Closes GH-7670 --- Zend/zend_weakrefs.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index a4b16fbe97002..cd8c4ed9dadf4 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -87,9 +87,9 @@ static void zend_weakref_register(zend_object *object, void *payload) { GC_ADD_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); zend_ulong obj_addr = (zend_ulong) object; - zval *zv = zend_hash_index_find(&EG(weakrefs), obj_addr); - if (!zv) { - zend_hash_index_add_new_ptr(&EG(weakrefs), obj_addr, payload); + zval *zv = zend_hash_index_lookup(&EG(weakrefs), obj_addr); + if (Z_TYPE_P(zv) == IS_NULL) { + ZVAL_PTR(zv, payload); return; } @@ -127,9 +127,11 @@ static void zend_weakref_unregister(zend_object *object, void *payload) { } HashTable *ht = ptr; - tagged_ptr = zend_hash_index_find_ptr(ht, (zend_ulong) payload); - ZEND_ASSERT(tagged_ptr && "Weakref not registered?"); - ZEND_ASSERT(tagged_ptr == payload); +#if ZEND_DEBUG + void *old_payload = zend_hash_index_find_ptr(ht, (zend_ulong) payload); + ZEND_ASSERT(old_payload && "Weakref not registered?"); + ZEND_ASSERT(old_payload == payload); +#endif zend_hash_index_del(ht, (zend_ulong) payload); if (zend_hash_num_elements(ht) == 0) { GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); From d3f073e8c7dceaaddb1ffe331f3a000652610fd1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 22 Nov 2021 13:54:50 +0300 Subject: [PATCH 0247/1346] Remove useless check --- Zend/zend_hash.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 02c316a95a2d0..a52a7fc96912c 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -749,10 +749,7 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s IS_CONSISTENT(ht); HT_ASSERT_RC1(ht); - - if (!ZSTR_IS_INTERNED(key)) { - zend_string_hash_val(key); - } + zend_string_hash_val(key); if (UNEXPECTED(HT_FLAGS(ht) & (HASH_FLAG_UNINITIALIZED|HASH_FLAG_PACKED))) { if (EXPECTED(HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED)) { From ae5498c929244ccb68d5b1bfa31329707e763430 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 23 Nov 2021 15:34:12 +0300 Subject: [PATCH 0248/1346] Fixed typo --- sapi/phpdbg/config.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/phpdbg/config.m4 b/sapi/phpdbg/config.m4 index 2de2a3fa33164..ac95cf3c57f91 100644 --- a/sapi/phpdbg/config.m4 +++ b/sapi/phpdbg/config.m4 @@ -68,7 +68,7 @@ if test "$BUILD_PHPDBG" = "" && test "$PHP_PHPDBG" != "no"; then AC_MSG_WARN([pthreads not available]) fi - CFLAGS="$CLFAGS_SAVE" + CFLAGS="$CFLAGS_SAVE" LIBS="$LIBS_SAVE" else AC_DEFINE(HAVE_USERFAULTFD_WRITEFAULT, 1, [Whether faulting on write-protected memory support can be compiled for userfaultfd]) From d312a0c8007ffd398cbbb3cf9340db2654513cd6 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 23 Nov 2021 19:11:44 +0100 Subject: [PATCH 0249/1346] [ci skip] We use multiple CI providers, not only Travis These are already listed at the beginning of the document, so we don't list them here again to avoid duplication. --- docs/release-process.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/release-process.md b/docs/release-process.md index e4a2281fce9a8..f9bb1d1fe71aa 100644 --- a/docs/release-process.md +++ b/docs/release-process.md @@ -61,7 +61,7 @@ explained at the end of this document in ## Packaging a non stable release (alpha/beta/RC) - 1. Check the tests at https://travis-ci.com/php/php-src/builds. + 1. Check that CI is passing (see above). 2. Run the `scripts/dev/credits` script in php-src and commit the changes in the credits files in ext/standard. @@ -199,8 +199,7 @@ explained at the end of this document in 7.2, merge to 7.3, 7.4 etc...). Then you can cherry-pick it in your release branch. Don't forget to update `NEWS` manually in an extra commit then. - 3. Commit those changes. Ensure the tests at - https://travis-ci.com/php/php-src/builds are still passing. + 3. Commit those changes. Ensure that CI is still passing (see above). 4. Run the `scripts/dev/credits` script in php-src and commit the changes in the credits files in ext/standard. From 067df263448ee26013cddee1065bc9c1f028bd23 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 24 Nov 2021 16:13:34 +0300 Subject: [PATCH 0250/1346] Use memrchr() when available On x86_64 glibc memrchr() uses SSE/AVX CPU extensions and works much faster then naive loop. On x86 32-bit we still use inlined version. memrchr() is a GNU extension. Its prototype becomes available when is included with defined _GNU_SOURCE macro. Previously, we defined it in "php_config.h", but some sources may include befire it. To avod mess we also pass -D_GNU_SOURCE to C compiler. --- Zend/zend_operators.h | 5 +++++ Zend/zend_signal.c | 4 +++- configure.ac | 7 +++++++ ext/pdo_firebird/firebird_driver.c | 4 +++- ext/zlib/zlib_fopen_wrapper.c | 4 +++- main/snprintf.c | 4 +++- main/spprintf.c | 4 +++- main/streams/cast.c | 4 +++- main/streams/memory.c | 4 +++- main/streams/streams.c | 4 +++- sapi/fpm/fpm/fpm_trace_pread.c | 4 +++- 11 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index ce9d852819e18..410745cbc3468 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -211,6 +211,10 @@ zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t n) { +#if defined(HAVE_MEMRCHR) && !defined(i386) + /* On x86 memrchr() doesn't use SSE/AVX, so inlined version is faster */ + return (const void*)memrchr(s, c, n); +#else const unsigned char *e; if (0 == n) { return NULL; @@ -222,6 +226,7 @@ static zend_always_inline const void *zend_memrchr(const void *s, int c, size_t } } return NULL; +#endif } diff --git a/Zend/zend_signal.c b/Zend/zend_signal.c index 3c090ccb8c524..68bc3de3ff252 100644 --- a/Zend/zend_signal.c +++ b/Zend/zend_signal.c @@ -25,7 +25,9 @@ All other licensing and usage conditions are those of the PHP Group. */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include #include "zend.h" diff --git a/configure.ac b/configure.ac index 602c72154af0e..db1cac4ca6018 100644 --- a/configure.ac +++ b/configure.ac @@ -265,6 +265,12 @@ else AC_MSG_RESULT(no) fi +dnl The effect of _GNU_SOURCE defined in config.h depeds on includes order +if test "$ac_cv_safe_to_define___extensions__" = yes ; then + AC_MSG_CHECKING(whether to use -D_GNU_SOURCE cflag) + CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" + AC_MSG_RESULT(yes) +fi dnl Include Zend configurations. dnl ---------------------------------------------------------------------------- @@ -609,6 +615,7 @@ vasprintf \ asprintf \ nanosleep \ memmem \ +memrchr \ ) AX_FUNC_WHICH_GETHOSTBYNAME_R diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c index 36a7a2bebc0dd..7dc40f510d459 100644 --- a/ext/pdo_firebird/firebird_driver.c +++ b/ext/pdo_firebird/firebird_driver.c @@ -18,7 +18,9 @@ #include "config.h" #endif -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "zend_exceptions.h" diff --git a/ext/zlib/zlib_fopen_wrapper.c b/ext/zlib/zlib_fopen_wrapper.c index c55b3e100304b..b414b33a8724e 100644 --- a/ext/zlib/zlib_fopen_wrapper.c +++ b/ext/zlib/zlib_fopen_wrapper.c @@ -15,7 +15,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "php_zlib.h" diff --git a/main/snprintf.c b/main/snprintf.c index f082115c6764d..3c379c5c2ce18 100644 --- a/main/snprintf.c +++ b/main/snprintf.c @@ -14,7 +14,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include diff --git a/main/spprintf.c b/main/spprintf.c index 4c01347fcf494..37b81dc6d530b 100644 --- a/main/spprintf.c +++ b/main/spprintf.c @@ -72,7 +72,9 @@ * SIO stdio-replacement strx_* functions by Panos Tsirigotis * for xinetd. */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include diff --git a/main/streams/cast.c b/main/streams/cast.c index db0f039eae139..3bad65fbac1f5 100644 --- a/main/streams/cast.c +++ b/main/streams/cast.c @@ -14,7 +14,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "php_globals.h" #include "php_network.h" diff --git a/main/streams/memory.c b/main/streams/memory.c index 0784f1617cf09..365976716d283 100644 --- a/main/streams/memory.c +++ b/main/streams/memory.c @@ -14,7 +14,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "ext/standard/base64.h" diff --git a/main/streams/streams.c b/main/streams/streams.c index 883a31c5a6fa6..1581e3ffae29c 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -17,7 +17,9 @@ +----------------------------------------------------------------------+ */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #include "php.h" #include "php_globals.h" #include "php_memory_streams.h" diff --git a/sapi/fpm/fpm/fpm_trace_pread.c b/sapi/fpm/fpm/fpm_trace_pread.c index 22b476f778d99..8bf4223410993 100644 --- a/sapi/fpm/fpm/fpm_trace_pread.c +++ b/sapi/fpm/fpm/fpm_trace_pread.c @@ -1,6 +1,8 @@ /* (c) 2007,2008 Andrei Nigmatulin */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif #define _FILE_OFFSET_BITS 64 #include "fpm_config.h" From 108bd4417ab425a24f19948acdc1617aa7fc9c6b Mon Sep 17 00:00:00 2001 From: othercorey Date: Wed, 24 Nov 2021 07:49:10 -0600 Subject: [PATCH 0251/1346] Add pdo_sqlite tests for empty filename and in-memory uri (#7662) pdo_sqlite already supports empty filenames and shared in-memory DBs. Add tests for them. --- .../tests/pdo_sqlite_empty_filename.phpt | 20 ++++++++ .../tests/pdo_sqlite_filename_uri.phpt | 12 +++++ .../tests/pdo_sqlite_open_basedir.phpt | 47 +++++++++++++++++++ .../tests/pdo_sqlite_open_basedir_uri.phpt | 32 +++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 ext/pdo_sqlite/tests/pdo_sqlite_empty_filename.phpt create mode 100644 ext/pdo_sqlite/tests/pdo_sqlite_open_basedir.phpt create mode 100644 ext/pdo_sqlite/tests/pdo_sqlite_open_basedir_uri.phpt diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_empty_filename.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_empty_filename.phpt new file mode 100644 index 0000000000000..8e474feabd30d --- /dev/null +++ b/ext/pdo_sqlite/tests/pdo_sqlite_empty_filename.phpt @@ -0,0 +1,20 @@ +--TEST-- +PDO_sqlite: Testing empty filename +--EXTENSIONS-- +pdo_sqlite +--FILE-- +exec('CREATE TABLE test1 (id INT);')); + +// create with empty URI +$db = new PDO('sqlite:file:?cache=shared'); + +var_dump($db->exec('CREATE TABLE test1 (id INT);')); +?> +--EXPECT-- +int(0) +int(0) diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt index a5d588c6b8709..b972be27cfbf2 100644 --- a/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt +++ b/ext/pdo_sqlite/tests/pdo_sqlite_filename_uri.phpt @@ -5,6 +5,16 @@ pdo_sqlite --FILE-- exec('CREATE TABLE test1 (id INT);')); + +// create second connection to in-memory database +$db = new PDO('sqlite:file::memory:?cache=shared'); + +var_dump($db->exec('SELECT * from test1')); + // create with default read-write|create mode $filename = "file:" . __DIR__ . DIRECTORY_SEPARATOR . "pdo_sqlite_filename_uri.db"; @@ -29,6 +39,8 @@ if (file_exists($filename)) { ?> --EXPECTF-- int(0) +int(0) +int(0) Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database in %s Stack trace: diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_open_basedir.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_open_basedir.phpt new file mode 100644 index 0000000000000..425d2190234bd --- /dev/null +++ b/ext/pdo_sqlite/tests/pdo_sqlite_open_basedir.phpt @@ -0,0 +1,47 @@ +--TEST-- +PDO_sqlite: Testing filenames with open_basedir +--EXTENSIONS-- +pdo_sqlite +--INI-- +open_basedir=. +--FILE-- +exec('CREATE TABLE test1 (id INT);')); + +// create outside basedir +$filename = '..' . DIRECTORY_SEPARATOR . 'pdo_sqlite_filename.db'; + +new PDO('sqlite:' . $filename); +?> + +--CLEAN-- + +--EXPECTF-- +int(0) + +Fatal error: Uncaught PDOException: PDO::__construct(): open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s) in %s:%d +Stack trace: +%s +#1 {main} + +Next PDOException: open_basedir prohibits opening %s in %s:%d +Stack trace: +%s +#1 {main} + thrown in %s diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_open_basedir_uri.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_open_basedir_uri.phpt new file mode 100644 index 0000000000000..7525ae34a8e86 --- /dev/null +++ b/ext/pdo_sqlite/tests/pdo_sqlite_open_basedir_uri.phpt @@ -0,0 +1,32 @@ +--TEST-- +PDO_sqlite: Testing URIs with open_basedir +--EXTENSIONS-- +pdo_sqlite +--INI-- +open_basedir={TMP} +--FILE-- + + +--CLEAN-- + +--EXPECTF-- +Fatal error: Uncaught PDOException: open_basedir prohibits opening %s in %s:%d +Stack trace: +%s +#1 {main} + thrown in %s From 7738d8dd02ff2014b37e2c3c35e8b7061beebd2f Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 24 Nov 2021 13:39:22 +0100 Subject: [PATCH 0252/1346] Drop unused GD defines These are not used in the bundled libgd, and not used in config.m4 either. Closes GH-7681. --- ext/gd/config.w32 | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/ext/gd/config.w32 b/ext/gd/config.w32 index 96c43dd90e583..0e61b1fc112db 100644 --- a/ext/gd/config.w32 +++ b/ext/gd/config.w32 @@ -57,37 +57,18 @@ if (PHP_GD != "no") { AC_DEFINE('HAVE_LIBGD', 1, 'GD support'); ADD_FLAG("CFLAGS_GD", " \ /D PHP_GD_EXPORTS=1 \ -/D HAVE_GD_DYNAMIC_CTX_EX=1 \ /D HAVE_GD_BUNDLED=1 \ -/D HAVE_GD_GD2 \ -/D HAVE_GD_GIF_READ=1 \ -/D HAVE_GD_GIF_CREATE=1 \ -/D HAVE_GDIMAGECOLORRESOLVE=1 \ -/D HAVE_GD_IMAGESETBRUSH=1 \ -/D HAVE_GD_IMAGESETTILE=1 \ -/D HAVE_GD_FONTCACHESHUTDOWN=1 \ -/D HAVE_GD_FONTMUTEX=1 \ /D HAVE_LIBFREETYPE=1 \ /D HAVE_GD_JPG \ /D HAVE_GD_PNG \ -/D HAVE_GD_STRINGFTEX=1 \ -/D HAVE_GD_STRINGTTF=1 \ -/D HAVE_GD_WBMP \ -/D HAVE_GD_XBM \ /D HAVE_GD_XPM \ /D HAVE_GD_FREETYPE=1 \ /D HAVE_GD_BMP \ /D HAVE_GD_TGA \ -/D HAVE_LIBGD13=1 \ -/D HAVE_LIBGD15=1 \ -/D HAVE_LIBGD20=1 \ -/D HAVE_LIBGD204=1 \ /D HAVE_LIBJPEG \ /D HAVE_LIBPNG \ /D HAVE_XPM \ -/D HAVE_COLORCLOSESTHWB \ /D HAVE_GD_GET_INTERPOLATION \ -/D USE_GD_IOCTX \ /D MSWIN32 \ "); if (ICC_TOOLSET) { From 243966177e39eb71822935042c3f13fa6c5b9eed Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 24 Nov 2021 14:23:57 +0100 Subject: [PATCH 0253/1346] Use the standard _WIN32 instead of the custom MSWIN32 in libgd We're already checking `_WIN32` elsewhere in our bundled libgd, so it makes no sense to also have a custom `MSWIN32`. Closes GH-7682. --- ext/gd/config.w32 | 1 - ext/gd/libgd/gdft.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/gd/config.w32 b/ext/gd/config.w32 index 0e61b1fc112db..2fb65763b31ab 100644 --- a/ext/gd/config.w32 +++ b/ext/gd/config.w32 @@ -69,7 +69,6 @@ if (PHP_GD != "no") { /D HAVE_LIBPNG \ /D HAVE_XPM \ /D HAVE_GD_GET_INTERPOLATION \ -/D MSWIN32 \ "); if (ICC_TOOLSET) { ADD_FLAG("LDFLAGS_GD", "/nodefaultlib:libcmt"); diff --git a/ext/gd/libgd/gdft.c b/ext/gd/libgd/gdft.c index b23b7563b4c25..554a656e625c9 100644 --- a/ext/gd/libgd/gdft.c +++ b/ext/gd/libgd/gdft.c @@ -12,7 +12,7 @@ #include "gd.h" #include "gdhelpers.h" -#ifndef MSWIN32 +#ifndef _WIN32 #include #else #include From 4b4b9edcc0f614ce7c6d1964acc1f8fd00a47edc Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 24 Nov 2021 20:38:00 +0300 Subject: [PATCH 0254/1346] Refactor GC data traversal loops Previusly, to redce stack usage GC traversed object properties and array elements in both directions. At first, it seeked backward from the last element, to find the last refcounted zval. Then, it traversed elements forward. As result, we had 2 non-spatial memory accesses for each object/array and usuall 2 expensive CPU cache misses. Now all the traversal algorithms are refactored to scan elements only in forward direction. The number of checks and GC stack usage should be the same. The order of element processing may be differenr, but this should not be a problem. --- Zend/zend_gc.c | 908 ++++++++++++++++++++++--------------------------- 1 file changed, 409 insertions(+), 499 deletions(-) diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index a473c84d2d4e6..de7353013f0b4 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -691,8 +691,10 @@ ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref) static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) { - HashTable *ht = NULL; + HashTable *ht; + Bucket *p; zval *zv; + uint32_t n; GC_STACK_DCL(stack); tail_call: @@ -700,109 +702,68 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) zend_object *obj = (zend_object*)ref; if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { - int n; - zval *zv, *end; + zval *table; + int len; - ht = obj->handlers->get_gc(obj, &zv, &n); + ht = obj->handlers->get_gc(obj, &table, &len); + n = len; + zv = table; if (UNEXPECTED(ht)) { GC_ADDREF(ht); if (!GC_REF_CHECK_COLOR(ht, GC_BLACK)) { GC_REF_SET_BLACK(ht); - } else { - ht = NULL; - } - } - if (EXPECTED(!ht)) { - if (!n) goto next; - end = zv + n; - while (!Z_REFCOUNTED_P(--end)) { - if (zv == end) goto next; + for (; n != 0; n--) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + zv++; + } + goto handle_ht; } - } else { - if (!n) goto handle_ht; - end = zv + n; } - while (zv != end) { + +handle_zvals: + for (; n != 0; n--) { if (Z_REFCOUNTED_P(zv)) { ref = Z_COUNTED_P(zv); GC_ADDREF(ref); if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); + zv++; + while (--n) { + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + zv++; + } + goto tail_call; } } zv++; } - if (EXPECTED(!ht)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { - GC_REF_SET_BLACK(ref); - goto tail_call; - } - goto next; - } - } else { - goto next; } } else if (GC_TYPE(ref) == IS_ARRAY) { ZEND_ASSERT((zend_array*)ref != &EG(symbol_table)); ht = (zend_array*)ref; - } else if (GC_TYPE(ref) == IS_REFERENCE) { - if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { - ref = Z_COUNTED(((zend_reference*)ref)->val); - GC_ADDREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { - GC_REF_SET_BLACK(ref); - goto tail_call; - } - } - goto next; - } else { - goto next; - } - handle_ht: - if (!ht->nNumUsed) goto next; - if (HT_IS_PACKED(ht)) { - zval *end; - + n = ht->nNumUsed; zv = ht->arPacked; - end = zv + ht->nNumUsed; - while (1) { - end--; - if (Z_REFCOUNTED_P(end)) { - break; - } - if (zv == end) goto next; - } - while (zv != end) { - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { - GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); - } - } - zv++; + if (HT_IS_PACKED(ht)) { + goto handle_zvals; } - } else { - Bucket *p = ht->arData; - Bucket *end = p + ht->nNumUsed; - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - break; - } - if (p == end) goto next; - } - while (p != end) { + p = (Bucket*)zv; + for (; n != 0; n--) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); @@ -812,24 +773,38 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) GC_ADDREF(ref); if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); + p++; + while (--n) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + p++; + } + goto tail_call; } } p++; } - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); + } else if (GC_TYPE(ref) == IS_REFERENCE) { + if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { + ref = Z_COUNTED(((zend_reference*)ref)->val); + GC_ADDREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_REF_SET_BLACK(ref); + goto tail_call; + } } } - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { - GC_REF_SET_BLACK(ref); - goto tail_call; - } -next: ref = GC_STACK_POP(); if (ref) { goto tail_call; @@ -838,149 +813,125 @@ static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack) { - HashTable *ht = NULL; + HashTable *ht; + Bucket *p; zval *zv; + uint32_t n; GC_STACK_DCL(stack); - do { - GC_BENCH_INC(zval_marked_grey); +tail_call: + GC_BENCH_INC(zval_marked_grey); - if (GC_TYPE(ref) == IS_OBJECT) { - zend_object *obj = (zend_object*)ref; + if (GC_TYPE(ref) == IS_OBJECT) { + zend_object *obj = (zend_object*)ref; - if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { - int n; - zval *zv, *end; + if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { + zval *table; + int len; - ht = obj->handlers->get_gc(obj, &zv, &n); - if (UNEXPECTED(ht)) { - GC_DELREF(ht); - if (!GC_REF_CHECK_COLOR(ht, GC_GREY)) { - GC_REF_SET_COLOR(ht, GC_GREY); - } else { - ht = NULL; - } - } - if (EXPECTED(!ht)) { - if (!n) goto next; - end = zv + n; - while (!Z_REFCOUNTED_P(--end)) { - if (zv == end) goto next; - } - } else { - if (!n) goto handle_ht; - end = zv + n; - } - while (zv != end) { - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_DELREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_GREY); - GC_STACK_PUSH(ref); + ht = obj->handlers->get_gc(obj, &table, &len); + n = len; + zv = table; + if (UNEXPECTED(ht)) { + GC_DELREF(ht); + if (!GC_REF_CHECK_COLOR(ht, GC_GREY)) { + GC_REF_SET_COLOR(ht, GC_GREY); + for (; n != 0; n--) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + GC_STACK_PUSH(ref); + } } + zv++; } - zv++; + goto handle_ht; } - if (EXPECTED(!ht)) { + } +handle_zvals: + for (; n != 0; n--) { + if (Z_REFCOUNTED_P(zv)) { ref = Z_COUNTED_P(zv); GC_DELREF(ref); if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { GC_REF_SET_COLOR(ref, GC_GREY); - continue; + zv++; + while (--n) { + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + GC_STACK_PUSH(ref); + } + } + zv++; + } + goto tail_call; } - goto next; - } - } else { - goto next; - } - } else if (GC_TYPE(ref) == IS_ARRAY) { - ZEND_ASSERT(((zend_array*)ref) != &EG(symbol_table)); - ht = (zend_array*)ref; - } else if (GC_TYPE(ref) == IS_REFERENCE) { - if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { - ref = Z_COUNTED(((zend_reference*)ref)->val); - GC_DELREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_GREY); - continue; } + zv++; } - goto next; - } else { - goto next; } - + } else if (GC_TYPE(ref) == IS_ARRAY) { + ZEND_ASSERT(((zend_array*)ref) != &EG(symbol_table)); + ht = (zend_array*)ref; handle_ht: - if (!ht->nNumUsed) goto next; + n = ht->nNumUsed; if (HT_IS_PACKED(ht)) { - zval *end; - zv = ht->arPacked; - end = zv + ht->nNumUsed; - while (1) { - end--; - if (Z_REFCOUNTED_P(end)) { - break; - } - if (zv == end) goto next; - } - while (zv != end) { - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_DELREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_GREY); - GC_STACK_PUSH(ref); - } - } - zv++; - } - } else { - Bucket *p = ht->arData; - Bucket *end = p + ht->nNumUsed; - - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - break; - } - if (p == end) goto next; - } - while (p != end) { - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_DELREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_GREY); - GC_STACK_PUSH(ref); - } - } - p++; - } + goto handle_zvals; + } + + p = ht->arData; + for (; n != 0; n--) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + p++; + while (--n) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + GC_STACK_PUSH(ref); + } + } + p++; + } + goto tail_call; + } + } + p++; } - ref = Z_COUNTED_P(zv); - GC_DELREF(ref); - if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_GREY); - continue; + } else if (GC_TYPE(ref) == IS_REFERENCE) { + if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { + ref = Z_COUNTED(((zend_reference*)ref)->val); + GC_DELREF(ref); + if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_GREY); + goto tail_call; + } } + } -next: - ref = GC_STACK_POP(); - } while (ref); + ref = GC_STACK_POP(); + if (ref) { + goto tail_call; + } } /* Two-Finger compaction algorithm */ @@ -1041,7 +992,10 @@ static void gc_mark_roots(gc_stack *stack) static void gc_scan(zend_refcounted *ref, gc_stack *stack) { + HashTable *ht; + Bucket *p; zval *zv; + uint32_t n; GC_STACK_DCL(stack); tail_call: @@ -1066,101 +1020,93 @@ static void gc_scan(zend_refcounted *ref, gc_stack *stack) if (GC_TYPE(ref) == IS_OBJECT) { zend_object *obj = (zend_object*)ref; if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { - int n; - zval *zv, *end; - HashTable *ht = obj->handlers->get_gc(obj, &zv, &n); + zval *table; + int len; + + ht = obj->handlers->get_gc(obj, &table, &len); + n = len; + zv = table; if (UNEXPECTED(ht)) { if (GC_REF_CHECK_COLOR(ht, GC_GREY)) { GC_REF_SET_COLOR(ht, GC_WHITE); GC_STACK_PUSH((zend_refcounted *) ht); + for (; n != 0; n--) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_WHITE); + GC_STACK_PUSH(ref); + } + } + zv++; + } + goto handle_ht; } } - if (!n) goto next; - end = zv + n; - while (!Z_REFCOUNTED_P(--end)) { - if (zv == end) goto next; - } - while (zv != end) { +handle_zvals: + for (; n != 0; n--) { if (Z_REFCOUNTED_P(zv)) { ref = Z_COUNTED_P(zv); if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { GC_REF_SET_COLOR(ref, GC_WHITE); - GC_STACK_PUSH(ref); + zv++; + while (--n) { + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_WHITE); + GC_STACK_PUSH(ref); + } + } + zv++; + } + goto tail_call; } } zv++; } - ref = Z_COUNTED_P(zv); - if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_WHITE); - goto tail_call; - } } } else if (GC_TYPE(ref) == IS_ARRAY) { - HashTable *ht = (HashTable *)ref; + ht = (HashTable *)ref; ZEND_ASSERT(ht != &EG(symbol_table)); - if (!ht->nNumUsed) goto next; + +handle_ht: + n = ht->nNumUsed; if (HT_IS_PACKED(ht)) { - zval *end; + zv = ht->arPacked; + goto handle_zvals; + } - zv = ht->arPacked; - end = zv + ht->nNumUsed; - while (1) { - end--; - if (Z_REFCOUNTED_P(end)) { - break; - } - if (zv == end) goto next; - } - while (zv != end) { - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_WHITE); - GC_STACK_PUSH(ref); - } - } - zv++; - } - } else { - Bucket *p = ht->arData; - Bucket *end = p + ht->nNumUsed; - - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - break; - } - if (p == end) goto next; - } - while (p != end) { - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_WHITE); - GC_STACK_PUSH(ref); - } - } - p++; - } + p = ht->arData; + for (; n != 0; n--) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } - } - ref = Z_COUNTED_P(zv); - if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { - GC_REF_SET_COLOR(ref, GC_WHITE); - goto tail_call; + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_WHITE); + p++; + while (--n) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { + GC_REF_SET_COLOR(ref, GC_WHITE); + GC_STACK_PUSH(ref); + } + } + p++; + } + goto tail_call; + } + } + p++; } } else if (GC_TYPE(ref) == IS_REFERENCE) { if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { @@ -1223,164 +1169,142 @@ static void gc_add_garbage(zend_refcounted *ref) static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *stack) { int count = 0; - HashTable *ht = NULL; + HashTable *ht; + Bucket *p; zval *zv; + uint32_t n; GC_STACK_DCL(stack); - do { - /* don't count references for compatibility ??? */ - if (GC_TYPE(ref) != IS_REFERENCE) { - count++; - } +tail_call: + /* don't count references for compatibility ??? */ + if (GC_TYPE(ref) != IS_REFERENCE) { + count++; + } - if (GC_TYPE(ref) == IS_OBJECT) { - zend_object *obj = (zend_object*)ref; + if (GC_TYPE(ref) == IS_OBJECT) { + zend_object *obj = (zend_object*)ref; - if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { - int n; - zval *zv, *end; + if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { + int len; + zval *table; - /* optimization: color is GC_BLACK (0) */ - if (!GC_INFO(ref)) { - gc_add_garbage(ref); - } - if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED) - && (obj->handlers->dtor_obj != zend_objects_destroy_object - || obj->ce->destructor != NULL)) { - *flags |= GC_HAS_DESTRUCTORS; - } - ht = obj->handlers->get_gc(obj, &zv, &n); - if (UNEXPECTED(ht)) { - GC_ADDREF(ht); - if (GC_REF_CHECK_COLOR(ht, GC_WHITE)) { - GC_REF_SET_BLACK(ht); - } else { - ht = NULL; - } - } - if (EXPECTED(!ht)) { - if (!n) goto next; - end = zv + n; - while (!Z_REFCOUNTED_P(--end)) { - if (zv == end) goto next; - } - } else { - if (!n) goto handle_ht; - end = zv + n; - } - while (zv != end) { - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { - GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); - } - } - zv++; - } - if (EXPECTED(!ht)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { - GC_REF_SET_BLACK(ref); - continue; - } - goto next; - } - } else { - goto next; - } - } else if (GC_TYPE(ref) == IS_ARRAY) { /* optimization: color is GC_BLACK (0) */ if (!GC_INFO(ref)) { gc_add_garbage(ref); } - ht = (zend_array*)ref; - } else if (GC_TYPE(ref) == IS_REFERENCE) { - if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { - ref = Z_COUNTED(((zend_reference*)ref)->val); - GC_ADDREF(ref); - if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { - GC_REF_SET_BLACK(ref); - continue; - } - } - goto next; - } else { - goto next; - } - -handle_ht: - if (!ht->nNumUsed) goto next; - if (HT_IS_PACKED(ht)) { - zval *end; - - zv = ht->arPacked; - end = zv + ht->nNumUsed; - while (1) { - end--; - if (Z_REFCOUNTED_P(end)) { - break; - } - if (zv == end) goto next; + if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED) + && (obj->handlers->dtor_obj != zend_objects_destroy_object + || obj->ce->destructor != NULL)) { + *flags |= GC_HAS_DESTRUCTORS; } - while (zv != end) { - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { - GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); + ht = obj->handlers->get_gc(obj, &table, &len); + n = len; + zv = table; + if (UNEXPECTED(ht)) { + GC_ADDREF(ht); + if (GC_REF_CHECK_COLOR(ht, GC_WHITE)) { + GC_REF_SET_BLACK(ht); + for (; n != 0; n--) { + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + zv++; } + goto handle_ht; } - zv++; - } - } else { - Bucket *p = ht->arData; - Bucket *end = p + ht->nNumUsed; - - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - break; - } - if (p == end) goto next; } - while (p != end) { - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } + +handle_zvals: + for (; n != 0; n--) { if (Z_REFCOUNTED_P(zv)) { ref = Z_COUNTED_P(zv); GC_ADDREF(ref); if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { GC_REF_SET_BLACK(ref); - GC_STACK_PUSH(ref); + zv++; + while (--n) { + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + zv++; + } + goto tail_call; } } - p++; + zv++; } + } + } else if (GC_TYPE(ref) == IS_ARRAY) { + /* optimization: color is GC_BLACK (0) */ + if (!GC_INFO(ref)) { + gc_add_garbage(ref); + } + ht = (zend_array*)ref; + +handle_ht: + n = ht->nNumUsed; + if (HT_IS_PACKED(ht)) { + zv = ht->arPacked; + goto handle_zvals; + } + + p = ht->arData; + for (; n != 0; n--) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + p++; + while (--n) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + GC_STACK_PUSH(ref); + } + } + p++; + } + goto tail_call; + } + } + p++; } - ref = Z_COUNTED_P(zv); - GC_ADDREF(ref); - if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { - GC_REF_SET_BLACK(ref); - continue; + } else if (GC_TYPE(ref) == IS_REFERENCE) { + if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { + ref = Z_COUNTED(((zend_reference*)ref)->val); + GC_ADDREF(ref); + if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { + GC_REF_SET_BLACK(ref); + goto tail_call; + } } + } -next: - ref = GC_STACK_POP(); - } while (ref); + ref = GC_STACK_POP(); + if (ref) { + goto tail_call; + } return count; } @@ -1427,130 +1351,116 @@ static int gc_collect_roots(uint32_t *flags, gc_stack *stack) static int gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffer *root, gc_stack *stack) { - HashTable *ht = NULL; + HashTable *ht; + Bucket *p; zval *zv; + uint32_t n; int count = 0; GC_STACK_DCL(stack); - do { - if (root) { - root = NULL; - count++; - } else if (GC_REF_ADDRESS(ref) != 0 - && GC_REF_CHECK_COLOR(ref, GC_BLACK)) { - GC_TRACE_REF(ref, "removing from buffer"); - GC_REMOVE_FROM_BUFFER(ref); - count++; - } else if (GC_TYPE(ref) == IS_REFERENCE) { - if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { - ref = Z_COUNTED(((zend_reference*)ref)->val); - continue; - } - goto next; - } else { - goto next; +tail_call: + if (root) { + root = NULL; + count++; + } else if (GC_REF_ADDRESS(ref) != 0 + && GC_REF_CHECK_COLOR(ref, GC_BLACK)) { + GC_TRACE_REF(ref, "removing from buffer"); + GC_REMOVE_FROM_BUFFER(ref); + count++; + } else if (GC_TYPE(ref) == IS_REFERENCE) { + if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { + ref = Z_COUNTED(((zend_reference*)ref)->val); + goto tail_call; } + goto next; + } else { + goto next; + } - if (GC_TYPE(ref) == IS_OBJECT) { - zend_object *obj = (zend_object*)ref; + if (GC_TYPE(ref) == IS_OBJECT) { + zend_object *obj = (zend_object*)ref; - if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { - int n; - zval *zv, *end; + if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { + int len; + zval *table; - ht = obj->handlers->get_gc(obj, &zv, &n); - if (EXPECTED(!ht)) { - if (!n) goto next; - end = zv + n; - while (!Z_REFCOUNTED_P(--end)) { - if (zv == end) goto next; - } - } else { - if (!n) goto handle_ht; - end = zv + n; - } - while (zv != end) { + ht = obj->handlers->get_gc(obj, &table, &len); + n = len; + zv = table; + if (UNEXPECTED(ht)) { + for (; n != 0; n--) { if (Z_REFCOUNTED_P(zv)) { ref = Z_COUNTED_P(zv); GC_STACK_PUSH(ref); } zv++; } - if (EXPECTED(!ht)) { - ref = Z_COUNTED_P(zv); - continue; - } -handle_ht: if (GC_REF_ADDRESS(ht) != 0 && GC_REF_CHECK_COLOR(ht, GC_BLACK)) { GC_TRACE_REF(ht, "removing from buffer"); GC_REMOVE_FROM_BUFFER(ht); } - } else { - goto next; + goto handle_ht; } - } else if (GC_TYPE(ref) == IS_ARRAY) { - ht = (zend_array*)ref; - } else { - goto next; - } - if (!ht->nNumUsed) goto next; - if (HT_IS_PACKED(ht)) { - zval *end; - - zv = ht->arPacked; - end = zv + ht->nNumUsed; - while (1) { - end--; - if (Z_REFCOUNTED_P(end)) { - break; - } - if (zv == end) goto next; - } - while (zv != end) { +handle_zvals: + for (; n != 0; n--) { if (Z_REFCOUNTED_P(zv)) { ref = Z_COUNTED_P(zv); - GC_STACK_PUSH(ref); + zv++; + while (--n) { + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_STACK_PUSH(ref); + } + zv++; + } + goto tail_call; } zv++; } - } else { - Bucket *p = ht->arData; - Bucket *end = p + ht->nNumUsed; - - while (1) { - end--; - zv = &end->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - break; - } - if (p == end) goto next; - } - while (p != end) { - zv = &p->val; - if (Z_TYPE_P(zv) == IS_INDIRECT) { - zv = Z_INDIRECT_P(zv); - } - if (Z_REFCOUNTED_P(zv)) { - ref = Z_COUNTED_P(zv); - GC_STACK_PUSH(ref); - } - p++; - } + } + } else if (GC_TYPE(ref) == IS_ARRAY) { + ht = (zend_array*)ref; + +handle_ht: + n = ht->nNumUsed; + if (HT_IS_PACKED(ht)) { + zv = ht->arPacked; + goto handle_zvals; + } + + p = ht->arData; + for (; n != 0; n--) { zv = &p->val; if (Z_TYPE_P(zv) == IS_INDIRECT) { zv = Z_INDIRECT_P(zv); } + if (Z_REFCOUNTED_P(zv)) { + ref = Z_COUNTED_P(zv); + p++; + while (--n) { + zv = &p->val; + if (Z_TYPE_P(zv) == IS_INDIRECT) { + zv = Z_INDIRECT_P(zv); + } + if (Z_REFCOUNTED_P(zv)) { + zend_refcounted *ref = Z_COUNTED_P(zv); + GC_STACK_PUSH(ref); + } + p++; + } + goto tail_call; + } + p++; } - ref = Z_COUNTED_P(zv); - continue; + } next: - ref = GC_STACK_POP(); - } while (ref); + ref = GC_STACK_POP(); + if (ref) { + goto tail_call; + } + return count; } From d0a3cc146db9bf7c18d8860dcd5442da8354406c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 25 Nov 2021 09:45:51 +0100 Subject: [PATCH 0255/1346] Fix intl test on travis Presumably the output is ICU version dependent. --- ext/intl/tests/locale_get_display_language3.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/tests/locale_get_display_language3.phpt b/ext/intl/tests/locale_get_display_language3.phpt index 9924e543cb611..c5498f40a8829 100644 --- a/ext/intl/tests/locale_get_display_language3.phpt +++ b/ext/intl/tests/locale_get_display_language3.phpt @@ -143,7 +143,7 @@ disp_locale=de : display_language=i-mingo ----------------- locale='i-navajo' disp_locale=en : display_language=Navajo -disp_locale=fr : display_language=navajo +disp_locale=fr : display_language=(navajo|navaho) disp_locale=de : display_language=Navajo ----------------- locale='i-pwn' From 4b9a4c4a6d3701c427715c32e4f30e13abcf5ed1 Mon Sep 17 00:00:00 2001 From: Dylan T Date: Wed, 24 Nov 2021 21:31:48 +0000 Subject: [PATCH 0256/1346] Update include_userstream_002.phpt --- ext/standard/tests/file/include_userstream_002.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/tests/file/include_userstream_002.phpt b/ext/standard/tests/file/include_userstream_002.phpt index da9fec23bd202..f655c385cfcf4 100644 --- a/ext/standard/tests/file/include_userstream_002.phpt +++ b/ext/standard/tests/file/include_userstream_002.phpt @@ -19,7 +19,7 @@ class test { if (strchr($mode, 'a')) $this->pos = strlen($this->data); else - $this->po = 0; + $this->pos = 0; return true; } From b9165671d51cc5545803b104b8e123b8bb36d0aa Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 25 Nov 2021 11:17:46 +0100 Subject: [PATCH 0257/1346] Verify that used SSA variables are defined There should either be a defining instruction, defining phi, or it should be an undef entry variable. --- Zend/Optimizer/ssa_integrity.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Zend/Optimizer/ssa_integrity.c b/Zend/Optimizer/ssa_integrity.c index 33b6567a9942f..d4ffbd1e7cd27 100644 --- a/Zend/Optimizer/ssa_integrity.c +++ b/Zend/Optimizer/ssa_integrity.c @@ -89,6 +89,11 @@ static inline bool is_var_type(zend_uchar type) { return (type & (IS_CV|IS_VAR|IS_TMP_VAR)) != 0; } +static inline bool is_defined(const zend_ssa *ssa, const zend_op_array *op_array, int var) { + const zend_ssa_var *ssa_var = &ssa->vars[var]; + return ssa_var->definition >= 0 || ssa_var->definition_phi || var < op_array->last_var; +} + #define FAIL(...) do { \ if (status == SUCCESS) { \ fprintf(stderr, "\nIn function %s::%s (%s):\n", \ @@ -209,6 +214,10 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex if (ssa_op->op1_use >= ssa->vars_count) { FAIL("op1 use %d out of range\n", ssa_op->op1_use); } + if (!is_defined(ssa, op_array, ssa_op->op1_use)) { + FAIL("op1 use of " VARFMT " in " INSTRFMT " is not defined\n", + VAR(ssa_op->op1_use), INSTR(i)); + } if (!is_in_use_chain(ssa, ssa_op->op1_use, i)) { FAIL("op1 use of " VARFMT " in " INSTRFMT " not in use chain\n", VAR(ssa_op->op1_use), INSTR(i)); @@ -222,6 +231,10 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex if (ssa_op->op2_use >= ssa->vars_count) { FAIL("op2 use %d out of range\n", ssa_op->op2_use); } + if (!is_defined(ssa, op_array, ssa_op->op2_use)) { + FAIL("op2 use of " VARFMT " in " INSTRFMT " is not defined\n", + VAR(ssa_op->op2_use), INSTR(i)); + } if (!is_in_use_chain(ssa, ssa_op->op2_use, i)) { FAIL("op2 use of " VARFMT " in " INSTRFMT " not in use chain\n", VAR(ssa_op->op2_use), INSTR(i)); @@ -235,6 +248,10 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex if (ssa_op->result_use >= ssa->vars_count) { FAIL("result use %d out of range\n", ssa_op->result_use); } + if (!is_defined(ssa, op_array, ssa_op->result_use)) { + FAIL("result use of " VARFMT " in " INSTRFMT " is not defined\n", + VAR(ssa_op->result_use), INSTR(i)); + } if (!is_in_use_chain(ssa, ssa_op->result_use, i)) { FAIL("result use of " VARFMT " in " INSTRFMT " not in use chain\n", VAR(ssa_op->result_use), INSTR(i)); From 1241ec8c3f2f86cb77ec48b1674a4db58077bfcc Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 25 Nov 2021 13:16:26 +0100 Subject: [PATCH 0258/1346] fix [-Wstrict-prototypes] build warnings in ext/gd --- ext/gd/config.m4 | 2 -- ext/gd/gd.c | 58 ++++++++++++++++++++++++------------------------ 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/ext/gd/config.m4 b/ext/gd/config.m4 index b3f7880ded279..0a175d11d52e7 100644 --- a/ext/gd/config.m4 +++ b/ext/gd/config.m4 @@ -158,8 +158,6 @@ dnl if test "$PHP_GD" != "no"; then if test "$PHP_EXTERNAL_GD" = "no"; then - dnl Disable strict prototypes as GD takes advantages of variadic function signatures for function pointers. - GD_CFLAGS="-Wno-strict-prototypes" extra_sources="libgd/gd.c libgd/gd_gd.c libgd/gd_gd2.c libgd/gd_io.c libgd/gd_io_dp.c \ libgd/gd_io_file.c libgd/gd_ss.c libgd/gd_io_ss.c libgd/gd_webp.c libgd/gd_avif.c \ libgd/gd_png.c libgd/gd_jpeg.c libgd/gdxpm.c libgd/gdfontt.c libgd/gdfonts.c \ diff --git a/ext/gd/gd.c b/ext/gd/gd.c index e8ab9086754fd..fc48e885f0a8c 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -140,16 +140,16 @@ static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS); static void php_image_filter_scatter(INTERNAL_FUNCTION_PARAMETERS); /* End Section filters declarations */ -static gdImagePtr _php_image_create_from_string(zend_string *Data, char *tn, gdImagePtr (*ioctx_func_p)()); -static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()); -static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()); +static gdImagePtr _php_image_create_from_string(zend_string *Data, char *tn, gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)); +static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(FILE *), gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)); +static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn); static gdIOCtx *create_stream_context_from_zval(zval *to_zval); static gdIOCtx *create_stream_context(php_stream *stream, int close_stream); static gdIOCtx *create_output_context(void); static int _php_image_type(zend_string *data); /* output streaming (formerly gd_ctx.c) */ -static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()); +static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn); /********************************************************* * @@ -291,7 +291,7 @@ static zend_function *php_gd_font_object_get_constructor(zend_object *object) return NULL; } -static void php_gd_font_minit_helper() +static void php_gd_font_minit_helper(void) { gd_font_ce = register_class_GdFont(); gd_font_ce->create_object = php_gd_font_object_create; @@ -1524,7 +1524,7 @@ static int _php_image_type(zend_string *data) /* }}} */ /* {{{ _php_image_create_from_string */ -gdImagePtr _php_image_create_from_string(zend_string *data, char *tn, gdImagePtr (*ioctx_func_p)()) +gdImagePtr _php_image_create_from_string(zend_string *data, char *tn, gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)) { gdImagePtr im; gdIOCtx *io_ctx; @@ -1629,7 +1629,7 @@ PHP_FUNCTION(imagecreatefromstring) /* }}} */ /* {{{ _php_image_create_from */ -static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()) +static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(FILE *), gdImagePtr (*ioctx_func_p)(gdIOCtxPtr)) { char *file; size_t file_len; @@ -1673,7 +1673,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void**)&fp, REPORT_ERRORS)) { goto out_err; } - } else if (ioctx_func_p) { + } else if (ioctx_func_p || image_type == PHP_GDIMG_TYPE_GD2PART) { /* we can create an io context */ gdIOCtx* io_ctx; zend_string *buff; @@ -1697,7 +1697,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, } if (image_type == PHP_GDIMG_TYPE_GD2PART) { - im = (*ioctx_func_p)(io_ctx, srcx, srcy, width, height); + im = gdImageCreateFromGd2PartCtx(io_ctx, srcx, srcy, width, height); } else { im = (*ioctx_func_p)(io_ctx); } @@ -1715,7 +1715,7 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, if (!im && fp) { switch (image_type) { case PHP_GDIMG_TYPE_GD2PART: - im = (*func_p)(fp, srcx, srcy, width, height); + im = gdImageCreateFromGd2Part(fp, srcx, srcy, width, height); break; #ifdef HAVE_GD_XPM case PHP_GDIMG_TYPE_XPM: @@ -1807,7 +1807,7 @@ PHP_FUNCTION(imagecreatefromavif) /* {{{ Create a new image from XPM file or URL */ PHP_FUNCTION(imagecreatefromxpm) { - _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XPM, "XPM", gdImageCreateFromXpm, NULL); + _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_XPM, "XPM", NULL, NULL); } /* }}} */ #endif @@ -1836,7 +1836,7 @@ PHP_FUNCTION(imagecreatefromgd2) /* {{{ Create a new image from a given part of GD2 file or URL */ PHP_FUNCTION(imagecreatefromgd2part) { - _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2PART, "GD2", gdImageCreateFromGd2Part, gdImageCreateFromGd2PartCtx); + _php_image_create_from(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2PART, "GD2", NULL, NULL); } /* }}} */ @@ -1859,7 +1859,7 @@ PHP_FUNCTION(imagecreatefromtga) #endif /* {{{ _php_image_output */ -static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) +static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn) { zval *imgind; char *file = NULL; @@ -1906,13 +1906,13 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char switch (image_type) { case PHP_GDIMG_TYPE_GD: - (*func_p)(im, fp); + gdImageGd(im, fp); break; case PHP_GDIMG_TYPE_GD2: if (q == -1) { q = 128; } - (*func_p)(im, fp, q, t); + gdImageGd2(im, fp, q, t); break; EMPTY_SWITCH_DEFAULT_CASE() } @@ -1932,13 +1932,13 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char switch (image_type) { case PHP_GDIMG_TYPE_GD: - (*func_p)(im, tmp); + gdImageGd(im, tmp); break; case PHP_GDIMG_TYPE_GD2: if (q == -1) { q = 128; } - (*func_p)(im, tmp, q, t); + gdImageGd2(im, tmp, q, t); break; EMPTY_SWITCH_DEFAULT_CASE() } @@ -2008,7 +2008,7 @@ PHP_FUNCTION(imagexbm) /* {{{ Output GIF image to browser or file */ PHP_FUNCTION(imagegif) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF", gdImageGifCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF"); } /* }}} */ @@ -2016,7 +2016,7 @@ PHP_FUNCTION(imagegif) /* {{{ Output PNG image to browser or file */ PHP_FUNCTION(imagepng) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG", gdImagePngCtxEx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG"); } /* }}} */ #endif /* HAVE_GD_PNG */ @@ -2025,7 +2025,7 @@ PHP_FUNCTION(imagepng) /* {{{ Output WEBP image to browser or file */ PHP_FUNCTION(imagewebp) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WEBP, "WEBP", gdImageWebpCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WEBP, "WEBP"); } /* }}} */ #endif /* HAVE_GD_WEBP */ @@ -2034,7 +2034,7 @@ PHP_FUNCTION(imagewebp) /* {{{ Output AVIF image to browser or file */ PHP_FUNCTION(imageavif) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_AVIF, "AVIF", gdImageAvifCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_AVIF, "AVIF"); } /* }}} */ #endif /* HAVE_GD_AVIF */ @@ -2043,7 +2043,7 @@ PHP_FUNCTION(imageavif) /* {{{ Output JPEG image to browser or file */ PHP_FUNCTION(imagejpeg) { - _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG", gdImageJpegCtx); + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG"); } /* }}} */ #endif /* HAVE_GD_JPG */ @@ -2095,14 +2095,14 @@ PHP_FUNCTION(imagewbmp) /* {{{ Output GD image to browser or file */ PHP_FUNCTION(imagegd) { - _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD, "GD", gdImageGd); + _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD, "GD"); } /* }}} */ /* {{{ Output GD2 image to browser or file */ PHP_FUNCTION(imagegd2) { - _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2, "GD2", gdImageGd2); + _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GD2, "GD2"); } /* }}} */ @@ -4222,7 +4222,7 @@ static gdIOCtx *create_output_context() { return ctx; } -static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) +static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn) { zval *imgind; zend_long quality = -1, basefilter = -1, speed = -1; @@ -4261,19 +4261,19 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, switch (image_type) { case PHP_GDIMG_TYPE_JPG: - (*func_p)(im, ctx, (int) quality); + gdImageJpegCtx(im, ctx, (int) quality); break; case PHP_GDIMG_TYPE_WEBP: if (quality == -1) { quality = 80; } - (*func_p)(im, ctx, (int) quality); + gdImageWebpCtx(im, ctx, (int) quality); break; case PHP_GDIMG_TYPE_AVIF: if (speed == -1) { speed = 6; } - (*func_p)(im, ctx, (int) quality, (int) speed); + gdImageAvifCtx(im, ctx, (int) quality, (int) speed); break; #ifdef HAVE_GD_PNG case PHP_GDIMG_TYPE_PNG: @@ -4285,7 +4285,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, break; #endif case PHP_GDIMG_TYPE_GIF: - (*func_p)(im, ctx); + gdImageGifCtx(im, ctx); break; EMPTY_SWITCH_DEFAULT_CASE() } From 2611e4bc6dde5b87c22f16badf6c4051ba2b233c Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sat, 20 Nov 2021 16:02:11 -0500 Subject: [PATCH 0259/1346] Optimize the destructor of WeakMap for large WeakMaps Postpone calling any destructors of entries within the weak map itself until after the singleton `EG(weakmap)` is updated to remove all keys in the weak map. Before, zend_weakref_unregister would do two hash table lookups when freeing an entry from a WeakMap - Free from `EG(weakrefs)` if that was the last reference - zend_weakref_unref_single to remove the entry from the WeakMap itself After this change, only the first hash table lookup is done. The freeing of entries from the weak map itself is done sequentially in `zend_hash_destroy` without hashing or scanning buckets. It may be a good idea to prevent modification of a WeakMap after the weak map starts to get freed. Closes GH-7672 --- Zend/zend_weakrefs.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index e4cfadb73c5d5..85e3276b1e4df 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -109,7 +109,7 @@ static void zend_weakref_register(zend_object *object, void *payload) { &EG(weakrefs), obj_addr, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_HT)); } -static void zend_weakref_unregister(zend_object *object, void *payload) { +static void zend_weakref_unregister(zend_object *object, void *payload, bool weakref_free) { zend_ulong obj_addr = (zend_ulong) object; void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), obj_addr); ZEND_ASSERT(tagged_ptr && "Weakref not registered?"); @@ -122,7 +122,9 @@ static void zend_weakref_unregister(zend_object *object, void *payload) { GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); /* Do this last, as it may destroy the object. */ - zend_weakref_unref_single(ptr, tag, obj_addr); + if (weakref_free) { + zend_weakref_unref_single(ptr, tag, obj_addr); + } return; } @@ -141,8 +143,10 @@ static void zend_weakref_unregister(zend_object *object, void *payload) { } /* Do this last, as it may destroy the object. */ - zend_weakref_unref_single( - ZEND_WEAKREF_GET_PTR(payload), ZEND_WEAKREF_GET_TAG(payload), obj_addr); + if (weakref_free) { + zend_weakref_unref_single( + ZEND_WEAKREF_GET_PTR(payload), ZEND_WEAKREF_GET_TAG(payload), obj_addr); + } } ZEND_API zval *zend_weakrefs_hash_add(HashTable *ht, zend_object *key, zval *pData) { @@ -156,7 +160,7 @@ ZEND_API zval *zend_weakrefs_hash_add(HashTable *ht, zend_object *key, zval *pDa ZEND_API zend_result zend_weakrefs_hash_del(HashTable *ht, zend_object *key) { zval *zv = zend_hash_index_find(ht, (zend_ulong) key); if (zv) { - zend_weakref_unregister(key, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_MAP)); + zend_weakref_unregister(key, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_MAP), 1); return SUCCESS; } return FAILURE; @@ -245,7 +249,7 @@ static void zend_weakref_free(zend_object *zo) { zend_weakref *wr = zend_weakref_from(zo); if (wr->referent) { - zend_weakref_unregister(wr->referent, ZEND_WEAKREF_ENCODE(wr, ZEND_WEAKREF_TAG_REF)); + zend_weakref_unregister(wr->referent, ZEND_WEAKREF_ENCODE(wr, ZEND_WEAKREF_TAG_REF), 1); } zend_object_std_dtor(&wr->std); @@ -293,8 +297,11 @@ static void zend_weakmap_free_obj(zend_object *object) zend_weakmap *wm = zend_weakmap_from(object); zend_ulong obj_addr; ZEND_HASH_MAP_FOREACH_NUM_KEY(&wm->ht, obj_addr) { + /* Optimization: Don't call zend_weakref_unref_single to free individual entries from wm->ht when unregistering (which would do a hash table lookup, call zend_hash_index_del, and skip over any bucket collisions). + * Let freeing the corresponding values for WeakMap entries be done in zend_hash_destroy, freeing objects sequentially. + * The performance difference is notable for larger WeakMaps with worse cache locality. */ zend_weakref_unregister( - (zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP)); + (zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP), 0); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&wm->ht); zend_object_std_dtor(&wm->std); @@ -395,7 +402,7 @@ static void zend_weakmap_unset_dimension(zend_object *object, zval *offset) return; } - zend_weakref_unregister(obj_key, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP)); + zend_weakref_unregister(obj_key, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP), 1); } static int zend_weakmap_count_elements(zend_object *object, zend_long *count) From 8be10fb48ddf3675b6efb5a2435f633c02b28680 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 26 Nov 2021 11:24:22 +0100 Subject: [PATCH 0260/1346] Remove redundant test This test is the same as 001.phpt, apart from some formatting differences. --- ext/session/tests/022.phpt | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 ext/session/tests/022.phpt diff --git a/ext/session/tests/022.phpt b/ext/session/tests/022.phpt deleted file mode 100644 index 43e12fcda337e..0000000000000 --- a/ext/session/tests/022.phpt +++ /dev/null @@ -1,34 +0,0 @@ ---TEST-- -session object serialization ---EXTENSIONS-- -session ---SKIPIF-- - ---INI-- -session.use_cookies=0 -session.cache_limiter= -session.serialize_handler=php -session.save_handler=files ---FILE-- -yes = "done"; } -} - -$baz = new foo; -$baz->method(); - -$arr[3] = new foo; -$arr[3]->method(); -session_start(); -$_SESSION["baz"] = $baz; -$_SESSION["arr"] = $arr; -var_dump(session_encode()); -session_destroy(); -?> ---EXPECT-- -string(126) "baz|O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}arr|a:1:{i:3;O:3:"foo":2:{s:3:"bar";s:2:"ok";s:3:"yes";s:4:"done";}}" From 35a01f86e08f312614e3fe2f1ced1f2a49f464c1 Mon Sep 17 00:00:00 2001 From: Gregor Harlan Date: Fri, 26 Nov 2021 11:51:42 +0100 Subject: [PATCH 0261/1346] Add dark mode for phpinfo() (#7626) The light mode remains the same. --- ext/standard/css.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ext/standard/css.c b/ext/standard/css.c index 7d8777f284b9d..2daafb61426c0 100644 --- a/ext/standard/css.c +++ b/ext/standard/css.c @@ -23,7 +23,7 @@ PHPAPI ZEND_COLD void php_info_print_css(void) /* {{{ */ PUTS("pre {margin: 0; font-family: monospace;}\n"); PUTS("a:link {color: #009; text-decoration: none; background-color: #fff;}\n"); PUTS("a:hover {text-decoration: underline;}\n"); - PUTS("table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;}\n"); + PUTS("table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.2);}\n"); PUTS(".center {text-align: center;}\n"); PUTS(".center table {margin: 1em auto; text-align: left;}\n"); PUTS(".center th {text-align: center !important;}\n"); @@ -38,5 +38,13 @@ PHPAPI ZEND_COLD void php_info_print_css(void) /* {{{ */ PUTS(".v i {color: #999;}\n"); PUTS("img {float: right; border: 0;}\n"); PUTS("hr {width: 934px; background-color: #ccc; border: 0; height: 1px;}\n"); + PUTS("@media (prefers-color-scheme: dark) {\n"); + PUTS(" body {background-color: #333; color: #ddd;}\n"); + PUTS(" td, th {border-color: #777;}\n"); + PUTS(" .e {background-color: #4F5B93;}\n"); + PUTS(" .h {background-color: #5b69a6;}\n"); + PUTS(" .v {background-color: #444;}\n"); + PUTS(" hr {background-color: #777;}\n"); + PUTS("}\n"); } /* }}} */ From 902d64390e49f8bf970588cf53cd8e00630c68bb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Oct 2021 15:49:27 +0200 Subject: [PATCH 0262/1346] Deprecate implicit dynamic properties Writing to a proprety that hasn't been declared is deprecated, unless the class uses the #[AllowDynamicProperties] attribute or defines __get()/__set(). RFC: https://wiki.php.net/rfc/deprecate_dynamic_properties --- UPGRADING | 10 +++ Zend/Optimizer/sccp.c | 4 +- Zend/Optimizer/zend_inference.c | 14 ++-- ...allow_dynamic_properties_on_interface.phpt | 11 +++ .../allow_dynamic_properties_on_trait.phpt | 11 +++ Zend/tests/anon/003.phpt | 2 +- Zend/tests/assign_to_obj_001.phpt | 1 + Zend/tests/bug27268.phpt | 1 + Zend/tests/bug30162.phpt | 2 + Zend/tests/bug38779_1.phpt | 1 + Zend/tests/bug47343.phpt | 6 +- Zend/tests/bug49893.phpt | 1 + Zend/tests/bug51822.phpt | 1 + Zend/tests/bug54268.phpt | 1 + Zend/tests/bug55305.phpt | 1 + Zend/tests/bug60536_001.phpt | 1 + Zend/tests/bug60833.phpt | 33 ++++----- Zend/tests/bug63462.phpt | 1 + Zend/tests/bug64821.1.phpt | 1 + Zend/tests/bug64960.phpt | 4 ++ Zend/tests/bug65911.phpt | 1 + Zend/tests/bug66609.phpt | 1 + Zend/tests/bug69446.phpt | 1 + Zend/tests/bug70223.phpt | 3 + Zend/tests/bug70397.phpt | 4 +- Zend/tests/bug70805.phpt | 2 + Zend/tests/bug70805_1.phpt | 2 + Zend/tests/bug70805_2.phpt | 2 + Zend/tests/bug71859.phpt | 1 + Zend/tests/bug72101.phpt | 13 ++-- Zend/tests/bug78010.phpt | 1 + Zend/tests/bug78340.phpt | 3 +- Zend/tests/bug78379.phpt | 2 + Zend/tests/bug78379_2.phpt | 1 + Zend/tests/bug78589.phpt | 1 + Zend/tests/bug79477.phpt | 1 + Zend/tests/bug79862.phpt | 1 + Zend/tests/bug81104.phpt | 1 + Zend/tests/closure_020.phpt | 1 + Zend/tests/closure_026.phpt | 1 + Zend/tests/dynamic_prop_deprecation.phpt | 47 ++++++++++++ Zend/tests/exception_stream_wrapper.phpt | 1 + Zend/tests/fibers/no-switch-gc.phpt | 5 +- Zend/tests/foreach_shadowed_dyn_property.phpt | 2 + Zend/tests/gc_038.phpt | 3 +- Zend/tests/gc_042.phpt | 1 + .../generators/iterator_wrapper_leak.phpt | 2 + Zend/tests/get_mangled_object_vars.phpt | 2 + Zend/tests/nowdoc.inc | 2 +- Zend/tests/temporary_cleaning_013.phpt | 13 ++++ ...hrowing_overloaded_compound_assign_op.phpt | 1 + .../typed_properties_086.phpt | 1 + Zend/zend_attributes.c | 22 ++++++ Zend/zend_attributes.h | 1 + Zend/zend_attributes.stub.php | 5 ++ Zend/zend_attributes_arginfo.h | 22 +++++- Zend/zend_builtin_functions.c | 7 +- Zend/zend_compile.h | 6 +- Zend/zend_inheritance.c | 2 +- Zend/zend_object_handlers.c | 12 ++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 72 +++++++++---------- ext/date/tests/DateTimeZone_clone_basic3.phpt | 8 +++ ext/date/tests/DateTime_clone_basic3.phpt | 8 +++ ext/date/tests/bug65672.phpt | 8 ++- ext/date/tests/call_function_from_method.phpt | 2 + ext/date/tests/date_interval_prop_dim.phpt | 3 +- ext/dom/tests/domobject_debug_handler.phpt | 1 + ext/exif/tests/bug68799.phpt | 1 + ext/gmp/tests/serialize.phpt | 2 + ext/json/tests/bug42785.phpt | 3 +- ext/json/tests/json_encode_basic.phpt | 5 +- ext/json/tests/json_encode_pretty_print2.phpt | 3 +- ext/libxml/tests/bug61367-read.phpt | 1 + ext/libxml/tests/bug61367-read_2.phpt | 2 + ext/libxml/tests/bug61367-write.phpt | 2 + ext/mysqli/tests/bug46614.phpt | 1 + ext/mysqli/tests/mysqli_fetch_object.phpt | 3 +- .../mysqli_fetch_object_no_constructor.phpt | 7 +- ext/mysqli/tests/mysqli_fetch_object_oo.phpt | 3 +- ext/opcache/tests/jit/fetch_obj_003.phpt | 1 + ext/opcache/tests/jit/fetch_obj_004.phpt | 1 + ext/opcache/tests/jit/inc_obj_002.phpt | 1 + ext/opcache/tests/opt/dce_005.phpt | 5 +- ext/pdo/tests/pdo_005.phpt | 1 + ext/pdo/tests/pdo_009.phpt | 9 +++ ext/pdo/tests/pdo_010.phpt | 9 +++ ext/pdo/tests/pdo_011.phpt | 7 +- ext/pdo/tests/pdo_012.phpt | 3 + ext/pdo/tests/pdo_013.phpt | 3 + ext/pdo/tests/pdo_014.phpt | 3 + ext/pdo/tests/pdo_023.phpt | 2 + ext/pdo_mysql/tests/bug46292.phpt | 2 + ext/pdo_mysql/tests/bug63176.phpt | 1 + ext/pdo_mysql/tests/bug70862.phpt | 1 + .../tests/pdo_mysql_stmt_fetch_serialize.phpt | 1 + .../tests/pdo_mysql_stmt_fetchobject.phpt | 1 + ext/pdo_pgsql/tests/bug72294.phpt | 2 + ext/pdo_sqlite/tests/bug46139.phpt | 1 + ext/pdo_sqlite/tests/bug70862.phpt | 1 + ext/reflection/tests/002.phpt | 1 + ext/reflection/tests/024.phpt | 3 +- .../ReflectionClass_getInterfaces_003.phpt | 2 + .../ReflectionObject___toString_basic2.phpt | 3 +- .../tests/ReflectionObject_export_basic3.phpt | 3 +- .../tests/ReflectionParameter_isDefault.phpt | 1 + .../ReflectionProperty_getDefaultValue.phpt | 1 + .../ReflectionProperty_hasDefaultValue.phpt | 1 + .../ReflectionProperty_isInitialized.phpt | 1 + .../ReflectionProperty_setValue_error.phpt | 1 + ext/reflection/tests/bug40431.phpt | 3 + ext/reflection/tests/bug46064.phpt | 2 + ext/reflection/tests/bug46064_2.phpt | 2 + ext/reflection/tests/bug53366.phpt | 1 + ext/reflection/tests/bug79820.phpt | 1 + ext/reflection/tests/bug80370.phpt | 1 + ext/reflection/tests/property_exists.phpt | 1 + ext/session/tests/001.phpt | 1 + ext/snmp/tests/snmp-object-properties.phpt | 2 + ext/soap/tests/bugs/bug39815.phpt | 8 +-- ...Object_sort_different_backing_storage.phpt | 6 +- .../ArrayObject_std_props_no_recursion.phpt | 7 +- .../tests/SplFileObject_fflush_basic_001.phpt | 5 +- .../SplFileObject_ftruncate_error_001.phpt | 5 +- .../tests/arrayObject___construct_basic2.phpt | 2 + .../tests/arrayObject___construct_basic3.phpt | 2 + .../tests/arrayObject___construct_basic6.phpt | 5 +- ext/spl/tests/arrayObject_clone_basic2.phpt | 2 + ext/spl/tests/arrayObject_clone_basic3.phpt | 2 + .../arrayObject_exchangeArray_basic3.phpt | 1 + ext/spl/tests/arrayObject_magicMethods2.phpt | 4 ++ ext/spl/tests/array_003.phpt | 1 + ext/spl/tests/array_007.phpt | 1 + ext/spl/tests/array_017.phpt | 2 + ext/spl/tests/bug61326.phpt | 4 +- ext/spl/tests/bug65387.phpt | 1 + ext/spl/tests/iterator_037.phpt | 5 +- .../tests/sqlite3_blob_bind_resource.phpt | 1 + ext/sqlite3/tests/stream_test.inc | 1 + ext/standard/tests/array/bug39576.phpt | 2 +- ext/standard/tests/file/bug27508.phpt | 1 + ext/standard/tests/file/bug38450.phpt | 1 + ext/standard/tests/file/bug38450_1.phpt | 1 + ext/standard/tests/file/bug38450_2.phpt | 1 + ext/standard/tests/file/bug38450_3.phpt | 3 +- ext/standard/tests/file/bug39551.phpt | 2 +- ext/standard/tests/file/bug71287.phpt | 2 + ext/standard/tests/file/fopencookie.phpt | 1 + ext/standard/tests/file/include_streams.phpt | 1 + .../tests/file/include_userstream_002.phpt | 9 +-- .../tests/file/include_userstream_003.phpt | 25 +++---- ext/standard/tests/file/userdirstream.phpt | 1 + ext/standard/tests/file/userstreams.phpt | 1 + ext/standard/tests/file/userstreams_002.phpt | 1 + ext/standard/tests/file/userstreams_003.phpt | 1 + ext/standard/tests/file/userstreams_004.phpt | 1 + ext/standard/tests/file/userstreams_005.phpt | 1 + ext/standard/tests/file/userstreams_006.phpt | 1 + ext/standard/tests/file/userstreams_007.phpt | 1 + ext/standard/tests/file/userwrapper.phpt | 2 + .../tests/general_functions/bug72306.phpt | 1 + .../general_functions/debug_zval_dump_o.phpt | 2 + .../tests/general_functions/is_object.phpt | 2 +- .../tests/general_functions/print_r.phpt | 2 + .../general_functions/print_r_64bit.phpt | 2 + .../tests/general_functions/var_dump.phpt | 2 + .../general_functions/var_dump_64bit.phpt | 2 + .../var_export-locale_32.phpt | 24 +++---- ext/standard/tests/serialize/001.phpt | 2 + .../tests/serialize/__serialize_004.phpt | 2 + ext/standard/tests/serialize/bug14293.phpt | 2 + ext/standard/tests/serialize/bug36424.phpt | 1 + .../serialize/serialization_objects_005.phpt | 2 +- ext/standard/tests/streams/bug40459.phpt | 1 + ext/standard/tests/streams/bug53903.phpt | 1 + ext/standard/tests/streams/bug60455_02.phpt | 1 + ext/standard/tests/streams/bug60455_03.phpt | 1 + ext/standard/tests/streams/bug60455_04.phpt | 1 + ext/standard/tests/streams/bug60817.phpt | 1 + ext/standard/tests/streams/bug67626.phpt | 2 + ext/standard/tests/streams/bug78662.phpt | 1 + .../tests/streams/set_file_buffer.phpt | 1 + .../stream_get_line_NUL_delimiter.phpt | 1 + .../streams/stream_read_object_return.phpt | 1 + .../tests/streams/stream_set_chunk_size.phpt | 1 + .../tests/streams/user-stream-error.phpt | 1 + ext/zip/tests/bug53603.phpt | 1 + .../phpdbg_get_executable_stream_wrapper.phpt | 1 + tests/classes/dereferencing_001.phpt | 4 +- tests/classes/iterators_006.phpt | 2 + tests/classes/method_call_variation_001.phpt | 4 +- tests/classes/property_recreate_private.phpt | 5 +- tests/classes/static_properties_003.phpt | 11 +-- tests/classes/visibility_005.phpt | 1 + tests/lang/030.phpt | 1 + tests/lang/035.phpt | 4 +- tests/lang/bug22510.phpt | 4 ++ tests/lang/bug27439.phpt | 1 + tests/lang/error_2_exception_001.phpt | 5 +- tests/lang/foreachLoopObjects.003.phpt | 1 + .../operators/overloaded_property_ref.phpt | 1 + 201 files changed, 583 insertions(+), 177 deletions(-) create mode 100644 Zend/tests/allow_dynamic_properties_on_interface.phpt create mode 100644 Zend/tests/allow_dynamic_properties_on_trait.phpt create mode 100644 Zend/tests/dynamic_prop_deprecation.phpt diff --git a/UPGRADING b/UPGRADING index e3c3eed59765f..3b02ec4bf3f2b 100644 --- a/UPGRADING +++ b/UPGRADING @@ -48,6 +48,16 @@ PHP 8.2 UPGRADE NOTES ======================================== - Core: + . Creation of dynamic properties is deprecated, unless the class opts in by + using the #[AllowDynamicProperties] attribute. stdClass allows dynamic + properties. Usage of __get()/__set() is not affected by this change. A + dynamic properties deprecation warning can be addressed by: + - Declaring the property (preferred). + - Adding the #[AllowDynamicProperties] attribute to the class (which also + applies to all child classes). + - Using a WeakMap if you wish to associate additional data with an object + you do not own. + . Callables that are not accepted by the $callable() syntax (but are accepted by call_user_func) are deprecated. In particular: diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 71aefe04a821a..be82c5aba91d6 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -1101,7 +1101,9 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o /* Don't try to propagate assignments to (potentially) typed properties. We would * need to deal with errors and type conversions first. */ - if (!var_info->ce || (var_info->ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS)) { + // TODO: Distinguish dynamic and declared property assignments here? + if (!var_info->ce || (var_info->ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS) || + !(var_info->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { SET_RESULT_BOT(result); SET_RESULT_BOT(op1); return; diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 9d06fee7f7fd9..92958baf22b94 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -4842,15 +4842,17 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op return 1; } - if (op_array->scope != ce && ce->default_properties_count) { - zend_property_info *prop_info = - zend_hash_find_ptr(&ce->properties_info, prop_name); - if (prop_info && (!(prop_info->flags & ZEND_ACC_PUBLIC) - || ZEND_TYPE_IS_SET(prop_info->type))) { + zend_property_info *prop_info = + zend_hash_find_ptr(&ce->properties_info, prop_name); + if (prop_info) { + if (ZEND_TYPE_IS_SET(prop_info->type)) { return 1; } + return !(prop_info->flags & ZEND_ACC_PUBLIC) + && prop_info->ce != op_array->scope; + } else { + return !(ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES); } - return 0; } return 1; case ZEND_ROPE_INIT: diff --git a/Zend/tests/allow_dynamic_properties_on_interface.phpt b/Zend/tests/allow_dynamic_properties_on_interface.phpt new file mode 100644 index 0000000000000..1d9bb4b89c261 --- /dev/null +++ b/Zend/tests/allow_dynamic_properties_on_interface.phpt @@ -0,0 +1,11 @@ +--TEST-- +#[AllowDynamicProperties] cannot be applied to interface +--FILE-- + +--EXPECTF-- +Fatal error: Cannot apply #[AllowDynamicProperties] to interface in %s on line %d diff --git a/Zend/tests/allow_dynamic_properties_on_trait.phpt b/Zend/tests/allow_dynamic_properties_on_trait.phpt new file mode 100644 index 0000000000000..4bceee03807f8 --- /dev/null +++ b/Zend/tests/allow_dynamic_properties_on_trait.phpt @@ -0,0 +1,11 @@ +--TEST-- +#[AllowDynamicProperties] cannot be applied to trait +--FILE-- + +--EXPECTF-- +Fatal error: Cannot apply #[AllowDynamicProperties] to trait in %s on line %d diff --git a/Zend/tests/anon/003.phpt b/Zend/tests/anon/003.phpt index e4c3f7cc03b21..c6a7390fac73c 100644 --- a/Zend/tests/anon/003.phpt +++ b/Zend/tests/anon/003.phpt @@ -4,7 +4,7 @@ reusing anonymous classes i = $i; } diff --git a/Zend/tests/assign_to_obj_001.phpt b/Zend/tests/assign_to_obj_001.phpt index a4eb7c0141b81..5b0c11b7446e9 100644 --- a/Zend/tests/assign_to_obj_001.phpt +++ b/Zend/tests/assign_to_obj_001.phpt @@ -8,6 +8,7 @@ function &a($i) { } class A { + public $a; public function test() { $this->a = a(1); unset($this->a); diff --git a/Zend/tests/bug27268.phpt b/Zend/tests/bug27268.phpt index a86e8d0297a8a..47301068d8478 100644 --- a/Zend/tests/bug27268.phpt +++ b/Zend/tests/bug27268.phpt @@ -2,6 +2,7 @@ Bug #27268 (Bad references accentuated by clone) --FILE-- A = $A; - } + public function __construct(public $A) {} public function __destruct() { diff --git a/Zend/tests/bug49893.phpt b/Zend/tests/bug49893.phpt index adab4421ddcb2..0832b0b0ef4c2 100644 --- a/Zend/tests/bug49893.phpt +++ b/Zend/tests/bug49893.phpt @@ -12,6 +12,7 @@ class A { } } class B { + public $a; function __construct() { $this->a = new A(); throw new Exception("1"); diff --git a/Zend/tests/bug51822.phpt b/Zend/tests/bug51822.phpt index 0a3813b2f1496..6bfacf8d5e73d 100644 --- a/Zend/tests/bug51822.phpt +++ b/Zend/tests/bug51822.phpt @@ -12,6 +12,7 @@ class DestructableObject class DestructorCreator { + public $test; public function __destruct() { $this->test = new DestructableObject; diff --git a/Zend/tests/bug54268.phpt b/Zend/tests/bug54268.phpt index e4ce5c0e3a774..3567aaa6ee570 100644 --- a/Zend/tests/bug54268.phpt +++ b/Zend/tests/bug54268.phpt @@ -20,6 +20,7 @@ class DestructableObject } class DestructorCreator { + public $test; public function __destruct() { $this->test = new DestructableObject; diff --git a/Zend/tests/bug55305.phpt b/Zend/tests/bug55305.phpt index 7f0749a315259..90d4c5b5bc087 100644 --- a/Zend/tests/bug55305.phpt +++ b/Zend/tests/bug55305.phpt @@ -2,6 +2,7 @@ Bug #55305 (ref lost: 1st ref instantiated in class def, 2nd ref made w/o instantiating) --FILE-- x; } } +#[AllowDynamicProperties] class Z extends Y { function __construct() { return ++$this->x; diff --git a/Zend/tests/bug60833.phpt b/Zend/tests/bug60833.phpt index 19cd2a4e53a26..e1b8a0a2a3ada 100644 --- a/Zend/tests/bug60833.phpt +++ b/Zend/tests/bug60833.phpt @@ -5,8 +5,8 @@ Bug #60833 (self, parent, static behave inconsistently case-sensitive) class A { static $x = "A"; function testit() { - $this->v1 = new sELF; - $this->v2 = new SELF; + var_dump(new sELF); + var_dump(new SELF); } } @@ -14,26 +14,21 @@ class B extends A { static $x = "B"; function testit() { PARENT::testit(); - $this->v3 = new sELF; - $this->v4 = new PARENT; - $this->v4 = STATIC::$x; + var_dump(new sELF); + var_dump(new PARENT); + var_dump(STATIC::$x); } } $t = new B(); $t->testit(); -var_dump($t); ?> ---EXPECTF-- -object(B)#%d (4) { - ["v1"]=> - object(A)#%d (0) { - } - ["v2"]=> - object(A)#%d (0) { - } - ["v3"]=> - object(B)#%d (0) { - } - ["v4"]=> - string(1) "B" +--EXPECT-- +object(A)#2 (0) { } +object(A)#2 (0) { +} +object(B)#2 (0) { +} +object(A)#2 (0) { +} +string(1) "B" diff --git a/Zend/tests/bug63462.phpt b/Zend/tests/bug63462.phpt index 03182224ef555..70e66e305c129 100644 --- a/Zend/tests/bug63462.phpt +++ b/Zend/tests/bug63462.phpt @@ -4,6 +4,7 @@ Test script to verify that magic methods should be called only once when accessi Marco Pivetta --FILE-- message = NULL; diff --git a/Zend/tests/bug64960.phpt b/Zend/tests/bug64960.phpt index 360b5bf722828..6ed010c859abf 100644 --- a/Zend/tests/bug64960.phpt +++ b/Zend/tests/bug64960.phpt @@ -31,6 +31,10 @@ $a['waa']; --EXPECTF-- Notice: ob_end_flush(): Failed to delete and flush buffer. No buffer to delete or flush in %sbug64960.php on line 3 +Deprecated: Creation of dynamic property Exception::$_trace is deprecated in %s on line %d + +Deprecated: Creation of dynamic property Exception::$_trace is deprecated in %s on line %d + Fatal error: Uncaught Exception in %sbug64960.php:19 Stack trace: #0 [internal function]: {closure}(8, 'ob_end_clean():...', '%s', 9) diff --git a/Zend/tests/bug65911.phpt b/Zend/tests/bug65911.phpt index cea7cdc1ded87..47d4eebc9849a 100644 --- a/Zend/tests/bug65911.phpt +++ b/Zend/tests/bug65911.phpt @@ -6,6 +6,7 @@ class A {} class B { + public $foo; public function go() { $this->foo = 'bar'; diff --git a/Zend/tests/bug66609.phpt b/Zend/tests/bug66609.phpt index f8c0d9ce67e4d..0807d1465e7d0 100644 --- a/Zend/tests/bug66609.phpt +++ b/Zend/tests/bug66609.phpt @@ -10,6 +10,7 @@ class Bar { return $foo->foo; } } +#[AllowDynamicProperties] class Foo { public function __get($x) { global $bar; diff --git a/Zend/tests/bug69446.phpt b/Zend/tests/bug69446.phpt index a82ecb4472084..6bc3c7006898d 100644 --- a/Zend/tests/bug69446.phpt +++ b/Zend/tests/bug69446.phpt @@ -5,6 +5,7 @@ zend.enable_gc = 1 --FILE-- value; }; -var_dump($f->call(new class {})->current()); +var_dump($f->call(new class { + public $value; +})->current()); ?> --EXPECT-- diff --git a/Zend/tests/bug70805.phpt b/Zend/tests/bug70805.phpt index 86653df0e74c8..65ecd90d0b1e6 100644 --- a/Zend/tests/bug70805.phpt +++ b/Zend/tests/bug70805.phpt @@ -3,9 +3,11 @@ Bug #70805 (Segmentation faults whilst running Drupal 8 test suite) --FILE-- stub->invoke($invocation); } @@ -77,10 +78,10 @@ $foo->bar($a, $b, $c); --EXPECTF-- Fatal error: Uncaught Error: Class "DoesNotExists" not found in %s:%d Stack trace: -#0 %sbug72101.php(8): {closure}(2, 'MethodCallbackB...', '%s', 8) -#1 %sbug72101.php(27): PHPUnit_Framework_MockObject_Stub_ReturnCallback->invoke(Object(PHPUnit_Framework_MockObject_Invocation_Static)) -#2 %sbug72101.php(19): PHPUnit_Framework_MockObject_Matcher->invoked(Object(PHPUnit_Framework_MockObject_Invocation_Static)) -#3 %sbug72101.php(52): PHPUnit_Framework_MockObject_InvocationMocker->invoke(Object(PHPUnit_Framework_MockObject_Invocation_Static)) -#4 %sbug72101.php(72): Mock_MethodCallbackByReference_7b180d26->bar(0, 0, 0) +#0 %sbug72101.php(%d): {closure}(2, 'MethodCallbackB...', '%s', 8) +#1 %sbug72101.php(%d): PHPUnit_Framework_MockObject_Stub_ReturnCallback->invoke(Object(PHPUnit_Framework_MockObject_Invocation_Static)) +#2 %sbug72101.php(%d): PHPUnit_Framework_MockObject_Matcher->invoked(Object(PHPUnit_Framework_MockObject_Invocation_Static)) +#3 %sbug72101.php(%d): PHPUnit_Framework_MockObject_InvocationMocker->invoke(Object(PHPUnit_Framework_MockObject_Invocation_Static)) +#4 %sbug72101.php(%d): Mock_MethodCallbackByReference_7b180d26->bar(0, 0, 0) #5 {main} - thrown in %sbug72101.php on line 61 + thrown in %sbug72101.php on line %d diff --git a/Zend/tests/bug78010.phpt b/Zend/tests/bug78010.phpt index a9ebc37ef1750..82334e78a25c1 100644 --- a/Zend/tests/bug78010.phpt +++ b/Zend/tests/bug78010.phpt @@ -5,6 +5,7 @@ memory_limit=2G --FILE-- bytes= self::$files[$path]; diff --git a/Zend/tests/bug78379.phpt b/Zend/tests/bug78379.phpt index 0f8d216bd31ea..850e44d7a5e48 100644 --- a/Zend/tests/bug78379.phpt +++ b/Zend/tests/bug78379.phpt @@ -3,10 +3,12 @@ Bug #78379 (Cast to object confuses GC, causes crash) --FILE-- p = (object)["x" => [1]]; } } +#[AllowDynamicProperties] class E { } $e = new E; diff --git a/Zend/tests/bug78379_2.phpt b/Zend/tests/bug78379_2.phpt index b1e7e3527f4d5..473f430ad8f79 100644 --- a/Zend/tests/bug78379_2.phpt +++ b/Zend/tests/bug78379_2.phpt @@ -2,6 +2,7 @@ Bug #78379.2 (Cast to object confuses GC, causes crash) --FILE-- x = [$this]; } diff --git a/Zend/tests/closure_020.phpt b/Zend/tests/closure_020.phpt index 7d98dd2dc6d13..55a2a01b257a4 100644 --- a/Zend/tests/closure_020.phpt +++ b/Zend/tests/closure_020.phpt @@ -5,6 +5,7 @@ Closure 020: Trying to access private property outside class class foo { private $test = 3; + public $a; public function x() { $a = &$this; diff --git a/Zend/tests/closure_026.phpt b/Zend/tests/closure_026.phpt index 0dba62fcb9a16..c586a7d71efe6 100644 --- a/Zend/tests/closure_026.phpt +++ b/Zend/tests/closure_026.phpt @@ -4,6 +4,7 @@ Closure 026: Assigning a closure object to an array in $this prop = 1; // Deprecated +$obj->prop = 1; // Ok +$obj->prop2 += 1; // Deprecated +$obj->prop2 += 1; // Ok +$obj->prop3++; // Deprecated +$obj->prop3++; // Ok +$obj->prop4[] = 1; // Deprecated +$obj->prop4[] = 1; // Ok +isset($obj->prop5); // Ok +unset($obj->prop6); // Ok + +// stdClass should not throw deprecation. +$obj = new stdClass; +$obj->prop = 1; + +// Classes with #[AllowDynamicProperties] should not throw deprecation. +#[AllowDynamicProperties] +class Test2 {} +class Test3 extends Test2 {} + +$obj = new Test2; +$obj->prop = 1; + +$obj = new Test3; +$obj->prop = 1; + +?> +--EXPECTF-- +Deprecated: Creation of dynamic property Test::$prop is deprecated in %s on line %d + +Deprecated: Creation of dynamic property Test::$prop2 is deprecated in %s on line %d + +Warning: Undefined property: Test::$prop2 in %s on line %d + +Deprecated: Creation of dynamic property Test::$prop3 is deprecated in %s on line %d + +Warning: Undefined property: Test::$prop3 in %s on line %d + +Deprecated: Creation of dynamic property Test::$prop4 is deprecated in %s on line %d diff --git a/Zend/tests/exception_stream_wrapper.phpt b/Zend/tests/exception_stream_wrapper.phpt index 7a70645cc140f..4de8274fe0c13 100644 --- a/Zend/tests/exception_stream_wrapper.phpt +++ b/Zend/tests/exception_stream_wrapper.phpt @@ -4,6 +4,7 @@ Exception in stream wrapper + __call x= $x; + $x->x = $x; @$x .= "x"; $n = gc_collect_cycles(); echo ".=\t$n\n"; diff --git a/Zend/tests/gc_042.phpt b/Zend/tests/gc_042.phpt index c8dfc0ef86100..b56309f1d63b6 100644 --- a/Zend/tests/gc_042.phpt +++ b/Zend/tests/gc_042.phpt @@ -3,6 +3,7 @@ Object properties HT may need to be removed from nested data --FILE-- gen1 = (function () { yield 1; diff --git a/Zend/tests/get_mangled_object_vars.phpt b/Zend/tests/get_mangled_object_vars.phpt index f9ad008a33c37..d8a885e1a6ade 100644 --- a/Zend/tests/get_mangled_object_vars.phpt +++ b/Zend/tests/get_mangled_object_vars.phpt @@ -3,6 +3,7 @@ get_mangled_object_vars() function --FILE-- {"6"} = 6; var_export(get_mangled_object_vars($obj)); echo "\n"; +#[AllowDynamicProperties] class AO extends ArrayObject { private $priv = 1; } diff --git a/Zend/tests/nowdoc.inc b/Zend/tests/nowdoc.inc index c903740e246c4..d2aa5c4aef140 100644 --- a/Zend/tests/nowdoc.inc +++ b/Zend/tests/nowdoc.inc @@ -4,7 +4,7 @@ $a = 1; $b = 2; $c = array( 'c' => 3, ); -class d { public function __construct() { $this->d = 4; } }; +class d { public $d = 4; }; $d = new d; ?> diff --git a/Zend/tests/temporary_cleaning_013.phpt b/Zend/tests/temporary_cleaning_013.phpt index ce121d03e884d..e5f4b73bb14a2 100644 --- a/Zend/tests/temporary_cleaning_013.phpt +++ b/Zend/tests/temporary_cleaning_013.phpt @@ -77,6 +77,7 @@ try { try { var_dump((function() { return new class { + public $foo; function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } }; })()->foo++); @@ -92,6 +93,7 @@ try { try { var_dump((function() { return new class { + public $bar; function __construct() { $this->bar = new stdClass; } function &__get($x) { return $this->bar; } function __destruct() { throw new Exception; } @@ -115,6 +117,7 @@ try { try { var_dump(++(function() { return new class { + public $bar; function __construct() { $this->bar = new stdClass; } function &__get($x) { return $this->bar; } function __destruct() { throw new Exception; } @@ -143,6 +146,7 @@ try { try { var_dump((new class { + public $foo; function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } })->foo); @@ -168,6 +172,7 @@ try { try { var_dump(isset((new class { + public $foo; function __construct() { $this->foo = new stdClass; } function __destruct() { throw new Exception; } })->foo->bar)); @@ -278,14 +283,22 @@ caught Exception 2 caught Exception 3 caught Exception 4 caught Exception 5 + +Deprecated: Creation of dynamic property class@anonymous::$foo is deprecated in %s on line %d caught Exception 6 caught Exception 7 caught Exception 8 caught Exception 9 caught Exception 10 + +Deprecated: Creation of dynamic property class@anonymous::$foo is deprecated in %s on line %d caught Exception 11 + +Deprecated: Creation of dynamic property class@anonymous::$foo is deprecated in %s on line %d caught Exception 12 caught Exception 13 + +Deprecated: Creation of dynamic property class@anonymous::$foo is deprecated in %s on line %d caught Exception 14 Notice: Indirect modification of overloaded element of ArrayAccess@anonymous has no effect in %s on line %d diff --git a/Zend/tests/throwing_overloaded_compound_assign_op.phpt b/Zend/tests/throwing_overloaded_compound_assign_op.phpt index e6e79baf5dd1c..39c38627076ca 100644 --- a/Zend/tests/throwing_overloaded_compound_assign_op.phpt +++ b/Zend/tests/throwing_overloaded_compound_assign_op.phpt @@ -3,6 +3,7 @@ Exception in compound assign op should prevent call to overloaded object handler --FILE-- $k = 42; diff --git a/Zend/tests/type_declarations/typed_properties_086.phpt b/Zend/tests/type_declarations/typed_properties_086.phpt index 7c160dd9d054d..5a6b19ad5c8c3 100644 --- a/Zend/tests/type_declarations/typed_properties_086.phpt +++ b/Zend/tests/type_declarations/typed_properties_086.phpt @@ -3,6 +3,7 @@ Test typed properties with integer keys --FILE-- ce_flags & ZEND_ACC_TRAIT) { + zend_error_noreturn(E_ERROR, "Cannot apply #[AllowDynamicProperties] to trait"); + } + if (scope->ce_flags & ZEND_ACC_INTERFACE) { + zend_error_noreturn(E_ERROR, "Cannot apply #[AllowDynamicProperties] to interface"); + } + scope->ce_flags |= ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES; +} + ZEND_METHOD(Attribute, __construct) { zend_long flags = ZEND_ATTRIBUTE_TARGET_ALL; @@ -73,6 +86,11 @@ ZEND_METHOD(ReturnTypeWillChange, __construct) ZEND_PARSE_PARAMETERS_NONE(); } +ZEND_METHOD(AllowDynamicProperties, __construct) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + static zend_attribute *get_attribute(HashTable *attributes, zend_string *lcname, uint32_t offset) { if (attributes) { @@ -288,6 +306,10 @@ void zend_register_attribute_ce(void) zend_ce_return_type_will_change_attribute = register_class_ReturnTypeWillChange(); zend_internal_attribute_register(zend_ce_return_type_will_change_attribute, ZEND_ATTRIBUTE_TARGET_METHOD); + + zend_ce_allow_dynamic_properties = register_class_AllowDynamicProperties(); + attr = zend_internal_attribute_register(zend_ce_allow_dynamic_properties, ZEND_ATTRIBUTE_TARGET_CLASS); + attr->validator = validate_allow_dynamic_properties; } void zend_attributes_shutdown(void) diff --git a/Zend/zend_attributes.h b/Zend/zend_attributes.h index fa21896447f52..a55dc562450d2 100644 --- a/Zend/zend_attributes.h +++ b/Zend/zend_attributes.h @@ -40,6 +40,7 @@ BEGIN_EXTERN_C() extern ZEND_API zend_class_entry *zend_ce_attribute; +extern ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties; typedef struct { zend_string *name; diff --git a/Zend/zend_attributes.stub.php b/Zend/zend_attributes.stub.php index 70b0c49aeb9f2..0469016704b16 100644 --- a/Zend/zend_attributes.stub.php +++ b/Zend/zend_attributes.stub.php @@ -13,3 +13,8 @@ final class ReturnTypeWillChange { public function __construct() {} } + +final class AllowDynamicProperties +{ + public function __construct() {} +} diff --git a/Zend/zend_attributes_arginfo.h b/Zend/zend_attributes_arginfo.h index 5f62eb8fd057d..657ab924c745a 100644 --- a/Zend/zend_attributes_arginfo.h +++ b/Zend/zend_attributes_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 3fd949e1b9f49666bed3081ed1e8e711acd9f49c */ + * Stub hash: 024e849a9dfa8789f13dd1d2ac222a48e4b017f1 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Attribute___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "Attribute::TARGET_ALL") @@ -8,9 +8,12 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReturnTypeWillChange___construct, 0, 0, 0) ZEND_END_ARG_INFO() +#define arginfo_class_AllowDynamicProperties___construct arginfo_class_ReturnTypeWillChange___construct + ZEND_METHOD(Attribute, __construct); ZEND_METHOD(ReturnTypeWillChange, __construct); +ZEND_METHOD(AllowDynamicProperties, __construct); static const zend_function_entry class_Attribute_methods[] = { @@ -24,6 +27,12 @@ static const zend_function_entry class_ReturnTypeWillChange_methods[] = { ZEND_FE_END }; + +static const zend_function_entry class_AllowDynamicProperties_methods[] = { + ZEND_ME(AllowDynamicProperties, __construct, arginfo_class_AllowDynamicProperties___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + static zend_class_entry *register_class_Attribute(void) { zend_class_entry ce, *class_entry; @@ -51,3 +60,14 @@ static zend_class_entry *register_class_ReturnTypeWillChange(void) return class_entry; } + +static zend_class_entry *register_class_AllowDynamicProperties(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "AllowDynamicProperties", class_AllowDynamicProperties_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; + + return class_entry; +} diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 89475235d818e..529ade072aa24 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -19,6 +19,7 @@ #include "zend.h" #include "zend_API.h" +#include "zend_attributes.h" #include "zend_gc.h" #include "zend_builtin_functions.h" #include "zend_constants.h" @@ -33,10 +34,12 @@ /* }}} */ ZEND_MINIT_FUNCTION(core) { /* {{{ */ - zend_standard_class_def = register_class_stdClass(); - zend_register_default_classes(); + zend_standard_class_def = register_class_stdClass(); + zend_add_class_attribute(zend_standard_class_def, zend_ce_allow_dynamic_properties->name, 0); + zend_standard_class_def->ce_flags |= ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES; + return SUCCESS; } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 531a072cf7b4a..65d675d77f3fd 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -240,7 +240,7 @@ typedef struct _zend_oparray_context { /* or IS_CONSTANT_VISITED_MARK | | | */ #define ZEND_CLASS_CONST_IS_CASE (1 << 6) /* | | | X */ /* | | | */ -/* Class Flags (unused: 15,16,21,30,31) | | | */ +/* Class Flags (unused: 16,21,30,31) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -269,6 +269,10 @@ typedef struct _zend_oparray_context { /* User class has methods with static variables | | | */ #define ZEND_HAS_STATIC_IN_METHODS (1 << 14) /* X | | | */ /* | | | */ +/* Objects of this class may have dynamic properties | | | */ +/* without triggering a deprecation warning | | | */ +#define ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES (1 << 15) /* X | | | */ +/* | | | */ /* Parent class is resolved (CE). | | | */ #define ZEND_ACC_RESOLVED_PARENT (1 << 17) /* X | | | */ /* | | | */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 55d67a59144e9..eab874d71e6cb 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1588,7 +1588,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } } - ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_USE_GUARDS | ZEND_ACC_NOT_SERIALIZABLE); + ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND_ACC_USE_GUARDS | ZEND_ACC_NOT_SERIALIZABLE | ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES); } /* }}} */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 4f4efb2e3aa11..dab57807796f0 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -277,6 +277,12 @@ static ZEND_COLD zend_never_inline void zend_forbidden_dynamic_property( ZSTR_VAL(ce->name), ZSTR_VAL(member)); } +static ZEND_COLD zend_never_inline void zend_deprecated_dynamic_property( + zend_class_entry *ce, zend_string *member) { + zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated", + ZSTR_VAL(ce->name), ZSTR_VAL(member)); +} + static ZEND_COLD zend_never_inline void zend_readonly_property_modification_scope_error( zend_class_entry *ce, zend_string *member, zend_class_entry *scope, const char *operation) { zend_throw_error(NULL, "Cannot %s readonly property %s::$%s from %s%s", @@ -874,6 +880,9 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva variable_ptr = &EG(error_zval); goto exit; } + if (UNEXPECTED(!(zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES))) { + zend_deprecated_dynamic_property(zobj->ce, name); + } Z_TRY_ADDREF_P(value); if (!zobj->properties) { @@ -1050,6 +1059,9 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam zend_forbidden_dynamic_property(zobj->ce, name); return &EG(error_zval); } + if (UNEXPECTED(!(zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES))) { + zend_deprecated_dynamic_property(zobj->ce, name); + } if (UNEXPECTED(!zobj->properties)) { rebuild_object_properties(zobj); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bf12c06df7b48..65f17983fb034 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2422,7 +2422,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index f2d73fd451d8b..797ac66c96df5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22924,7 +22924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -23055,7 +23055,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -23186,7 +23186,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -23317,7 +23317,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -25482,7 +25482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -25613,7 +25613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -25744,7 +25744,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -25875,7 +25875,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -29407,7 +29407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -29538,7 +29538,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -29669,7 +29669,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -29800,7 +29800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -31862,7 +31862,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -31993,7 +31993,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -32124,7 +32124,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -32255,7 +32255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -33724,7 +33724,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -33855,7 +33855,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -33986,7 +33986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -34117,7 +34117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -36203,7 +36203,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -36334,7 +36334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -36465,7 +36465,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -36596,7 +36596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -40346,7 +40346,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -40477,7 +40477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -40608,7 +40608,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -40739,7 +40739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -43986,7 +43986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -44117,7 +44117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -44248,7 +44248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -44379,7 +44379,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -49028,7 +49028,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -49159,7 +49159,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -49290,7 +49290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } @@ -49421,7 +49421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } } - if (!zobj->ce->__set) { + if (!zobj->ce->__set && (zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { if (EXPECTED(zobj->properties == NULL)) { rebuild_object_properties(zobj); } diff --git a/ext/date/tests/DateTimeZone_clone_basic3.phpt b/ext/date/tests/DateTimeZone_clone_basic3.phpt index 5f8533378988d..c5e8761c85289 100644 --- a/ext/date/tests/DateTimeZone_clone_basic3.phpt +++ b/ext/date/tests/DateTimeZone_clone_basic3.phpt @@ -37,6 +37,10 @@ object(DateTimeZone)#%d (2) { } -- Add some properties -- + +Deprecated: Creation of dynamic property DateTimeZone::$property1 is deprecated in %s on line %d + +Deprecated: Creation of dynamic property DateTimeZone::$property2 is deprecated in %s on line %d object(DateTimeZone)#%d (4) { ["property1"]=> int(99) @@ -61,6 +65,10 @@ object(DateTimeZone)#%d (4) { } -- Add some more properties -- + +Deprecated: Creation of dynamic property DateTimeZone::$property3 is deprecated in %s on line %d + +Deprecated: Creation of dynamic property DateTimeZone::$property4 is deprecated in %s on line %d object(DateTimeZone)#%d (6) { ["property1"]=> int(99) diff --git a/ext/date/tests/DateTime_clone_basic3.phpt b/ext/date/tests/DateTime_clone_basic3.phpt index dd7220799d363..c57d829fc6249 100644 --- a/ext/date/tests/DateTime_clone_basic3.phpt +++ b/ext/date/tests/DateTime_clone_basic3.phpt @@ -39,6 +39,10 @@ object(DateTime)#%d (3) { } -- Add some properties -- + +Deprecated: Creation of dynamic property DateTime::$property1 is deprecated in %s on line %d + +Deprecated: Creation of dynamic property DateTime::$property2 is deprecated in %s on line %d object(DateTime)#%d (5) { ["property1"]=> int(99) @@ -67,6 +71,10 @@ object(DateTime)#%d (5) { } -- Add some more properties -- + +Deprecated: Creation of dynamic property DateTime::$property3 is deprecated in %s on line %d + +Deprecated: Creation of dynamic property DateTime::$property4 is deprecated in %s on line %d object(DateTime)#%d (7) { ["property1"]=> int(99) diff --git a/ext/date/tests/bug65672.phpt b/ext/date/tests/bug65672.phpt index a01287d9b4c04..a3a4542e69db2 100644 --- a/ext/date/tests/bug65672.phpt +++ b/ext/date/tests/bug65672.phpt @@ -32,7 +32,7 @@ $period->dynamic3[] = "array"; var_dump($period->dynamic3); ?> ---EXPECT-- +--EXPECTF-- string(5) "stuff" string(8) "modified" array(1) { @@ -40,11 +40,17 @@ array(1) { string(5) "array" } bool(false) + +Deprecated: Creation of dynamic property DatePeriod@anonymous::$dynamic1 is deprecated in %s on line %d string(7) "dynamic" + +Deprecated: Creation of dynamic property DatePeriod@anonymous::$dynamic2 is deprecated in %s on line %d array(1) { [0]=> string(5) "array" } + +Deprecated: Creation of dynamic property DatePeriod@anonymous::$dynamic3 is deprecated in %s on line %d array(1) { [0]=> string(5) "array" diff --git a/ext/date/tests/call_function_from_method.phpt b/ext/date/tests/call_function_from_method.phpt index 7cbe68481e2a8..de49b06839b7d 100644 --- a/ext/date/tests/call_function_from_method.phpt +++ b/ext/date/tests/call_function_from_method.phpt @@ -6,6 +6,8 @@ date.timezone=UTC date = date_create($in); } diff --git a/ext/date/tests/date_interval_prop_dim.phpt b/ext/date/tests/date_interval_prop_dim.phpt index 5d33badebed74..6b5423d137317 100644 --- a/ext/date/tests/date_interval_prop_dim.phpt +++ b/ext/date/tests/date_interval_prop_dim.phpt @@ -12,5 +12,6 @@ while ($i < 1026) { } ?> ==NOCRASH== ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property Z::$prop is deprecated in %s on line %d ==NOCRASH== diff --git a/ext/dom/tests/domobject_debug_handler.phpt b/ext/dom/tests/domobject_debug_handler.phpt index 8dbaa61a16545..8318fc70ed17e 100644 --- a/ext/dom/tests/domobject_debug_handler.phpt +++ b/ext/dom/tests/domobject_debug_handler.phpt @@ -15,6 +15,7 @@ $d->loadXML($xml); print_r($d); ?> --EXPECTF-- +Deprecated: Creation of dynamic property DOMDocument::$dynamicProperty is deprecated in %s on line %d DOMDocument Object ( [config] => diff --git a/ext/exif/tests/bug68799.phpt b/ext/exif/tests/bug68799.phpt index edd8eba8a0dd9..be26275007f88 100644 --- a/ext/exif/tests/bug68799.phpt +++ b/ext/exif/tests/bug68799.phpt @@ -8,6 +8,7 @@ exif * Pollute the heap. Helps trigger bug. Sometimes not needed. */ class A { + public $a; function __construct() { $a = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa'; $this->a = $a . $a . $a . $a . $a . $a; diff --git a/ext/gmp/tests/serialize.phpt b/ext/gmp/tests/serialize.phpt index 4b42db7606d6a..65c2f34e13d17 100644 --- a/ext/gmp/tests/serialize.phpt +++ b/ext/gmp/tests/serialize.phpt @@ -51,6 +51,8 @@ object(GMP)#%d (1) { ["num"]=> string(2) "42" } + +Deprecated: Creation of dynamic property GMP::$foo is deprecated in %s on line %d string(56) "O:3:"GMP":2:{i:0;s:1:"d";i:1;a:1:{s:3:"foo";s:3:"bar";}}" object(GMP)#%d (2) { ["foo"]=> diff --git a/ext/json/tests/bug42785.phpt b/ext/json/tests/bug42785.phpt index 698f193a70881..49a301c707423 100644 --- a/ext/json/tests/bug42785.phpt +++ b/ext/json/tests/bug42785.phpt @@ -15,8 +15,7 @@ setlocale(LC_ALL, "de_DE", "de", "german", "ge", "de_DE.ISO8859-1", "ISO8859-1") $foo = array(100.10,"bar"); var_dump(json_encode($foo)); -class bar {} -$bar1 = new bar; +$bar1 = new stdClass; $bar1->a = 100.10; $bar1->b = "foo"; var_dump(json_encode($bar1)); diff --git a/ext/json/tests/json_encode_basic.phpt b/ext/json/tests/json_encode_basic.phpt index b8c2e328d9b77..43e7a0391ddb5 100644 --- a/ext/json/tests/json_encode_basic.phpt +++ b/ext/json/tests/json_encode_basic.phpt @@ -12,10 +12,7 @@ unset ($unset_var); $fp = fopen(__FILE__, "r"); // get an object -class sample { -} - -$obj = new sample(); +$obj = new stdClass(); $obj->MyInt = 99; $obj->MyFloat = 123.45; $obj->MyBool = true; diff --git a/ext/json/tests/json_encode_pretty_print2.phpt b/ext/json/tests/json_encode_pretty_print2.phpt index e872852a38d6b..f182fb559e139 100644 --- a/ext/json/tests/json_encode_pretty_print2.phpt +++ b/ext/json/tests/json_encode_pretty_print2.phpt @@ -2,6 +2,7 @@ json_encode() with JSON_PRETTY_PRINT on declared properties --FILE-- resolveExternals = true; diff --git a/ext/libxml/tests/bug61367-read_2.phpt b/ext/libxml/tests/bug61367-read_2.phpt index 8adad1ce429fa..92f1829a44dcf 100644 --- a/ext/libxml/tests/bug61367-read_2.phpt +++ b/ext/libxml/tests/bug61367-read_2.phpt @@ -14,6 +14,8 @@ open_basedir=. * Note: Using error_reporting=E_ALL & ~E_NOTICE to suppress "Trying to get property of non-object" notices. */ class StreamExploiter { + public $context; + public function stream_close ( ) { $doc = new DOMDocument; $doc->resolveExternals = true; diff --git a/ext/libxml/tests/bug61367-write.phpt b/ext/libxml/tests/bug61367-write.phpt index 47ab33870e76a..c65341e1972b7 100644 --- a/ext/libxml/tests/bug61367-write.phpt +++ b/ext/libxml/tests/bug61367-write.phpt @@ -8,6 +8,8 @@ open_basedir=. appendChild($doc->createTextNode('hello')); diff --git a/ext/mysqli/tests/bug46614.phpt b/ext/mysqli/tests/bug46614.phpt index 1d2a4610e012c..34c03585dfbda 100644 --- a/ext/mysqli/tests/bug46614.phpt +++ b/ext/mysqli/tests/bug46614.phpt @@ -13,6 +13,7 @@ if (!defined("MYSQLI_ASYNC")) { + NULL + ["label"]=> + NULL ["a"]=> NULL ["b"]=> diff --git a/ext/mysqli/tests/mysqli_fetch_object_oo.phpt b/ext/mysqli/tests/mysqli_fetch_object_oo.phpt index 86ddb9a04c727..2ddba280f43a2 100644 --- a/ext/mysqli/tests/mysqli_fetch_object_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_object_oo.phpt @@ -49,7 +49,8 @@ require_once('skipifconnectfailure.inc'); } class mysqli_fetch_object_test { - + public $ID; + public $label; public $a = null; public $b = null; diff --git a/ext/opcache/tests/jit/fetch_obj_003.phpt b/ext/opcache/tests/jit/fetch_obj_003.phpt index d1dc873c76e2b..97a7c05e07546 100644 --- a/ext/opcache/tests/jit/fetch_obj_003.phpt +++ b/ext/opcache/tests/jit/fetch_obj_003.phpt @@ -9,6 +9,7 @@ opcache.jit_buffer_size=1M opcache --FILE-- prop = PHP_INT_MAX - 5; diff --git a/ext/opcache/tests/opt/dce_005.phpt b/ext/opcache/tests/opt/dce_005.phpt index 7c90a9715058e..add703e966a2b 100644 --- a/ext/opcache/tests/opt/dce_005.phpt +++ b/ext/opcache/tests/opt/dce_005.phpt @@ -10,6 +10,7 @@ opcache.preload= opcache --FILE-- prepare('SELECT classtypes.name, test.id AS id, test.val AS val FRO class Test1 { + public $id; + public $val; + public function __construct() { echo __METHOD__ . "()\n"; @@ -37,6 +40,9 @@ class Test1 class Test2 { + public $id; + public $val; + public function __construct() { echo __METHOD__ . "()\n"; @@ -45,6 +51,9 @@ class Test2 class Test3 { + public $id; + public $val; + public function __construct() { echo __METHOD__ . "()\n"; diff --git a/ext/pdo/tests/pdo_010.phpt b/ext/pdo/tests/pdo_010.phpt index 3c78f8df4f01b..1d47741b38644 100644 --- a/ext/pdo/tests/pdo_010.phpt +++ b/ext/pdo/tests/pdo_010.phpt @@ -29,6 +29,9 @@ $stmt = $db->prepare('SELECT classtypes.name, test.grp AS grp, test.id AS id, te class Test1 { + public $id; + public $val; + public function __construct() { echo __METHOD__ . "()\n"; @@ -37,6 +40,9 @@ class Test1 class Test2 { + public $id; + public $val; + public function __construct() { echo __METHOD__ . "()\n"; @@ -45,6 +51,9 @@ class Test2 class Test3 { + public $id; + public $val; + public function __construct() { echo __METHOD__ . "()\n"; diff --git a/ext/pdo/tests/pdo_011.phpt b/ext/pdo/tests/pdo_011.phpt index d9d1b304e4c1b..53bf34d442a04 100644 --- a/ext/pdo/tests/pdo_011.phpt +++ b/ext/pdo/tests/pdo_011.phpt @@ -23,9 +23,8 @@ $db->exec('INSERT INTO test VALUES(4, \'D\', \'Group2\')'); class DerivedStatement extends PDOStatement { - private function __construct($name, $db) + private function __construct(public $name, $db) { - $this->name = $name; echo __METHOD__ . "($name)\n"; } @@ -41,11 +40,9 @@ $derived = $db->prepare('SELECT id, val FROM test', array(PDO::ATTR_STATEMENT_CL class Test1 { - public function __construct($id, $val) + public function __construct(public $id, public $val) { echo __METHOD__ . "($id,$val)\n"; - $this->id = $id; - $this->val = $val; } static public function factory($id, $val) diff --git a/ext/pdo/tests/pdo_012.phpt b/ext/pdo/tests/pdo_012.phpt index 956a3144cc65a..9c5cf51d24f4e 100644 --- a/ext/pdo/tests/pdo_012.phpt +++ b/ext/pdo/tests/pdo_012.phpt @@ -26,6 +26,9 @@ var_dump($stmt->fetchAll()); class Test { + public $val; + public $grp; + function __construct($name = 'N/A') { echo __METHOD__ . "($name)\n"; diff --git a/ext/pdo/tests/pdo_013.phpt b/ext/pdo/tests/pdo_013.phpt index d3946a019b633..df43d20527f23 100644 --- a/ext/pdo/tests/pdo_013.phpt +++ b/ext/pdo/tests/pdo_013.phpt @@ -32,6 +32,9 @@ foreach ($stmt as $data) class Test { + public $val; + public $grp; + function __construct($name = 'N/A') { echo __METHOD__ . "($name)\n"; diff --git a/ext/pdo/tests/pdo_014.phpt b/ext/pdo/tests/pdo_014.phpt index c864c74a2dd03..d607481e92c77 100644 --- a/ext/pdo/tests/pdo_014.phpt +++ b/ext/pdo/tests/pdo_014.phpt @@ -22,6 +22,9 @@ $SELECT = 'SELECT val, grp FROM test'; class Test { + public $val; + public $grp; + function __construct($name = 'N/A') { echo __METHOD__ . "($name)\n"; diff --git a/ext/pdo/tests/pdo_023.phpt b/ext/pdo/tests/pdo_023.phpt index 8e07840f19f9f..b2356c13445e6 100644 --- a/ext/pdo/tests/pdo_023.phpt +++ b/ext/pdo/tests/pdo_023.phpt @@ -14,6 +14,7 @@ PDOTest::skip(); if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.__DIR__ . '/../../pdo/tests/'); require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc'; +#[AllowDynamicProperties] class PDOStatementX extends PDOStatement { public $test1 = 1; @@ -31,6 +32,7 @@ class PDOStatementX extends PDOStatement } } +#[AllowDynamicProperties] class PDODatabaseX extends PDO { public $test1 = 1; diff --git a/ext/pdo_mysql/tests/bug46292.phpt b/ext/pdo_mysql/tests/bug46292.phpt index 156be1faf2d54..8664df7ddebcb 100644 --- a/ext/pdo_mysql/tests/bug46292.phpt +++ b/ext/pdo_mysql/tests/bug46292.phpt @@ -15,6 +15,8 @@ MySQLPDOTest::skip(); class myclass { + public $value; + public function __construct() { printf("%s()\n", __METHOD__); } diff --git a/ext/pdo_mysql/tests/bug63176.phpt b/ext/pdo_mysql/tests/bug63176.phpt index 3e0e5e02eee98..599aaaa67c091 100644 --- a/ext/pdo_mysql/tests/bug63176.phpt +++ b/ext/pdo_mysql/tests/bug63176.phpt @@ -20,6 +20,7 @@ class PDO3 extends PDO { class ModelA { + public $db; public function __construct($h) { var_dump($h); if ($h) { diff --git a/ext/pdo_mysql/tests/bug70862.phpt b/ext/pdo_mysql/tests/bug70862.phpt index e91319b2b9f6c..95e68896eacdf 100644 --- a/ext/pdo_mysql/tests/bug70862.phpt +++ b/ext/pdo_mysql/tests/bug70862.phpt @@ -19,6 +19,7 @@ MySQLPDOTest::skip(); $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); class HelloWrapper { + public $context; public function stream_open() { return true; } public function stream_eof() { return true; } public function stream_read() { return NULL; } diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt index 9cff31ffea6f4..5b65c8d54441f 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetch_serialize.phpt @@ -14,6 +14,7 @@ MySQLPDOTest::skip(); try { + #[AllowDynamicProperties] class myclass implements Serializable { private static $instance = null; diff --git a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt index 54f5826fff550..9f1bbd2d0f6c6 100644 --- a/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt +++ b/ext/pdo_mysql/tests/pdo_mysql_stmt_fetchobject.phpt @@ -30,6 +30,7 @@ try { $query = "SELECT id, '', NULL, \"\" FROM test ORDER BY id ASC LIMIT 3"; $stmt = $db->prepare($query); + #[AllowDynamicProperties] class myclass { private $set_calls = 0; diff --git a/ext/pdo_pgsql/tests/bug72294.phpt b/ext/pdo_pgsql/tests/bug72294.phpt index 6528c1211a727..8b55b033f61c2 100644 --- a/ext/pdo_pgsql/tests/bug72294.phpt +++ b/ext/pdo_pgsql/tests/bug72294.phpt @@ -70,6 +70,8 @@ class PHPUnit_Framework_TestFailure class PHPUnit_Framework_TestResult { + private $errors; + public function run( $test) { $error = false; diff --git a/ext/pdo_sqlite/tests/bug46139.phpt b/ext/pdo_sqlite/tests/bug46139.phpt index fabc312634e3b..7ec94aff0cfce 100644 --- a/ext/pdo_sqlite/tests/bug46139.phpt +++ b/ext/pdo_sqlite/tests/bug46139.phpt @@ -8,6 +8,7 @@ pdo_sqlite require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc'; $db = PDOTest::test_factory(__DIR__ . '/common.phpt'); +#[AllowDynamicProperties] class Person { public $test = NULL; public function __construct() { diff --git a/ext/pdo_sqlite/tests/bug70862.phpt b/ext/pdo_sqlite/tests/bug70862.phpt index eff0f8fb9144a..5becca7c75914 100644 --- a/ext/pdo_sqlite/tests/bug70862.phpt +++ b/ext/pdo_sqlite/tests/bug70862.phpt @@ -14,6 +14,7 @@ $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); $db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true); class HelloWrapper { + public $context; public function stream_open() { return true; } public function stream_eof() { return true; } public function stream_read() { return NULL; } diff --git a/ext/reflection/tests/002.phpt b/ext/reflection/tests/002.phpt index b10013d2a9336..5e35859c7ceeb 100644 --- a/ext/reflection/tests/002.phpt +++ b/ext/reflection/tests/002.phpt @@ -3,6 +3,7 @@ Reflection properties are read only --FILE-- --EXPECTF-- Object of class [ class C1 ] { - @@ %s024.php 2-6 + @@ %s - Constants [0] { } diff --git a/ext/reflection/tests/ReflectionClass_getInterfaces_003.phpt b/ext/reflection/tests/ReflectionClass_getInterfaces_003.phpt index f1cac44e9581b..b5fbf59b43937 100644 --- a/ext/reflection/tests/ReflectionClass_getInterfaces_003.phpt +++ b/ext/reflection/tests/ReflectionClass_getInterfaces_003.phpt @@ -58,6 +58,8 @@ array(1) { } } Modify the object, and it is apparently no longer referenced. + +Deprecated: Creation of dynamic property ReflectionClass::$x is deprecated in %s on line %d array(1) { ["I"]=> object(ReflectionClass)#%d (2) { diff --git a/ext/reflection/tests/ReflectionObject___toString_basic2.phpt b/ext/reflection/tests/ReflectionObject___toString_basic2.phpt index e93dd9b331a29..4d0a48d911318 100644 --- a/ext/reflection/tests/ReflectionObject___toString_basic2.phpt +++ b/ext/reflection/tests/ReflectionObject___toString_basic2.phpt @@ -3,6 +3,7 @@ ReflectionObject::__toString() : very basic test with dynamic properties --FILE-- --EXPECTF-- Object of class [ class Foo ] { - @@ %s 3-5 + @@ %s - Constants [0] { } diff --git a/ext/reflection/tests/ReflectionObject_export_basic3.phpt b/ext/reflection/tests/ReflectionObject_export_basic3.phpt index 612bfa5916bf5..9c3d78da6e044 100644 --- a/ext/reflection/tests/ReflectionObject_export_basic3.phpt +++ b/ext/reflection/tests/ReflectionObject_export_basic3.phpt @@ -6,6 +6,7 @@ class C { private $p = 1; } +#[AllowDynamicProperties] class D extends C{ } @@ -15,7 +16,7 @@ echo new ReflectionObject($Obj); ?> --EXPECTF-- Object of class [ class D extends C ] { - @@ %s 6-7 + @@ %s - Constants [0] { } diff --git a/ext/reflection/tests/ReflectionParameter_isDefault.phpt b/ext/reflection/tests/ReflectionParameter_isDefault.phpt index ea958781709ff..3ab0d980fd048 100644 --- a/ext/reflection/tests/ReflectionParameter_isDefault.phpt +++ b/ext/reflection/tests/ReflectionParameter_isDefault.phpt @@ -2,6 +2,7 @@ ReflectionParameter::isDefault() --FILE-- isProtected()); echo "=== 3rd test ===\n"; +#[AllowDynamicProperties] class test3 { } @@ -59,6 +61,7 @@ class test5 { private $value = 1; } +#[AllowDynamicProperties] class test4 extends test5{ } diff --git a/ext/reflection/tests/bug46064.phpt b/ext/reflection/tests/bug46064.phpt index 4a97b3b22a658..c866ee83be72e 100644 --- a/ext/reflection/tests/bug46064.phpt +++ b/ext/reflection/tests/bug46064.phpt @@ -3,6 +3,7 @@ Bug #46064 (Exception when creating ReflectionProperty object on dynamicly creat --FILE-- foobar = 2; diff --git a/ext/reflection/tests/bug46064_2.phpt b/ext/reflection/tests/bug46064_2.phpt index f1aac5b5c0e6d..623b6743a997a 100644 --- a/ext/reflection/tests/bug46064_2.phpt +++ b/ext/reflection/tests/bug46064_2.phpt @@ -3,6 +3,7 @@ Bug #46064.2 (Exception when creating ReflectionProperty object on dynamicly cre --FILE-- getProperty('test')); +#[AllowDynamicProperties] class bar { public function __construct() { $this->a = 1; diff --git a/ext/reflection/tests/bug53366.phpt b/ext/reflection/tests/bug53366.phpt index 61493d53020a5..e2bc250ebfe97 100644 --- a/ext/reflection/tests/bug53366.phpt +++ b/ext/reflection/tests/bug53366.phpt @@ -3,6 +3,7 @@ Bug #53366 (Reflection doesn't get dynamic property value from getProperty()) --FILE-- array(3) { diff --git a/ext/soap/tests/bugs/bug39815.phpt b/ext/soap/tests/bugs/bug39815.phpt index 688c995822daf..7ad18d3505e4c 100644 --- a/ext/soap/tests/bugs/bug39815.phpt +++ b/ext/soap/tests/bugs/bug39815.phpt @@ -4,8 +4,7 @@ Bug #39815 (to_zval_double() in ext/soap/php_encoding.c is not locale-independen soap --SKIPIF-- --INI-- precision=14 @@ -16,6 +15,7 @@ function test(){ return 123.456; } class LocalSoapClient extends SoapClient { + private $server; function __construct($wsdl, $options) { parent::__construct($wsdl, $options); @@ -35,10 +35,10 @@ class LocalSoapClient extends SoapClient { $x = new LocalSoapClient(NULL,array('location'=>'test://', 'uri'=>'http://testuri.org/', "trace"=>1)); -setlocale(LC_ALL,"sv_SE","sv_SE.ISO8859-1"); +setlocale(LC_ALL,"de_DE","de_DE.ISO8859-1"); var_dump($x->test()); echo $x->__getLastResponse(); -setlocale(LC_ALL,"en_US","en_US.ISO8859-1"); +setlocale(LC_ALL, "C"); var_dump($x->test()); echo $x->__getLastResponse(); ?> diff --git a/ext/spl/tests/ArrayObject_sort_different_backing_storage.phpt b/ext/spl/tests/ArrayObject_sort_different_backing_storage.phpt index 0b9bbd633073a..93dd6570791c7 100644 --- a/ext/spl/tests/ArrayObject_sort_different_backing_storage.phpt +++ b/ext/spl/tests/ArrayObject_sort_different_backing_storage.phpt @@ -28,7 +28,7 @@ $ao5->uasort(function($a, $b) { return $a <=> $b; }); var_dump($ao5); ?> ---EXPECT-- +--EXPECTF-- object(ArrayObject)#2 (1) { ["storage":"ArrayObject":private]=> object(stdClass)#1 (2) { @@ -50,6 +50,10 @@ object(ArrayObject)#3 (1) { } } } + +Deprecated: Creation of dynamic property ArrayObject::$a is deprecated in %s on line %d + +Deprecated: Creation of dynamic property ArrayObject::$b is deprecated in %s on line %d object(ArrayObject)#4 (2) { ["b"]=> int(1) diff --git a/ext/spl/tests/ArrayObject_std_props_no_recursion.phpt b/ext/spl/tests/ArrayObject_std_props_no_recursion.phpt index 193e972530057..55ec57762fa4e 100644 --- a/ext/spl/tests/ArrayObject_std_props_no_recursion.phpt +++ b/ext/spl/tests/ArrayObject_std_props_no_recursion.phpt @@ -13,7 +13,10 @@ $c->prop = 'c'; var_dump((array) $c); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property ArrayObject::$prop is deprecated in %s on line %d + +Deprecated: Creation of dynamic property ArrayObject::$prop is deprecated in %s on line %d array(3) { [0]=> int(1) @@ -22,6 +25,8 @@ array(3) { [2]=> int(3) } + +Deprecated: Creation of dynamic property ArrayObject::$prop is deprecated in %s on line %d array(1) { ["prop"]=> string(1) "c" diff --git a/ext/spl/tests/SplFileObject_fflush_basic_001.phpt b/ext/spl/tests/SplFileObject_fflush_basic_001.phpt index 2060bd2b43396..b399a852008e4 100644 --- a/ext/spl/tests/SplFileObject_fflush_basic_001.phpt +++ b/ext/spl/tests/SplFileObject_fflush_basic_001.phpt @@ -13,8 +13,9 @@ var_dump($obj->fflush()); */ //create a basic stream class class VariableStream { - var $position; - var $varname; + public $position; + public $varname; + public $context; function stream_open($path, $mode, $options, &$opened_path) { diff --git a/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt b/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt index 4e0642c6ae435..a77257cc57542 100644 --- a/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt +++ b/ext/spl/tests/SplFileObject_ftruncate_error_001.phpt @@ -5,8 +5,9 @@ SplFileObject::ftruncate function - truncating with stream that does not support //create a basic stream class class VariableStream { - var $position; - var $varname; + public $position; + public $varname; + public $context; function stream_open($path, $mode, $options, &$opened_path) { diff --git a/ext/spl/tests/arrayObject___construct_basic2.phpt b/ext/spl/tests/arrayObject___construct_basic2.phpt index 4de313708002c..0d993a14e786b 100644 --- a/ext/spl/tests/arrayObject___construct_basic2.phpt +++ b/ext/spl/tests/arrayObject___construct_basic2.phpt @@ -54,6 +54,8 @@ function testAccess($c, $ao) { NULL string(12) "C::prop.orig" - Write: + +Deprecated: Creation of dynamic property ArrayObject::$prop is deprecated in %s on line %d string(8) "changed1" string(8) "changed2" - Isset: diff --git a/ext/spl/tests/arrayObject___construct_basic3.phpt b/ext/spl/tests/arrayObject___construct_basic3.phpt index 1d6015ce6ac28..3fb4dda5a6e97 100644 --- a/ext/spl/tests/arrayObject___construct_basic3.phpt +++ b/ext/spl/tests/arrayObject___construct_basic3.phpt @@ -54,6 +54,8 @@ function testAccess($c, $ao) { NULL string(12) "C::prop.orig" - Write: + +Deprecated: Creation of dynamic property ArrayObject::$prop is deprecated in %s on line %d string(8) "changed1" string(8) "changed2" - Isset: diff --git a/ext/spl/tests/arrayObject___construct_basic6.phpt b/ext/spl/tests/arrayObject___construct_basic6.phpt index 681e6e0d318a2..4ba17b6526d99 100644 --- a/ext/spl/tests/arrayObject___construct_basic6.phpt +++ b/ext/spl/tests/arrayObject___construct_basic6.phpt @@ -21,7 +21,8 @@ var_dump($ao); $ao = new MyArrayObject(array(1,2,3), ArrayObject::STD_PROP_LIST); var_dump($ao); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property ArrayObject::$p is deprecated in %s on line %d object(ArrayObject)#1 (2) { ["p"]=> int(1) @@ -35,6 +36,8 @@ object(ArrayObject)#1 (2) { int(3) } } + +Deprecated: Creation of dynamic property ArrayObject::$p is deprecated in %s on line %d object(ArrayObject)#2 (2) { ["p"]=> int(1) diff --git a/ext/spl/tests/arrayObject_clone_basic2.phpt b/ext/spl/tests/arrayObject_clone_basic2.phpt index 3bcebc7970b77..b0a82ccfbc34a 100644 --- a/ext/spl/tests/arrayObject_clone_basic2.phpt +++ b/ext/spl/tests/arrayObject_clone_basic2.phpt @@ -2,6 +2,8 @@ SPL: Cloning an instance of ArrayObject which wraps an object. --FILE-- --EXPECTF-- --> Write existent, non-existent and dynamic: + +Deprecated: Creation of dynamic property ArrayObject::$a is deprecated in %s on line %d + +Deprecated: Creation of dynamic property ArrayObject::$dynamic is deprecated in %s on line %d Original wrapped object: object(UsesMagic)#1 (4) { ["a"]=> diff --git a/ext/spl/tests/array_003.phpt b/ext/spl/tests/array_003.phpt index e4c0a1f9f828c..3ca23f09dc7ce 100644 --- a/ext/spl/tests/array_003.phpt +++ b/ext/spl/tests/array_003.phpt @@ -7,6 +7,7 @@ SPL: ArrayObject from object // since they cannot be accessed from the external object which iterates // them. +#[AllowDynamicProperties] class test { public $pub = "public"; diff --git a/ext/spl/tests/array_007.phpt b/ext/spl/tests/array_007.phpt index dc8a9a5bad73c..3cdd40a1dbc70 100644 --- a/ext/spl/tests/array_007.phpt +++ b/ext/spl/tests/array_007.phpt @@ -7,6 +7,7 @@ SPL: ArrayObject/Iterator from IteratorAggregate // since they cannot be accessed from the external object which iterates // them. +#[AllowDynamicProperties] class test implements IteratorAggregate { public $pub = "public"; diff --git a/ext/spl/tests/array_017.phpt b/ext/spl/tests/array_017.phpt index fb152543d7e2f..ba4842dce20c9 100644 --- a/ext/spl/tests/array_017.phpt +++ b/ext/spl/tests/array_017.phpt @@ -3,6 +3,7 @@ SPL: ArrayObject::exchangeArray($this) --FILE-- foo = 'bar'; var_dump($aobj1 == $aobj3); ?> ---EXPECT-- +--EXPECTF-- bool(false) bool(true) + +Deprecated: Creation of dynamic property ArrayObject::$foo is deprecated in %s on line %d bool(false) diff --git a/ext/spl/tests/bug65387.phpt b/ext/spl/tests/bug65387.phpt index 1e3c8fe4d07be..243be76e0ece2 100644 --- a/ext/spl/tests/bug65387.phpt +++ b/ext/spl/tests/bug65387.phpt @@ -14,6 +14,7 @@ $it2 = new CallbackFilterIterator($it, function($elem) use(&$it2) { // Callback object new class { + private $it; public function __construct() { $it = new ArrayIterator([1, 2, 3]); $this->it = new CallbackFilterIterator($it, function($elem) { diff --git a/ext/spl/tests/iterator_037.phpt b/ext/spl/tests/iterator_037.phpt index baa15f36847d3..c6c465baa2bfd 100644 --- a/ext/spl/tests/iterator_037.phpt +++ b/ext/spl/tests/iterator_037.phpt @@ -27,10 +27,7 @@ function test($ar, $flags) class MyItem { - function __construct($value) - { - $this->value = $value; - } + function __construct(public $value) {} function __toString() { diff --git a/ext/sqlite3/tests/sqlite3_blob_bind_resource.phpt b/ext/sqlite3/tests/sqlite3_blob_bind_resource.phpt index ef165607366fb..e6c774d6f0777 100644 --- a/ext/sqlite3/tests/sqlite3_blob_bind_resource.phpt +++ b/ext/sqlite3/tests/sqlite3_blob_bind_resource.phpt @@ -13,6 +13,7 @@ $insert_stmt = $db->prepare("INSERT INTO test (id, data) VALUES (1, ?)"); class HelloWrapper { + public $context; public function stream_open() { return true; } public function stream_eof() { return true; } public function stream_read() { return NULL; } diff --git a/ext/sqlite3/tests/stream_test.inc b/ext/sqlite3/tests/stream_test.inc index 0d53d0f7be233..7017cce4781ce 100644 --- a/ext/sqlite3/tests/stream_test.inc +++ b/ext/sqlite3/tests/stream_test.inc @@ -2,6 +2,7 @@ class SQLite3_Test_Stream { + public $context; private $position; public static $string_length = 10; public static $string = "abcdefg\0hi"; diff --git a/ext/standard/tests/array/bug39576.phpt b/ext/standard/tests/array/bug39576.phpt index 61600fa578436..3834200bf434b 100644 --- a/ext/standard/tests/array/bug39576.phpt +++ b/ext/standard/tests/array/bug39576.phpt @@ -4,10 +4,10 @@ Bug #39576 (array_walk() doesn't separate userdata zval) --EXPECTF-- -Fatal error: Uncaught ArgumentCountError: Too few arguments to function VariableStream::__construct(), 0 passed and exactly 1 expected in %sbug38450_3.php:7 +Fatal error: Uncaught ArgumentCountError: Too few arguments to function VariableStream::__construct(), 0 passed and exactly 1 expected in %sbug38450_3.php:%d Stack trace: #0 [internal function]: VariableStream->__construct() #1 %s(%d): fopen('var://myvar', 'r+') diff --git a/ext/standard/tests/file/bug39551.phpt b/ext/standard/tests/file/bug39551.phpt index c4f148c862320..e6982fcaab10a 100644 --- a/ext/standard/tests/file/bug39551.phpt +++ b/ext/standard/tests/file/bug39551.phpt @@ -5,7 +5,7 @@ Bug #39551 (Segfault with stream_bucket_new in user filter) $bucket = stream_bucket_new(fopen('php://temp', 'w+'), ''); -class bucketFilter { +class bucketFilter extends php_user_filter { public function filter($in, $out, &$consumed, $closing ): int { $bucket = stream_bucket_new(fopen('php://temp', 'w+'), ''); diff --git a/ext/standard/tests/file/bug71287.phpt b/ext/standard/tests/file/bug71287.phpt index f88414f2c2887..1824015e05678 100644 --- a/ext/standard/tests/file/bug71287.phpt +++ b/ext/standard/tests/file/bug71287.phpt @@ -3,6 +3,8 @@ Bug #71287 (Error message contains hexadecimal instead of decimal number) --FILE-- '; private $pos; private $stream = null; @@ -98,10 +99,10 @@ include "test2://hello"; -Warning: fopen(): test1:// wrapper is disabled in the server configuration by allow_url_include=0 in %sinclude_userstream_002.php on line 10 +Warning: fopen(): test1:// wrapper is disabled in the server configuration by allow_url_include=0 in %sinclude_userstream_002.php on line 11 -Warning: fopen(test1://hello): Failed to open stream: no suitable wrapper could be found in %sinclude_userstream_002.php on line 10 +Warning: fopen(test1://hello): Failed to open stream: no suitable wrapper could be found in %sinclude_userstream_002.php on line 11 -Warning: include(test2://hello): Failed to open stream: "test::stream_open" call failed in %sinclude_userstream_002.php on line 89 +Warning: include(test2://hello): Failed to open stream: "test::stream_open" call failed in %sinclude_userstream_002.php on line 90 -Warning: include(): Failed opening 'test2://hello' for inclusion (include_path='%s') in %sinclude_userstream_002.php on line 89 +Warning: include(): Failed opening 'test2://hello' for inclusion (include_path='%s') in %sinclude_userstream_002.php on line 90 diff --git a/ext/standard/tests/file/include_userstream_003.phpt b/ext/standard/tests/file/include_userstream_003.phpt index d71a09fc73236..1f2c44821f864 100644 --- a/ext/standard/tests/file/include_userstream_003.phpt +++ b/ext/standard/tests/file/include_userstream_003.phpt @@ -6,6 +6,7 @@ allow_url_include=1 --FILE-- '; private $pos; private $stream = null; @@ -97,28 +98,28 @@ include "test2://hello"; --EXPECTF-- Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0 -Warning: file_get_contents(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %sinclude_userstream_003.php on line 86 +Warning: file_get_contents(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %s on line %d -Warning: file_get_contents(test1://hello): Failed to open stream: no suitable wrapper could be found in %sinclude_userstream_003.php on line 86 +Warning: file_get_contents(test1://hello): Failed to open stream: no suitable wrapper could be found in %s on line %d -Warning: include(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %sinclude_userstream_003.php on line 87 +Warning: include(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %s on line %d -Warning: include(test1://hello): Failed to open stream: no suitable wrapper could be found in %sinclude_userstream_003.php on line 87 +Warning: include(test1://hello): Failed to open stream: no suitable wrapper could be found in %s on line %d -Warning: include(): Failed opening 'test1://hello' for inclusion (include_path='%s') in %sinclude_userstream_003.php on line 87 +Warning: include(): Failed opening 'test1://hello' for inclusion (include_path='%s') in %s on line %d -Warning: fopen(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %sinclude_userstream_003.php on line 10 +Warning: fopen(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %s on line %d -Warning: fopen(test1://hello): Failed to open stream: no suitable wrapper could be found in %sinclude_userstream_003.php on line 10 +Warning: fopen(test1://hello): Failed to open stream: no suitable wrapper could be found in %s on line %d -Warning: file_get_contents(test2://hello): Failed to open stream: "test::stream_open" call failed in %sinclude_userstream_003.php on line 88 +Warning: file_get_contents(test2://hello): Failed to open stream: "test::stream_open" call failed in %s on line %d -Warning: fopen(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %sinclude_userstream_003.php on line 10 +Warning: fopen(): test1:// wrapper is disabled in the server configuration by allow_url_fopen=0 in %s on line %d -Warning: fopen(test1://hello): Failed to open stream: no suitable wrapper could be found in %sinclude_userstream_003.php on line 10 +Warning: fopen(test1://hello): Failed to open stream: no suitable wrapper could be found in %s on line %d -Warning: include(test2://hello): Failed to open stream: "test::stream_open" call failed in %sinclude_userstream_003.php on line 89 +Warning: include(test2://hello): Failed to open stream: "test::stream_open" call failed in %s on line %d -Warning: include(): Failed opening 'test2://hello' for inclusion (include_path='%s') in %sinclude_userstream_003.php on line 89 +Warning: include(): Failed opening 'test2://hello' for inclusion (include_path='%s') in %s on line %d diff --git a/ext/standard/tests/file/userdirstream.phpt b/ext/standard/tests/file/userdirstream.phpt index e2f03dabb7f5c..eb6db1fb509d4 100644 --- a/ext/standard/tests/file/userdirstream.phpt +++ b/ext/standard/tests/file/userdirstream.phpt @@ -4,6 +4,7 @@ Directory Streams a = 0; } function __toString() { return $this->a++ ? str_repeat("a", 0x8000) : "a"; } } diff --git a/ext/standard/tests/general_functions/debug_zval_dump_o.phpt b/ext/standard/tests/general_functions/debug_zval_dump_o.phpt index 89ed4a63d21a8..d4972b9a86389 100644 --- a/ext/standard/tests/general_functions/debug_zval_dump_o.phpt +++ b/ext/standard/tests/general_functions/debug_zval_dump_o.phpt @@ -17,6 +17,7 @@ function zval_dump( $values ) { /* checking on objects type */ echo "*** Testing debug_zval_dump() on objects ***\n"; +#[AllowDynamicProperties] class object_class { var $value1 = 1; private $value2 = 10; @@ -45,6 +46,7 @@ class no_member_class{ } /* class with member as object of other class */ +#[AllowDynamicProperties] class contains_object_class { var $p = 30; diff --git a/ext/standard/tests/general_functions/is_object.phpt b/ext/standard/tests/general_functions/is_object.phpt index ed4a2f7a349f7..6a0123d23ebf0 100644 --- a/ext/standard/tests/general_functions/is_object.phpt +++ b/ext/standard/tests/general_functions/is_object.phpt @@ -62,7 +62,7 @@ class myClass $this->public_var = 10; $this->public_var1 = new foo(); $this->private_var = new foo(); - $this->proected_var = new foo(); + $this->protected_var = new foo(); } } diff --git a/ext/standard/tests/general_functions/print_r.phpt b/ext/standard/tests/general_functions/print_r.phpt index 112e436d4e77a..0ea60658aed7a 100644 --- a/ext/standard/tests/general_functions/print_r.phpt +++ b/ext/standard/tests/general_functions/print_r.phpt @@ -136,6 +136,7 @@ $arrays = array ( check_printr($arrays); echo "\n*** Testing print_r() on object variables ***\n"; +#[AllowDynamicProperties] class object_class { var $value; @@ -168,6 +169,7 @@ class no_member_class { } /* class with member as object of other class */ +#[AllowDynamicProperties] class contains_object_class { var $p = 30; diff --git a/ext/standard/tests/general_functions/print_r_64bit.phpt b/ext/standard/tests/general_functions/print_r_64bit.phpt index 1d61df4f9f52d..6026b959d7c4c 100644 --- a/ext/standard/tests/general_functions/print_r_64bit.phpt +++ b/ext/standard/tests/general_functions/print_r_64bit.phpt @@ -140,6 +140,7 @@ $arrays = array ( check_printr($arrays); echo "\n*** Testing print_r() on object variables ***\n"; +#[AllowDynamicProperties] class object_class { var $value; @@ -172,6 +173,7 @@ class no_member_class { } /* class with member as object of other class */ +#[AllowDynamicProperties] class contains_object_class { var $p = 30; diff --git a/ext/standard/tests/general_functions/var_dump.phpt b/ext/standard/tests/general_functions/var_dump.phpt index 32f5c9ab39336..0cbd1fce9c66c 100644 --- a/ext/standard/tests/general_functions/var_dump.phpt +++ b/ext/standard/tests/general_functions/var_dump.phpt @@ -134,6 +134,7 @@ $arrays = array ( check_vardump($arrays); echo "\n*** Testing var_dump() on object variables ***\n"; +#[AllowDynamicProperties] class object_class { var $value; @@ -166,6 +167,7 @@ class no_member_class { } /* class with member as object of other class */ +#[AllowDynamicProperties] class contains_object_class { var $p = 30; diff --git a/ext/standard/tests/general_functions/var_dump_64bit.phpt b/ext/standard/tests/general_functions/var_dump_64bit.phpt index 463308427a3f1..cbf9c003bdb92 100644 --- a/ext/standard/tests/general_functions/var_dump_64bit.phpt +++ b/ext/standard/tests/general_functions/var_dump_64bit.phpt @@ -134,6 +134,7 @@ $arrays = array ( check_vardump($arrays); echo "\n*** Testing var_dump() on object variables ***\n"; +#[AllowDynamicProperties] class object_class { var $value; @@ -166,6 +167,7 @@ class no_member_class { } /* class with member as object of other class */ +#[AllowDynamicProperties] class contains_object_class { var $p = 30; diff --git a/ext/standard/tests/general_functions/var_export-locale_32.phpt b/ext/standard/tests/general_functions/var_export-locale_32.phpt index 4033eff5c3749..81ddacb1a358e 100644 --- a/ext/standard/tests/general_functions/var_export-locale_32.phpt +++ b/ext/standard/tests/general_functions/var_export-locale_32.phpt @@ -236,7 +236,7 @@ class myClass $this->public_var = 10; $this->public_var1 = new foo(); $this->private_var = new foo(); - $this->proected_var = new foo(); + $this->protected_var = new foo(); } } @@ -961,8 +961,7 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) @@ -977,12 +976,11 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) -string(293) "myClass::__set_state(array( +string(266) "myClass::__set_state(array( 'foo_object' => foo::__set_state(array( )), @@ -993,8 +991,7 @@ string(293) "myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), ))" @@ -1012,8 +1009,7 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) @@ -1028,12 +1024,11 @@ myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), )) -string(293) "myClass::__set_state(array( +string(266) "myClass::__set_state(array( 'foo_object' => foo::__set_state(array( )), @@ -1044,8 +1039,7 @@ string(293) "myClass::__set_state(array( 'private_var' => foo::__set_state(array( )), - 'protected_var' => NULL, - 'proected_var' => + 'protected_var' => foo::__set_state(array( )), ))" diff --git a/ext/standard/tests/serialize/001.phpt b/ext/standard/tests/serialize/001.phpt index 147c355b08c8c..f2ac0340cf078 100644 --- a/ext/standard/tests/serialize/001.phpt +++ b/ext/standard/tests/serialize/001.phpt @@ -4,6 +4,7 @@ serialize()/unserialize()/var_dump() serialize_precision=100 --FILE-- a = 'hello'; diff --git a/ext/standard/tests/serialize/bug36424.phpt b/ext/standard/tests/serialize/bug36424.phpt index 55bc38e94c23c..27c18afb5fe90 100644 --- a/ext/standard/tests/serialize/bug36424.phpt +++ b/ext/standard/tests/serialize/bug36424.phpt @@ -3,6 +3,7 @@ Bug #36424 - Serializable interface breaks object references --FILE-- constructorCalled = true; diff --git a/ext/standard/tests/streams/bug53903.phpt b/ext/standard/tests/streams/bug53903.phpt index 7ee62ad2dec0a..010618424228f 100644 --- a/ext/standard/tests/streams/bug53903.phpt +++ b/ext/standard/tests/streams/bug53903.phpt @@ -4,6 +4,7 @@ Bug #53903 streamwrapper/stream_stat causes problems - #phparty7 - @phpsp - novatec/2015 - sao p */ final class StreamWrapper { + public $context; public function stream_open( string $path, string $mode, diff --git a/tests/classes/dereferencing_001.phpt b/tests/classes/dereferencing_001.phpt index 4ec2a87659f49..d1af58b0a8ba2 100644 --- a/tests/classes/dereferencing_001.phpt +++ b/tests/classes/dereferencing_001.phpt @@ -4,9 +4,7 @@ ZE2 dereferencing of objects from methods name = $_name; - } + function __construct(public $name) {} function display() { echo $this->name . "\n"; diff --git a/tests/classes/iterators_006.phpt b/tests/classes/iterators_006.phpt index 86c2481b50abd..a3e74fdadb66c 100644 --- a/tests/classes/iterators_006.phpt +++ b/tests/classes/iterators_006.phpt @@ -6,6 +6,8 @@ ZE2 iterators and array wrapping class ai implements Iterator { private $array; + private $key; + private $current; function __construct() { $this->array = array('foo', 'bar', 'baz'); diff --git a/tests/classes/method_call_variation_001.phpt b/tests/classes/method_call_variation_001.phpt index 5b6b725bc2fcd..c407f1c942d06 100644 --- a/tests/classes/method_call_variation_001.phpt +++ b/tests/classes/method_call_variation_001.phpt @@ -2,7 +2,9 @@ In $a->$b[Y]() and $a->X[Y]() both $a->$b[Y] and $a->X[Y] represent a global function name --FILE-- p = 'changed in D'; @@ -78,7 +79,7 @@ object(C)#%d (1) { Unset a private property, and attempt to recreate at global scope (expecting failure): -Fatal error: Uncaught Error: Cannot access private property C::$p in %s:46 +Fatal error: Uncaught Error: Cannot access private property C::$p in %s:%d Stack trace: #0 {main} - thrown in %s on line 46 + thrown in %s on line %d diff --git a/tests/classes/static_properties_003.phpt b/tests/classes/static_properties_003.phpt index 30a6e2a510bcf..175b3e0b2c500 100644 --- a/tests/classes/static_properties_003.phpt +++ b/tests/classes/static_properties_003.phpt @@ -2,6 +2,7 @@ Attempting to access static properties using instance property syntax --FILE-- y)); --> Access visible static prop like instance prop: bool(false) -Notice: Accessing static property C::$x as non static in %s on line 11 - Notice: Accessing static property C::$x as non static in %s on line 12 -Warning: Undefined property: C::$x in %s on line %d - Notice: Accessing static property C::$x as non static in %s on line 13 -Notice: Accessing static property C::$x as non static in %s on line 15 +Warning: Undefined property: C::$x in %s on line %d + +Notice: Accessing static property C::$x as non static in %s on line 14 Notice: Accessing static property C::$x as non static in %s on line 16 + +Notice: Accessing static property C::$x as non static in %s on line 17 string(3) "ref" string(5) "C::$x" diff --git a/tests/classes/visibility_005.phpt b/tests/classes/visibility_005.phpt index ac7a2dd35a167..914322a729d5a 100644 --- a/tests/classes/visibility_005.phpt +++ b/tests/classes/visibility_005.phpt @@ -3,6 +3,7 @@ ZE2 foreach and property visibility --FILE-- Name = $name; diff --git a/tests/lang/035.phpt b/tests/lang/035.phpt index 0292868d7fc9c..b39dea1875d0a 100644 --- a/tests/lang/035.phpt +++ b/tests/lang/035.phpt @@ -3,9 +3,7 @@ ZE2: set_exception_handler() --FILE-- error = $_error; - } + function __construct(public $error) {} function getException() { diff --git a/tests/lang/bug22510.phpt b/tests/lang/bug22510.phpt index e79972d29e5d0..ea48e3b1955e1 100644 --- a/tests/lang/bug22510.phpt +++ b/tests/lang/bug22510.phpt @@ -2,6 +2,8 @@ Bug #22510 (segfault among complex references) --FILE-- instance = new foo(); diff --git a/tests/lang/bug27439.phpt b/tests/lang/bug27439.phpt index c9f08a0403b97..ebbb489b2bfb8 100644 --- a/tests/lang/bug27439.phpt +++ b/tests/lang/bug27439.phpt @@ -12,6 +12,7 @@ class test_props { class test { public $array = array(1,2,3); public $string = "string"; + public $object; public function __construct() { $this->object = new test_props; diff --git a/tests/lang/error_2_exception_001.phpt b/tests/lang/error_2_exception_001.phpt index 32d85bf1cb177..4dba9b7a1212e 100644 --- a/tests/lang/error_2_exception_001.phpt +++ b/tests/lang/error_2_exception_001.phpt @@ -4,10 +4,7 @@ ZE2 errors caught as exceptions errno = $_errno; - $this->errmsg = $_errmsg; - } + function __construct(public $errno, public $errmsg) {} function getErrno() { return $this->errno; diff --git a/tests/lang/foreachLoopObjects.003.phpt b/tests/lang/foreachLoopObjects.003.phpt index e70d6a386d572..c8405797f0128 100644 --- a/tests/lang/foreachLoopObjects.003.phpt +++ b/tests/lang/foreachLoopObjects.003.phpt @@ -3,6 +3,7 @@ Foreach loop tests - modifying the object during the loop. --FILE-- bar = str_repeat("1", 2); } function &__get($x) { return $this->bar; } function __set($x, $v) { $this->bar = $v; } From 7504cf189b086e38315c1fd62656160d407a1c13 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sat, 27 Nov 2021 19:52:30 -0500 Subject: [PATCH 0263/1346] Improve performance of WeakReference/WeakMap. Avoid hash collisions on pointers. (#7690) Shift pointers by ZEND_MM_ALIGNMENT_LOG2 to avoid the noticeable performance degradation caused by hash table collisions. in `EG(weakrefs)` and zend_weakmap->ht On 64-bit platforms, pointers are usually aligned to at least 8 bytes, so only one in 8 hash buckets were actually getting used. (With the metadata needed to track allocations, alignment might be at least 16 bytes in practice) Address review comments, add optimization Make it public for any extensions that need to work with EG(weakrefs) for instrumentation, debugging, etc. (e.g. zend_test) PHP 8.1 and previous releases would use the raw pointer value as a hash key instead. --- Zend/zend_weakrefs.c | 109 +++++++++++++++++++++++++------------------ Zend/zend_weakrefs.h | 22 +++++++++ ext/zend_test/test.c | 6 +-- 3 files changed, 89 insertions(+), 48 deletions(-) diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 85e3276b1e4df..9d530047f902f 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -35,8 +35,16 @@ typedef struct _zend_weakmap_iterator { uint32_t ht_iter; } zend_weakmap_iterator; -/* The EG(weakrefs) ht is a map from object address a tagged pointer, that may be one of - * zend_weakref*, zend_weakmap* or HashTable*. */ +/* EG(weakrefs) is a map from a key corresponding to a zend_object pointer to all the WeakReference and/or WeakMap entries relating to that pointer. + * + * 1. For a single WeakReference, + * the HashTable's corresponding value's tag is a ZEND_WEAKREF_TAG_REF and the pointer is a singleton WeakReference instance (zend_weakref *) for that zend_object pointer (from WeakReference::create()). + * 2. For a single WeakMap, the HashTable's corresponding value's tag is a ZEND_WEAKREF_TAG_MAP and the pointer is a WeakMap instance (zend_weakmap *). + * 3. For multiple values associated with the same zend_object pointer, the HashTable entry's tag is a ZEND_WEAKREF_TAG_HT with a HashTable mapping + * tagged pointers of at most 1 WeakReference and 1 or more WeakMaps to the same tagged pointer. + * + * ZEND_MM_ALIGNED_OFFSET_LOG2 is at least 2 on supported architectures (pointers to the objects in question are aligned to 4 bytes (1<<2) even on 32-bit systems), + * i.e. the least two significant bits of the pointer can be used as a tag (ZEND_WEAKREF_TAG_*). */ #define ZEND_WEAKREF_TAG_REF 0 #define ZEND_WEAKREF_TAG_MAP 1 #define ZEND_WEAKREF_TAG_HT 2 @@ -56,38 +64,40 @@ static zend_object_handlers zend_weakmap_handlers; #define zend_weakmap_fetch(z) zend_weakmap_from(Z_OBJ_P(z)) static inline void zend_weakref_unref_single( - void *ptr, uintptr_t tag, zend_ulong obj_addr) + void *ptr, uintptr_t tag, zend_object *object) { if (tag == ZEND_WEAKREF_TAG_REF) { + /* Unreferencing WeakReference (at ptr) singleton that pointed to object. */ zend_weakref *wr = ptr; wr->referent = NULL; } else { + /* unreferencing WeakMap entry (at ptr) with a key of object. */ ZEND_ASSERT(tag == ZEND_WEAKREF_TAG_MAP); - zend_hash_index_del((HashTable *) ptr, obj_addr); + zend_hash_index_del((HashTable *) ptr, zend_object_to_weakref_key(object)); } } -static void zend_weakref_unref(zend_ulong obj_addr, void *tagged_ptr) { +static void zend_weakref_unref(zend_object *object, void *tagged_ptr) { void *ptr = ZEND_WEAKREF_GET_PTR(tagged_ptr); uintptr_t tag = ZEND_WEAKREF_GET_TAG(tagged_ptr); if (tag == ZEND_WEAKREF_TAG_HT) { HashTable *ht = ptr; ZEND_HASH_MAP_FOREACH_PTR(ht, tagged_ptr) { zend_weakref_unref_single( - ZEND_WEAKREF_GET_PTR(tagged_ptr), ZEND_WEAKREF_GET_TAG(tagged_ptr), obj_addr); + ZEND_WEAKREF_GET_PTR(tagged_ptr), ZEND_WEAKREF_GET_TAG(tagged_ptr), object); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(ht); FREE_HASHTABLE(ht); } else { - zend_weakref_unref_single(ptr, tag, obj_addr); + zend_weakref_unref_single(ptr, tag, object); } } static void zend_weakref_register(zend_object *object, void *payload) { GC_ADD_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); - zend_ulong obj_addr = (zend_ulong) object; - zval *zv = zend_hash_index_lookup(&EG(weakrefs), obj_addr); + zend_ulong obj_key = zend_object_to_weakref_key(object); + zval *zv = zend_hash_index_lookup(&EG(weakrefs), obj_key); if (Z_TYPE_P(zv) == IS_NULL) { ZVAL_PTR(zv, payload); return; @@ -105,25 +115,28 @@ static void zend_weakref_register(zend_object *object, void *payload) { zend_hash_init(ht, 0, NULL, NULL, 0); zend_hash_index_add_new_ptr(ht, (zend_ulong) tagged_ptr, tagged_ptr); zend_hash_index_add_new_ptr(ht, (zend_ulong) payload, payload); - zend_hash_index_update_ptr( - &EG(weakrefs), obj_addr, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_HT)); + /* Replace the single WeakMap or WeakReference entry in EG(weakrefs) with a HashTable with 2 entries in place. */ + ZVAL_PTR(zv, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_HT)); } static void zend_weakref_unregister(zend_object *object, void *payload, bool weakref_free) { - zend_ulong obj_addr = (zend_ulong) object; - void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), obj_addr); + zend_ulong obj_key = zend_object_to_weakref_key(object); + void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), obj_key); ZEND_ASSERT(tagged_ptr && "Weakref not registered?"); void *ptr = ZEND_WEAKREF_GET_PTR(tagged_ptr); uintptr_t tag = ZEND_WEAKREF_GET_TAG(tagged_ptr); if (tag != ZEND_WEAKREF_TAG_HT) { ZEND_ASSERT(tagged_ptr == payload); - zend_hash_index_del(&EG(weakrefs), obj_addr); + zend_hash_index_del(&EG(weakrefs), obj_key); GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); /* Do this last, as it may destroy the object. */ if (weakref_free) { - zend_weakref_unref_single(ptr, tag, obj_addr); + zend_weakref_unref_single(ptr, tag, object); + } else { + /* The optimization of skipping unref is only used in the destructor of WeakMap */ + ZEND_ASSERT(ZEND_WEAKREF_GET_TAG(payload) == ZEND_WEAKREF_TAG_MAP); } return; } @@ -139,18 +152,21 @@ static void zend_weakref_unregister(zend_object *object, void *payload, bool wea GC_DEL_FLAGS(object, IS_OBJ_WEAKLY_REFERENCED); zend_hash_destroy(ht); FREE_HASHTABLE(ht); - zend_hash_index_del(&EG(weakrefs), obj_addr); + zend_hash_index_del(&EG(weakrefs), obj_key); } /* Do this last, as it may destroy the object. */ if (weakref_free) { zend_weakref_unref_single( - ZEND_WEAKREF_GET_PTR(payload), ZEND_WEAKREF_GET_TAG(payload), obj_addr); + ZEND_WEAKREF_GET_PTR(payload), ZEND_WEAKREF_GET_TAG(payload), object); + } else { + /* The optimization of skipping unref is only used in the destructor of WeakMap */ + ZEND_ASSERT(ZEND_WEAKREF_GET_TAG(payload) == ZEND_WEAKREF_TAG_MAP); } } ZEND_API zval *zend_weakrefs_hash_add(HashTable *ht, zend_object *key, zval *pData) { - zval *zv = zend_hash_index_add(ht, (zend_ulong) key, pData); + zval *zv = zend_hash_index_add(ht, zend_object_to_weakref_key(key), pData); if (zv) { zend_weakref_register(key, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_MAP)); } @@ -158,7 +174,7 @@ ZEND_API zval *zend_weakrefs_hash_add(HashTable *ht, zend_object *key, zval *pDa } ZEND_API zend_result zend_weakrefs_hash_del(HashTable *ht, zend_object *key) { - zval *zv = zend_hash_index_find(ht, (zend_ulong) key); + zval *zv = zend_hash_index_find(ht, zend_object_to_weakref_key(key)); if (zv) { zend_weakref_unregister(key, ZEND_WEAKREF_ENCODE(ht, ZEND_WEAKREF_TAG_MAP), 1); return SUCCESS; @@ -170,17 +186,19 @@ void zend_weakrefs_init(void) { zend_hash_init(&EG(weakrefs), 8, NULL, NULL, 0); } +/* This is called when the object is garbage collected + * to remove all WeakReference and WeakMap entries weakly referencing that object. */ void zend_weakrefs_notify(zend_object *object) { /* Annoyingly we can't use the HT destructor here, because we need access to the key (which * is the object address), which is not provided to the dtor. */ - zend_ulong obj_addr = (zend_ulong) object; - void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), obj_addr); + const zend_ulong obj_key = zend_object_to_weakref_key(object); + void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), obj_key); #if ZEND_DEBUG ZEND_ASSERT(tagged_ptr && "Tracking of the IS_OBJ_WEAKLY_REFERENCE flag should be precise"); #endif if (tagged_ptr) { - zend_weakref_unref(obj_addr, tagged_ptr); - zend_hash_index_del(&EG(weakrefs), obj_addr); + zend_weakref_unref(object, tagged_ptr); + zend_hash_index_del(&EG(weakrefs), obj_key); } } @@ -199,7 +217,7 @@ static zend_object* zend_weakref_new(zend_class_entry *ce) { } static zend_always_inline bool zend_weakref_find(zend_object *referent, zval *return_value) { - void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), (zend_ulong) referent); + void *tagged_ptr = zend_hash_index_find_ptr(&EG(weakrefs), zend_object_to_weakref_key(referent)); if (!tagged_ptr) { return 0; } @@ -295,13 +313,13 @@ static zend_object *zend_weakmap_create_object(zend_class_entry *ce) static void zend_weakmap_free_obj(zend_object *object) { zend_weakmap *wm = zend_weakmap_from(object); - zend_ulong obj_addr; - ZEND_HASH_MAP_FOREACH_NUM_KEY(&wm->ht, obj_addr) { + zend_ulong obj_key; + ZEND_HASH_MAP_FOREACH_NUM_KEY(&wm->ht, obj_key) { /* Optimization: Don't call zend_weakref_unref_single to free individual entries from wm->ht when unregistering (which would do a hash table lookup, call zend_hash_index_del, and skip over any bucket collisions). * Let freeing the corresponding values for WeakMap entries be done in zend_hash_destroy, freeing objects sequentially. * The performance difference is notable for larger WeakMaps with worse cache locality. */ zend_weakref_unregister( - (zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP), 0); + zend_weakref_key_to_object(obj_key), ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP), 0); } ZEND_HASH_FOREACH_END(); zend_hash_destroy(&wm->ht); zend_object_std_dtor(&wm->std); @@ -320,12 +338,12 @@ static zval *zend_weakmap_read_dimension(zend_object *object, zval *offset, int } zend_weakmap *wm = zend_weakmap_from(object); - zend_object *obj_key = Z_OBJ_P(offset); - zval *zv = zend_hash_index_find(&wm->ht, (zend_ulong) obj_key); + zend_object *obj_addr = Z_OBJ_P(offset); + zval *zv = zend_hash_index_find(&wm->ht, zend_object_to_weakref_key(obj_addr)); if (zv == NULL) { if (type != BP_VAR_IS) { zend_throw_error(NULL, - "Object %s#%d not contained in WeakMap", ZSTR_VAL(obj_key->ce->name), obj_key->handle); + "Object %s#%d not contained in WeakMap", ZSTR_VAL(obj_addr->ce->name), obj_addr->handle); return NULL; } return NULL; @@ -350,10 +368,11 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval } zend_weakmap *wm = zend_weakmap_from(object); - zend_object *obj_key = Z_OBJ_P(offset); + zend_object *obj_addr = Z_OBJ_P(offset); + zend_ulong obj_key = zend_object_to_weakref_key(obj_addr); Z_TRY_ADDREF_P(value); - zval *zv = zend_hash_index_find(&wm->ht, (zend_ulong) obj_key); + zval *zv = zend_hash_index_find(&wm->ht, obj_key); if (zv) { /* Because the destructors can have side effects such as resizing or rehashing the WeakMap storage, * free the zval only after overwriting the original value. */ @@ -364,8 +383,8 @@ static void zend_weakmap_write_dimension(zend_object *object, zval *offset, zval return; } - zend_weakref_register(obj_key, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP)); - zend_hash_index_add_new(&wm->ht, (zend_ulong) obj_key, value); + zend_weakref_register(obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP)); + zend_hash_index_add_new(&wm->ht, obj_key, value); } /* int return and check_empty due to Object Handler API */ @@ -377,7 +396,7 @@ static int zend_weakmap_has_dimension(zend_object *object, zval *offset, int che } zend_weakmap *wm = zend_weakmap_from(object); - zval *zv = zend_hash_index_find(&wm->ht, (zend_ulong) Z_OBJ_P(offset)); + zval *zv = zend_hash_index_find(&wm->ht, zend_object_to_weakref_key(Z_OBJ_P(offset))); if (!zv) { return 0; } @@ -396,13 +415,13 @@ static void zend_weakmap_unset_dimension(zend_object *object, zval *offset) } zend_weakmap *wm = zend_weakmap_from(object); - zend_object *obj_key = Z_OBJ_P(offset); - if (!zend_hash_index_exists(&wm->ht, (zend_ulong) Z_OBJ_P(offset))) { + zend_object *obj_addr = Z_OBJ_P(offset); + if (!zend_hash_index_exists(&wm->ht, zend_object_to_weakref_key(obj_addr))) { /* Object not in WeakMap, do nothing. */ return; } - zend_weakref_unregister(obj_key, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP), 1); + zend_weakref_unregister(obj_addr, ZEND_WEAKREF_ENCODE(&wm->ht, ZEND_WEAKREF_TAG_MAP), 1); } static int zend_weakmap_count_elements(zend_object *object, zend_long *count) @@ -423,10 +442,10 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop ALLOC_HASHTABLE(ht); zend_hash_init(ht, zend_hash_num_elements(&wm->ht), NULL, ZVAL_PTR_DTOR, 0); - zend_ulong obj_addr; + zend_ulong obj_key; zval *val; - ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&wm->ht, obj_addr, val) { - zend_object *obj = (zend_object*)obj_addr; + ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&wm->ht, obj_key, val) { + zend_object *obj = zend_weakref_key_to_object(obj_key); zval pair; array_init(&pair); @@ -460,11 +479,11 @@ static zend_object *zend_weakmap_clone_obj(zend_object *old_object) zend_weakmap *new_wm = zend_weakmap_from(new_object); zend_hash_copy(&new_wm->ht, &old_wm->ht, NULL); - zend_ulong obj_addr; + zend_ulong obj_key; zval *val; - ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&new_wm->ht, obj_addr, val) { + ZEND_HASH_MAP_FOREACH_NUM_KEY_VAL(&new_wm->ht, obj_key, val) { zend_weakref_register( - (zend_object *) obj_addr, ZEND_WEAKREF_ENCODE(new_wm, ZEND_WEAKREF_TAG_MAP)); + zend_weakref_key_to_object(obj_key), ZEND_WEAKREF_ENCODE(new_wm, ZEND_WEAKREF_TAG_MAP)); zval_add_ref(val); } ZEND_HASH_FOREACH_END(); return new_object; @@ -511,7 +530,7 @@ static void zend_weakmap_iterator_get_current_key(zend_object_iterator *obj_iter ZEND_ASSERT(0 && "Must have integer key"); } - ZVAL_OBJ_COPY(key, (zend_object *) num_key); + ZVAL_OBJ_COPY(key, zend_weakref_key_to_object(num_key)); } static void zend_weakmap_iterator_move_forward(zend_object_iterator *obj_iter) diff --git a/Zend/zend_weakrefs.h b/Zend/zend_weakrefs.h index 3c391b02158f9..506e2e9d40c5c 100644 --- a/Zend/zend_weakrefs.h +++ b/Zend/zend_weakrefs.h @@ -17,6 +17,8 @@ #ifndef ZEND_WEAKREFS_H #define ZEND_WEAKREFS_H +#include "zend_alloc.h" + BEGIN_EXTERN_C() extern ZEND_API zend_class_entry *zend_ce_weakref; @@ -40,6 +42,26 @@ static zend_always_inline void *zend_weakrefs_hash_add_ptr(HashTable *ht, zend_o } } +/* 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. + * + * E.g. On most 64-bit platforms, pointers are aligned to 8 bytes, so the least significant 3 bits are always 0 and can be discarded. + * + * NOTE: This function is only used for EG(weakrefs) and zend_weakmap->ht. + * It is not used for the HashTable instances associated with ZEND_WEAKREF_TAG_HT tags (created in zend_weakref_register, which uses ZEND_WEAKREF_ENCODE instead). + * The ZEND_WEAKREF_TAG_HT instances are used to disambiguate between multiple weak references to the same zend_object. + */ +static zend_always_inline zend_ulong zend_object_to_weakref_key(const zend_object *object) +{ + ZEND_ASSERT(((uintptr_t)object) % ZEND_MM_ALIGNMENT == 0); + return ((uintptr_t) object) >> ZEND_MM_ALIGNMENT_LOG2; +} + +static zend_always_inline zend_object *zend_weakref_key_to_object(zend_ulong key) +{ + return (zend_object *) (((uintptr_t) key) << ZEND_MM_ALIGNMENT_LOG2); +} + END_EXTERN_C() #endif diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index d0de996d99777..b8ad6c5b46c03 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -509,9 +509,9 @@ PHP_RINIT_FUNCTION(zend_test) PHP_RSHUTDOWN_FUNCTION(zend_test) { - zend_ulong objptr; - ZEND_HASH_FOREACH_NUM_KEY(&ZT_G(global_weakmap), objptr) { - zend_weakrefs_hash_del(&ZT_G(global_weakmap), (zend_object *)(uintptr_t)objptr); + 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)); return SUCCESS; From f0dd79a7e415d8b1d4a3868a27975d6578c87961 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 28 Nov 2021 13:04:46 +0100 Subject: [PATCH 0264/1346] Optimize ArrayAccess method lookup While these currently aren't cached in the class entry, we can at least save us a lowercasing and hash calculation of the method name. --- Zend/zend_object_handlers.c | 24 ++++++++++++++++++------ Zend/zend_string.h | 4 ++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index dab57807796f0..85817d1ae7f11 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -918,7 +918,9 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty GC_ADDREF(object); if (type == BP_VAR_IS) { - zend_call_method_with_1_params(object, ce, NULL, "offsetexists", rv, &tmp_offset); + zend_function *offsetexists = + zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETEXISTS)); + zend_call_known_instance_method_with_1_params(offsetexists, object, rv, &tmp_offset); if (UNEXPECTED(Z_ISUNDEF_P(rv))) { OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); @@ -933,7 +935,9 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty zval_ptr_dtor(rv); } - zend_call_method_with_1_params(object, ce, NULL, "offsetget", rv, &tmp_offset); + zend_function *offsetget = + zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETGET)); + zend_call_known_instance_method_with_1_params(offsetget, object, rv, &tmp_offset); OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); @@ -964,7 +968,9 @@ ZEND_API void zend_std_write_dimension(zend_object *object, zval *offset, zval * ZVAL_COPY_DEREF(&tmp_offset, offset); } GC_ADDREF(object); - zend_call_method_with_2_params(object, ce, NULL, "offsetset", NULL, &tmp_offset, value); + zend_function *offsetset = + zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETSET)); + zend_call_known_instance_method_with_2_params(offsetset, object, NULL, &tmp_offset, value); OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); } else { @@ -982,11 +988,15 @@ ZEND_API int zend_std_has_dimension(zend_object *object, zval *offset, int check if (EXPECTED(zend_class_implements_interface(ce, zend_ce_arrayaccess) != 0)) { ZVAL_COPY_DEREF(&tmp_offset, offset); GC_ADDREF(object); - zend_call_method_with_1_params(object, ce, NULL, "offsetexists", &retval, &tmp_offset); + zend_function *offsetexists = + zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETEXISTS)); + zend_call_known_instance_method_with_1_params(offsetexists, object, &retval, &tmp_offset); result = i_zend_is_true(&retval); zval_ptr_dtor(&retval); if (check_empty && result && EXPECTED(!EG(exception))) { - zend_call_method_with_1_params(object, ce, NULL, "offsetget", &retval, &tmp_offset); + zend_function *offsetget = + zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETGET)); + zend_call_known_instance_method_with_1_params(offsetget, object, &retval, &tmp_offset); result = i_zend_is_true(&retval); zval_ptr_dtor(&retval); } @@ -1163,7 +1173,9 @@ ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset) /* {{{ if (zend_class_implements_interface(ce, zend_ce_arrayaccess)) { ZVAL_COPY_DEREF(&tmp_offset, offset); GC_ADDREF(object); - zend_call_method_with_1_params(object, ce, NULL, "offsetunset", NULL, &tmp_offset); + zend_function *offsetunset = + zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETUNSET)); + zend_call_known_instance_method_with_1_params(offsetunset, object, NULL, &tmp_offset); OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); } else { diff --git a/Zend/zend_string.h b/Zend/zend_string.h index a365cb2574da6..fa275216ebf8d 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -570,6 +570,10 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_AUTOGLOBAL_SERVER, "_SERVER") \ _(ZEND_STR_AUTOGLOBAL_ENV, "_ENV") \ _(ZEND_STR_AUTOGLOBAL_REQUEST, "_REQUEST") \ + _(ZEND_STR_OFFSETGET, "offsetget") \ + _(ZEND_STR_OFFSETSET, "offsetset") \ + _(ZEND_STR_OFFSETEXISTS, "offsetexists") \ + _(ZEND_STR_OFFSETUNSET, "offsetunset") \ typedef enum _zend_known_string_id { From c5d6f59e96dc56a1fbcdab957c22547f5091f171 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 28 Nov 2021 18:37:29 +0100 Subject: [PATCH 0265/1346] Use custom object instead of resource for soap server service The "service" resource is a purely internal structure used by SoapServer, which userland code cannot interact with. Instead of storing it as a resource in an object propperty, use a custom object structure instead. --- ext/soap/soap.c | 53 +++++++++++++++++++++++++++++------------ ext/soap/soap.stub.php | 3 --- ext/soap/soap_arginfo.h | 8 +------ 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 11a4984d02c9c..91f71e3fc12a1 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -30,7 +30,6 @@ static int le_sdl = 0; int le_url = 0; -static int le_service = 0; static int le_typemap = 0; typedef struct _soapHeader { @@ -150,8 +149,7 @@ static void soap_error_handler(int error_num, zend_string *error_filename, const #define Z_HEADER_MUST_UNDERSTAND_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 3)) #define Z_HEADER_ACTOR_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 4)) -#define Z_SERVER_SERVICE_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 0)) -#define Z_SERVER_SOAP_FAULT_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 1)) +#define Z_SERVER_SOAP_FAULT_P(zv) php_soap_deref(OBJ_PROP_NUM(Z_OBJ_P(zv), 0)) /* SoapFault extends Exception, so take those properties into account. */ #define FAULT_PROP_START_OFFSET zend_ce_exception->default_properties_count @@ -165,8 +163,7 @@ static void soap_error_handler(int error_num, zend_string *error_filename, const #define FETCH_THIS_SERVICE(ss) \ { \ - zval *tmp = Z_SERVER_SERVICE_P(ZEND_THIS); \ - ss = (soapServicePtr)zend_fetch_resource_ex(tmp, "service", le_service); \ + ss = soap_server_object_fetch(Z_OBJ_P(ZEND_THIS))->service; \ if (!ss) { \ zend_throw_error(NULL, "Cannot fetch SoapServer object"); \ SOAP_SERVER_END_CODE(); \ @@ -181,6 +178,34 @@ static zend_class_entry* soap_header_class_entry; static zend_class_entry* soap_param_class_entry; zend_class_entry* soap_var_class_entry; +static zend_object_handlers soap_server_object_handlers; + +typedef struct { + soapServicePtr service; + zend_object std; +} soap_server_object; + +static inline soap_server_object *soap_server_object_fetch(zend_object *obj) { + return (soap_server_object *) ((char *) obj - XtOffsetOf(soap_server_object, std)); +} + +static zend_object *soap_server_object_create(zend_class_entry *ce) +{ + soap_server_object *obj = zend_object_alloc(sizeof(soap_server_object), ce); + zend_object_std_init(&obj->std, ce); + object_properties_init(&obj->std, ce); + obj->std.handlers = &soap_server_object_handlers; + return &obj->std; +} + +static void soap_server_object_free(zend_object *obj) { + soap_server_object *server_obj = soap_server_object_fetch(obj); + if (server_obj->service) { + delete_service(server_obj->service); + } + zend_object_std_dtor(obj); +} + ZEND_DECLARE_MODULE_GLOBALS(soap) static void (*old_error_handler)(int, zend_string *, const uint32_t, zend_string *); @@ -361,11 +386,6 @@ static void delete_url_res(zend_resource *res) delete_url(https://redirect.github.com/res-%3Eptr); } -static void delete_service_res(zend_resource *res) -{ - delete_service(res->ptr); -} - static void delete_hashtable_res(zend_resource *res) { delete_hashtable(res->ptr); @@ -386,6 +406,11 @@ PHP_MINIT_FUNCTION(soap) /* Register SoapServer class */ soap_server_class_entry = register_class_SoapServer(); + soap_server_class_entry->create_object = soap_server_object_create; + + 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; /* Register SoapFault class */ soap_fault_class_entry = register_class_SoapFault(zend_ce_exception); @@ -397,7 +422,6 @@ PHP_MINIT_FUNCTION(soap) le_sdl = zend_register_list_destructors_ex(delete_sdl_res, NULL, "SOAP SDL", module_number); le_url = zend_register_list_destructors_ex(delete_url_res, NULL, "SOAP URL", module_number); - le_service = zend_register_list_destructors_ex(delete_service_res, NULL, "SOAP service", module_number); le_typemap = zend_register_list_destructors_ex(delete_hashtable_res, NULL, "SOAP table", module_number); REGISTER_LONG_CONSTANT("SOAP_1_1", SOAP_1_1, CONST_CS | CONST_PERSISTENT); @@ -832,7 +856,6 @@ PHP_METHOD(SoapServer, __construct) soapServicePtr service; zval *options = NULL; zend_string *wsdl; - zend_resource *res; int version = SOAP_1_1; zend_long cache_wsdl; HashTable *typemap_ht = NULL; @@ -942,8 +965,8 @@ PHP_METHOD(SoapServer, __construct) service->typemap = soap_create_typemap(service->sdl, typemap_ht); } - res = zend_register_resource(service, le_service); - ZVAL_RES(Z_SERVER_SERVICE_P(ZEND_THIS), res); + soap_server_object *server_obj = soap_server_object_fetch(Z_OBJ_P(ZEND_THIS)); + server_obj->service = service; SOAP_SERVER_END_CODE(); } @@ -1824,7 +1847,7 @@ static zend_never_inline ZEND_COLD void soap_real_error_handler(int error_num, z } if (Z_OBJ_P(error_object) && instanceof_function(Z_OBJCE_P(error_object), soap_server_class_entry) && - (service = (soapServicePtr)zend_fetch_resource_ex(Z_SERVER_SERVICE_P(error_object), "service", le_service)) && + (service = soap_server_object_fetch(Z_OBJ_P(error_object))->service) && !service->send_errors) { buffer = zend_string_init("Internal Error", sizeof("Internal Error")-1, 0); } else { diff --git a/ext/soap/soap.stub.php b/ext/soap/soap.stub.php index 52613178d8d6f..d21b715cd7580 100644 --- a/ext/soap/soap.stub.php +++ b/ext/soap/soap.stub.php @@ -54,9 +54,6 @@ public function __construct(mixed $data, ?int $encoding, ?string $typeName = nul class SoapServer { - /** @var resource */ - private $service; - private ?SoapFault $__soap_fault = null; public function __construct(?string $wsdl, array $options = []) {} diff --git a/ext/soap/soap_arginfo.h b/ext/soap/soap_arginfo.h index b6bd7f7e3554e..3cf1c19ada2a5 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: ab057422ee42f574e7d00462f3bf173caf14ecc1 */ + * Stub hash: 96c82014f1fe922cee14d0cd55dd14a6ba3ffe5f */ 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") @@ -400,12 +400,6 @@ static zend_class_entry *register_class_SoapServer(void) INIT_CLASS_ENTRY(ce, "SoapServer", class_SoapServer_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); - zval property_service_default_value; - ZVAL_NULL(&property_service_default_value); - zend_string *property_service_name = zend_string_init("service", sizeof("service") - 1, 1); - zend_declare_property_ex(class_entry, property_service_name, &property_service_default_value, ZEND_ACC_PRIVATE, NULL); - zend_string_release(property_service_name); - zend_string *property___soap_fault_class_SoapFault = zend_string_init("SoapFault", sizeof("SoapFault")-1, 1); zval property___soap_fault_default_value; ZVAL_NULL(&property___soap_fault_default_value); From fbdded1ff1cf5902191811527a096a103b7ab8e2 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sun, 28 Nov 2021 11:54:25 -0500 Subject: [PATCH 0266/1346] Use interned string for calling count() in Zend VM Similar to f0dd79a7e415d8b1d4a3868a27975d6578c87961 Copied from GH-7695 --- Zend/zend_string.h | 1 + Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 9 ++++++--- ext/standard/array.c | 10 ++++++---- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index fa275216ebf8d..23e52386c9039 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -574,6 +574,7 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_OFFSETSET, "offsetset") \ _(ZEND_STR_OFFSETEXISTS, "offsetexists") \ _(ZEND_STR_OFFSETUNSET, "offsetunset") \ + _(ZEND_STR_COUNT, "count") \ typedef enum _zend_known_string_id { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 65f17983fb034..264904980527b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -9086,7 +9086,8 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMPVAR|CV, UNUSED) if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) { zval retval; - zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval); + zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 797ac66c96df5..b50cb80b04a1f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -10564,7 +10564,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_ if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) { zval retval; - zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval); + zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; @@ -17857,7 +17858,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_TMPVAR_UNUSED_HANDL if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) { zval retval; - zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval); + zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; @@ -47584,7 +47586,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(Z if (zend_class_implements_interface(zobj->ce, zend_ce_countable)) { zval retval; - zend_call_method_with_0_params(zobj, NULL, NULL, "count", &retval); + zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); count = zval_get_long(&retval); zval_ptr_dtor(&retval); break; diff --git a/ext/standard/array.c b/ext/standard/array.c index f438c474e7ece..c3d4c3d7a78a3 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -702,9 +702,10 @@ PHP_FUNCTION(count) case IS_OBJECT: { zval retval; /* first, we check if the handler is defined */ - if (Z_OBJ_HT_P(array)->count_elements) { + zend_object *zobj = Z_OBJ_P(array); + if (zobj->handlers->count_elements) { RETVAL_LONG(1); - if (SUCCESS == Z_OBJ_HT(*array)->count_elements(Z_OBJ_P(array), &Z_LVAL_P(return_value))) { + if (SUCCESS == zobj->handlers->count_elements(zobj, &Z_LVAL_P(return_value))) { return; } if (EG(exception)) { @@ -712,8 +713,9 @@ PHP_FUNCTION(count) } } /* if not and the object implements Countable we call its count() method */ - if (instanceof_function(Z_OBJCE_P(array), zend_ce_countable)) { - zend_call_method_with_0_params(Z_OBJ_P(array), NULL, NULL, "count", &retval); + if (instanceof_function(zobj->ce, zend_ce_countable)) { + zend_function *count_fn = zend_hash_find_ptr(&zobj->ce->function_table, ZSTR_KNOWN(ZEND_STR_COUNT)); + zend_call_known_instance_method_with_0_params(count_fn, zobj, &retval); if (Z_TYPE(retval) != IS_UNDEF) { RETVAL_LONG(zval_get_long(&retval)); zval_ptr_dtor(&retval); From 032de9e001f015fd39142939477aa80a02cb099b Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Fri, 26 Nov 2021 18:37:04 -0500 Subject: [PATCH 0267/1346] Optimize SplObjectStorage native read/write/has/unset dimension handlers This makes reading/writing with `$splObjectStorage[$offset]` shorthand twice as fast as it was previously, and a bit faster than offsetGet/offsetSet instead of (previously) much slower. Call destructor after overriding old SplObjectStorage entry. Previously, it was called before, which was possibly unsafe if the destructor had side effects. Add tests. Closes GH-7695 Related to GH-7690 Check for ref in SplObjectStorage->__unserialize, check for ref. SplObjectStorage->unserialize may be a different cause of references for malformed inputs, so continue checking In internally used methods, convert references to non-references if they're found. --- ext/spl/spl_observer.c | 175 ++++++++++++++++-- ext/spl/tests/SplObjectStorage_coalesce.phpt | 91 +++++++++ ...plObjectStorage_unserialize_reference.phpt | 42 +++++ ext/spl/tests/SplObjectStorage_unset.phpt | 55 ++++++ 4 files changed, 349 insertions(+), 14 deletions(-) create mode 100644 ext/spl/tests/SplObjectStorage_coalesce.phpt create mode 100644 ext/spl/tests/SplObjectStorage_unserialize_reference.phpt create mode 100644 ext/spl/tests/SplObjectStorage_unset.phpt diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index be826b2f06d4d..f16337673b66f 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -44,10 +44,17 @@ PHPAPI zend_class_entry *spl_ce_MultipleIterator; PHPAPI zend_object_handlers spl_handler_SplObjectStorage; +/* Bit flags for marking internal functionality overridden by SplObjectStorage subclasses. */ +#define SOS_OVERRIDDEN_READ_DIMENSION 1 +#define SOS_OVERRIDDEN_WRITE_DIMENSION 2 +#define SOS_OVERRIDDEN_UNSET_DIMENSION 4 + typedef struct _spl_SplObjectStorage { /* {{{ */ HashTable storage; zend_long index; HashPosition pos; + /* In SplObjectStorage, flags is a hidden implementation detail to optimize ArrayAccess handlers. + * In MultipleIterator on a different class hierarchy, flags is a user settable value controlling iteration behavior. */ zend_long flags; zend_function *fptr_get_hash; zend_object std; @@ -76,7 +83,7 @@ void spl_SplObjectStorage_free_storage(zend_object *object) /* {{{ */ } /* }}} */ static int spl_object_storage_get_hash(zend_hash_key *key, spl_SplObjectStorage *intern, zend_object *obj) { - if (intern->fptr_get_hash) { + if (UNEXPECTED(intern->fptr_get_hash)) { zval param; zval rv; ZVAL_OBJ(¶m, obj); @@ -125,8 +132,54 @@ static spl_SplObjectStorageElement* spl_object_storage_get(spl_SplObjectStorage } } /* }}} */ +static spl_SplObjectStorageElement *spl_object_storage_create_element(zend_object *obj, zval *inf) /* {{{ */ +{ + spl_SplObjectStorageElement *pelement = emalloc(sizeof(spl_SplObjectStorageElement)); + pelement->obj = obj; + GC_ADDREF(obj); + if (inf) { + ZVAL_COPY(&pelement->inf, inf); + } else { + ZVAL_NULL(&pelement->inf); + } + return pelement; +} /* }}} */ + +/* A faster version of spl_object_storage_attach used when neither SplObjectStorage->getHash nor SplObjectStorage->offsetSet is overridden. */ +static spl_SplObjectStorageElement *spl_object_storage_attach_handle(spl_SplObjectStorage *intern, zend_object *obj, zval *inf) /* {{{ */ +{ + uint32_t handle = obj->handle; + zval *entry_zv = zend_hash_index_lookup(&intern->storage, handle); + spl_SplObjectStorageElement *pelement; + ZEND_ASSERT(!(intern->flags & SOS_OVERRIDDEN_WRITE_DIMENSION)); + + if (Z_TYPE_P(entry_zv) != IS_NULL) { + zval zv_inf; + ZEND_ASSERT(Z_TYPE_P(entry_zv) == IS_PTR); + pelement = Z_PTR_P(entry_zv); + ZVAL_COPY_VALUE(&zv_inf, &pelement->inf); + if (inf) { + ZVAL_COPY(&pelement->inf, inf); + } else { + ZVAL_NULL(&pelement->inf); + } + /* Call the old value's destructor last, in case it moves the entry */ + zval_ptr_dtor(&zv_inf); + return pelement; + } + + pelement = spl_object_storage_create_element(obj, inf); + ZVAL_PTR(entry_zv, pelement); + return pelement; +} /* }}} */ + spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *intern, zend_object *obj, zval *inf) /* {{{ */ { + if (EXPECTED(!(intern->flags & SOS_OVERRIDDEN_WRITE_DIMENSION))) { + return spl_object_storage_attach_handle(intern, obj, inf); + } + /* getHash or offsetSet is overridden. */ + spl_SplObjectStorageElement *pelement, element; zend_hash_key key; if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) { @@ -136,13 +189,16 @@ spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *int pelement = spl_object_storage_get(intern, &key); if (pelement) { - zval_ptr_dtor(&pelement->inf); + zval zv_inf; + ZVAL_COPY_VALUE(&zv_inf, &pelement->inf); if (inf) { ZVAL_COPY(&pelement->inf, inf); } else { ZVAL_NULL(&pelement->inf); } spl_object_storage_free_hash(intern, &key); + /* Call the old value's destructor last, in case it moves the entry */ + zval_ptr_dtor(&zv_inf); return pelement; } @@ -164,6 +220,9 @@ spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *int static int spl_object_storage_detach(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */ { + if (EXPECTED(!(intern->flags & SOS_OVERRIDDEN_UNSET_DIMENSION))) { + return zend_hash_index_del(&intern->storage, obj->handle); + } int ret = FAILURE; zend_hash_key key; if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) { @@ -189,6 +248,9 @@ void spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjectStorag intern->index = 0; } /* }}} */ +#define SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zstr_method) \ + (((zend_function *)zend_hash_find_ptr(&(class_type)->function_table, ZSTR_KNOWN(zstr_method)))->common.scope != spl_ce_SplObjectStorage) + static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend_object *orig) /* {{{ */ { spl_SplObjectStorage *intern; @@ -207,10 +269,27 @@ static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend while (parent) { if (parent == spl_ce_SplObjectStorage) { + /* Possible optimization: Cache these results with a map from class entry to IS_NULL/IS_PTR. + * Or maybe just a single item with the result for the most recently loaded subclass. */ if (class_type != spl_ce_SplObjectStorage) { - intern->fptr_get_hash = zend_hash_str_find_ptr(&class_type->function_table, "gethash", sizeof("gethash") - 1); - if (intern->fptr_get_hash->common.scope == spl_ce_SplObjectStorage) { - intern->fptr_get_hash = NULL; + zend_function *get_hash = zend_hash_str_find_ptr(&class_type->function_table, "gethash", sizeof("gethash") - 1); + if (get_hash->common.scope != spl_ce_SplObjectStorage) { + intern->fptr_get_hash = get_hash; + } + if (intern->fptr_get_hash != NULL || + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETGET) || + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETEXISTS)) { + intern->flags |= SOS_OVERRIDDEN_READ_DIMENSION; + } + + if (intern->fptr_get_hash != NULL || + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETSET)) { + intern->flags |= SOS_OVERRIDDEN_WRITE_DIMENSION; + } + + if (intern->fptr_get_hash != NULL || + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETUNSET)) { + intern->flags |= SOS_OVERRIDDEN_UNSET_DIMENSION; } } break; @@ -328,20 +407,21 @@ static zend_object *spl_SplObjectStorage_new(zend_class_entry *class_type) } /* }}} */ -int spl_object_storage_contains(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */ +/* Returns true if the SplObjectStorage contains an entry for getHash(obj), even if the corresponding value is null. */ +bool spl_object_storage_contains(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */ { - int found; + if (EXPECTED(!intern->fptr_get_hash)) { + return zend_hash_index_find(&intern->storage, obj->handle) != NULL; + } zend_hash_key key; if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) { - return 0; + return true; } - if (key.key) { - found = zend_hash_exists(&intern->storage, key.key); - } else { - found = zend_hash_index_exists(&intern->storage, key.h); - } - spl_object_storage_free_hash(intern, &key); + ZEND_ASSERT(key.key); + bool found = zend_hash_exists(&intern->storage, key.key); + zend_string_release_ex(key.key, 0); + return found; } /* }}} */ @@ -361,6 +441,68 @@ PHP_METHOD(SplObjectStorage, attach) spl_object_storage_attach(intern, obj, inf); } /* }}} */ +static int spl_object_storage_has_dimension(zend_object *object, zval *offset, int check_empty) +{ + spl_SplObjectStorage *intern = spl_object_storage_from_obj(object); + if (UNEXPECTED(offset == NULL || Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_READ_DIMENSION))) { + /* Can't optimize empty()/isset() check if getHash, offsetExists, or offsetGet is overridden */ + return zend_std_has_dimension(object, offset, check_empty); + } + spl_SplObjectStorageElement *element = zend_hash_index_find_ptr(&intern->storage, Z_OBJ_HANDLE_P(offset)); + if (!element) { + return 0; + } + + if (check_empty) { + return i_zend_is_true(&element->inf); + } + /* NOTE: SplObjectStorage->offsetExists() is an alias of SplObjectStorage->contains(), so this returns true even if the value is null. */ + return 1; +} + +static zval *spl_object_storage_read_dimension(zend_object *object, zval *offset, int type, zval *rv) +{ + spl_SplObjectStorage *intern = spl_object_storage_from_obj(object); + if (UNEXPECTED(offset == NULL || Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_READ_DIMENSION))) { + /* Can't optimize it if getHash, offsetExists, or offsetGet is overridden */ + return zend_std_read_dimension(object, offset, type, rv); + } + spl_SplObjectStorageElement *element = zend_hash_index_find_ptr(&intern->storage, Z_OBJ_HANDLE_P(offset)); + + if (!element) { + if (type == BP_VAR_IS) { + return &EG(uninitialized_zval); + } + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "Object not found"); + return NULL; + } else { + /* This deliberately returns a non-reference, even for BP_VAR_W and BP_VAR_RW, to behave the same way as SplObjectStorage did when using the default zend_std_read_dimension behavior. + * i.e. This prevents taking a reference to an entry of SplObjectStorage because offsetGet would return a non-reference. */ + ZVAL_COPY_DEREF(rv, &element->inf); + return rv; + } +} + +static void spl_object_storage_write_dimension(zend_object *object, zval *offset, zval *inf) +{ + spl_SplObjectStorage *intern = spl_object_storage_from_obj(object); + if (UNEXPECTED(offset == NULL || Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_WRITE_DIMENSION))) { + zend_std_write_dimension(object, offset, inf); + return; + } + spl_object_storage_attach_handle(intern, Z_OBJ_P(offset), inf); +} + +static void spl_object_storage_unset_dimension(zend_object *object, zval *offset) +{ + spl_SplObjectStorage *intern = spl_object_storage_from_obj(object); + if (UNEXPECTED(Z_TYPE_P(offset) != IS_OBJECT || (intern->flags & SOS_OVERRIDDEN_UNSET_DIMENSION))) { + zend_std_unset_dimension(object, offset); + return; + } + zend_hash_index_del(&intern->storage, Z_OBJ_HANDLE_P(offset)); +} + /* {{{ Detaches an object from the storage */ PHP_METHOD(SplObjectStorage, detach) { @@ -851,6 +993,7 @@ PHP_METHOD(SplObjectStorage, __unserialize) RETURN_THROWS(); } + ZVAL_DEREF(val); spl_object_storage_attach(intern, Z_OBJ_P(key), val); key = NULL; } else { @@ -1201,6 +1344,10 @@ PHP_MINIT_FUNCTION(spl_observer) spl_handler_SplObjectStorage.clone_obj = spl_object_storage_clone; spl_handler_SplObjectStorage.get_gc = spl_object_storage_get_gc; spl_handler_SplObjectStorage.free_obj = spl_SplObjectStorage_free_storage; + spl_handler_SplObjectStorage.read_dimension = spl_object_storage_read_dimension; + spl_handler_SplObjectStorage.write_dimension = spl_object_storage_write_dimension; + spl_handler_SplObjectStorage.has_dimension = spl_object_storage_has_dimension; + spl_handler_SplObjectStorage.unset_dimension = spl_object_storage_unset_dimension; spl_ce_MultipleIterator = register_class_MultipleIterator(zend_ce_iterator); spl_ce_MultipleIterator->create_object = spl_SplObjectStorage_new; diff --git a/ext/spl/tests/SplObjectStorage_coalesce.phpt b/ext/spl/tests/SplObjectStorage_coalesce.phpt new file mode 100644 index 0000000000000..5a89b46be6b8f --- /dev/null +++ b/ext/spl/tests/SplObjectStorage_coalesce.phpt @@ -0,0 +1,91 @@ +--TEST-- +SplObjectStorage magic operators +--FILE-- +contains($o2)); +echo "check isset/empty/contains for false.\n"; +$s[$o2] = false; +var_dump(isset($s[$o2])); +var_dump(empty($s[$o2])); +var_dump($s->contains($o2)); +try { + $s['invalid'] = 123; +} catch (Error $e) { + printf("%s: %s\n", $e::class, $e->getMessage()); +} +try { + var_dump(isset($s['invalid'])); +} catch (Error $e) { + printf("%s: %s\n", $e::class, $e->getMessage()); +} +$a = &$s[$o1]; + +var_dump($s); + +?> +--EXPECTF-- +string(7) "default" +string(7) "dynamic" +string(7) "dynamic" +string(7) "dynamic" +string(7) "dynamic" +bool(true) +bool(false) +o2 +bool(false) +bool(true) +object(stdClass)#4 (0) { +} +check isset/empty/contains for null. offsetExists returns true as long as the entry is there. +bool(true) +bool(true) +bool(true) +check isset/empty/contains for false. +bool(true) +bool(true) +bool(true) +TypeError: SplObjectStorage::offsetSet(): Argument #1 ($object) must be of type object, string given +TypeError: SplObjectStorage::offsetExists(): Argument #1 ($object) must be of type object, string given + +Notice: Indirect modification of overloaded element of SplObjectStorage has no effect in %s on line 38 +object(SplObjectStorage)#1 (1) { + ["storage":"SplObjectStorage":private]=> + array(2) { + [0]=> + array(2) { + ["obj"]=> + object(stdClass)#2 (0) { + } + ["inf"]=> + string(7) "dynamic" + } + [1]=> + array(2) { + ["obj"]=> + object(stdClass)#3 (0) { + } + ["inf"]=> + bool(false) + } + } +} \ No newline at end of file diff --git a/ext/spl/tests/SplObjectStorage_unserialize_reference.phpt b/ext/spl/tests/SplObjectStorage_unserialize_reference.phpt new file mode 100644 index 0000000000000..de18a42aacdf8 --- /dev/null +++ b/ext/spl/tests/SplObjectStorage_unserialize_reference.phpt @@ -0,0 +1,42 @@ +--TEST-- +SPL: Test that __unserialize converts references to non-references +--FILE-- +__unserialize([$x, []]); +var_dump($s); +$val = $s[$o]; +$val = 123; +var_dump($s); +?> +--EXPECT-- +object(SplObjectStorage)#1 (1) { + ["storage":"SplObjectStorage":private]=> + array(1) { + [0]=> + array(2) { + ["obj"]=> + object(stdClass)#2 (0) { + } + ["inf"]=> + int(1) + } + } +} +object(SplObjectStorage)#1 (1) { + ["storage":"SplObjectStorage":private]=> + array(1) { + [0]=> + array(2) { + ["obj"]=> + object(stdClass)#2 (0) { + } + ["inf"]=> + int(1) + } + } +} diff --git a/ext/spl/tests/SplObjectStorage_unset.phpt b/ext/spl/tests/SplObjectStorage_unset.phpt new file mode 100644 index 0000000000000..2e3e58c837cb0 --- /dev/null +++ b/ext/spl/tests/SplObjectStorage_unset.phpt @@ -0,0 +1,55 @@ +--TEST-- +SplObjectStorage unset and destructor edge cases +--FILE-- +getMessage()}\n"; +} +var_dump($s); +$s[$o] = new HasDestructor(); +try { + $s->offsetUnset($o); +} catch (Exception $e) { + echo "Caught: {$e->getMessage()}\n"; +} + +var_dump($s); +?> +--EXPECT-- +In destructor. Should no longer be accessible in $s: +object(SplObjectStorage)#2 (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} +Caught: thrown from destructor +object(SplObjectStorage)#2 (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} +In destructor. Should no longer be accessible in $s: +object(SplObjectStorage)#2 (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} +Caught: thrown from destructor +object(SplObjectStorage)#2 (1) { + ["storage":"SplObjectStorage":private]=> + array(0) { + } +} \ No newline at end of file From 283669f1aefb93c193a7a21990452d0edec6ef2b Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 30 Nov 2021 14:47:14 +0000 Subject: [PATCH 0268/1346] pcntl add forkx for solaris based systems. (#7654) --- ext/pcntl/config.m4 | 2 +- ext/pcntl/pcntl.c | 52 +++++++++++++++++++++++++++++++++++++++ ext/pcntl/pcntl.stub.php | 4 +++ ext/pcntl/pcntl_arginfo.h | 6 +++++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/ext/pcntl/config.m4 b/ext/pcntl/config.m4 index 50dfd354e8ec0..148f1f114678c 100644 --- a/ext/pcntl/config.m4 +++ b/ext/pcntl/config.m4 @@ -7,7 +7,7 @@ if test "$PHP_PCNTL" != "no"; then AC_CHECK_FUNCS([fork], [], [AC_MSG_ERROR([pcntl: fork() not supported by this platform])]) AC_CHECK_FUNCS([waitpid], [], [AC_MSG_ERROR([pcntl: waitpid() not supported by this platform])]) AC_CHECK_FUNCS([sigaction], [], [AC_MSG_ERROR([pcntl: sigaction() not supported by this platform])]) - AC_CHECK_FUNCS([getpriority setpriority wait3 wait4 sigwaitinfo sigtimedwait unshare rfork]) + AC_CHECK_FUNCS([getpriority setpriority wait3 wait4 sigwaitinfo sigtimedwait unshare rfork forkx]) AC_MSG_CHECKING([for siginfo_t]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 54ed5c4b90e91..645b211952b9f 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -46,6 +46,10 @@ #include #endif +#ifdef HAVE_FORKX +#include +#endif + #ifndef NSIG # define NSIG 32 #endif @@ -364,6 +368,11 @@ void php_register_signal_constants(INIT_FUNC_ARGS) REGISTER_LONG_CONSTANT("RFTHREAD", RFTHREAD, CONST_CS | CONST_PERSISTENT); #endif #endif + +#ifdef HAVE_FORKX + REGISTER_LONG_CONSTANT("FORK_NOSIGCHLD", FORK_NOSIGCHLD, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("FORK_WAITPID", FORK_WAITPID, CONST_CS | CONST_PERSISTENT); +#endif } static void php_pcntl_register_errno_constants(INIT_FUNC_ARGS) @@ -1551,6 +1560,49 @@ PHP_FUNCTION(pcntl_rfork) #endif /* }}} */ +#ifdef HAVE_FORKX +/* {{{ proto bool pcntl_forkx(int flags) + More elaborated version of fork with the following settings. + FORK_WAITPID: forbid the parent process to wait for multiple pid but one only + FORK_NOSIGCHLD: SIGCHLD signal ignored when the child terminates */ +PHP_FUNCTION(pcntl_forkx) +{ + zend_long flags; + pid_t pid; + + ZEND_PARSE_PARAMETERS_START(1, 2) + Z_PARAM_LONG(flags) + ZEND_PARSE_PARAMETERS_END(); + + if (flags < FORK_NOSIGCHLD || flags > FORK_WAITPID) { + zend_argument_value_error(1, "must be FORK_NOSIGCHLD or FORK_WAITPID"); + RETURN_THROWS(); + } + + pid = forkx(flags); + + if (pid == -1) { + PCNTL_G(last_error) = errno; + switch (errno) { + case EAGAIN: + php_error_docref(NULL, E_WARNING, "Maximum process creations limit reached\n"); + break; + case EPERM: + php_error_docref(NULL, E_WARNING, "Calling process not having the proper privileges\n"); + break; + case ENOMEM: + php_error_docref(NULL, E_WARNING, "No swap space left\n"); + break; + default: + php_error_docref(NULL, E_WARNING, "Error %d", errno); + } + } + + RETURN_LONG((zend_long) pid); +} +#endif +/* }}} */ + static void pcntl_interrupt_function(zend_execute_data *execute_data) { pcntl_signal_dispatch(); diff --git a/ext/pcntl/pcntl.stub.php b/ext/pcntl/pcntl.stub.php index a6b7552c93500..d668b4d06627a 100644 --- a/ext/pcntl/pcntl.stub.php +++ b/ext/pcntl/pcntl.stub.php @@ -83,3 +83,7 @@ function pcntl_unshare(int $flags): bool {} #ifdef HAVE_RFORK function pcntl_rfork(int $flags, int $signal = 0): int{} #endif +# +#ifdef HAVE_RFORK +function pcntl_forkx(int $flags): int{} +#endif diff --git a/ext/pcntl/pcntl_arginfo.h b/ext/pcntl/pcntl_arginfo.h index b513510286dea..4caaff2bcffcb 100644 --- a/ext/pcntl/pcntl_arginfo.h +++ b/ext/pcntl/pcntl_arginfo.h @@ -125,6 +125,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_rfork, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, signal, IS_LONG, 0, "0") ZEND_END_ARG_INFO() #endif + +#if defined(HAVE_FORKX) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_forkx, 0, 0, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0) +ZEND_END_ARG_INFO() +#endif ZEND_FUNCTION(pcntl_fork); From 8ba1267744633e948be5958a0c4bc6c72fbf2940 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 26 Nov 2021 16:54:26 +0100 Subject: [PATCH 0269/1346] Add templates and workflows for GitHub issues This adds the necessary templates and actions for https://wiki.php.net/rfc/github_issues. Closes GH-7694. --- .github/ISSUE_TEMPLATE/bug_report.yml | 36 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 8 +++++ .github/ISSUE_TEMPLATE/feature_request.yml | 10 ++++++ .github/workflows/close-needs-feedback.yml | 17 ++++++++++ .github/workflows/remove-needs-feedback.yml | 15 +++++++++ 5 files changed, 86 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/workflows/close-needs-feedback.yml create mode 100644 .github/workflows/remove-needs-feedback.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000000..acd9c1220c20e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,36 @@ +name: Bug report +description: Create a bug report +labels: ["Bug", "Status: Needs Triage"] +body: + - type: textarea + attributes: + label: Description + description: "Please provide a minimal way to reproduce the problem and describe what the expected vs actual behavior is. Provide a [3v4l.org](https://3v4l.org/) link if possible." + value: | + The following code: + + ```php + Date: Wed, 1 Dec 2021 18:43:37 -0500 Subject: [PATCH 0270/1346] Cache method overrides of ArrayAccess in zend_class_entry Previously, code such as subclasses of SplFixedArray would check for method overrides when instantiating the objects. This optimization was mentioned as a followup to GH-6552 --- Zend/zend.h | 2 + Zend/zend_API.h | 1 + Zend/zend_compile.c | 1 + Zend/zend_interfaces.c | 23 ++++++++ Zend/zend_iterators.h | 7 +++ Zend/zend_object_handlers.c | 37 ++++++------- Zend/zend_opcode.c | 3 ++ Zend/zend_string.h | 4 -- ext/opcache/zend_file_cache.c | 15 ++++++ ext/opcache/zend_persist.c | 11 ++++ ext/opcache/zend_persist_calc.c | 3 ++ ext/spl/spl_fixedarray.c | 93 +++++++++------------------------ ext/spl/spl_observer.c | 10 ++-- 13 files changed, 112 insertions(+), 98 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index 56b5a376f4c12..d58c02f4475b4 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -183,6 +183,8 @@ struct _zend_class_entry { /* allocated only if class implements Iterator or IteratorAggregate interface */ zend_class_iterator_funcs *iterator_funcs_ptr; + /* allocated only if class implements ArrayAccess interface */ + zend_class_arrayaccess_funcs *arrayaccess_funcs_ptr; /* handlers */ union { diff --git a/Zend/zend_API.h b/Zend/zend_API.h index a0d5ebee10282..e31745298d9da 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -292,6 +292,7 @@ typedef struct _zend_fcall_info_cache { class_container.interfaces = NULL; \ class_container.get_iterator = NULL; \ class_container.iterator_funcs_ptr = NULL; \ + class_container.arrayaccess_funcs_ptr = NULL; \ class_container.info.internal.module = NULL; \ class_container.info.internal.builtin_functions = functions; \ } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index afd4ff2fa585d..ed83eddcc9cf3 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1802,6 +1802,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_hand ce->create_object = NULL; ce->get_iterator = NULL; ce->iterator_funcs_ptr = NULL; + ce->arrayaccess_funcs_ptr = NULL; ce->get_static_method = NULL; ce->parent = NULL; ce->parent_name = NULL; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index a8cd9b534ed4c..83162d3b46066 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -359,6 +359,28 @@ static int zend_implement_iterator(zend_class_entry *interface, zend_class_entry } /* }}} */ +/* {{{ zend_implement_arrayaccess */ +static int zend_implement_arrayaccess(zend_class_entry *interface, zend_class_entry *class_type) +{ + ZEND_ASSERT(!class_type->arrayaccess_funcs_ptr && "ArrayAccess funcs already set?"); + zend_class_arrayaccess_funcs *funcs_ptr = class_type->type == ZEND_INTERNAL_CLASS + ? pemalloc(sizeof(zend_class_arrayaccess_funcs), 1) + : zend_arena_alloc(&CG(arena), sizeof(zend_class_arrayaccess_funcs)); + class_type->arrayaccess_funcs_ptr = funcs_ptr; + + funcs_ptr->zf_offsetget = zend_hash_str_find_ptr( + &class_type->function_table, "offsetget", sizeof("offsetget") - 1); + funcs_ptr->zf_offsetexists = zend_hash_str_find_ptr( + &class_type->function_table, "offsetexists", sizeof("offsetexists") - 1); + funcs_ptr->zf_offsetset = zend_hash_str_find_ptr( + &class_type->function_table, "offsetset", sizeof("offsetset") - 1); + funcs_ptr->zf_offsetunset = zend_hash_str_find_ptr( + &class_type->function_table, "offsetunset", sizeof("offsetunset") - 1); + + return SUCCESS; +} +/* }}} */ + /* {{{ zend_user_serialize */ ZEND_API int zend_user_serialize(zval *object, unsigned char **buffer, size_t *buf_len, zend_serialize_data *data) { @@ -616,6 +638,7 @@ ZEND_API void zend_register_interfaces(void) zend_ce_serializable->interface_gets_implemented = zend_implement_serializable; zend_ce_arrayaccess = register_class_ArrayAccess(); + zend_ce_arrayaccess->interface_gets_implemented = zend_implement_arrayaccess; zend_ce_countable = register_class_Countable(); diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index bce98a24ac93c..5e7451f7eacc7 100644 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -72,6 +72,13 @@ typedef struct _zend_class_iterator_funcs { zend_function *zf_rewind; } zend_class_iterator_funcs; +typedef struct _zend_class_arrayaccess_funcs { + zend_function *zf_offsetget; + zend_function *zf_offsetexists; + zend_function *zf_offsetset; + zend_function *zf_offsetunset; +} zend_class_arrayaccess_funcs; + BEGIN_EXTERN_C() /* given a zval, returns stuff that can be used to iterate it. */ ZEND_API zend_object_iterator* zend_iterator_unwrap(zval *array_ptr); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 85817d1ae7f11..529893b1de882 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -908,7 +908,9 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty zend_class_entry *ce = object->ce; zval tmp_offset; - if (EXPECTED(zend_class_implements_interface(ce, zend_ce_arrayaccess) != 0)) { + /* arrayaccess_funcs_ptr is set if (and only if) the class implements zend_ce_arrayaccess */ + zend_class_arrayaccess_funcs *funcs = ce->arrayaccess_funcs_ptr; + if (EXPECTED(funcs)) { if (offset == NULL) { /* [] construct */ ZVAL_NULL(&tmp_offset); @@ -918,9 +920,7 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty GC_ADDREF(object); if (type == BP_VAR_IS) { - zend_function *offsetexists = - zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETEXISTS)); - zend_call_known_instance_method_with_1_params(offsetexists, object, rv, &tmp_offset); + zend_call_known_instance_method_with_1_params(funcs->zf_offsetexists, object, rv, &tmp_offset); if (UNEXPECTED(Z_ISUNDEF_P(rv))) { OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); @@ -935,9 +935,7 @@ ZEND_API zval *zend_std_read_dimension(zend_object *object, zval *offset, int ty zval_ptr_dtor(rv); } - zend_function *offsetget = - zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETGET)); - zend_call_known_instance_method_with_1_params(offsetget, object, rv, &tmp_offset); + zend_call_known_instance_method_with_1_params(funcs->zf_offsetget, object, rv, &tmp_offset); OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); @@ -961,16 +959,15 @@ ZEND_API void zend_std_write_dimension(zend_object *object, zval *offset, zval * zend_class_entry *ce = object->ce; zval tmp_offset; - if (EXPECTED(zend_class_implements_interface(ce, zend_ce_arrayaccess) != 0)) { + zend_class_arrayaccess_funcs *funcs = ce->arrayaccess_funcs_ptr; + if (EXPECTED(funcs)) { if (!offset) { ZVAL_NULL(&tmp_offset); } else { ZVAL_COPY_DEREF(&tmp_offset, offset); } GC_ADDREF(object); - zend_function *offsetset = - zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETSET)); - zend_call_known_instance_method_with_2_params(offsetset, object, NULL, &tmp_offset, value); + zend_call_known_instance_method_with_2_params(funcs->zf_offsetset, object, NULL, &tmp_offset, value); OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); } else { @@ -985,18 +982,15 @@ ZEND_API int zend_std_has_dimension(zend_object *object, zval *offset, int check zval retval, tmp_offset; int result; - if (EXPECTED(zend_class_implements_interface(ce, zend_ce_arrayaccess) != 0)) { + zend_class_arrayaccess_funcs *funcs = ce->arrayaccess_funcs_ptr; + if (EXPECTED(funcs)) { ZVAL_COPY_DEREF(&tmp_offset, offset); GC_ADDREF(object); - zend_function *offsetexists = - zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETEXISTS)); - zend_call_known_instance_method_with_1_params(offsetexists, object, &retval, &tmp_offset); + zend_call_known_instance_method_with_1_params(funcs->zf_offsetexists, object, &retval, &tmp_offset); result = i_zend_is_true(&retval); zval_ptr_dtor(&retval); if (check_empty && result && EXPECTED(!EG(exception))) { - zend_function *offsetget = - zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETGET)); - zend_call_known_instance_method_with_1_params(offsetget, object, &retval, &tmp_offset); + zend_call_known_instance_method_with_1_params(funcs->zf_offsetget, object, &retval, &tmp_offset); result = i_zend_is_true(&retval); zval_ptr_dtor(&retval); } @@ -1170,12 +1164,11 @@ ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset) /* {{{ zend_class_entry *ce = object->ce; zval tmp_offset; - if (zend_class_implements_interface(ce, zend_ce_arrayaccess)) { + zend_class_arrayaccess_funcs *funcs = ce->arrayaccess_funcs_ptr; + if (EXPECTED(funcs)) { ZVAL_COPY_DEREF(&tmp_offset, offset); GC_ADDREF(object); - zend_function *offsetunset = - zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_OFFSETUNSET)); - zend_call_known_instance_method_with_1_params(offsetunset, object, NULL, &tmp_offset); + zend_call_known_instance_method_with_1_params(funcs->zf_offsetunset, object, NULL, &tmp_offset); OBJ_RELEASE(object); zval_ptr_dtor(&tmp_offset); } else { diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index ac4fb75e986ae..b215e5120af5b 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -469,6 +469,9 @@ ZEND_API void destroy_zend_class(zval *zv) if (ce->iterator_funcs_ptr) { free(ce->iterator_funcs_ptr); } + if (ce->arrayaccess_funcs_ptr) { + free(ce->arrayaccess_funcs_ptr); + } if (ce->num_interfaces > 0) { free(ce->interfaces); } diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 5a37ada0e47cd..0236bad20cf21 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -571,10 +571,6 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_AUTOGLOBAL_SERVER, "_SERVER") \ _(ZEND_STR_AUTOGLOBAL_ENV, "_ENV") \ _(ZEND_STR_AUTOGLOBAL_REQUEST, "_REQUEST") \ - _(ZEND_STR_OFFSETGET, "offsetget") \ - _(ZEND_STR_OFFSETSET, "offsetset") \ - _(ZEND_STR_OFFSETEXISTS, "offsetexists") \ - _(ZEND_STR_OFFSETUNSET, "offsetunset") \ _(ZEND_STR_COUNT, "count") \ diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 578556b8ef395..ef59254d70937 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -880,6 +880,14 @@ static void zend_file_cache_serialize_class(zval *zv, SERIALIZE_PTR(ce->iterator_funcs_ptr); } + if (ce->arrayaccess_funcs_ptr) { + SERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetget); + SERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetexists); + SERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetset); + SERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetunset); + SERIALIZE_PTR(ce->arrayaccess_funcs_ptr); + } + ZEND_MAP_PTR_INIT(ce->static_members_table, NULL); ZEND_MAP_PTR_INIT(ce->mutable_data, NULL); } @@ -1670,6 +1678,13 @@ static void zend_file_cache_unserialize_class(zval *zv, UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_current); UNSERIALIZE_PTR(ce->iterator_funcs_ptr->zf_next); } + if (ce->arrayaccess_funcs_ptr) { + UNSERIALIZE_PTR(ce->arrayaccess_funcs_ptr); + UNSERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetget); + UNSERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetexists); + UNSERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetset); + UNSERIALIZE_PTR(ce->arrayaccess_funcs_ptr->zf_offsetunset); + } if (!(script->corrupted)) { ce->ce_flags |= ZEND_ACC_IMMUTABLE; diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index c438e6b38b81c..a572f5e3be87e 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -985,6 +985,9 @@ zend_class_entry *zend_persist_class_entry(zend_class_entry *orig_ce) if (ce->iterator_funcs_ptr) { ce->iterator_funcs_ptr = zend_shared_memdup(ce->iterator_funcs_ptr, sizeof(zend_class_iterator_funcs)); } + if (ce->arrayaccess_funcs_ptr) { + ce->arrayaccess_funcs_ptr = zend_shared_memdup(ce->arrayaccess_funcs_ptr, sizeof(zend_class_arrayaccess_funcs)); + } if (ce->ce_flags & ZEND_ACC_CACHED) { return ce; @@ -1135,6 +1138,14 @@ void zend_update_parent_ce(zend_class_entry *ce) ce->iterator_funcs_ptr->zf_next = zend_hash_str_find_ptr(&ce->function_table, "next", sizeof("next") - 1); } } + + if (ce->arrayaccess_funcs_ptr) { + ZEND_ASSERT(zend_class_implements_interface(ce, zend_ce_arrayaccess)); + ce->arrayaccess_funcs_ptr->zf_offsetget = zend_hash_str_find_ptr(&ce->function_table, "offsetget", sizeof("offsetget") - 1); + ce->arrayaccess_funcs_ptr->zf_offsetexists = zend_hash_str_find_ptr(&ce->function_table, "offsetexists", sizeof("offsetexists") - 1); + ce->arrayaccess_funcs_ptr->zf_offsetset = zend_hash_str_find_ptr(&ce->function_table, "offsetset", sizeof("offsetset") - 1); + ce->arrayaccess_funcs_ptr->zf_offsetunset = zend_hash_str_find_ptr(&ce->function_table, "offsetunset", sizeof("offsetunset") - 1); + } } /* update methods */ diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 1eac4684c58af..06d746218d2ec 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -470,6 +470,9 @@ void zend_persist_class_entry_calc(zend_class_entry *ce) if (ce->iterator_funcs_ptr) { ADD_SIZE(sizeof(zend_class_iterator_funcs)); } + if (ce->arrayaccess_funcs_ptr) { + ADD_SIZE(sizeof(zend_class_arrayaccess_funcs)); + } if (ce->ce_flags & ZEND_ACC_CACHED) { return; diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 9503baeaba87b..dac31fe8c3001 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -40,23 +40,19 @@ PHPAPI zend_class_entry *spl_ce_SplFixedArray; ZEND_GET_MODULE(spl_fixedarray) #endif +/* Check if the object is an instance of a subclass of SplFixedArray that overrides method's implementation. + * Expect subclassing SplFixedArray to be rare and check that first. */ +#define HAS_FIXEDARRAY_ARRAYACCESS_OVERRIDE(object, method) UNEXPECTED((object)->ce != spl_ce_SplFixedArray && (object)->ce->arrayaccess_funcs_ptr->method->common.scope != spl_ce_SplFixedArray) + typedef struct _spl_fixedarray { zend_long size; /* It is possible to resize this, so this can't be combined with the object */ zval *elements; } spl_fixedarray; -typedef struct _spl_fixedarray_methods { - zend_function *fptr_offset_get; - zend_function *fptr_offset_set; - zend_function *fptr_offset_has; - zend_function *fptr_offset_del; - zend_function *fptr_count; -} spl_fixedarray_methods; - typedef struct _spl_fixedarray_object { spl_fixedarray array; - spl_fixedarray_methods *methods; + zend_function *fptr_count; zend_object std; } spl_fixedarray_object; @@ -233,9 +229,6 @@ static void spl_fixedarray_object_free_storage(zend_object *object) spl_fixedarray_object *intern = spl_fixed_array_from_obj(object); spl_fixedarray_dtor(&intern->array); zend_object_std_dtor(&intern->std); - if (intern->methods) { - efree(intern->methods); - } } static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, zend_object *orig, bool clone_orig) @@ -267,34 +260,11 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z ZEND_ASSERT(parent); if (UNEXPECTED(inherited)) { - spl_fixedarray_methods methods; - methods.fptr_offset_get = zend_hash_str_find_ptr(&class_type->function_table, "offsetget", sizeof("offsetget") - 1); - if (methods.fptr_offset_get->common.scope == parent) { - methods.fptr_offset_get = NULL; - } - methods.fptr_offset_set = zend_hash_str_find_ptr(&class_type->function_table, "offsetset", sizeof("offsetset") - 1); - if (methods.fptr_offset_set->common.scope == parent) { - methods.fptr_offset_set = NULL; - } - methods.fptr_offset_has = zend_hash_str_find_ptr(&class_type->function_table, "offsetexists", sizeof("offsetexists") - 1); - if (methods.fptr_offset_has->common.scope == parent) { - methods.fptr_offset_has = NULL; - } - methods.fptr_offset_del = zend_hash_str_find_ptr(&class_type->function_table, "offsetunset", sizeof("offsetunset") - 1); - if (methods.fptr_offset_del->common.scope == parent) { - methods.fptr_offset_del = NULL; - } - methods.fptr_count = zend_hash_str_find_ptr(&class_type->function_table, "count", sizeof("count") - 1); - if (methods.fptr_count->common.scope == parent) { - methods.fptr_count = NULL; - } - /* Assume that most of the time in performance-sensitive code, SplFixedArray won't be subclassed with overrides for these ArrayAccess methods. */ - /* Save 32 bytes per object on 64-bit systems by combining the 5 null pointers into 1 null pointer */ - /* (This is already looking up 5 functions when any subclass of SplFixedArray is instantiated, which is inefficient) */ - if (methods.fptr_offset_get || methods.fptr_offset_set || methods.fptr_offset_del || methods.fptr_offset_has || methods.fptr_count) { - intern->methods = emalloc(sizeof(spl_fixedarray_methods)); - *intern->methods = methods; + zend_function *fptr_count = zend_hash_str_find_ptr(&class_type->function_table, "count", sizeof("count") - 1); + if (fptr_count->common.scope == parent) { + fptr_count = NULL; } + intern->fptr_count = fptr_count; } return &intern->std; @@ -374,27 +344,24 @@ static int spl_fixedarray_object_has_dimension(zend_object *object, zval *offset static zval *spl_fixedarray_object_read_dimension(zend_object *object, zval *offset, int type, zval *rv) { - spl_fixedarray_object *intern; - - intern = spl_fixed_array_from_obj(object); - if (type == BP_VAR_IS && !spl_fixedarray_object_has_dimension(object, offset, 0)) { return &EG(uninitialized_zval); } - if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_get)) { + if (HAS_FIXEDARRAY_ARRAYACCESS_OVERRIDE(object, zf_offsetget)) { zval tmp; if (!offset) { ZVAL_NULL(&tmp); offset = &tmp; } - zend_call_method_with_1_params(object, intern->std.ce, &intern->methods->fptr_offset_get, "offsetGet", rv, offset); + zend_call_known_instance_method_with_1_params(object->ce->arrayaccess_funcs_ptr->zf_offsetget, object, rv, offset); if (!Z_ISUNDEF_P(rv)) { return rv; } return &EG(uninitialized_zval); } + spl_fixedarray_object *intern = spl_fixed_array_from_obj(object); return spl_fixedarray_object_read_dimension_helper(intern, offset); } @@ -429,20 +396,18 @@ static void spl_fixedarray_object_write_dimension_helper(spl_fixedarray_object * static void spl_fixedarray_object_write_dimension(zend_object *object, zval *offset, zval *value) { - spl_fixedarray_object *intern; - zval tmp; - - intern = spl_fixed_array_from_obj(object); + if (HAS_FIXEDARRAY_ARRAYACCESS_OVERRIDE(object, zf_offsetset)) { + zval tmp; - if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_set)) { if (!offset) { ZVAL_NULL(&tmp); offset = &tmp; } - zend_call_method_with_2_params(object, intern->std.ce, &intern->methods->fptr_offset_set, "offsetSet", NULL, offset, value); + zend_call_known_instance_method_with_2_params(object->ce->arrayaccess_funcs_ptr->zf_offsetset, object, NULL, offset, value); return; } + spl_fixedarray_object *intern = spl_fixed_array_from_obj(object); spl_fixedarray_object_write_dimension_helper(intern, offset, value); } @@ -467,15 +432,12 @@ static void spl_fixedarray_object_unset_dimension_helper(spl_fixedarray_object * static void spl_fixedarray_object_unset_dimension(zend_object *object, zval *offset) { - spl_fixedarray_object *intern; - - intern = spl_fixed_array_from_obj(object); - - if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_del)) { - zend_call_method_with_1_params(object, intern->std.ce, &intern->methods->fptr_offset_del, "offsetUnset", NULL, offset); + if (UNEXPECTED(HAS_FIXEDARRAY_ARRAYACCESS_OVERRIDE(object, zf_offsetunset))) { + zend_call_known_instance_method_with_1_params(object->ce->arrayaccess_funcs_ptr->zf_offsetunset, object, NULL, offset); return; } + spl_fixedarray_object *intern = spl_fixed_array_from_obj(object); spl_fixedarray_object_unset_dimension_helper(intern, offset); } @@ -501,20 +463,17 @@ static bool spl_fixedarray_object_has_dimension_helper(spl_fixedarray_object *in static int spl_fixedarray_object_has_dimension(zend_object *object, zval *offset, int check_empty) { - spl_fixedarray_object *intern; - - intern = spl_fixed_array_from_obj(object); - - if (UNEXPECTED(intern->methods && intern->methods->fptr_offset_has)) { + if (HAS_FIXEDARRAY_ARRAYACCESS_OVERRIDE(object, zf_offsetexists)) { zval rv; - bool result; - zend_call_method_with_1_params(object, intern->std.ce, &intern->methods->fptr_offset_has, "offsetExists", &rv, offset); - result = zend_is_true(&rv); + zend_call_known_instance_method_with_1_params(object->ce->arrayaccess_funcs_ptr->zf_offsetexists, object, &rv, offset); + bool result = zend_is_true(&rv); zval_ptr_dtor(&rv); return result; } + spl_fixedarray_object *intern = spl_fixed_array_from_obj(object); + return spl_fixedarray_object_has_dimension_helper(intern, offset, check_empty); } @@ -523,9 +482,9 @@ static int spl_fixedarray_object_count_elements(zend_object *object, zend_long * spl_fixedarray_object *intern; intern = spl_fixed_array_from_obj(object); - if (UNEXPECTED(intern->methods && intern->methods->fptr_count)) { + if (UNEXPECTED(intern->fptr_count)) { zval rv; - zend_call_method_with_0_params(object, intern->std.ce, &intern->methods->fptr_count, "count", &rv); + zend_call_known_instance_method_with_0_params(intern->fptr_count, object, &rv); if (!Z_ISUNDEF(rv)) { *count = zval_get_long(&rv); zval_ptr_dtor(&rv); diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index f16337673b66f..3ac375c5cd6b5 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -249,7 +249,7 @@ void spl_object_storage_addall(spl_SplObjectStorage *intern, spl_SplObjectStorag } /* }}} */ #define SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zstr_method) \ - (((zend_function *)zend_hash_find_ptr(&(class_type)->function_table, ZSTR_KNOWN(zstr_method)))->common.scope != spl_ce_SplObjectStorage) + (class_type->arrayaccess_funcs_ptr && class_type->arrayaccess_funcs_ptr->zstr_method) static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend_object *orig) /* {{{ */ { @@ -277,18 +277,18 @@ static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend intern->fptr_get_hash = get_hash; } if (intern->fptr_get_hash != NULL || - SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETGET) || - SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETEXISTS)) { + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zf_offsetget) || + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zf_offsetexists)) { intern->flags |= SOS_OVERRIDDEN_READ_DIMENSION; } if (intern->fptr_get_hash != NULL || - SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETSET)) { + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zf_offsetset)) { intern->flags |= SOS_OVERRIDDEN_WRITE_DIMENSION; } if (intern->fptr_get_hash != NULL || - SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, ZEND_STR_OFFSETUNSET)) { + SPL_OBJECT_STORAGE_CLASS_HAS_OVERRIDE(class_type, zf_offsetunset)) { intern->flags |= SOS_OVERRIDDEN_UNSET_DIMENSION; } } From 64f34ed382c34e95e36294dbbaa6970f715cc3ce Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 4 Dec 2021 21:09:35 +0100 Subject: [PATCH 0271/1346] Adjust security bug url Go directly to the submission form, which is no longer shown by default. --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 48a0f3a383187..dcb5f4f98e3f9 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -4,5 +4,5 @@ contact_links: url: https://github.com/php/doc-en/issues about: Please report documentation issues on the doc-en repository. - name: Security issue - url: https://bugs.php.net/report.php?bug_type=Security + url: https://bugs.php.net/report.php?security_bug about: Please report security issues in this private bug tracker. From 3be0ce653be7bd90c10e7dbe055506d393a2a472 Mon Sep 17 00:00:00 2001 From: Yurun Date: Sun, 5 Dec 2021 11:59:18 +0800 Subject: [PATCH 0272/1346] Report wireless network interfaces on Windows too There is no particular reason to exclude wireless network interfaces from the results of `net_get_interfaces()` on Windows, especially since `getifaddrs(3)` includes these as well. Closes GH-7718. --- NEWS | 4 ++++ ext/standard/net.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 4aa580dd20519..3bdec63ad2290 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,10 @@ PHP NEWS - OCI8: . Added oci8.prefetch_lob_size directive to tune LOB query performance +- Standard: + . net_get_interfaces() also reports wireless network interfaces on Windows. + (Yurun) + - Zip: . add ZipArchive::clearError() method . add ZipArchive::getStreamName() method diff --git a/ext/standard/net.c b/ext/standard/net.c index c549bfbc5b0c0..f8e934d5393cc 100644 --- a/ext/standard/net.c +++ b/ext/standard/net.c @@ -190,7 +190,7 @@ PHP_FUNCTION(net_get_interfaces) { for (p = pAddresses; p; p = p->Next) { zval iface, unicast; - if ((IF_TYPE_ETHERNET_CSMACD != p->IfType) && (IF_TYPE_SOFTWARE_LOOPBACK != p->IfType)) { + if ((IF_TYPE_ETHERNET_CSMACD != p->IfType) && (IF_TYPE_IEEE80211 != p->IfType) && (IF_TYPE_SOFTWARE_LOOPBACK != p->IfType)) { continue; } From da684582d74a2c4016f5d9ccad78ce587fcd0b83 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 9 Dec 2021 17:15:59 +0000 Subject: [PATCH 0273/1346] ZEND_INIT_FCALL is only produced when function exists at compile time (#7728) --- UPGRADING.INTERNALS | 13 +++++++++++++ Zend/zend_vm_def.h | 4 +--- Zend/zend_vm_execute.h | 4 +--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 7feaee74ef705..7175f0b54b4db 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -6,6 +6,8 @@ PHP 8.2 INTERNALS UPGRADE NOTES 3. Module changes +4. OpCode changes + ======================== 1. Internal API changes ======================== @@ -24,3 +26,14 @@ PHP 8.2 INTERNALS UPGRADE NOTES 3. Module changes ======================== +======================== +4. OpCode changes +======================== + +* The ZEND_INIT_FCALL opcode now asserts that the function exists in the symbol + table as the function's existence is checked at compile time. + For extensions modifying the function symbol table, setting + CG(compiler_options) |= ZEND_COMPILE_IGNORE_USER_FUNCTIONS | ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS; + will produce ZEND_INIT_FCALL_BY_NAME opcodes instead which check for the + existence of the function at runtime. + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 68e08162ca6d1..934860c33012e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3930,9 +3930,7 @@ ZEND_VM_HOT_HANDLER(61, ZEND_INIT_FCALL, NUM, CONST, NUM|CACHE_SLOT) if (UNEXPECTED(fbc == NULL)) { fname = (zval*)RT_CONSTANT(opline, opline->op2); func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(fname)); - if (UNEXPECTED(func == NULL)) { - ZEND_VM_DISPATCH_TO_HELPER(zend_undefined_function_helper); - } + ZEND_ASSERT(func != NULL && "Function existence must be checked at compile time"); fbc = Z_FUNC_P(func); if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) { init_func_run_time_cache(&fbc->op_array); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 32b9232d90bf8..37c2d1ee653e2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3693,9 +3693,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CO if (UNEXPECTED(fbc == NULL)) { fname = (zval*)RT_CONSTANT(opline, opline->op2); func = zend_hash_find_known_hash(EG(function_table), Z_STR_P(fname)); - if (UNEXPECTED(func == NULL)) { - ZEND_VM_TAIL_CALL(zend_undefined_function_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } + ZEND_ASSERT(func != NULL && "Function existence must be checked at compile time"); fbc = Z_FUNC_P(func); if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) { init_func_run_time_cache(&fbc->op_array); From 25bb229f573b8fb5386cef6f293c855a9abea7a9 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Fri, 10 Dec 2021 09:19:16 -0500 Subject: [PATCH 0274/1346] Allocate less memory for EG(errors) when recording errors for opcache (#7744) errors is an array of pointers, not an array of values. Low importance since this is freed after opcache compiles a file and there are typically no or very few errors. --- Zend/zend.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index e42fc648a4dc7..c37cd9ed97453 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1331,7 +1331,7 @@ ZEND_API ZEND_COLD void zend_error_zstr_at( /* This is very inefficient for a large number of errors. * Use pow2 realloc if it becomes a problem. */ EG(num_errors)++; - EG(errors) = erealloc(EG(errors), sizeof(zend_error_info) * EG(num_errors)); + EG(errors) = erealloc(EG(errors), sizeof(zend_error_info*) * EG(num_errors)); EG(errors)[EG(num_errors)-1] = info; } @@ -1575,7 +1575,7 @@ ZEND_API ZEND_COLD void zend_error_zstr(int type, zend_string *message) { ZEND_API void zend_begin_record_errors(void) { - ZEND_ASSERT(!EG(record_errors) && "Error recoreding already enabled"); + ZEND_ASSERT(!EG(record_errors) && "Error recording already enabled"); EG(record_errors) = true; EG(num_errors) = 0; EG(errors) = NULL; From ac91b83ceb71a2f90af6e772ab313417af05943e Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 28 Nov 2021 12:06:25 +1100 Subject: [PATCH 0275/1346] Add oci_set_prefetch_lob() --- UPGRADING | 7 +- ext/oci8/config.m4 | 8 +- ext/oci8/oci8.c | 9 +- ext/oci8/oci8.stub.php | 3 + ext/oci8/oci8_arginfo.h | 9 +- ext/oci8/oci8_interface.c | 24 ++++ ext/oci8/oci8_statement.c | 37 ++++-- ext/oci8/package.xml | 14 ++- ext/oci8/php_oci8_int.h | 3 +- ext/oci8/tests/lob_prefetch.phpt | 77 +++++++------ ext/oci8/tests/lob_prefetch_ini.phpt | 165 +++++++++++++++++++++++++++ php.ini-production | 2 +- 12 files changed, 298 insertions(+), 60 deletions(-) create mode 100755 ext/oci8/tests/lob_prefetch_ini.phpt diff --git a/UPGRADING b/UPGRADING index 3b02ec4bf3f2b..0e4dfc42b690a 100644 --- a/UPGRADING +++ b/UPGRADING @@ -28,9 +28,10 @@ PHP 8.2 UPGRADE NOTES HTTP method in curl_getinfo() return value. - OCI8: - . Added an oci8.prefetch_lob_size directive to tune LOB query performance - by reducing the number of round-trips between PHP and Oracle Database when - fetching LOBS. This is usable with Oracle Database 12.2 or later. + . Added an oci8.prefetch_lob_size directive and oci_set_prefetch_lob() + function to tune LOB query performance by reducing the number of + round-trips between PHP and Oracle Database when fetching LOBS. This is + usable with Oracle Database 12.2 or later. - PCRE: . Added support for the "n" (NO_AUTO_CAPTURE) modifier, which makes simple diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 89da625e27b0e..09eae79692cbe 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -211,7 +211,13 @@ if test "$PHP_OCI8" != "no"; then oci8_php_version=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3` if test "$oci8_php_version" -lt "5002000"; then - AC_MSG_ERROR([You need at least PHP 5.2.0 to be able to use this version of OCI8. PHP $php_version found]) + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 1.4 for PHP $php_version]) + elif test "$oci8_php_version" -lt "7000000"; then + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 2.0 for PHP $php_version]) + elif test "$oci8_php_version" -lt "8000000"; then + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 2.2 for PHP $php_version]) + elif test "$oci8_php_version" -lt "8001000"; then + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 3.0 for PHP $php_version]) else AC_MSG_RESULT([$php_version, ok]) fi diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 8efb04ea0f629..38dcfc42f35df 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -35,6 +35,9 @@ #ifdef HAVE_OCI8 +/* Note to maintainers: config.m4 should/does check the minimum PHP version so + * the below checks are obsolete - but are kept 'just in case' */ + /* PHP 5.2 is the minimum supported version for OCI8 2.0 */ #if PHP_MAJOR_VERSION < 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION <= 1) #error Use PHP OCI8 1.4 for your version of PHP @@ -42,8 +45,10 @@ /* PHP 7 is the minimum supported version for OCI8 2.1 */ #error Use PHP OCI8 2.0 for your version of PHP #elif PHP_MAJOR_VERSION < 8 -/* PHP 8 is the minimum supported version for OCI8 3.0 */ +/* PHP 8 is the minimum supported version for OCI8 3 */ #error Use PHP OCI8 2.2 for your version of PHP +#elif PHP_MAJOR_VERSION == 8 && PHP_MINOR_VERSION < 1 +#error Use PHP OCI8 3.0 for your version of PHP #endif #include "php_oci8.h" @@ -174,7 +179,7 @@ PHP_INI_BEGIN() #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) STD_PHP_INI_BOOLEAN("oci8.events", "0", PHP_INI_SYSTEM, OnUpdateBool, events, zend_oci_globals, oci_globals) #endif - STD_PHP_INI_ENTRY( "oci8.prefetch_lob_size", "0", PHP_INI_ALL, OnUpdateLong, prefetch_lob_size, zend_oci_globals, oci_globals) + STD_PHP_INI_ENTRY( "oci8.prefetch_lob_size", "0", PHP_INI_SYSTEM, OnUpdateLong, prefetch_lob_size, zend_oci_globals, oci_globals) PHP_INI_END() /* }}} */ diff --git a/ext/oci8/oci8.stub.php b/ext/oci8/oci8.stub.php index cf24b20a74a5e..efedc3eb9063c 100644 --- a/ext/oci8/oci8.stub.php +++ b/ext/oci8/oci8.stub.php @@ -381,6 +381,9 @@ function oci_set_prefetch($statement, int $rows): bool {} */ function ocisetprefetch($statement, int $rows): bool {} +/** @param resource $statement */ +function oci_set_prefetch_lob($statement, int $prefetch_lob_size): bool {} + /** @param resource $connection */ function oci_set_client_identifier($connection, string $client_id): bool {} diff --git a/ext/oci8/oci8_arginfo.h b/ext/oci8/oci8_arginfo.h index 26bc20bcc70fe..b6916e49c37c5 100644 --- a/ext/oci8/oci8_arginfo.h +++ b/ext/oci8/oci8_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 46ee8ce62b36639636b4f5126e20a4b4e1df2e25 */ + * Stub hash: 9db587b5d431b9dfe7178fd843ae8907db737a04 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_define_by_name, 0, 3, _IS_BOOL, 0) ZEND_ARG_INFO(0, statement) @@ -299,6 +299,11 @@ ZEND_END_ARG_INFO() #define arginfo_ocisetprefetch arginfo_oci_set_prefetch +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_set_prefetch_lob, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, statement) + ZEND_ARG_TYPE_INFO(0, prefetch_lob_size, IS_LONG, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_set_client_identifier, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, connection) ZEND_ARG_TYPE_INFO(0, client_id, IS_STRING, 0) @@ -596,6 +601,7 @@ ZEND_FUNCTION(oci_num_fields); ZEND_FUNCTION(oci_parse); ZEND_FUNCTION(oci_get_implicit_resultset); ZEND_FUNCTION(oci_set_prefetch); +ZEND_FUNCTION(oci_set_prefetch_lob); ZEND_FUNCTION(oci_set_client_identifier); ZEND_FUNCTION(oci_set_edition); ZEND_FUNCTION(oci_set_module_name); @@ -710,6 +716,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(oci_get_implicit_resultset, arginfo_oci_get_implicit_resultset) ZEND_FE(oci_set_prefetch, arginfo_oci_set_prefetch) ZEND_DEP_FALIAS(ocisetprefetch, oci_set_prefetch, arginfo_ocisetprefetch) + ZEND_FE(oci_set_prefetch_lob, arginfo_oci_set_prefetch_lob) ZEND_FE(oci_set_client_identifier, arginfo_oci_set_client_identifier) ZEND_FE(oci_set_edition, arginfo_oci_set_edition) ZEND_FE(oci_set_module_name, arginfo_oci_set_module_name) diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 7668e102ba5a8..d277e0441d346 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1633,6 +1633,30 @@ PHP_FUNCTION(oci_set_prefetch) } /* }}} */ +/* {{{ Sets the amount of LOB data to be prefetched when OCI LOB locators are fetched */ +PHP_FUNCTION(oci_set_prefetch_lob) +{ + zval *z_statement; + php_oci_statement *statement; + zend_long prefetch_lob_size; + + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_RESOURCE(z_statement) + Z_PARAM_LONG(prefetch_lob_size) + ZEND_PARSE_PARAMETERS_END(); + + PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); + + if (prefetch_lob_size < 0) { + zend_argument_value_error(2, "must be greater than or equal to 0"); + RETURN_THROWS(); + } + + statement->prefetch_lob_size = (ub4) prefetch_lob_size; + RETURN_TRUE; +} +/* }}} */ + /* {{{ Sets the client identifier attribute on the connection */ PHP_FUNCTION(oci_set_client_identifier) { diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 5ee04a6168e9e..4db6337dbcd79 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -117,6 +117,12 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char php_oci_statement_set_prefetch(statement, (ub4)100); /* semi-arbitrary, "sensible default" */ } + if (OCI_G(prefetch_lob_size) > 0) { + statement->prefetch_lob_size = (ub4)OCI_G(prefetch_lob_size); + } else { + statement->prefetch_lob_size = 0; + } + PHP_OCI_REGISTER_RESOURCE(statement, le_statement); OCI_G(num_statements)++; @@ -173,6 +179,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement) GC_ADDREF(statement2->connection->id); php_oci_statement_set_prefetch(statement2, statement->prefetch_count); + statement2->prefetch_lob_size = statement->prefetch_lob_size; PHP_OCI_REGISTER_RESOURCE(statement2, le_statement); @@ -186,7 +193,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement) /* {{{ php_oci_statement_set_prefetch() Set prefetch buffer size for the statement */ -int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch ) +int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch) { sword errstatus; @@ -820,18 +827,30 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode) return 1; } + /* Enable LOB data prefetching */ + if ((outcol->data_type == SQLT_CLOB || outcol->data_type == SQLT_BLOB) && statement->prefetch_lob_size > 0) { + int get_lob_len = 1; /* == true */ + + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &get_lob_len, 0, OCI_ATTR_LOBPREFETCH_LENGTH, statement->err)); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } + + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &(statement->prefetch_lob_size), 0, OCI_ATTR_LOBPREFETCH_SIZE, statement->err)); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } + } + /* additional define setup */ switch (outcol->data_type) { + case SQLT_RSET: case SQLT_BLOB: case SQLT_CLOB: - if (OCI_G(prefetch_lob_size) > 0) { - int get_lob_len = 1; /* == true */ - ub4 prefetch_size = OCI_G(prefetch_lob_size); - PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &get_lob_len, 0, OCI_ATTR_LOBPREFETCH_LENGTH, statement->err)); - PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &prefetch_size, 0, OCI_ATTR_LOBPREFETCH_SIZE, statement->err)); - } - ZEND_FALLTHROUGH; - case SQLT_RSET: case SQLT_RDD: case SQLT_BFILE: PHP_OCI_CALL_RETURN(errstatus, diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 25de0a9867d40..61bb1ad76416c 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -10,7 +10,9 @@ http://pear.php.net/dtd/package-2.0.xsd"> The OCI8 extension lets you access Oracle Database. -Use 'pecl install oci8' to install for PHP 8. +Use 'pecl install oci8' to install for PHP 8.1. + +Use 'pecl install oci8-3.0.1' to install for PHP 8.0. Use 'pecl install oci8-2.2.0' to install for PHP 7. @@ -53,7 +55,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin no - 2021-11-15 + 2021-12-11 @@ -66,9 +68,9 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin PHP - This version is for PHP 8 only. + This version is for PHP 8.1 only. - Added oci8.prefetch_lob_size directive to improve LOB query performance. + Added oci8.prefetch_lob_size directive and oci_set_prefetch_lob() function to improve LOB query performance. @@ -373,6 +375,8 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin + + @@ -435,7 +439,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin - 8.0.0 + 8.1.0 1.4.0b1 diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index b2e5f88c26b87..dec9172f5c5e4 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -235,7 +235,8 @@ typedef struct { unsigned has_data:1; /* statement has more data flag */ unsigned has_descr:1; /* statement has at least one descriptor or cursor column */ ub2 stmttype; /* statement type */ - ub4 prefetch_count; /* current prefetch count */ + ub4 prefetch_count; /* row prefetch count */ + ub4 prefetch_lob_size; /* LOB prefetch size */ } php_oci_statement; /* }}} */ diff --git a/ext/oci8/tests/lob_prefetch.phpt b/ext/oci8/tests/lob_prefetch.phpt index 0fbdb1603300a..94a85585a8e8a 100755 --- a/ext/oci8/tests/lob_prefetch.phpt +++ b/ext/oci8/tests/lob_prefetch.phpt @@ -13,14 +13,14 @@ require(__DIR__.'/skipif.inc'); require __DIR__.'/connect.inc'; require __DIR__.'/create_table.inc'; -define("NUMROWS", 500); +define("NUMROWS", 200); define("LOBSIZE", 64000); $ora_sql = "declare c clob; b blob; - numrows number := 500; + numrows number := " . NUMROWS . "; dest_offset integer := 1; src_offset integer := 1; warn integer; @@ -44,8 +44,10 @@ $statement = oci_parse($c,$ora_sql); oci_execute($statement); -function get_clob_loc($c, $sql) { +function get_clob_loc($c, $sql, $pfl) { $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); oci_execute($stid); $l = []; while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { @@ -56,8 +58,10 @@ function get_clob_loc($c, $sql) { return($l); } -function get_clob_inline($c, $sql) { +function get_clob_inline($c, $sql, $pfl) { $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); oci_execute($stid); $l = []; while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) != false) { @@ -81,8 +85,10 @@ function check_clobs($locarr, $inlinearr) { } } -function get_blob_loc($c, $sql) { +function get_blob_loc($c, $sql, $pfl) { $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); oci_execute($stid); $l = []; while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { @@ -94,22 +100,28 @@ function get_blob_loc($c, $sql) { } -print("Test 1\n"); +print("Test 1 - Default prefetch_lob_size\n"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); +$r = ini_get("oci8.prefetch_lob_size"); +var_dump($r); -$ig = ini_set("oci8.prefetch_lob_size", "100000"); -var_dump($ig); +print("Test 2\n"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); +$s = oci_parse($c, 'select * from dual'); +$r = oci_set_prefetch_lob($s, 0); +var_dump($r); -print("Test 2 - CLOB prefetch_lob_size 100000\n"); +try { + oci_set_prefetch_lob($s, -1); +} catch (ValueError $e) { + echo $e->getMessage(), "\n"; +} + +print("Test 3 - CLOB prefetch_lob_size 100000\n"); $sql = "select clob from ${schema}${table_name}" . " order by id"; -$locarr = get_clob_loc($c, $sql); -$inlinearr = get_clob_inline($c, $sql); +$locarr = get_clob_loc($c, $sql, 100000); +$inlinearr = get_clob_inline($c, $sql, 100000); print(count($locarr) . "\n"); print(count($inlinearr) . "\n"); @@ -117,12 +129,8 @@ check_clobs($locarr, $inlinearr); print("Test 3 - CLOB prefetch_lob_size 100\n"); -ini_set("oci8.prefetch_lob_size", "100"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); - -$locarr = get_clob_loc($c, $sql); -$inlinearr = get_clob_inline($c, $sql); +$locarr = get_clob_loc($c, $sql, 100); +$inlinearr = get_clob_inline($c, $sql, 100); print(count($locarr) . "\n"); print(count($inlinearr) . "\n"); @@ -130,12 +138,8 @@ check_clobs($locarr, $inlinearr); print("Test 4 - BLOB prefetch_lob_size 100000\n"); -ini_set("oci8.prefetch_lob_size", "100000"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); - $sql = "select blob from ${schema}${table_name}" . " order by id"; -$locarr = get_blob_loc($c, $sql); +$locarr = get_blob_loc($c, $sql, 100000); print(count($locarr) . "\n"); @@ -144,20 +148,19 @@ require __DIR__.'/drop_table.inc'; ?> DONE --EXPECTF-- -Test 1 -string(1) "0" +Test 1 - Default prefetch_lob_size string(1) "0" -string(6) "100000" -Test 2 - CLOB prefetch_lob_size 100000 -500 -500 +Test 2 +bool(true) +oci_set_prefetch_lob(): Argument #2 ($prefetch_lob_size) must be greater than or equal to 0 +Test 3 - CLOB prefetch_lob_size 100000 +200 +200 Comparing CLOBS Test 3 - CLOB prefetch_lob_size 100 -string(3) "100" -500 -500 +200 +200 Comparing CLOBS Test 4 - BLOB prefetch_lob_size 100000 -string(6) "100000" -500 +200 DONE diff --git a/ext/oci8/tests/lob_prefetch_ini.phpt b/ext/oci8/tests/lob_prefetch_ini.phpt new file mode 100755 index 0000000000000..2142a8e0ece01 --- /dev/null +++ b/ext/oci8/tests/lob_prefetch_ini.phpt @@ -0,0 +1,165 @@ +--TEST-- +LOB prefetching with oci8. +--EXTENSIONS-- +oci8 +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(__DIR__.'/skipif.inc'); +?> +--INI-- +oci8.prefetch_lob_size=100000 +--FILE-- += 0) + oci_set_prefetch_lob($stid, $pfl); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { + $l[] = $row['CLOB']->load(); + $row['CLOB']->free(); + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + +function get_clob_inline($c, $sql, $pfl) { + $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) != false) { + $l[] = $row['CLOB']; + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + +function check_clobs($locarr, $inlinearr) { + print("Comparing CLOBS\n"); + for ($i = 0; $i < NUMROWS; ++$i) { + if (strlen($locarr[$i]) != LOBSIZE) { + trigger_error("size mismatch at $i " . strlen($locarr[$i]), E_USER_ERROR); + exit; + } + if (strcmp($locarr[$i], $inlinearr[$i])) { + trigger_error("data mismatch at $i " . strlen($locarr[$i]) . " " . strlen($inlinearr[$i]), E_USER_ERROR); + exit; + } + } +} + +function get_blob_loc($c, $sql, $pfl) { + $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { + $l[] = $row['BLOB']->load(); + $row['BLOB']->free(); + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + + +print("Test 1 - prefetch_lob_size\n"); + +$r = ini_get("oci8.prefetch_lob_size"); +var_dump($r); + +print("Test 2 - CLOB with current oci8.prefetch_lob_size\n"); + +$sql = "select clob from ${schema}${table_name}" . " order by id"; +$locarr = get_clob_loc($c, $sql, -1); +$inlinearr = get_clob_inline($c, $sql, -1); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 3 - CLOB override prefetch_lob_size 0\n"); + +$locarr = get_clob_loc($c, $sql, 0); +$inlinearr = get_clob_inline($c, $sql, 0); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 4 - CLOB override prefetch_lob_size 1000\n"); + +$locarr = get_clob_loc($c, $sql, 1000); +$inlinearr = get_clob_inline($c, $sql, 1000); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 5 - BLOB with current ocig8.prefetch_lob_size \n"); + +$sql = "select blob from ${schema}${table_name}" . " order by id"; +$locarr = get_blob_loc($c, $sql, -1); + +print(count($locarr) . "\n"); + +require __DIR__.'/drop_table.inc'; + +?> +DONE +--EXPECTF-- +Test 1 - prefetch_lob_size +string(6) "100000" +Test 2 - CLOB with current oci8.prefetch_lob_size +200 +200 +Comparing CLOBS +Test 3 - CLOB override prefetch_lob_size 0 +200 +200 +Comparing CLOBS +Test 4 - CLOB override prefetch_lob_size 1000 +200 +200 +Comparing CLOBS +Test 5 - BLOB with current ocig8.prefetch_lob_size +200 +DONE diff --git a/php.ini-production b/php.ini-production index e25092e688f59..89a198db395a6 100644 --- a/php.ini-production +++ b/php.ini-production @@ -1273,7 +1273,7 @@ mysqlnd.collect_memory_statistics = Off ; https://php.net/oci8.statement-cache-size ;oci8.statement_cache_size = 20 -; Tuning: Enables statement prefetching and sets the default number of +; Tuning: Enables row prefetching and sets the default number of ; rows that will be fetched automatically after statement execution. ; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100 From e7f3bc95068996dd7f8e7af8a9992f01e321b66a Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sat, 11 Dec 2021 20:49:31 +0000 Subject: [PATCH 0276/1346] Fix pcntl_forkx condition in stub (#7755) --- ext/pcntl/pcntl.stub.php | 4 ++-- ext/pcntl/pcntl_arginfo.h | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/ext/pcntl/pcntl.stub.php b/ext/pcntl/pcntl.stub.php index d668b4d06627a..d89854256e1b6 100644 --- a/ext/pcntl/pcntl.stub.php +++ b/ext/pcntl/pcntl.stub.php @@ -83,7 +83,7 @@ function pcntl_unshare(int $flags): bool {} #ifdef HAVE_RFORK function pcntl_rfork(int $flags, int $signal = 0): int{} #endif -# -#ifdef HAVE_RFORK + +#ifdef HAVE_FORKX function pcntl_forkx(int $flags): int{} #endif diff --git a/ext/pcntl/pcntl_arginfo.h b/ext/pcntl/pcntl_arginfo.h index 4caaff2bcffcb..91147e70ea9da 100644 --- a/ext/pcntl/pcntl_arginfo.h +++ b/ext/pcntl/pcntl_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: fb7d243e0a1b5e85e0bfc0b2add5145cee134b25 */ + * Stub hash: e9f831c37e960f9b0db7561faefe61d49dd7df21 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_fork, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -125,9 +125,9 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_rfork, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, signal, IS_LONG, 0, "0") ZEND_END_ARG_INFO() #endif - + #if defined(HAVE_FORKX) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_forkx, 0, 0, IS_LONG, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_forkx, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 0) ZEND_END_ARG_INFO() #endif @@ -174,6 +174,9 @@ ZEND_FUNCTION(pcntl_unshare); #if defined(HAVE_RFORK) ZEND_FUNCTION(pcntl_rfork); #endif +#if defined(HAVE_FORKX) +ZEND_FUNCTION(pcntl_forkx); +#endif static const zend_function_entry ext_functions[] = { @@ -218,6 +221,9 @@ static const zend_function_entry ext_functions[] = { #endif #if defined(HAVE_RFORK) ZEND_FE(pcntl_rfork, arginfo_pcntl_rfork) +#endif +#if defined(HAVE_FORKX) + ZEND_FE(pcntl_forkx, arginfo_pcntl_forkx) #endif ZEND_FE_END }; From 93f6af691348fbc0486c05666dfe08de93455e70 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Sun, 12 Dec 2021 13:32:34 +1100 Subject: [PATCH 0277/1346] It's past time to drop linking support for Oracle Client 10g --- UPGRADING | 3 ++ ext/oci8/config.m4 | 9 +++- ext/oci8/oci8.c | 86 +++------------------------------ ext/oci8/oci8_interface.c | 34 ++++--------- ext/oci8/oci8_statement.c | 15 ++---- ext/oci8/package.xml | 69 ++++++++++++++++---------- ext/oci8/php_oci8.h | 3 +- ext/oci8/php_oci8_int.h | 4 ++ ext/oci8/tests/driver_name.phpt | 6 +-- 9 files changed, 83 insertions(+), 146 deletions(-) diff --git a/UPGRADING b/UPGRADING index 0e4dfc42b690a..8b016ba30255b 100644 --- a/UPGRADING +++ b/UPGRADING @@ -118,6 +118,9 @@ PHP 8.2 UPGRADE NOTES 9. Other Changes to Extensions ======================================== +- OCI8: + . The minimum Oracle Client library version required is now 11.2. + - Zip: . extension updated to 1.20.0 with new methods: ZipArchive::clearError, getStreamName and getStreamIndex diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 09eae79692cbe..714c655be439d 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -340,8 +340,8 @@ if test "$PHP_OCI8" != "no"; then AC_OCI8_ORACLE_VERSION($OCI8_DIR) case $OCI8_ORACLE_VERSION in - 7.3|8.0|8.1|9.0) - AC_MSG_ERROR([Oracle client libraries < 10 are not supported]) + 7.3|8.0|8.1|9.0|10.1) + AC_MSG_ERROR([Oracle Client libraries < 11.2 are not supported]) ;; esac @@ -413,6 +413,11 @@ if test "$PHP_OCI8" != "no"; then fi AC_OCI8IC_VERSION($PHP_OCI8_INSTANT_CLIENT) + case $OCI8_ORACLE_VERSION in + 10.1) + AC_MSG_ERROR([Oracle Client libraries < 11.2 are not supported]) + ;; + esac PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD) PHP_ADD_LIBPATH($PHP_OCI8_INSTANT_CLIENT, OCI8_SHARED_LIBADD) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 38dcfc42f35df..b574138c28bab 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -36,7 +36,8 @@ #ifdef HAVE_OCI8 /* Note to maintainers: config.m4 should/does check the minimum PHP version so - * the below checks are obsolete - but are kept 'just in case' */ + * the below checks are obsolete - but are kept 'just in case'. Also bump the + * minimum version in package.xml, as appropriate. */ /* PHP 5.2 is the minimum supported version for OCI8 2.0 */ #if PHP_MAJOR_VERSION < 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION <= 1) @@ -173,12 +174,8 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY( "oci8.statement_cache_size", "20", PHP_INI_SYSTEM, OnUpdateLong, statement_cache_size, zend_oci_globals, oci_globals) STD_PHP_INI_ENTRY( "oci8.default_prefetch", "100", PHP_INI_SYSTEM, OnUpdateLong, default_prefetch, zend_oci_globals, oci_globals) STD_PHP_INI_BOOLEAN("oci8.old_oci_close_semantics", "0", PHP_INI_SYSTEM, OnUpdateOldCloseSemantics, old_oci_close_semantics,zend_oci_globals, oci_globals) -#if (OCI_MAJOR_VERSION >= 11) STD_PHP_INI_ENTRY( "oci8.connection_class", "", PHP_INI_ALL, OnUpdateString, connection_class, zend_oci_globals, oci_globals) -#endif -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) STD_PHP_INI_BOOLEAN("oci8.events", "0", PHP_INI_SYSTEM, OnUpdateBool, events, zend_oci_globals, oci_globals) -#endif STD_PHP_INI_ENTRY( "oci8.prefetch_lob_size", "0", PHP_INI_SYSTEM, OnUpdateLong, prefetch_lob_size, zend_oci_globals, oci_globals) PHP_INI_END() /* }}} */ @@ -216,23 +213,7 @@ static void php_oci_init_global_handles(void) errstatus = OCIHandleAlloc (OCI_G(env), (dvoid **)&OCI_G(err), OCI_HTYPE_ERROR, 0, NULL); - if (errstatus == OCI_SUCCESS) { -#if !defined(OCI_MAJOR_VERSION) || (OCI_MAJOR_VERSION < 11) - /* This fixes PECL bug 15988 (sqlnet.ora not being read). The - * root cause was fixed in Oracle 10.2.0.4 but there is no - * compile time method to check for that precise patch level, - * nor can it be guaranteed that runtime will use the same - * patch level the code was compiled with. So, we do this - * code for all non 11g versions. - */ - OCICPool *cpoolh; - ub4 cpoolmode = 0x80000000; /* Pass invalid mode to OCIConnectionPoolCreate */ - PHP_OCI_CALL(OCIHandleAlloc, (OCI_G(env), (dvoid **) &cpoolh, OCI_HTYPE_CPOOL, (size_t) 0, (dvoid **) 0)); - PHP_OCI_CALL(OCIConnectionPoolCreate, (OCI_G(env), OCI_G(err), cpoolh, NULL, 0, NULL, 0, 0, 0, 0, NULL, 0, NULL, 0, cpoolmode)); - PHP_OCI_CALL(OCIConnectionPoolDestroy, (cpoolh, OCI_G(err), OCI_DEFAULT)); - PHP_OCI_CALL(OCIHandleFree, (cpoolh, OCI_HTYPE_CPOOL)); -#endif - } else { + if (errstatus != OCI_SUCCESS) { OCIErrorGet(OCI_G(env), (ub4)1, NULL, &ora_error_code, tmp_buf, (ub4)PHP_OCI_ERRBUF_LEN, (ub4)OCI_HTYPE_ERROR); if (ora_error_code) { @@ -348,11 +329,9 @@ PHP_MINIT_FUNCTION(oci) REGISTER_LONG_CONSTANT("SQLT_LBI",SQLT_LBI, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQLT_BIN",SQLT_BIN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQLT_ODT",SQLT_ODT, CONST_CS | CONST_PERSISTENT); -#if defined(HAVE_OCI_INSTANT_CLIENT) || (defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 10) REGISTER_LONG_CONSTANT("SQLT_BDOUBLE",SQLT_BDOUBLE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQLT_BFLOAT",SQLT_BFLOAT, CONST_CS | CONST_PERSISTENT); -#endif -#if defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 12 +#if OCI_MAJOR_VERSION >= 12 REGISTER_LONG_CONSTANT("SQLT_BOL",SQLT_BOL, CONST_CS | CONST_PERSISTENT); #endif @@ -369,7 +348,7 @@ PHP_MINIT_FUNCTION(oci) REGISTER_LONG_CONSTANT("OCI_B_BIN",SQLT_BIN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_B_INT",SQLT_INT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OCI_B_NUM",SQLT_NUM, CONST_CS | CONST_PERSISTENT); -#if defined(OCI_MAJOR_VERSION) && OCI_MAJOR_VERSION >= 12 +#if OCI_MAJOR_VERSION >= 12 REGISTER_LONG_CONSTANT("OCI_B_BOL",SQLT_BOL, CONST_CS | CONST_PERSISTENT); #endif @@ -450,9 +429,7 @@ PHP_RSHUTDOWN_FUNCTION(oci) PHP_MINFO_FUNCTION(oci) { char buf[32]; -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) char ver[256]; -#endif php_info_print_table_start(); php_info_print_table_row(2, "OCI8 Support", "enabled"); @@ -463,19 +440,9 @@ PHP_MINFO_FUNCTION(oci) #endif php_info_print_table_row(2, "OCI8 Version", PHP_OCI8_VERSION); -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) php_oci_client_get_version(ver, sizeof(ver)); php_info_print_table_row(2, "Oracle Run-time Client Library Version", ver); -#else - php_info_print_table_row(2, "Oracle Run-time Client Library Version", "Unknown"); -#endif -#if defined(OCI_MAJOR_VERSION) && defined(OCI_MINOR_VERSION) snprintf(buf, sizeof(buf), "%d.%d", OCI_MAJOR_VERSION, OCI_MINOR_VERSION); -#elif defined(PHP_OCI8_ORACLE_VERSION) - snprintf(buf, sizeof(buf), "%s", PHP_OCI8_ORACLE_VERSION); -#else - snprintf(buf, sizeof(buf), "Unknown"); -#endif #if defined(HAVE_OCI_INSTANT_CLIENT) php_info_print_table_row(2, "Oracle Compile-time Instant Client Version", buf); #else @@ -1342,23 +1309,14 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char static int php_oci_connection_ping(php_oci_connection *connection) { sword errstatus; -#if (!((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))) - char version[256]; -#endif OCI_G(errcode) = 0; /* assume ping is successful */ - /* Use OCIPing instead of OCIServerVersion. If OCIPing returns ORA-1010 (invalid OCI operation) - * such as from Pre-10.1 servers, the error is still from the server and we would have - * successfully performed a roundtrip and validated the connection. Use OCIServerVersion for - * Pre-10.2 clients + /* If OCIPing returns ORA-1010 (invalid OCI operation) such as from + * pre-10.1 servers, the error is still from the server and we would have + * successfully performed a roundtrip and validated the connection. */ -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIPing available 10.2 onwards */ PHP_OCI_CALL_RETURN(errstatus, OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); -#else - /* use good old OCIServerVersion() */ - PHP_OCI_CALL_RETURN(errstatus, OCIServerVersion, (connection->svc, OCI_G(err), (text *)version, sizeof(version), OCI_HTYPE_SVCCTX)); -#endif if (errstatus == OCI_SUCCESS) { return 1; @@ -1583,16 +1541,6 @@ int php_oci_connection_release(php_oci_connection *connection) rlsMode |= OCI_SESSRLS_DROPSESS; } - /* Sessions for non-persistent connections should be dropped. For 11 and above, the session - * pool has its own mechanism for doing so for purity NEW connections. We need to do so - * explicitly for 10.2 and earlier. - */ -#if (!(OCI_MAJOR_VERSION >= 11)) - if (!connection->is_persistent) { - rlsMode |= OCI_SESSRLS_DROPSESS; - } -#endif - if (connection->svc) { PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL, 0, rlsMode)); @@ -1654,7 +1602,6 @@ int php_oci_password_change(php_oci_connection *connection, char *user, int user */ void php_oci_client_get_version(char *version, size_t version_size) { -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIClientVersion only available 10.2 onwards */ sword major_version = 0; sword minor_version = 0; sword update_num = 0; @@ -1663,9 +1610,6 @@ void php_oci_client_get_version(char *version, size_t version_size) PHP_OCI_CALL(OCIClientVersion, (&major_version, &minor_version, &update_num, &patch_num, &port_update_num)); snprintf(version, version_size, "%d.%d.%d.%d.%d", major_version, minor_version, update_num, patch_num, port_update_num); -#else - memcpy(version, "Unknown", sizeof("Unknown")); -#endif } /* }}} */ @@ -2050,13 +1994,8 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha } /* Disable RLB as we mostly have single-connection pools */ -#if (OCI_MAJOR_VERSION > 10) poolmode = OCI_SPC_NO_RLB | OCI_SPC_HOMOGENEOUS; -#else - poolmode = OCI_SPC_HOMOGENEOUS; -#endif -#if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) /* {{{ Allocate auth handle for session pool */ PHP_OCI_CALL_RETURN(errstatus, OCIHandleAlloc, (session_pool->env, (dvoid **)&(spoolAuth), OCI_HTYPE_AUTHINFO, 0, NULL)); @@ -2098,7 +2037,6 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha goto exit_create_spool; } /* }}} */ -#endif /* Create the homogeneous session pool - We have different session pools for every different * username, password, charset and dbname. @@ -2327,7 +2265,6 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna /* }}} */ /* {{{ Set the edition attribute on the session handle */ -#if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) if (OCI_G(edition)) { PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(edition), (ub4) (strlen(OCI_G(edition))), (ub4) OCI_ATTR_EDITION, OCI_G(err))); @@ -2336,18 +2273,15 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna return 1; } } -#endif /* }}} */ /* {{{ Set the driver name attribute on the session handle */ -#if (OCI_MAJOR_VERSION >= 11) PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->session, (ub4) OCI_HTYPE_SESSION, (dvoid *) PHP_OCI8_DRIVER_NAME, (ub4) sizeof(PHP_OCI8_DRIVER_NAME)-1, (ub4) OCI_ATTR_DRIVER_NAME, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode)); return 1; } -#endif /* }}} */ /* {{{ Set the server handle in the service handle */ @@ -2435,9 +2369,7 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna static int php_oci_create_session(php_oci_connection *connection, php_oci_spool *session_pool, char *dbname, int dbname_len, char *username, int username_len, char *password, int password_len, char *new_password, int new_password_len, int session_mode) { php_oci_spool *actual_spool = NULL; -#if (OCI_MAJOR_VERSION > 10) ub4 purity = -2; /* Illegal value to initialize */ -#endif time_t timestamp = time(NULL); ub4 statement_cache_size = 0; @@ -2493,7 +2425,6 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool } /* Set the Connection class and purity if OCI client version >= 11g */ -#if (OCI_MAJOR_VERSION > 10) PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(connection_class), (ub4)(strlen(OCI_G(connection_class))), (ub4)OCI_ATTR_CONNECTION_CLASS, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { @@ -2512,7 +2443,6 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool php_oci_error(OCI_G(err), OCI_G(errcode)); return 1; } -#endif } /* }}} */ diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index d277e0441d346..2b1117dd6515f 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1637,14 +1637,17 @@ PHP_FUNCTION(oci_set_prefetch) PHP_FUNCTION(oci_set_prefetch_lob) { zval *z_statement; - php_oci_statement *statement; zend_long prefetch_lob_size; +#if (OCI_MAJOR_VERSION > 12 || (OCI_MAJOR_VERSION == 12 && OCI_MINOR_VERSION >= 2)) + php_oci_statement *statement; +#endif ZEND_PARSE_PARAMETERS_START(2, 2) Z_PARAM_RESOURCE(z_statement) Z_PARAM_LONG(prefetch_lob_size) ZEND_PARSE_PARAMETERS_END(); +#if (OCI_MAJOR_VERSION > 12 || (OCI_MAJOR_VERSION == 12 && OCI_MINOR_VERSION >= 2)) PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); if (prefetch_lob_size < 0) { @@ -1654,6 +1657,12 @@ PHP_FUNCTION(oci_set_prefetch_lob) statement->prefetch_lob_size = (ub4) prefetch_lob_size; RETURN_TRUE; +#else + /* Although the LOB prefetch feature was available in some earlier Oracle + * version, I don't consider it stable until 12.2 */ + php_error_docref(NULL, E_NOTICE, "Unsupported with this version of Oracle Client"); + RETURN_FALSE; +#endif } /* }}} */ @@ -1718,7 +1727,6 @@ PHP_FUNCTION(oci_set_edition) Z_PARAM_STRING(edition, edition_len) ZEND_PARSE_PARAMETERS_END(); -#if ((OCI_MAJOR_VERSION > 11) || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION >= 2))) if (OCI_G(edition)) { efree(OCI_G(edition)); } @@ -1732,10 +1740,6 @@ PHP_FUNCTION(oci_set_edition) } RETURN_TRUE; -#else - php_error_docref(NULL, E_NOTICE, "Unsupported attribute type"); - RETURN_FALSE; -#endif } /* }}} */ @@ -1751,8 +1755,6 @@ PHP_FUNCTION(oci_set_module_name) Z_PARAM_STRING(module, module_len) ZEND_PARSE_PARAMETERS_END(); -#if (OCI_MAJOR_VERSION >= 10) - php_oci_connection *connection; sword errstatus; @@ -1766,10 +1768,6 @@ PHP_FUNCTION(oci_set_module_name) } RETURN_TRUE; -#else - php_error_docref(NULL, E_NOTICE, "Unsupported attribute type"); - RETURN_FALSE; -#endif } /* }}} */ @@ -1785,8 +1783,6 @@ PHP_FUNCTION(oci_set_action) Z_PARAM_STRING(action, action_len) ZEND_PARSE_PARAMETERS_END(); -#if (OCI_MAJOR_VERSION >= 10) - php_oci_connection *connection; sword errstatus; @@ -1800,10 +1796,6 @@ PHP_FUNCTION(oci_set_action) } RETURN_TRUE; -#else - php_error_docref(NULL, E_NOTICE, "Unsupported attribute type"); - RETURN_FALSE; -#endif } /* }}} */ @@ -1819,8 +1811,6 @@ PHP_FUNCTION(oci_set_client_info) Z_PARAM_STRING(client_info, client_info_len) ZEND_PARSE_PARAMETERS_END(); -#if (OCI_MAJOR_VERSION >= 10) - php_oci_connection *connection; sword errstatus; @@ -1834,10 +1824,6 @@ PHP_FUNCTION(oci_set_client_info) } RETURN_TRUE; -#else - php_error_docref(NULL, E_NOTICE, "Unsupported attribute type"); - RETURN_FALSE; -#endif } /* }}} */ diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 4db6337dbcd79..ca7ef1c8cd50f 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -36,8 +36,7 @@ #include "php_oci8.h" #include "php_oci8_int.h" -#if defined(OCI_MAJOR_VERSION) && (OCI_MAJOR_VERSION > 10) && \ - (defined(__x86_64__) || defined(__LP64__) || defined(_LP64) || defined(_WIN64)) +#if defined(__x86_64__) || defined(__LP64__) || defined(_LP64) || defined(_WIN64) typedef ub8 oci_phpsized_int; #else typedef ub4 oci_phpsized_int; @@ -267,11 +266,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows) zend_hash_apply(statement->columns, php_oci_cleanup_pre_fetch); } -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) PHP_OCI_CALL_RETURN(errstatus, OCIStmtFetch2, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, 0, OCI_DEFAULT)); -#else - PHP_OCI_CALL_RETURN(errstatus, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); -#endif if (errstatus == OCI_NO_DATA || nrows == 0) { if (statement->last_query == NULL) { @@ -347,11 +342,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows) } } -#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) PHP_OCI_CALL_RETURN(errstatus, OCIStmtFetch2, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, 0, OCI_DEFAULT)); -#else - PHP_OCI_CALL_RETURN(errstatus, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); -#endif if (piecewisecols) { for (i = 0; i < statement->ncolumns; i++) { @@ -827,7 +818,8 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode) return 1; } - /* Enable LOB data prefetching */ + /* Enable LOB data prefetching. */ +#if (OCI_MAJOR_VERSION > 12 || (OCI_MAJOR_VERSION == 12 && OCI_MINOR_VERSION >= 2)) if ((outcol->data_type == SQLT_CLOB || outcol->data_type == SQLT_BLOB) && statement->prefetch_lob_size > 0) { int get_lob_len = 1; /* == true */ @@ -845,6 +837,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode) return 1; } } +#endif /* additional define setup */ switch (outcol->data_type) { diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 61bb1ad76416c..f5ba6005b61c3 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -20,9 +20,9 @@ Use 'pecl install oci8-2.0.12' to install for PHP 5.2 - PHP 5.6. Use 'pecl install oci8-1.4.10' to install for PHP 4.3.9 - PHP 5.1. -The OCI8 extension can be linked with Oracle client libraries from Oracle Database 10.2 or later. These libraries are found in your database installation, or in the free Oracle Instant Client from https://www.oracle.com/database/technologies/instant-client.html. +The current OCI8 extension can be linked with Oracle Client libraries from Oracle Database 11.2 or later. (OCI8 3.0 and earlier can be linked with 10g or later). The Oracle Client libraries are in the free Oracle Instant Client from https://www.oracle.com/database/technologies/instant-client.html. They are also included in your database installation. -Oracle's standard cross-version connectivity applies. For example, PHP OCI8 linked with Instant Client 19c can connect to Oracle Database 11.2 onward. See Oracle's note "Oracle Client / Server Interoperability Support" (ID 207303.1) for details. +Oracle's standard cross-version connectivity applies. For example, PHP OCI8 linked with Oracle Client 19c can connect to Oracle Database 11.2 onward. See Oracle's note "Oracle Client / Server Interoperability Support" (ID 207303.1) for details. Christopher Jones @@ -55,12 +55,12 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin no - 2021-12-11 + 2021-12-12 - 3.2.0 - 3.2.0 + 3.2.1 + 3.2.1 stable @@ -70,7 +70,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin This version is for PHP 8.1 only. - Added oci8.prefetch_lob_size directive and oci_set_prefetch_lob() function to improve LOB query performance. + Requires Oracle Client libraries from 11.2 or later. @@ -454,8 +454,8 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin - 3.1.0 - 3.1.0 + 3.2.0 + 3.2.0 stable @@ -463,16 +463,16 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin PHP - This version is for PHP 8 only. + This version is for PHP 8.1 only. - Deprecated directive oci8.old_oci_close_semantics + Added oci8.prefetch_lob_size directive and oci_set_prefetch_lob() function to improve LOB query performance. - + - 3.0.1 - 3.0.1 + 3.1.0 + 3.1.0 stable @@ -480,16 +480,16 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin PHP - This version is for PHP 8 only. + This version is for PHP 8.0 only. - Updated Windows build environment to build with newer Oracle Client libraries. (cmb) + Deprecated directive oci8.old_oci_close_semantics - + - 2.2.0 - 2.2.0 + 3.0.1 + 3.0.1 stable @@ -497,15 +497,12 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin PHP -This version is for PHP 7 only. -Added oci_set_call_timeout() for call timeouts. (Requires Oracle client libraries 18c or later) -Added oci_set_db_operation() for the Oracle Database 'DBOP' end-to-end-tracing attribute. (Requires Oracle 12.2 or later) -Fixed bug #76804 (oci_pconnect with OCI_CRED_EXT not working). (KoenigsKind) -Fixed installation on PHP 7.3. -Internal change: Convert some parameter parsing to the Fast Parameter Parsing API. + This version is for PHP 8.0 only. + + Updated Windows build environment to build with newer Oracle Client libraries. (cmb) - + 3.0.0 @@ -517,7 +514,7 @@ Internal change: Convert some parameter parsing to the Fast Parameter Parsing AP PHP - This version is for PHP 8 only. + This version is for PHP 8.0 only. Deprecated old OCI8 function aliases. (Jens de Nies) @@ -531,6 +528,26 @@ Internal change: Convert some parameter parsing to the Fast Parameter Parsing AP + + + 2.2.0 + 2.2.0 + + + stable + stable + + PHP + +This version is for PHP 7 only. +Added oci_set_call_timeout() for call timeouts. (Requires Oracle client libraries 18c or later) +Added oci_set_db_operation() for the Oracle Database 'DBOP' end-to-end-tracing attribute. (Requires Oracle 12.2 or later) +Fixed bug #76804 (oci_pconnect with OCI_CRED_EXT not working). (KoenigsKind) +Fixed installation on PHP 7.3. +Internal change: Convert some parameter parsing to the Fast Parameter Parsing API. + + + 2.1.8 diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index e447600441655..5ed8c7bbe72c5 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -31,7 +31,6 @@ # include "TSRM.h" #endif - /* * The version of the OCI8 extension. */ @@ -41,7 +40,7 @@ */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "3.2.0" +#define PHP_OCI8_VERSION "3.2.1" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index dec9172f5c5e4..9b34fc922cbb9 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -55,6 +55,10 @@ #include "ext/standard/php_string.h" #include +#if !defined(OCI_MAJOR_VERSION) || OCI_MAJOR_VERSION < 11 || ((OCI_MAJOR_VERSION == 11) && (OCI_MINOR_VERSION < 2)) +#error This version of PHP OCI8 requires Oracle Client libraries from 11.2 or later. +#endif + extern int le_connection; extern int le_pconnection; extern int le_statement; diff --git a/ext/oci8/tests/driver_name.phpt b/ext/oci8/tests/driver_name.phpt index 0b32c4bd1f6be..80b4740bc140b 100644 --- a/ext/oci8/tests/driver_name.phpt +++ b/ext/oci8/tests/driver_name.phpt @@ -57,11 +57,11 @@ function get_attr($conn) ?> --EXPECT-- **Test 1.1 - Default values for the attribute ************** -The value of DRIVER_NAME is PHP OCI8 : 3.2.0 +The value of DRIVER_NAME is PHP OCI8 : 3.2.1 ***Test 1.2 - Get the values from different connections ************** Testing with oci_pconnect() -The value of DRIVER_NAME is PHP OCI8 : 3.2.0 +The value of DRIVER_NAME is PHP OCI8 : 3.2.1 Testing with oci_new_connect() -The value of DRIVER_NAME is PHP OCI8 : 3.2.0 +The value of DRIVER_NAME is PHP OCI8 : 3.2.1 Done From 1d54097435bc09a287cb50b6e166eccba19f2925 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sun, 12 Dec 2021 22:45:46 +0100 Subject: [PATCH 0278/1346] Fix oci8 Oracle Client paths on Windows This is a copy & paste relict, but we don't fix it for the stable branches, since some may rely on these paths now (unlikely, but still possible). --- ext/oci8/config.w32 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index 5f0da8f33d2d8..1c94c1578995c 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -164,8 +164,8 @@ if (PHP_OCI8_19 != "no") { oci8_19_inc_paths += oci8_19_dirs[i] + "\\include;"; } - oci8_19_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_12;" - oci8_19_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_12;"; + oci8_19_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient_19;" + oci8_19_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient_19;"; if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8_19", oci8_19_inc_paths) && CHECK_LIB("oci.lib", "oci8_19", oci8_19_lib_paths)) From f583c4dfd222142b043949c6a3399f87cd8a2d47 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 14 Dec 2021 17:09:59 +0300 Subject: [PATCH 0279/1346] Use 64-bit multiplication on 64-bit systems --- Zend/zend_string.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 0236bad20cf21..19cd926eff7be 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -429,25 +429,25 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size ((chunk >> (8 * 7)) & 0xff); # else hash = - hash * 33 * 33 * 33 * 33 + - str[0] * 33 * 33 * 33 + - str[1] * 33 * 33 + - str[2] * 33 + + hash * Z_L(33 * 33 * 33 * 33) + + str[0] * Z_L(33 * 33 * 33) + + str[1] * Z_L(33 * 33) + + str[2] * Z_L(33) + str[3]; hash = - hash * 33 * 33 * 33 * 33 + - str[4] * 33 * 33 * 33 + - str[5] * 33 * 33 + - str[6] * 33 + + hash * Z_L(33 * 33 * 33 * 33) + + str[4] * Z_L(33 * 33 * 33) + + str[5] * Z_L(33 * 33) + + str[6] * Z_L(33) + str[7]; # endif } if (len >= 4) { hash = - hash * 33 * 33 * 33 * 33 + - str[0] * 33 * 33 * 33 + - str[1] * 33 * 33 + - str[2] * 33 + + hash * Z_L(33 * 33 * 33 * 33) + + str[0] * Z_L(33 * 33 * 33) + + str[1] * Z_L(33 * 33) + + str[2] * Z_L(33) + str[3]; len -= 4; str += 4; @@ -455,18 +455,18 @@ static zend_always_inline zend_ulong zend_inline_hash_func(const char *str, size if (len >= 2) { if (len > 2) { hash = - hash * 33 * 33 * 33 + - str[0] * 33 * 33 + - str[1] * 33 + + hash * Z_L(33 * 33 * 33) + + str[0] * Z_L(33 * 33) + + str[1] * Z_L(33) + str[2]; } else { hash = - hash * 33 * 33 + - str[0] * 33 + + hash * Z_L(33 * 33) + + str[0] * Z_L(33) + str[1]; } } else if (len != 0) { - hash = hash * 33 + *str; + hash = hash * Z_L(33) + *str; } #else /* variant with the hash unrolled eight times */ From 8eee0d6130c778d9e9d638ac2fbe53dfe5bed38e Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Thu, 16 Dec 2021 00:38:35 +1100 Subject: [PATCH 0280/1346] Make strtolower() and strtoupper() do ASCII case conversion (#7506) Implement RFC https://wiki.php.net/rfc/strtolower-ascii --- UPGRADING | 8 + Zend/tests/lc_ctype_inheritance.phpt | 25 +- Zend/zend_operators.c | 8 +- ext/pdo_dblib/dblib_stmt.c | 1 - ext/standard/string.c | 122 ++----- ext/standard/tests/strings/bug79986.phpt | 13 - .../tests/strings/strtolower-win32.phpt | 340 ----------------- ext/standard/tests/strings/strtolower.phpt | 151 +++++++- ext/standard/tests/strings/strtoupper.phpt | 20 - .../tests/strings/strtoupper1-win32.phpt | 342 ------------------ ext/standard/tests/strings/strtoupper1.phpt | 152 ++++++-- ext/xml/xml.c | 1 - 12 files changed, 318 insertions(+), 865 deletions(-) delete mode 100644 ext/standard/tests/strings/bug79986.phpt delete mode 100644 ext/standard/tests/strings/strtolower-win32.phpt delete mode 100644 ext/standard/tests/strings/strtoupper.phpt delete mode 100644 ext/standard/tests/strings/strtoupper1-win32.phpt diff --git a/UPGRADING b/UPGRADING index 8b016ba30255b..ccc211f5b508a 100644 --- a/UPGRADING +++ b/UPGRADING @@ -19,6 +19,14 @@ PHP 8.2 UPGRADE NOTES 1. Backward Incompatible Changes ======================================== +- Standard: + . strtolower() and strtoupper() are no longer locale-sensitive. They now + perform ASCII case conversion, as if the locale were "C". Use + mb_strtolower() if you want localized case conversion. Similarly, stristr, + stripos, strripos, lcfirst, ucfirst, ucwords, str_ireplace, + array_change_key_case and sorting with SORT_FLAG_CASE use ASCII case + conversion. + ======================================== 2. New Features ======================================== diff --git a/Zend/tests/lc_ctype_inheritance.phpt b/Zend/tests/lc_ctype_inheritance.phpt index 8c968f0615e6e..bcfd4ff463d75 100644 --- a/Zend/tests/lc_ctype_inheritance.phpt +++ b/Zend/tests/lc_ctype_inheritance.phpt @@ -9,17 +9,30 @@ LC_CTYPE=de_DE --FILE-- --EXPECTF-- +inherited +ctype_lower(\xe4): n +preg_match(\w, \xe4): int(0) string(%d) "C%r(\.UTF-8)?%r" -string(2) "e4" -int(0) +ctype_lower(\xe4): n +preg_match(\w, \xe4): int(0) +de_DE bool(true) -string(2) "c4" -int(1) +ctype_lower(\xe4): y +preg_match(\w, \xe4): int(1) diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index ca93f48603f58..de3664f5c653f 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -126,9 +126,9 @@ ZEND_API const unsigned char zend_toupper_map[256] = { * Functions using locale lowercase: zend_binary_strncasecmp_l zend_binary_strcasecmp_l + * Functions using ascii lowercase: string_compare_function_ex string_case_compare_function - * Functions using ascii lowercase: zend_str_tolower_copy zend_str_tolower_dup zend_str_tolower @@ -1997,7 +1997,7 @@ ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, bool int ret; if (case_insensitive) { - ret = zend_binary_strcasecmp_l(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str1)); + ret = zend_binary_strcasecmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str1)); } else { ret = zend_binary_strcmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2)); } @@ -2037,13 +2037,13 @@ ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /* if (Z_STR_P(op1) == Z_STR_P(op2)) { return 0; } else { - return zend_binary_strcasecmp_l(Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2)); + return zend_binary_strcasecmp(Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2)); } } else { zend_string *tmp_str1, *tmp_str2; zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1); zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2); - int ret = zend_binary_strcasecmp_l(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str1)); + int ret = zend_binary_strcasecmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str1)); zend_tmp_string_release(tmp_str1); zend_tmp_string_release(tmp_str2); diff --git a/ext/pdo_dblib/dblib_stmt.c b/ext/pdo_dblib/dblib_stmt.c index f415a8d7f44be..2a946c81dc242 100644 --- a/ext/pdo_dblib/dblib_stmt.c +++ b/ext/pdo_dblib/dblib_stmt.c @@ -21,7 +21,6 @@ #include "php.h" #include "php_ini.h" -#include "ext/standard/php_string.h" #include "ext/standard/info.h" #include "pdo/php_pdo.h" #include "pdo/php_pdo_driver.h" diff --git a/ext/standard/string.c b/ext/standard/string.c index c7c4e193ec378..7c2dce4595b0f 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1346,16 +1346,7 @@ PHP_FUNCTION(strtok) /* {{{ php_strtoupper */ PHPAPI char *php_strtoupper(char *s, size_t len) { - unsigned char *c; - const unsigned char *e; - - c = (unsigned char *)s; - e = (unsigned char *)c+len; - - while (c < e) { - *c = toupper(*c); - c++; - } + zend_str_toupper(s, len); return s; } /* }}} */ @@ -1363,35 +1354,7 @@ PHPAPI char *php_strtoupper(char *s, size_t len) /* {{{ php_string_toupper */ PHPAPI zend_string *php_string_toupper(zend_string *s) { - unsigned char *c; - const unsigned char *e; - - if (EXPECTED(!BG(ctype_string))) { - return zend_string_toupper(s); - } - c = (unsigned char *)ZSTR_VAL(s); - e = c + ZSTR_LEN(s); - - while (c < e) { - if (islower(*c)) { - unsigned char *r; - zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0); - - if (c != (unsigned char*)ZSTR_VAL(s)) { - memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s)); - } - r = c + (ZSTR_VAL(res) - ZSTR_VAL(s)); - while (c < e) { - *r = toupper(*c); - r++; - c++; - } - *r = '\0'; - return res; - } - c++; - } - return zend_string_copy(s); + return zend_string_toupper(s); } /* }}} */ @@ -1404,23 +1367,14 @@ PHP_FUNCTION(strtoupper) Z_PARAM_STR(arg) ZEND_PARSE_PARAMETERS_END(); - RETURN_STR(php_string_toupper(arg)); + RETURN_STR(zend_string_toupper(arg)); } /* }}} */ /* {{{ php_strtolower */ PHPAPI char *php_strtolower(char *s, size_t len) { - unsigned char *c; - const unsigned char *e; - - c = (unsigned char *)s; - e = c+len; - - while (c < e) { - *c = tolower(*c); - c++; - } + zend_str_tolower(s, len); return s; } /* }}} */ @@ -1428,32 +1382,7 @@ PHPAPI char *php_strtolower(char *s, size_t len) /* {{{ php_string_tolower */ PHPAPI zend_string *php_string_tolower(zend_string *s) { - if (EXPECTED(!BG(ctype_string))) { - return zend_string_tolower(s); - } - - unsigned char *c = (unsigned char *)ZSTR_VAL(s); - const unsigned char *e = c + ZSTR_LEN(s); - while (c < e) { - if (isupper(*c)) { - unsigned char *r; - zend_string *res = zend_string_alloc(ZSTR_LEN(s), 0); - - if (c != (unsigned char*)ZSTR_VAL(s)) { - memcpy(ZSTR_VAL(res), ZSTR_VAL(s), c - (unsigned char*)ZSTR_VAL(s)); - } - r = c + (ZSTR_VAL(res) - ZSTR_VAL(s)); - while (c < e) { - *r = tolower(*c); - r++; - c++; - } - *r = '\0'; - return res; - } - c++; - } - return zend_string_copy(s); + return zend_string_tolower(s); } /* }}} */ @@ -1466,7 +1395,7 @@ PHP_FUNCTION(strtolower) Z_PARAM_STR(str) ZEND_PARSE_PARAMETERS_END(); - RETURN_STR(php_string_tolower(str)); + RETURN_STR(zend_string_tolower(str)); } /* }}} */ @@ -1758,8 +1687,8 @@ PHP_FUNCTION(pathinfo) case insensitive strstr */ PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len) { - php_strtolower(s, s_len); - php_strtolower(t, t_len); + zend_str_tolower(s, s_len); + zend_str_tolower(t, t_len); return (char*)php_memnstr(s, t, t_len, s + s_len); } /* }}} */ @@ -1982,8 +1911,8 @@ PHP_FUNCTION(stripos) RETURN_FALSE; } - haystack_dup = php_string_tolower(haystack); - needle_dup = php_string_tolower(needle); + haystack_dup = zend_string_tolower(haystack); + needle_dup = zend_string_tolower(needle); found = (char*)php_memnstr(ZSTR_VAL(haystack_dup) + offset, ZSTR_VAL(needle_dup), ZSTR_LEN(needle_dup), ZSTR_VAL(haystack_dup) + ZSTR_LEN(haystack)); @@ -2077,10 +2006,9 @@ PHP_FUNCTION(strripos) } e = ZSTR_VAL(haystack) + (ZSTR_LEN(haystack) + (size_t)offset); } - /* Borrow that ord_needle buffer to avoid repeatedly tolower()ing needle */ - lowered = tolower(*ZSTR_VAL(needle)); + lowered = zend_tolower_ascii(*ZSTR_VAL(needle)); while (e >= p) { - if (tolower(*e) == lowered) { + if (zend_tolower_ascii(*e) == lowered) { RETURN_LONG(e - p + (offset > 0 ? offset : 0)); } e--; @@ -2088,7 +2016,7 @@ PHP_FUNCTION(strripos) RETURN_FALSE; } - haystack_dup = php_string_tolower(haystack); + haystack_dup = zend_string_tolower(haystack); if (offset >= 0) { if ((size_t)offset > ZSTR_LEN(haystack)) { zend_string_release_ex(haystack_dup, 0); @@ -2112,7 +2040,7 @@ PHP_FUNCTION(strripos) } } - needle_dup = php_string_tolower(needle); + needle_dup = zend_string_tolower(needle); if ((found = (char *)zend_memnrstr(p, ZSTR_VAL(needle_dup), ZSTR_LEN(needle_dup), e))) { RETVAL_LONG(found - ZSTR_VAL(haystack_dup)); zend_string_release_ex(needle_dup, 0); @@ -2647,7 +2575,7 @@ PHP_FUNCTION(chr) static zend_string* php_ucfirst(zend_string *str) { const unsigned char ch = ZSTR_VAL(str)[0]; - unsigned char r = toupper(ch); + unsigned char r = zend_toupper_ascii(ch); if (r == ch) { return zend_string_copy(str); } else { @@ -2679,7 +2607,7 @@ PHP_FUNCTION(ucfirst) Lowercase the first character of the word in a native string */ static zend_string* php_lcfirst(zend_string *str) { - unsigned char r = tolower(ZSTR_VAL(str)[0]); + unsigned char r = zend_tolower_ascii(ZSTR_VAL(str)[0]); if (r == ZSTR_VAL(str)[0]) { return zend_string_copy(str); } else { @@ -2732,10 +2660,10 @@ PHP_FUNCTION(ucwords) ZVAL_STRINGL(return_value, ZSTR_VAL(str), ZSTR_LEN(str)); r = Z_STRVAL_P(return_value); - *r = toupper((unsigned char) *r); + *r = zend_toupper_ascii((unsigned char) *r); for (r_end = r + Z_STRLEN_P(return_value) - 1; r < r_end; ) { if (mask[(unsigned char)*r++]) { - *r = toupper((unsigned char) *r); + *r = zend_toupper_ascii((unsigned char) *r); } } } @@ -3067,11 +2995,11 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si if (case_sensitivity) { char_count = count_chars(ZSTR_VAL(str), ZSTR_LEN(str), from); } else { - lc_from = tolower(from); char_count = 0; + lc_from = zend_tolower_ascii(from); source_end = ZSTR_VAL(str) + ZSTR_LEN(str); for (source = ZSTR_VAL(str); source < source_end; source++) { - if (tolower(*source) == lc_from) { + if (zend_tolower_ascii(*source) == lc_from) { char_count++; } } @@ -3111,7 +3039,7 @@ static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, si } else { source_end = ZSTR_VAL(str) + ZSTR_LEN(str); for (source = ZSTR_VAL(str); source < source_end; source++) { - if (tolower(*source) == lc_from) { + if (zend_tolower_ascii(*source) == lc_from) { memcpy(target, to, to_len); target += to_len; } else { @@ -4345,7 +4273,7 @@ static zend_long php_str_replace_in_subject( zend_long old_replace_count = replace_count; if (!lc_subject_str) { - lc_subject_str = php_string_tolower(subject_str); + lc_subject_str = zend_string_tolower(subject_str); } tmp_result = php_str_to_str_i_ex(subject_str, ZSTR_VAL(lc_subject_str), search_str, replace_value, replace_len, &replace_count); @@ -4398,7 +4326,7 @@ static zend_long php_str_replace_in_subject( ZSTR_VAL(search_str), ZSTR_LEN(search_str), ZSTR_VAL(replace_str), ZSTR_LEN(replace_str), &replace_count)); } else { - lc_subject_str = php_string_tolower(subject_str); + lc_subject_str = zend_string_tolower(subject_str); ZVAL_STR(result, php_str_to_str_i_ex(subject_str, ZSTR_VAL(lc_subject_str), search_str, ZSTR_VAL(replace_str), ZSTR_LEN(replace_str), &replace_count)); zend_string_release_ex(lc_subject_str, 0); @@ -4941,7 +4869,7 @@ int php_tag_find(char *tag, size_t len, const char *set) { n = norm; t = tag; - c = tolower(*t); + c = zend_tolower_ascii(*t); /* normalize the tag removing leading and trailing whitespace and turn any into just and any @@ -4969,7 +4897,7 @@ int php_tag_find(char *tag, size_t len, const char *set) { } break; } - c = tolower(*(++t)); + c = zend_tolower_ascii(*(++t)); } *(n++) = '>'; *n = '\0'; diff --git a/ext/standard/tests/strings/bug79986.phpt b/ext/standard/tests/strings/bug79986.phpt deleted file mode 100644 index fcbc72148c242..0000000000000 --- a/ext/standard/tests/strings/bug79986.phpt +++ /dev/null @@ -1,13 +0,0 @@ ---TEST-- -Bug #79986 (str_ireplace bug with diacritics characters) ---SKIPIF-- - ---FILE-- - ---EXPECT-- -11 22 33 diff --git a/ext/standard/tests/strings/strtolower-win32.phpt b/ext/standard/tests/strings/strtolower-win32.phpt deleted file mode 100644 index 516248346cf01..0000000000000 --- a/ext/standard/tests/strings/strtolower-win32.phpt +++ /dev/null @@ -1,340 +0,0 @@ ---TEST-- -Test strtolower() function ---SKIPIF-- - ---FILE-- - ".(bin2hex(strtolower("$char")))."\n"; -} - -echo "*** Testing strlower() with basic strings ***\n"; -$str = "Mary Had A liTTle LAmb and ShE loveD IT So\n"; -var_dump(strtolower($str)); - -echo "\n*** Testing strtolower() with various strings ***"; -/* strings to pass strtolower() */ -$strings = array ( - "", - "string", - "stRINg0234", - "1.233.344StrinG12333", - "$$$$$$!!!!@@@@@@@ ABCDEF !!!***", - "ABCD\0abcdABCD", - TRUE, - FALSE, -); - -$count = 0; -/* loop through to check possible variations */ -foreach ($strings as $string) { - echo "\n-- Iteration $count --\n"; - var_dump( strtolower($string) ); - $count++; -} - -echo "\n*** Testing strtolower() with two different case strings ***\n"; -if (strtolower("HeLLo woRLd") === strtolower("hEllo WORLD")) - echo "strings are same, with Case Insensitive\n"; -else - echo "strings are not same\n"; - -echo "*** Done ***"; -?> ---EXPECTF-- -*** Testing strtolower() with all 256 chars *** -00 => 00 -01 => 01 -02 => 02 -03 => 03 -04 => 04 -05 => 05 -06 => 06 -07 => 07 -08 => 08 -09 => 09 -0a => 0a -0b => 0b -0c => 0c -0d => 0d -0e => 0e -0f => 0f -10 => 10 -11 => 11 -12 => 12 -13 => 13 -14 => 14 -15 => 15 -16 => 16 -17 => 17 -18 => 18 -19 => 19 -1a => 1a -1b => 1b -1c => 1c -1d => 1d -1e => 1e -1f => 1f -20 => 20 -21 => 21 -22 => 22 -23 => 23 -24 => 24 -25 => 25 -26 => 26 -27 => 27 -28 => 28 -29 => 29 -2a => 2a -2b => 2b -2c => 2c -2d => 2d -2e => 2e -2f => 2f -30 => 30 -31 => 31 -32 => 32 -33 => 33 -34 => 34 -35 => 35 -36 => 36 -37 => 37 -38 => 38 -39 => 39 -3a => 3a -3b => 3b -3c => 3c -3d => 3d -3e => 3e -3f => 3f -40 => 40 -41 => 61 -42 => 62 -43 => 63 -44 => 64 -45 => 65 -46 => 66 -47 => 67 -48 => 68 -49 => 69 -4a => 6a -4b => 6b -4c => 6c -4d => 6d -4e => 6e -4f => 6f -50 => 70 -51 => 71 -52 => 72 -53 => 73 -54 => 74 -55 => 75 -56 => 76 -57 => 77 -58 => 78 -59 => 79 -5a => 7a -5b => 5b -5c => 5c -5d => 5d -5e => 5e -5f => 5f -60 => 60 -61 => 61 -62 => 62 -63 => 63 -64 => 64 -65 => 65 -66 => 66 -67 => 67 -68 => 68 -69 => 69 -6a => 6a -6b => 6b -6c => 6c -6d => 6d -6e => 6e -6f => 6f -70 => 70 -71 => 71 -72 => 72 -73 => 73 -74 => 74 -75 => 75 -76 => 76 -77 => 77 -78 => 78 -79 => 79 -7a => 7a -7b => 7b -7c => 7c -7d => 7d -7e => 7e -7f => 7f -80 => 80 -81 => 81 -82 => 82 -83 => 83 -84 => 84 -85 => 85 -86 => 86 -87 => 87 -88 => 88 -89 => 89 -8a => 9a -8b => 8b -8c => 9c -8d => 8d -8e => 9e -8f => 8f -90 => 90 -91 => 91 -92 => 92 -93 => 93 -94 => 94 -95 => 95 -96 => 96 -97 => 97 -98 => 98 -99 => 99 -9a => 9a -9b => 9b -9c => 9c -9d => 9d -9e => 9e -9f => ff -a0 => a0 -a1 => a1 -a2 => a2 -a3 => a3 -a4 => a4 -a5 => a5 -a6 => a6 -a7 => a7 -a8 => a8 -a9 => a9 -aa => aa -ab => ab -ac => ac -ad => ad -ae => ae -af => af -b0 => b0 -b1 => b1 -b2 => b2 -b3 => b3 -b4 => b4 -b5 => b5 -b6 => b6 -b7 => b7 -b8 => b8 -b9 => b9 -ba => ba -bb => bb -bc => bc -bd => bd -be => be -bf => bf -c0 => e0 -c1 => e1 -c2 => e2 -c3 => e3 -c4 => e4 -c5 => e5 -c6 => e6 -c7 => e7 -c8 => e8 -c9 => e9 -ca => ea -cb => eb -cc => ec -cd => ed -ce => ee -cf => ef -d0 => f0 -d1 => f1 -d2 => f2 -d3 => f3 -d4 => f4 -d5 => f5 -d6 => f6 -d7 => d7 -d8 => f8 -d9 => f9 -da => fa -db => fb -dc => fc -dd => fd -de => fe -df => df -e0 => e0 -e1 => e1 -e2 => e2 -e3 => e3 -e4 => e4 -e5 => e5 -e6 => e6 -e7 => e7 -e8 => e8 -e9 => e9 -ea => ea -eb => eb -ec => ec -ed => ed -ee => ee -ef => ef -f0 => f0 -f1 => f1 -f2 => f2 -f3 => f3 -f4 => f4 -f5 => f5 -f6 => f6 -f7 => f7 -f8 => f8 -f9 => f9 -fa => fa -fb => fb -fc => fc -fd => fd -fe => fe -ff => ff -*** Testing strlower() with basic strings *** -string(43) "mary had a little lamb and she loved it so -" - -*** Testing strtolower() with various strings *** --- Iteration 0 -- -string(0) "" - --- Iteration 1 -- -string(6) "string" - --- Iteration 2 -- -string(10) "string0234" - --- Iteration 3 -- -string(20) "1.233.344string12333" - --- Iteration 4 -- -string(31) "$$$$$$!!!!@@@@@@@ abcdef !!!***" - --- Iteration 5 -- -string(13) "abcd%0abcdabcd" - --- Iteration 6 -- -string(1) "1" - --- Iteration 7 -- -string(0) "" - -*** Testing strtolower() with two different case strings *** -strings are same, with Case Insensitive -*** Done *** diff --git a/ext/standard/tests/strings/strtolower.phpt b/ext/standard/tests/strings/strtolower.phpt index 37a38493ce114..6052ccd840d50 100644 --- a/ext/standard/tests/strings/strtolower.phpt +++ b/ext/standard/tests/strings/strtolower.phpt @@ -1,27 +1,10 @@ --TEST-- Test strtolower() function ---SKIPIF-- - --FILE-- ".(bin2hex(strtolower("$char")))."\n"; } @@ -66,7 +49,7 @@ else echo "*** Done ***"; ?> --EXPECTF-- -*** Testing strtolower() with 128 chars *** +*** Testing strtolower() with 256 chars *** 00 => 00 01 => 01 02 => 02 @@ -195,6 +178,134 @@ echo "*** Done ***"; 7d => 7d 7e => 7e 7f => 7f +80 => 80 +81 => 81 +82 => 82 +83 => 83 +84 => 84 +85 => 85 +86 => 86 +87 => 87 +88 => 88 +89 => 89 +8a => 8a +8b => 8b +8c => 8c +8d => 8d +8e => 8e +8f => 8f +90 => 90 +91 => 91 +92 => 92 +93 => 93 +94 => 94 +95 => 95 +96 => 96 +97 => 97 +98 => 98 +99 => 99 +9a => 9a +9b => 9b +9c => 9c +9d => 9d +9e => 9e +9f => 9f +a0 => a0 +a1 => a1 +a2 => a2 +a3 => a3 +a4 => a4 +a5 => a5 +a6 => a6 +a7 => a7 +a8 => a8 +a9 => a9 +aa => aa +ab => ab +ac => ac +ad => ad +ae => ae +af => af +b0 => b0 +b1 => b1 +b2 => b2 +b3 => b3 +b4 => b4 +b5 => b5 +b6 => b6 +b7 => b7 +b8 => b8 +b9 => b9 +ba => ba +bb => bb +bc => bc +bd => bd +be => be +bf => bf +c0 => c0 +c1 => c1 +c2 => c2 +c3 => c3 +c4 => c4 +c5 => c5 +c6 => c6 +c7 => c7 +c8 => c8 +c9 => c9 +ca => ca +cb => cb +cc => cc +cd => cd +ce => ce +cf => cf +d0 => d0 +d1 => d1 +d2 => d2 +d3 => d3 +d4 => d4 +d5 => d5 +d6 => d6 +d7 => d7 +d8 => d8 +d9 => d9 +da => da +db => db +dc => dc +dd => dd +de => de +df => df +e0 => e0 +e1 => e1 +e2 => e2 +e3 => e3 +e4 => e4 +e5 => e5 +e6 => e6 +e7 => e7 +e8 => e8 +e9 => e9 +ea => ea +eb => eb +ec => ec +ed => ed +ee => ee +ef => ef +f0 => f0 +f1 => f1 +f2 => f2 +f3 => f3 +f4 => f4 +f5 => f5 +f6 => f6 +f7 => f7 +f8 => f8 +f9 => f9 +fa => fa +fb => fb +fc => fc +fd => fd +fe => fe +ff => ff *** Testing strlower() with basic strings *** string(43) "mary had a little lamb and she loved it so " diff --git a/ext/standard/tests/strings/strtoupper.phpt b/ext/standard/tests/strings/strtoupper.phpt deleted file mode 100644 index 41bc5e6080643..0000000000000 --- a/ext/standard/tests/strings/strtoupper.phpt +++ /dev/null @@ -1,20 +0,0 @@ ---TEST-- -Test strtoupper on non-ASCII characters ---SKIPIF-- - ---FILE-- - ---EXPECT-- -��� diff --git a/ext/standard/tests/strings/strtoupper1-win32.phpt b/ext/standard/tests/strings/strtoupper1-win32.phpt deleted file mode 100644 index c9328462cf7a9..0000000000000 --- a/ext/standard/tests/strings/strtoupper1-win32.phpt +++ /dev/null @@ -1,342 +0,0 @@ ---TEST-- -Test strtoupper() function ---SKIPIF-- - ---FILE-- - ".(bin2hex(strtoupper("$char")))."\n"; -} - -echo "\n*** Testing strtoupper() with basic strings ***\n"; -$str = "Mary Had A liTTle LAmb and ShE loveD IT So\n"; -var_dump(strtoupper($str)); - -echo "\n*** Testing strtoupper() with various strings ***"; -/* strings to pass strtoupper() */ -$strings = array ( - "", - "string", - "stRINg0234", - "1.233.344StrinG12333", - "$$$$$$!!!!@@@@@@@ ABCDEF !!!***", - "ABCD\0abcdABCD", - TRUE, - FALSE, -); - -$count = 0; -/* loop through to check possible variations */ -foreach ($strings as $string) { - echo "\n-- Iteration $count --\n"; - var_dump( strtoupper($string) ); - $count++; -} - -echo "\n*** Testing strtoupper() with two different case strings ***\n"; -if (strtoupper("HeLLo woRLd") === strtoupper("hEllo WORLD")) - echo "strings are same, with Case Insensitive\n"; -else - echo "strings are not same\n"; - -echo "*** Done ***"; -?> ---EXPECTF-- -*** Testing strtoupper() with all 256 chars *** -00 => 00 -01 => 01 -02 => 02 -03 => 03 -04 => 04 -05 => 05 -06 => 06 -07 => 07 -08 => 08 -09 => 09 -0a => 0a -0b => 0b -0c => 0c -0d => 0d -0e => 0e -0f => 0f -10 => 10 -11 => 11 -12 => 12 -13 => 13 -14 => 14 -15 => 15 -16 => 16 -17 => 17 -18 => 18 -19 => 19 -1a => 1a -1b => 1b -1c => 1c -1d => 1d -1e => 1e -1f => 1f -20 => 20 -21 => 21 -22 => 22 -23 => 23 -24 => 24 -25 => 25 -26 => 26 -27 => 27 -28 => 28 -29 => 29 -2a => 2a -2b => 2b -2c => 2c -2d => 2d -2e => 2e -2f => 2f -30 => 30 -31 => 31 -32 => 32 -33 => 33 -34 => 34 -35 => 35 -36 => 36 -37 => 37 -38 => 38 -39 => 39 -3a => 3a -3b => 3b -3c => 3c -3d => 3d -3e => 3e -3f => 3f -40 => 40 -41 => 41 -42 => 42 -43 => 43 -44 => 44 -45 => 45 -46 => 46 -47 => 47 -48 => 48 -49 => 49 -4a => 4a -4b => 4b -4c => 4c -4d => 4d -4e => 4e -4f => 4f -50 => 50 -51 => 51 -52 => 52 -53 => 53 -54 => 54 -55 => 55 -56 => 56 -57 => 57 -58 => 58 -59 => 59 -5a => 5a -5b => 5b -5c => 5c -5d => 5d -5e => 5e -5f => 5f -60 => 60 -61 => 41 -62 => 42 -63 => 43 -64 => 44 -65 => 45 -66 => 46 -67 => 47 -68 => 48 -69 => 49 -6a => 4a -6b => 4b -6c => 4c -6d => 4d -6e => 4e -6f => 4f -70 => 50 -71 => 51 -72 => 52 -73 => 53 -74 => 54 -75 => 55 -76 => 56 -77 => 57 -78 => 58 -79 => 59 -7a => 5a -7b => 7b -7c => 7c -7d => 7d -7e => 7e -7f => 7f -80 => 80 -81 => 81 -82 => 82 -83 => 83 -84 => 84 -85 => 85 -86 => 86 -87 => 87 -88 => 88 -89 => 89 -8a => 8a -8b => 8b -8c => 8c -8d => 8d -8e => 8e -8f => 8f -90 => 90 -91 => 91 -92 => 92 -93 => 93 -94 => 94 -95 => 95 -96 => 96 -97 => 97 -98 => 98 -99 => 99 -9a => 8a -9b => 9b -9c => 8c -9d => 9d -9e => 8e -9f => 9f -a0 => a0 -a1 => a1 -a2 => a2 -a3 => a3 -a4 => a4 -a5 => a5 -a6 => a6 -a7 => a7 -a8 => a8 -a9 => a9 -aa => aa -ab => ab -ac => ac -ad => ad -ae => ae -af => af -b0 => b0 -b1 => b1 -b2 => b2 -b3 => b3 -b4 => b4 -b5 => b5 -b6 => b6 -b7 => b7 -b8 => b8 -b9 => b9 -ba => ba -bb => bb -bc => bc -bd => bd -be => be -bf => bf -c0 => c0 -c1 => c1 -c2 => c2 -c3 => c3 -c4 => c4 -c5 => c5 -c6 => c6 -c7 => c7 -c8 => c8 -c9 => c9 -ca => ca -cb => cb -cc => cc -cd => cd -ce => ce -cf => cf -d0 => d0 -d1 => d1 -d2 => d2 -d3 => d3 -d4 => d4 -d5 => d5 -d6 => d6 -d7 => d7 -d8 => d8 -d9 => d9 -da => da -db => db -dc => dc -dd => dd -de => de -df => df -e0 => c0 -e1 => c1 -e2 => c2 -e3 => c3 -e4 => c4 -e5 => c5 -e6 => c6 -e7 => c7 -e8 => c8 -e9 => c9 -ea => ca -eb => cb -ec => cc -ed => cd -ee => ce -ef => cf -f0 => d0 -f1 => d1 -f2 => d2 -f3 => d3 -f4 => d4 -f5 => d5 -f6 => d6 -f7 => f7 -f8 => d8 -f9 => d9 -fa => da -fb => db -fc => dc -fd => dd -fe => de -ff => 9f - -*** Testing strtoupper() with basic strings *** -string(43) "MARY HAD A LITTLE LAMB AND SHE LOVED IT SO -" - -*** Testing strtoupper() with various strings *** --- Iteration 0 -- -string(0) "" - --- Iteration 1 -- -string(6) "STRING" - --- Iteration 2 -- -string(10) "STRING0234" - --- Iteration 3 -- -string(20) "1.233.344STRING12333" - --- Iteration 4 -- -string(31) "$$$$$$!!!!@@@@@@@ ABCDEF !!!***" - --- Iteration 5 -- -string(13) "ABCD%0ABCDABCD" - --- Iteration 6 -- -string(1) "1" - --- Iteration 7 -- -string(0) "" - -*** Testing strtoupper() with two different case strings *** -strings are same, with Case Insensitive -*** Done *** diff --git a/ext/standard/tests/strings/strtoupper1.phpt b/ext/standard/tests/strings/strtoupper1.phpt index 7b79f6f457be9..abda0b9d38b28 100644 --- a/ext/standard/tests/strings/strtoupper1.phpt +++ b/ext/standard/tests/strings/strtoupper1.phpt @@ -1,27 +1,9 @@ --TEST-- Test strtoupper() function ---SKIPIF-- - --FILE-- ".(bin2hex(strtoupper("$char")))."\n"; } @@ -65,7 +47,7 @@ else echo "*** Done ***"; ?> --EXPECTF-- -*** Testing strtoupper() with 128 chars *** +*** Testing strtoupper() with 256 chars *** 00 => 00 01 => 01 02 => 02 @@ -194,6 +176,134 @@ echo "*** Done ***"; 7d => 7d 7e => 7e 7f => 7f +80 => 80 +81 => 81 +82 => 82 +83 => 83 +84 => 84 +85 => 85 +86 => 86 +87 => 87 +88 => 88 +89 => 89 +8a => 8a +8b => 8b +8c => 8c +8d => 8d +8e => 8e +8f => 8f +90 => 90 +91 => 91 +92 => 92 +93 => 93 +94 => 94 +95 => 95 +96 => 96 +97 => 97 +98 => 98 +99 => 99 +9a => 9a +9b => 9b +9c => 9c +9d => 9d +9e => 9e +9f => 9f +a0 => a0 +a1 => a1 +a2 => a2 +a3 => a3 +a4 => a4 +a5 => a5 +a6 => a6 +a7 => a7 +a8 => a8 +a9 => a9 +aa => aa +ab => ab +ac => ac +ad => ad +ae => ae +af => af +b0 => b0 +b1 => b1 +b2 => b2 +b3 => b3 +b4 => b4 +b5 => b5 +b6 => b6 +b7 => b7 +b8 => b8 +b9 => b9 +ba => ba +bb => bb +bc => bc +bd => bd +be => be +bf => bf +c0 => c0 +c1 => c1 +c2 => c2 +c3 => c3 +c4 => c4 +c5 => c5 +c6 => c6 +c7 => c7 +c8 => c8 +c9 => c9 +ca => ca +cb => cb +cc => cc +cd => cd +ce => ce +cf => cf +d0 => d0 +d1 => d1 +d2 => d2 +d3 => d3 +d4 => d4 +d5 => d5 +d6 => d6 +d7 => d7 +d8 => d8 +d9 => d9 +da => da +db => db +dc => dc +dd => dd +de => de +df => df +e0 => e0 +e1 => e1 +e2 => e2 +e3 => e3 +e4 => e4 +e5 => e5 +e6 => e6 +e7 => e7 +e8 => e8 +e9 => e9 +ea => ea +eb => eb +ec => ec +ed => ed +ee => ee +ef => ef +f0 => f0 +f1 => f1 +f2 => f2 +f3 => f3 +f4 => f4 +f5 => f5 +f6 => f6 +f7 => f7 +f8 => f8 +f9 => f9 +fa => fa +fb => fb +fc => fc +fd => fd +fe => fe +ff => ff *** Testing strtoupper() with basic strings *** string(43) "MARY HAD A LITTLE LAMB AND SHE LOVED IT SO diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 5c73837c385a1..be69940545cda 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -23,7 +23,6 @@ #include "php.h" #include "zend_variables.h" -#include "ext/standard/php_string.h" #include "ext/standard/info.h" #include "ext/standard/html.h" From 38460c2c94a0d4b110060951a1a56575226adbfc Mon Sep 17 00:00:00 2001 From: Yannis Guyon Date: Wed, 15 Dec 2021 20:00:24 +0100 Subject: [PATCH 0281/1346] Implement php_handle_avif() using libavifinfo See #80828 and the internals@ mailing list discussion at https://externals.io/message/116543 Use libavifinfo's AvifInfoGetFeaturesStream() in php_handle_avif() to get the width, height, bit depth and channel count from an AVIF payload. Implement stream reading/skipping functions and data struct. Use libavifinfo's AvifInfoIdentifyStream() in php_is_image_avif(). Update the expected features read from "test1pix.avif" in getimagesize.phpt. Closes GH-7711. --- NEWS | 1 + README.REDIST.BINS | 3 +- UPGRADING | 5 + ext/standard/config.m4 | 2 +- ext/standard/config.w32 | 1 + ext/standard/image.c | 136 ++-- ext/standard/libavifinfo/LICENSE | 26 + ext/standard/libavifinfo/PATENTS | 107 +++ ext/standard/libavifinfo/README.md | 11 + ext/standard/libavifinfo/avifinfo.c | 745 +++++++++++++++++++++ ext/standard/libavifinfo/avifinfo.h | 92 +++ ext/standard/tests/image/getimagesize.phpt | 12 +- 12 files changed, 1058 insertions(+), 83 deletions(-) create mode 100644 ext/standard/libavifinfo/LICENSE create mode 100644 ext/standard/libavifinfo/PATENTS create mode 100644 ext/standard/libavifinfo/README.md create mode 100644 ext/standard/libavifinfo/avifinfo.c create mode 100644 ext/standard/libavifinfo/avifinfo.h diff --git a/NEWS b/NEWS index 3bdec63ad2290..ab7fa8554ba37 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ PHP NEWS - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) + . Finished AVIF support in getimagesize(). (Yannis Guyon) - Zip: . add ZipArchive::clearError() method diff --git a/README.REDIST.BINS b/README.REDIST.BINS index 64123ab004953..19e6a02b18269 100644 --- a/README.REDIST.BINS +++ b/README.REDIST.BINS @@ -15,6 +15,7 @@ 15. ext/phar/zip.c portion extracted from libzip 16. libbcmath (ext/bcmath) see ext/bcmath/libbcmath/LICENSE 17. ext/mbstring/ucgendat portions based on the ucgendat.c from the OpenLDAP +18. avifinfo (ext/standard/libavifinfo) see ext/standard/libavifinfo/LICENSE 3. pcre2lib (ext/pcre) @@ -591,7 +592,7 @@ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -16. ext/mbstring/ucgendat portions based on the ucgendat.c from the OpenLDAP +17. ext/mbstring/ucgendat portions based on the ucgendat.c from the OpenLDAP The OpenLDAP Public License Version 2.8, 17 August 2003 diff --git a/UPGRADING b/UPGRADING index ccc211f5b508a..86dd792ca484d 100644 --- a/UPGRADING +++ b/UPGRADING @@ -129,6 +129,11 @@ PHP 8.2 UPGRADE NOTES - OCI8: . The minimum Oracle Client library version required is now 11.2. +- Standard: + . getimagesize() now reports the actual image dimensions, bits and channels + of AVIF images. Previously, the dimensions have been reported as 0x0, and + bits and channels have not been reported at all. + - Zip: . extension updated to 1.20.0 with new methods: ZipArchive::clearError, getStreamName and getStreamIndex diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 5299006892797..9ca92c610b9ed 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -460,7 +460,7 @@ PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32. http_fopen_wrapper.c php_fopen_wrapper.c credits.c css.c \ var_unserializer.c ftok.c sha1.c user_filters.c uuencode.c \ filters.c proc_open.c streamsfuncs.c http.c password.c \ - random.c net.c hrtime.c crc32_x86.c,,, + random.c net.c hrtime.c crc32_x86.c libavifinfo/avifinfo.c,,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) PHP_ADD_MAKEFILE_FRAGMENT diff --git a/ext/standard/config.w32 b/ext/standard/config.w32 index 3de43d04c067e..1813210849344 100644 --- a/ext/standard/config.w32 +++ b/ext/standard/config.w32 @@ -37,6 +37,7 @@ EXTENSION("standard", "array.c base64.c basic_functions.c browscap.c \ user_filters.c uuencode.c filters.c proc_open.c password.c \ streamsfuncs.c http.c flock_compat.c random.c hrtime.c", false /* never shared */, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1'); +ADD_SOURCES("ext/standard/libavifinfo", "avifinfo.c", "standard"); PHP_STANDARD = "yes"; ADD_MAKEFILE_FRAGMENT(); PHP_INSTALL_HEADERS("", "ext/standard"); diff --git a/ext/standard/image.c b/ext/standard/image.c index 85ecda2f3d70b..a614521ae1091 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -22,6 +22,7 @@ #endif #include "fopen_wrappers.h" #include "ext/standard/fsock.h" +#include "libavifinfo/avifinfo.h" #if HAVE_UNISTD_H #include #endif @@ -1155,95 +1156,76 @@ static struct gfxinfo *php_handle_webp(php_stream * stream) } /* }}} */ -/* {{{ php_handle_avif - * There's no simple way to get this information - so, for now, this is unsupported. - * Simply return 0 for everything. - */ -static struct gfxinfo *php_handle_avif(php_stream * stream) { - return ecalloc(1, sizeof(struct gfxinfo)); -} -/* }}} */ - -/* {{{ php_ntohl - * Convert a big-endian network uint32 to host order - - * which may be either little-endian or big-endian. - * Thanks to Rob Pike via Joe Drago: - * https://commandcenter.blogspot.nl/2012/04/byte-order-fallacy.html - */ -static uint32_t php_ntohl(uint32_t val) { - uint8_t data[4]; - - memcpy(&data, &val, sizeof(data)); - return ((uint32_t)data[3] << 0) | - ((uint32_t)data[2] << 8) | - ((uint32_t)data[1] << 16) | - ((uint32_t)data[0] << 24); -} -/* }}} */ - -/* {{{ php_is_image_avif - * detect whether an image is of type AVIF - * - * An AVIF image will start off a header "box". - * This starts with with a four-byte integer containing the number of bytes in the filetype box. - * This must be followed by the string "ftyp". - * Next comes a four-byte string indicating the "major brand". - * If that's "avif" or "avis", this is an AVIF image. - * Next, there's a four-byte "minor version" field, which we can ignore. - * Next comes an array of four-byte strings containing "compatible brands". - * These extend to the end of the box. - * If any of the compatible brands is "avif" or "avis", then this is an AVIF image. - * Otherwise, well, it's not. - * For more, see https://mpeg.chiariglione.org/standards/mpeg-4/iso-base-media-file-format/text-isoiec-14496-12-5th-edition - */ -bool php_is_image_avif(php_stream * stream) { - uint32_t header_size_reversed, header_size, i; - char box_type[4], brand[4]; +/* {{{ User struct and stream read/skip implementations for libavifinfo API */ +struct php_avif_stream { + php_stream* stream; + uint8_t buffer[AVIFINFO_MAX_NUM_READ_BYTES]; +}; - ZEND_ASSERT(stream != NULL); +static const uint8_t* php_avif_stream_read(void* stream, size_t num_bytes) { + struct php_avif_stream* avif_stream = (struct php_avif_stream*)stream; - if (php_stream_read(stream, (char *) &header_size_reversed, 4) != 4) { - return 0; + if (avif_stream == NULL || avif_stream->stream == NULL) { + return NULL; } - - header_size = php_ntohl(header_size_reversed); - - /* If the box type isn't "ftyp", it can't be an AVIF image. */ - if (php_stream_read(stream, box_type, 4) != 4) { - return 0; + if (php_stream_read(avif_stream->stream, (char*)avif_stream->buffer, num_bytes) != num_bytes) { + avif_stream->stream = NULL; /* fail further calls */ + return NULL; } + return avif_stream->buffer; +} - if (memcmp(box_type, "ftyp", 4)) { - return 0; - } - - /* If the major brand is "avif" or "avis", it's an AVIF image. */ - if (php_stream_read(stream, brand, 4) != 4) { - return 0; - } +static void php_avif_stream_skip(void* stream, size_t num_bytes) { + struct php_avif_stream* avif_stream = (struct php_avif_stream*)stream; - if (!memcmp(brand, "avif", 4) || !memcmp(brand, "avis", 4)) { - return 1; + if (avif_stream == NULL || avif_stream->stream == NULL) { + return; } - - /* Skip the next four bytes, which are the "minor version". */ - if (php_stream_read(stream, brand, 4) != 4) { - return 0; + if (php_stream_seek(avif_stream->stream, num_bytes, SEEK_CUR)) { + avif_stream->stream = NULL; /* fail further calls */ } +} +/* }}} */ - /* Look for "avif" or "avis" in any member of compatible_brands[], to the end of the header. - Note we've already read four groups of four bytes. */ +/* {{{ php_handle_avif + * Parse AVIF features + * + * The stream must be positioned at the beginning of a box, so it does not + * matter whether the "ftyp" box was already read by php_is_image_avif() or not. + * It will read bytes from the stream until features are found or the file is + * declared as invalid. Around 450 bytes are usually enough. + * Transforms such as mirror and rotation are not applied on width and height. + */ +static struct gfxinfo *php_handle_avif(php_stream * stream) { + struct gfxinfo* result = NULL; + AvifInfoFeatures features; + struct php_avif_stream avif_stream; + avif_stream.stream = stream; + + if (AvifInfoGetFeaturesStream(&avif_stream, php_avif_stream_read, php_avif_stream_skip, &features) == kAvifInfoOk) { + result = (struct gfxinfo*)ecalloc(1, sizeof(struct gfxinfo)); + result->width = features.width; + result->height = features.height; + result->bits = features.bit_depth; + result->channels = features.num_channels; + } + return result; +} +/* }}} */ - for (i = 16; i < header_size; i += 4) { - if (php_stream_read(stream, brand, 4) != 4) { - return 0; - } +/* {{{ php_is_image_avif + * Detect whether an image is of type AVIF + * + * Only the first "ftyp" box is read. + * For a valid file, 12 bytes are usually read, but more might be necessary. + */ +bool php_is_image_avif(php_stream* stream) { + struct php_avif_stream avif_stream; + avif_stream.stream = stream; - if (!memcmp(brand, "avif", 4) || !memcmp(brand, "avis", 4)) { - return 1; - } + if (AvifInfoIdentifyStream(&avif_stream, php_avif_stream_read, php_avif_stream_skip) == kAvifInfoOk) { + return 1; } - return 0; } /* }}} */ diff --git a/ext/standard/libavifinfo/LICENSE b/ext/standard/libavifinfo/LICENSE new file mode 100644 index 0000000000000..330b6b87bb6e8 --- /dev/null +++ b/ext/standard/libavifinfo/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2021, Alliance for Open Media. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/ext/standard/libavifinfo/PATENTS b/ext/standard/libavifinfo/PATENTS new file mode 100644 index 0000000000000..826644b635355 --- /dev/null +++ b/ext/standard/libavifinfo/PATENTS @@ -0,0 +1,107 @@ +Alliance for Open Media Patent License 1.0 + +1. License Terms. + +1.1. Patent License. Subject to the terms and conditions of this License, each + Licensor, on behalf of itself and successors in interest and assigns, + grants Licensee a non-sublicensable, perpetual, worldwide, non-exclusive, + no-charge, royalty-free, irrevocable (except as expressly stated in this + License) patent license to its Necessary Claims to make, use, sell, offer + for sale, import or distribute any Implementation. + +1.2. Conditions. + +1.2.1. Availability. As a condition to the grant of rights to Licensee to make, + sell, offer for sale, import or distribute an Implementation under + Section 1.1, Licensee must make its Necessary Claims available under + this License, and must reproduce this License with any Implementation + as follows: + + a. For distribution in source code, by including this License in the + root directory of the source code with its Implementation. + + b. For distribution in any other form (including binary, object form, + and/or hardware description code (e.g., HDL, RTL, Gate Level Netlist, + GDSII, etc.)), by including this License in the documentation, legal + notices, and/or other written materials provided with the + Implementation. + +1.2.2. Additional Conditions. This license is directly from Licensor to + Licensee. Licensee acknowledges as a condition of benefiting from it + that no rights from Licensor are received from suppliers, distributors, + or otherwise in connection with this License. + +1.3. Defensive Termination. If any Licensee, its Affiliates, or its agents + initiates patent litigation or files, maintains, or voluntarily + participates in a lawsuit against another entity or any person asserting + that any Implementation infringes Necessary Claims, any patent licenses + granted under this License directly to the Licensee are immediately + terminated as of the date of the initiation of action unless 1) that suit + was in response to a corresponding suit regarding an Implementation first + brought against an initiating entity, or 2) that suit was brought to + enforce the terms of this License (including intervention in a third-party + action by a Licensee). + +1.4. Disclaimers. The Reference Implementation and Specification are provided + "AS IS" and without warranty. The entire risk as to implementing or + otherwise using the Reference Implementation or Specification is assumed + by the implementer and user. Licensor expressly disclaims any warranties + (express, implied, or otherwise), including implied warranties of + merchantability, non-infringement, fitness for a particular purpose, or + title, related to the material. IN NO EVENT WILL LICENSOR BE LIABLE TO + ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF + ACTION OF ANY KIND WITH RESPECT TO THIS LICENSE, WHETHER BASED ON BREACH + OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR + NOT THE OTHER PARTRY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +2. Definitions. + +2.1. Affiliate. "Affiliate" means an entity that directly or indirectly + Controls, is Controlled by, or is under common Control of that party. + +2.2. Control. "Control" means direct or indirect control of more than 50% of + the voting power to elect directors of that corporation, or for any other + entity, the power to direct management of such entity. + +2.3. Decoder. "Decoder" means any decoder that conforms fully with all + non-optional portions of the Specification. + +2.4. Encoder. "Encoder" means any encoder that produces a bitstream that can + be decoded by a Decoder only to the extent it produces such a bitstream. + +2.5. Final Deliverable. "Final Deliverable" means the final version of a + deliverable approved by the Alliance for Open Media as a Final + Deliverable. + +2.6. Implementation. "Implementation" means any implementation, including the + Reference Implementation, that is an Encoder and/or a Decoder. An + Implementation also includes components of an Implementation only to the + extent they are used as part of an Implementation. + +2.7. License. "License" means this license. + +2.8. Licensee. "Licensee" means any person or entity who exercises patent + rights granted under this License. + +2.9. Licensor. "Licensor" means (i) any Licensee that makes, sells, offers + for sale, imports or distributes any Implementation, or (ii) a person + or entity that has a licensing obligation to the Implementation as a + result of its membership and/or participation in the Alliance for Open + Media working group that developed the Specification. + +2.10. Necessary Claims. "Necessary Claims" means all claims of patents or + patent applications, (a) that currently or at any time in the future, + are owned or controlled by the Licensor, and (b) (i) would be an + Essential Claim as defined by the W3C Policy as of February 5, 2004 + (https://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential) + as if the Specification was a W3C Recommendation; or (ii) are infringed + by the Reference Implementation. + +2.11. Reference Implementation. "Reference Implementation" means an Encoder + and/or Decoder released by the Alliance for Open Media as a Final + Deliverable. + +2.12. Specification. "Specification" means the specification designated by + the Alliance for Open Media as a Final Deliverable for which this + License was issued. diff --git a/ext/standard/libavifinfo/README.md b/ext/standard/libavifinfo/README.md new file mode 100644 index 0000000000000..a08c29067f4b9 --- /dev/null +++ b/ext/standard/libavifinfo/README.md @@ -0,0 +1,11 @@ +# AVIF-info + +There is no compact, reliable way to determine the size of an AVIF image. A +standalone C snippet called +[libavifinfo](https://aomedia.googlesource.com/libavifinfo) was created to +partially parse an AVIF payload and to extract the width, height, bit depth and +channel count without depending on the full libavif library. + +`avifinfo.h`, `avifinfo.c`, `LICENSE` and `PATENTS` were copied verbatim from: \ +https://aomedia.googlesource.com/libavifinfo/+/96f34d945ac7dac229feddfa94dbae66e202b838 \ +They can easily be kept up-to-date the same way. diff --git a/ext/standard/libavifinfo/avifinfo.c b/ext/standard/libavifinfo/avifinfo.c new file mode 100644 index 0000000000000..5b93d1997be33 --- /dev/null +++ b/ext/standard/libavifinfo/avifinfo.c @@ -0,0 +1,745 @@ +// Copyright (c) 2021, Alliance for Open Media. All rights reserved +// +// This source code is subject to the terms of the BSD 2 Clause License and +// the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License +// was not distributed with this source code in the LICENSE file, you can +// obtain it at www.aomedia.org/license/software. If the Alliance for Open +// Media Patent License 1.0 was not distributed with this source code in the +// PATENTS file, you can obtain it at www.aomedia.org/license/patent. + +#include "avifinfo.h" + +#include +#include +#include + +//------------------------------------------------------------------------------ + +// Status returned when reading the content of a box (or file). +typedef enum { + kFound, // Input correctly parsed and information retrieved. + kNotFound, // Input correctly parsed but information is missing or elsewhere. + kTruncated, // Input correctly parsed until missing bytes to continue. + kAborted, // Input correctly parsed until stopped to avoid timeout or crash. + kInvalid, // Input incorrectly parsed. +} AvifInfoInternalStatus; + +static AvifInfoStatus AvifInfoInternalConvertStatus(AvifInfoInternalStatus s) { + return (s == kFound) ? kAvifInfoOk + : (s == kNotFound || s == kTruncated) ? kAvifInfoNotEnoughData + : (s == kAborted) ? kAvifInfoTooComplex + : kAvifInfoInvalidFile; +} + +// uint32_t is used everywhere in this file. It is unlikely to be insufficient +// to parse AVIF headers. +#define AVIFINFO_MAX_SIZE UINT32_MAX +// AvifInfoInternalFeatures uses uint8_t to store values and the number of +// values is clamped to 32 to limit the stack size. +#define AVIFINFO_MAX_VALUE UINT8_MAX +#define AVIFINFO_UNDEFINED 0 +// Maximum number of stored associations. Past that, they are skipped. +#define AVIFINFO_MAX_TILES 16 +#define AVIFINFO_MAX_PROPS 32 +#define AVIFINFO_MAX_FEATURES 8 + +// Reads an unsigned integer from 'input' with most significant bits first. +// 'input' must be at least 'num_bytes'-long. +static uint32_t AvifInfoInternalReadBigEndian(const uint8_t* input, + uint32_t num_bytes) { + uint32_t value = 0; + for (uint32_t i = 0; i < num_bytes; ++i) { + value = (value << 8) | input[i]; + } + return value; +} + +//------------------------------------------------------------------------------ +// Convenience macros. + +#if defined(AVIFINFO_LOG_ERROR) // Toggle to log encountered issues. +static void AvifInfoInternalLogError(const char* file, int line, + AvifInfoInternalStatus status) { + const char* kStr[] = {"Found", "NotFound", "Truncated", "Invalid", "Aborted"}; + fprintf(stderr, " %s:%d: %s\n", file, line, kStr[status]); + // Set a breakpoint here to catch the first detected issue. +} +#define AVIFINFO_RETURN(check_status) \ + do { \ + const AvifInfoInternalStatus status_checked = (check_status); \ + if (status_checked != kFound && status_checked != kNotFound) { \ + AvifInfoInternalLogError(__FILE__, __LINE__, status_checked); \ + } \ + return status_checked; \ + } while (0) +#else +#define AVIFINFO_RETURN(check_status) \ + do { \ + return (check_status); \ + } while (0) +#endif + +#define AVIFINFO_CHECK(check_condition, check_status) \ + do { \ + if (!(check_condition)) AVIFINFO_RETURN(check_status); \ + } while (0) +#define AVIFINFO_CHECK_STATUS_IS(check_status, expected_status) \ + do { \ + const AvifInfoInternalStatus status_returned = (check_status); \ + AVIFINFO_CHECK(status_returned == (expected_status), status_returned); \ + } while (0) +#define AVIFINFO_CHECK_FOUND(check_status) \ + AVIFINFO_CHECK_STATUS_IS((check_status), kFound) +#define AVIFINFO_CHECK_NOT_FOUND(check_status) \ + AVIFINFO_CHECK_STATUS_IS((check_status), kNotFound) + +//------------------------------------------------------------------------------ +// Streamed input struct and helper functions. + +typedef struct { + void* stream; // User-defined data. + read_stream_t read; // Used to fetch more bytes from the 'stream'. + skip_stream_t skip; // Used to advance the position in the 'stream'. + // Fallback to 'read' if 'skip' is null. +} AvifInfoInternalStream; + +// Reads 'num_bytes' from the 'stream'. They are available at '*data'. +// 'num_bytes' must be greater than zero. +static AvifInfoInternalStatus AvifInfoInternalRead( + AvifInfoInternalStream* stream, uint32_t num_bytes, const uint8_t** data) { + *data = stream->read(stream->stream, num_bytes); + AVIFINFO_CHECK(*data != NULL, kTruncated); + return kFound; +} + +// Skips 'num_bytes' from the 'stream'. 'num_bytes' can be zero. +static AvifInfoInternalStatus AvifInfoInternalSkip( + AvifInfoInternalStream* stream, uint32_t num_bytes) { + // Avoid a call to the user-defined function for nothing. + if (num_bytes > 0) { + if (stream->skip == NULL) { + const uint8_t* unused; + while (num_bytes > AVIFINFO_MAX_NUM_READ_BYTES) { + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, AVIFINFO_MAX_NUM_READ_BYTES, &unused)); + num_bytes -= AVIFINFO_MAX_NUM_READ_BYTES; + } + return AvifInfoInternalRead(stream, num_bytes, &unused); + } + stream->skip(stream->stream, num_bytes); + } + return kFound; +} + +//------------------------------------------------------------------------------ +// Features are parsed into temporary property associations. + +typedef struct { + uint8_t tile_item_id; + uint8_t parent_item_id; +} AvifInfoInternalTile; // Tile item id <-> parent item id associations. + +typedef struct { + uint8_t property_index; + uint8_t item_id; +} AvifInfoInternalProp; // Property index <-> item id associations. + +typedef struct { + uint8_t property_index; + uint32_t width, height; +} AvifInfoInternalDimProp; // Property <-> features associations. + +typedef struct { + uint8_t property_index; + uint8_t bit_depth, num_channels; +} AvifInfoInternalChanProp; // Property <-> features associations. + +typedef struct { + uint8_t has_primary_item; // True if "pitm" was parsed. + uint8_t has_alpha; // True if an alpha "auxC" was parsed. + uint8_t primary_item_id; + AvifInfoFeatures primary_item_features; // Deduced from the data below. + uint8_t data_was_skipped; // True if some loops/indices were skipped. + + uint8_t num_tiles; + AvifInfoInternalTile tiles[AVIFINFO_MAX_TILES]; + uint8_t num_props; + AvifInfoInternalProp props[AVIFINFO_MAX_PROPS]; + uint8_t num_dim_props; + AvifInfoInternalDimProp dim_props[AVIFINFO_MAX_FEATURES]; + uint8_t num_chan_props; + AvifInfoInternalChanProp chan_props[AVIFINFO_MAX_FEATURES]; +} AvifInfoInternalFeatures; + +// Generates the features of a given 'target_item_id' from internal features. +static AvifInfoInternalStatus AvifInfoInternalGetItemFeatures( + AvifInfoInternalFeatures* f, uint32_t target_item_id, uint32_t tile_depth) { + for (uint32_t prop_item = 0; prop_item < f->num_props; ++prop_item) { + if (f->props[prop_item].item_id != target_item_id) continue; + const uint32_t property_index = f->props[prop_item].property_index; + + // Retrieve the width and height of the primary item if not already done. + if (target_item_id == f->primary_item_id && + (f->primary_item_features.width == AVIFINFO_UNDEFINED || + f->primary_item_features.height == AVIFINFO_UNDEFINED)) { + for (uint32_t i = 0; i < f->num_dim_props; ++i) { + if (f->dim_props[i].property_index != property_index) continue; + f->primary_item_features.width = f->dim_props[i].width; + f->primary_item_features.height = f->dim_props[i].height; + if (f->primary_item_features.bit_depth != AVIFINFO_UNDEFINED && + f->primary_item_features.num_channels != AVIFINFO_UNDEFINED) { + return kFound; + } + break; + } + } + // Retrieve the bit depth and number of channels of the target item if not + // already done. + if (f->primary_item_features.bit_depth == AVIFINFO_UNDEFINED || + f->primary_item_features.num_channels == AVIFINFO_UNDEFINED) { + for (uint32_t i = 0; i < f->num_chan_props; ++i) { + if (f->chan_props[i].property_index != property_index) continue; + f->primary_item_features.bit_depth = f->chan_props[i].bit_depth; + f->primary_item_features.num_channels = f->chan_props[i].num_channels; + if (f->primary_item_features.width != AVIFINFO_UNDEFINED && + f->primary_item_features.height != AVIFINFO_UNDEFINED) { + return kFound; + } + break; + } + } + } + + // Check for the bit_depth and num_channels in a tile if not yet found. + for (uint32_t tile = 0; tile < f->num_tiles && tile_depth < 3; ++tile) { + if (f->tiles[tile].parent_item_id != target_item_id) continue; + AVIFINFO_CHECK_NOT_FOUND(AvifInfoInternalGetItemFeatures( + f, f->tiles[tile].tile_item_id, tile_depth + 1)); + } + AVIFINFO_RETURN(kNotFound); +} + +// Generates the 'f->primary_item_features' from the AvifInfoInternalFeatures. +// Returns kNotFound if there is not enough information. +static AvifInfoInternalStatus AvifInfoInternalGetPrimaryItemFeatures( + AvifInfoInternalFeatures* f) { + // Nothing to do without the primary item ID. + AVIFINFO_CHECK(f->has_primary_item, kNotFound); + // Early exit. + AVIFINFO_CHECK(f->num_dim_props > 0 && f->num_chan_props, kNotFound); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalGetItemFeatures(f, f->primary_item_id, /*tile_depth=*/0)); + + // "auxC" is parsed before the "ipma" properties so it is known now, if any. + if (f->has_alpha) ++f->primary_item_features.num_channels; + return kFound; +} + +//------------------------------------------------------------------------------ +// Box header parsing and various size checks. + +typedef struct { + uint32_t size; // In bytes. + uint8_t type[4]; // Four characters. + uint32_t version; // 0 or actual version if this is a full box. + uint32_t flags; // 0 or actual value if this is a full box. + uint32_t content_size; // 'size' minus the header size. +} AvifInfoInternalBox; + +// Reads the header of a 'box' starting at the beginning of a 'stream'. +// 'num_remaining_bytes' is the remaining size of the container of the 'box' +// (either the file size itself or the content size of the parent of the 'box'). +static AvifInfoInternalStatus AvifInfoInternalParseBox( + AvifInfoInternalStream* stream, uint32_t num_remaining_bytes, + uint32_t* num_parsed_boxes, AvifInfoInternalBox* box) { + const uint8_t* data; + // See ISO/IEC 14496-12:2012(E) 4.2 + uint32_t box_header_size = 8; // box 32b size + 32b type (at least) + AVIFINFO_CHECK(box_header_size <= num_remaining_bytes, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 8, &data)); + box->size = AvifInfoInternalReadBigEndian(data, sizeof(uint32_t)); + memcpy(box->type, data + 4, 4); + // 'box->size==1' means 64-bit size should be read after the box type. + // 'box->size==0' means this box extends to all remaining bytes. + if (box->size == 1) { + box_header_size += 8; + AVIFINFO_CHECK(box_header_size <= num_remaining_bytes, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 8, &data)); + // Stop the parsing if any box has a size greater than 4GB. + AVIFINFO_CHECK(AvifInfoInternalReadBigEndian(data, sizeof(uint32_t)) == 0, + kAborted); + // Read the 32 least-significant bits. + box->size = AvifInfoInternalReadBigEndian(data + 4, sizeof(uint32_t)); + } else if (box->size == 0) { + box->size = num_remaining_bytes; + } + AVIFINFO_CHECK(box->size >= box_header_size, kInvalid); + AVIFINFO_CHECK(box->size <= num_remaining_bytes, kInvalid); + + const int has_fullbox_header = + !memcmp(box->type, "meta", 4) || !memcmp(box->type, "pitm", 4) || + !memcmp(box->type, "ipma", 4) || !memcmp(box->type, "ispe", 4) || + !memcmp(box->type, "pixi", 4) || !memcmp(box->type, "iref", 4) || + !memcmp(box->type, "auxC", 4); + if (has_fullbox_header) box_header_size += 4; + AVIFINFO_CHECK(box->size >= box_header_size, kInvalid); + box->content_size = box->size - box_header_size; + // Avoid timeouts. The maximum number of parsed boxes is arbitrary. + ++*num_parsed_boxes; + AVIFINFO_CHECK(*num_parsed_boxes < 4096, kAborted); + + box->version = 0; + box->flags = 0; + if (has_fullbox_header) { + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 4, &data)); + box->version = AvifInfoInternalReadBigEndian(data, 1); + box->flags = AvifInfoInternalReadBigEndian(data + 1, 3); + // See AV1 Image File Format (AVIF) 8.1 + // at https://aomediacodec.github.io/av1-avif/#avif-boxes (available when + // https://github.com/AOMediaCodec/av1-avif/pull/170 is merged). + uint32_t is_parsable = 1; + if (!memcmp(box->type, "meta", 4)) is_parsable = (box->version <= 0); + if (!memcmp(box->type, "pitm", 4)) is_parsable = (box->version <= 1); + if (!memcmp(box->type, "ipma", 4)) is_parsable = (box->version <= 1); + if (!memcmp(box->type, "ispe", 4)) is_parsable = (box->version <= 0); + if (!memcmp(box->type, "pixi", 4)) is_parsable = (box->version <= 0); + if (!memcmp(box->type, "iref", 4)) is_parsable = (box->version <= 1); + if (!memcmp(box->type, "auxC", 4)) is_parsable = (box->version <= 0); + // Instead of considering this file as invalid, skip unparsable boxes. + if (!is_parsable) memcpy(box->type, "\0skp", 4); // \0 so not a valid type + } + return kFound; +} + +//------------------------------------------------------------------------------ + +// Parses a 'stream' of an "ipco" box into 'features'. +// "ispe" is used for width and height, "pixi" and "av1C" are used for bit depth +// and number of channels, and "auxC" is used for alpha. +static AvifInfoInternalStatus ParseIpco(AvifInfoInternalStream* stream, + uint32_t num_remaining_bytes, + uint32_t* num_parsed_boxes, + AvifInfoInternalFeatures* features) { + uint32_t box_index = 1; // 1-based index. Used for iterating over properties. + do { + AvifInfoInternalBox box; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, + num_parsed_boxes, &box)); + + if (!memcmp(box.type, "ispe", 4)) { + // See ISO/IEC 23008-12:2017(E) 6.5.3.2 + const uint8_t* data; + AVIFINFO_CHECK(box.content_size >= 8, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 8, &data)); + const uint32_t width = AvifInfoInternalReadBigEndian(data + 0, 4); + const uint32_t height = AvifInfoInternalReadBigEndian(data + 4, 4); + AVIFINFO_CHECK(width != 0 && height != 0, kInvalid); + if (features->num_dim_props < AVIFINFO_MAX_FEATURES && + box_index <= AVIFINFO_MAX_VALUE) { + features->dim_props[features->num_dim_props].property_index = box_index; + features->dim_props[features->num_dim_props].width = width; + features->dim_props[features->num_dim_props].height = height; + ++features->num_dim_props; + } else { + features->data_was_skipped = 1; + } + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size - 8)); + } else if (!memcmp(box.type, "pixi", 4)) { + // See ISO/IEC 23008-12:2017(E) 6.5.6.2 + const uint8_t* data; + AVIFINFO_CHECK(box.content_size >= 1, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 1, &data)); + const uint32_t num_channels = AvifInfoInternalReadBigEndian(data + 0, 1); + AVIFINFO_CHECK(num_channels >= 1, kInvalid); + AVIFINFO_CHECK(box.content_size >= 1 + num_channels, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 1, &data)); + const uint32_t bit_depth = AvifInfoInternalReadBigEndian(data, 1); + AVIFINFO_CHECK(bit_depth >= 1, kInvalid); + for (uint32_t i = 1; i < num_channels; ++i) { + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 1, &data)); + // Bit depth should be the same for all channels. + AVIFINFO_CHECK(AvifInfoInternalReadBigEndian(data, 1) == bit_depth, + kInvalid); + AVIFINFO_CHECK(i <= 32, kAborted); // Be reasonable. + } + if (features->num_chan_props < AVIFINFO_MAX_FEATURES && + box_index <= AVIFINFO_MAX_VALUE && bit_depth <= AVIFINFO_MAX_VALUE && + num_channels <= AVIFINFO_MAX_VALUE) { + features->chan_props[features->num_chan_props].property_index = + box_index; + features->chan_props[features->num_chan_props].bit_depth = bit_depth; + features->chan_props[features->num_chan_props].num_channels = + num_channels; + ++features->num_chan_props; + } else { + features->data_was_skipped = 1; + } + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - (1 + num_channels))); + } else if (!memcmp(box.type, "av1C", 4)) { + // See AV1 Codec ISO Media File Format Binding 2.3.1 + // at https://aomediacodec.github.io/av1-isobmff/#av1c + // Only parse the necessary third byte. Assume that the others are valid. + const uint8_t* data; + AVIFINFO_CHECK(box.content_size >= 3, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 3, &data)); + const int high_bitdepth = (data[2] & 0x40) != 0; + const int twelve_bit = (data[2] & 0x20) != 0; + const int monochrome = (data[2] & 0x10) != 0; + if (twelve_bit) { + AVIFINFO_CHECK(high_bitdepth, kInvalid); + } + if (features->num_chan_props < AVIFINFO_MAX_FEATURES && + box_index <= AVIFINFO_MAX_VALUE) { + features->chan_props[features->num_chan_props].property_index = + box_index; + features->chan_props[features->num_chan_props].bit_depth = + high_bitdepth ? twelve_bit ? 12 : 10 : 8; + features->chan_props[features->num_chan_props].num_channels = + monochrome ? 1 : 3; + ++features->num_chan_props; + } else { + features->data_was_skipped = 1; + } + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size - 3)); + } else if (!memcmp(box.type, "auxC", 4)) { + // See AV1 Image File Format (AVIF) 4 + // at https://aomediacodec.github.io/av1-avif/#auxiliary-images + const char* kAlphaStr = "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha"; + const uint32_t kAlphaStrLength = 44; // Includes terminating character. + if (box.content_size >= kAlphaStrLength) { + const uint8_t* data; + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, kAlphaStrLength, &data)); + const char* const aux_type = (const char*)data; + if (strcmp(aux_type, kAlphaStr) == 0) { + // Note: It is unlikely but it is possible that this alpha plane does + // not belong to the primary item or a tile. Ignore this issue. + features->has_alpha = 1; + } + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - kAlphaStrLength)); + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + ++box_index; + num_remaining_bytes -= box.size; + } while (num_remaining_bytes > 0); + AVIFINFO_RETURN(kNotFound); +} + +// Parses a 'stream' of an "iprp" box into 'features'. The "ipco" box contain +// the properties which are linked to items by the "ipma" box. +static AvifInfoInternalStatus ParseIprp(AvifInfoInternalStream* stream, + uint32_t num_remaining_bytes, + uint32_t* num_parsed_boxes, + AvifInfoInternalFeatures* features) { + do { + AvifInfoInternalBox box; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, + num_parsed_boxes, &box)); + + if (!memcmp(box.type, "ipco", 4)) { + AVIFINFO_CHECK_NOT_FOUND( + ParseIpco(stream, box.content_size, num_parsed_boxes, features)); + } else if (!memcmp(box.type, "ipma", 4)) { + // See ISO/IEC 23008-12:2017(E) 9.3.2 + uint32_t num_read_bytes = 4; + const uint8_t* data; + AVIFINFO_CHECK(box.content_size >= num_read_bytes, kInvalid); + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 4, &data)); + const uint32_t entry_count = AvifInfoInternalReadBigEndian(data, 4); + const uint32_t id_num_bytes = (box.version < 1) ? 2 : 4; + const uint32_t index_num_bytes = (box.flags & 1) ? 2 : 1; + const uint32_t essential_bit_mask = (box.flags & 1) ? 0x8000 : 0x80; + + for (uint32_t entry = 0; entry < entry_count; ++entry) { + if (entry >= AVIFINFO_MAX_PROPS || + features->num_props >= AVIFINFO_MAX_PROPS) { + features->data_was_skipped = 1; + break; + } + num_read_bytes += id_num_bytes + 1; + AVIFINFO_CHECK(box.content_size >= num_read_bytes, kInvalid); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, id_num_bytes + 1, &data)); + const uint32_t item_id = + AvifInfoInternalReadBigEndian(data, id_num_bytes); + const uint32_t association_count = + AvifInfoInternalReadBigEndian(data + id_num_bytes, 1); + + uint32_t property; + for (property = 0; property < association_count; ++property) { + if (property >= AVIFINFO_MAX_PROPS || + features->num_props >= AVIFINFO_MAX_PROPS) { + features->data_was_skipped = 1; + break; + } + num_read_bytes += index_num_bytes; + AVIFINFO_CHECK(box.content_size >= num_read_bytes, kInvalid); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, index_num_bytes, &data)); + const uint32_t value = + AvifInfoInternalReadBigEndian(data, index_num_bytes); + // const int essential = (value & essential_bit_mask); // Unused. + const uint32_t property_index = (value & ~essential_bit_mask); + if (property_index <= AVIFINFO_MAX_VALUE && + item_id <= AVIFINFO_MAX_VALUE) { + features->props[features->num_props].property_index = + property_index; + features->props[features->num_props].item_id = item_id; + ++features->num_props; + } else { + features->data_was_skipped = 1; + } + } + if (property < association_count) break; // Do not read garbage. + } + + // If all features are available now, do not look further. + AVIFINFO_CHECK_NOT_FOUND( + AvifInfoInternalGetPrimaryItemFeatures(features)); + + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - num_read_bytes)); + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + num_remaining_bytes -= box.size; + } while (num_remaining_bytes != 0); + AVIFINFO_RETURN(kNotFound); +} + +//------------------------------------------------------------------------------ + +// Parses a 'stream' of an "iref" box into 'features'. +// The "dimg" boxes contain links between tiles and their parent items, which +// can be used to infer bit depth and number of channels for the primary item +// when the latter does not have these properties. +static AvifInfoInternalStatus ParseIref(AvifInfoInternalStream* stream, + uint32_t num_remaining_bytes, + uint32_t* num_parsed_boxes, + AvifInfoInternalFeatures* features) { + do { + AvifInfoInternalBox box; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, + num_parsed_boxes, &box)); + + if (!memcmp(box.type, "dimg", 4)) { + // See ISO/IEC 14496-12:2015(E) 8.11.12.2 + const uint32_t num_bytes_per_id = (box.version == 0) ? 2 : 4; + uint32_t num_read_bytes = num_bytes_per_id + 2; + const uint8_t* data; + AVIFINFO_CHECK(box.content_size >= num_read_bytes, kInvalid); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, num_bytes_per_id + 2, &data)); + const uint32_t from_item_id = + AvifInfoInternalReadBigEndian(data, num_bytes_per_id); + const uint32_t reference_count = + AvifInfoInternalReadBigEndian(data + num_bytes_per_id, 2); + + for (uint32_t i = 0; i < reference_count; ++i) { + if (i >= AVIFINFO_MAX_TILES) { + features->data_was_skipped = 1; + break; + } + num_read_bytes += num_bytes_per_id; + AVIFINFO_CHECK(box.content_size >= num_read_bytes, kInvalid); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, num_bytes_per_id, &data)); + const uint32_t to_item_id = + AvifInfoInternalReadBigEndian(data, num_bytes_per_id); + if (from_item_id <= AVIFINFO_MAX_VALUE && + to_item_id <= AVIFINFO_MAX_VALUE && + features->num_tiles < AVIFINFO_MAX_TILES) { + features->tiles[features->num_tiles].tile_item_id = to_item_id; + features->tiles[features->num_tiles].parent_item_id = from_item_id; + ++features->num_tiles; + } else { + features->data_was_skipped = 1; + } + } + + // If all features are available now, do not look further. + AVIFINFO_CHECK_NOT_FOUND( + AvifInfoInternalGetPrimaryItemFeatures(features)); + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + num_remaining_bytes -= box.size; + } while (num_remaining_bytes > 0); + AVIFINFO_RETURN(kNotFound); +} + +//------------------------------------------------------------------------------ + +// Parses a 'stream' of a "meta" box. It looks for the primary item ID in the +// "pitm" box and recurses into other boxes to find its 'features'. +static AvifInfoInternalStatus ParseMeta(AvifInfoInternalStream* stream, + uint32_t num_remaining_bytes, + uint32_t* num_parsed_boxes, + AvifInfoInternalFeatures* features) { + do { + AvifInfoInternalBox box; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, num_remaining_bytes, + num_parsed_boxes, &box)); + + if (!memcmp(box.type, "pitm", 4)) { + // See ISO/IEC 14496-12:2015(E) 8.11.4.2 + const uint32_t num_bytes_per_id = (box.version == 0) ? 2 : 4; + const uint8_t* data; + AVIFINFO_CHECK(num_bytes_per_id <= num_remaining_bytes, kInvalid); + AVIFINFO_CHECK_FOUND( + AvifInfoInternalRead(stream, num_bytes_per_id, &data)); + const uint32_t primary_item_id = + AvifInfoInternalReadBigEndian(data, num_bytes_per_id); + AVIFINFO_CHECK(primary_item_id <= AVIFINFO_MAX_VALUE, kAborted); + features->has_primary_item = 1; + features->primary_item_id = primary_item_id; + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - num_bytes_per_id)); + } else if (!memcmp(box.type, "iprp", 4)) { + AVIFINFO_CHECK_NOT_FOUND( + ParseIprp(stream, box.content_size, num_parsed_boxes, features)); + } else if (!memcmp(box.type, "iref", 4)) { + AVIFINFO_CHECK_NOT_FOUND( + ParseIref(stream, box.content_size, num_parsed_boxes, features)); + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + num_remaining_bytes -= box.size; + } while (num_remaining_bytes != 0); + // According to ISO/IEC 14496-12:2012(E) 8.11.1.1 there is at most one "meta". + AVIFINFO_RETURN(features->data_was_skipped ? kAborted : kInvalid); +} + +//------------------------------------------------------------------------------ + +// Parses a file 'stream'. The file type is checked through the "ftyp" box. +static AvifInfoInternalStatus ParseFtyp(AvifInfoInternalStream* stream) { + AvifInfoInternalBox box; + uint32_t num_parsed_boxes = 0; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, AVIFINFO_MAX_SIZE, + &num_parsed_boxes, &box)); + AVIFINFO_CHECK(!memcmp(box.type, "ftyp", 4), kInvalid); + // Iterate over brands. See ISO/IEC 14496-12:2012(E) 4.3.1 + AVIFINFO_CHECK(box.content_size >= 8, kInvalid); // major_brand,minor_version + for (uint32_t i = 0; i + 4 <= box.content_size; i += 4) { + const uint8_t* data; + AVIFINFO_CHECK_FOUND(AvifInfoInternalRead(stream, 4, &data)); + if (i == 4) continue; // Skip minor_version. + if (!memcmp(data, "avif", 4) || !memcmp(data, "avis", 4)) { + AVIFINFO_CHECK_FOUND( + AvifInfoInternalSkip(stream, box.content_size - (i + 4))); + return kFound; + } + AVIFINFO_CHECK(i <= 32 * 4, kAborted); // Be reasonable. + } + AVIFINFO_RETURN(kInvalid); // No AVIF brand no good. +} + +// Parses a file 'stream'. 'features' are extracted from the "meta" box. +static AvifInfoInternalStatus ParseFile(AvifInfoInternalStream* stream, + uint32_t* num_parsed_boxes, + AvifInfoInternalFeatures* features) { + while (1) { + AvifInfoInternalBox box; + AVIFINFO_CHECK_FOUND(AvifInfoInternalParseBox(stream, AVIFINFO_MAX_SIZE, + num_parsed_boxes, &box)); + if (!memcmp(box.type, "meta", 4)) { + return ParseMeta(stream, box.content_size, num_parsed_boxes, features); + } else { + AVIFINFO_CHECK_FOUND(AvifInfoInternalSkip(stream, box.content_size)); + } + } + AVIFINFO_RETURN(kInvalid); // No "meta" no good. +} + +//------------------------------------------------------------------------------ +// Helpers for converting the fixed-size input public API to the streamed one. + +typedef struct { + const uint8_t* data; + size_t data_size; +} AvifInfoInternalForward; + +static const uint8_t* AvifInfoInternalForwardRead(void* stream, + size_t num_bytes) { + AvifInfoInternalForward* forward = (AvifInfoInternalForward*)stream; + if (num_bytes > forward->data_size) return NULL; + const uint8_t* data = forward->data; + forward->data += num_bytes; + forward->data_size -= num_bytes; + return data; +} + +static void AvifInfoInternalForwardSkip(void* stream, size_t num_bytes) { + AvifInfoInternalForward* forward = (AvifInfoInternalForward*)stream; + if (num_bytes > forward->data_size) num_bytes = forward->data_size; + forward->data += num_bytes; + forward->data_size -= num_bytes; +} + +//------------------------------------------------------------------------------ +// Fixed-size input public API + +AvifInfoStatus AvifInfoIdentify(const uint8_t* data, size_t data_size) { + AvifInfoInternalForward stream; + stream.data = data; + stream.data_size = data_size; + // Forward null 'data' as a null 'stream' to handle it the same way. + return AvifInfoIdentifyStream( + (void*)&stream, (data == NULL) ? NULL : AvifInfoInternalForwardRead, + AvifInfoInternalForwardSkip); +} + +AvifInfoStatus AvifInfoGetFeatures(const uint8_t* data, size_t data_size, + AvifInfoFeatures* features) { + AvifInfoInternalForward stream; + stream.data = data; + stream.data_size = data_size; + return AvifInfoGetFeaturesStream( + (void*)&stream, (data == NULL) ? NULL : AvifInfoInternalForwardRead, + AvifInfoInternalForwardSkip, features); +} + +//------------------------------------------------------------------------------ +// Streamed input API + +AvifInfoStatus AvifInfoIdentifyStream(void* stream, read_stream_t read, + skip_stream_t skip) { + if (read == NULL) return kAvifInfoNotEnoughData; + + AvifInfoInternalStream internal_stream; + internal_stream.stream = stream; + internal_stream.read = read; + internal_stream.skip = skip; // Fallbacks to 'read' if null. + return AvifInfoInternalConvertStatus(ParseFtyp(&internal_stream)); +} + +AvifInfoStatus AvifInfoGetFeaturesStream(void* stream, read_stream_t read, + skip_stream_t skip, + AvifInfoFeatures* features) { + if (features != NULL) memset(features, 0, sizeof(*features)); + if (read == NULL) return kAvifInfoNotEnoughData; + + AvifInfoInternalStream internal_stream; + internal_stream.stream = stream; + internal_stream.read = read; + internal_stream.skip = skip; // Fallbacks to 'read' if null. + uint32_t num_parsed_boxes = 0; + AvifInfoInternalFeatures internal_features; + memset(&internal_features, AVIFINFO_UNDEFINED, sizeof(internal_features)); + + // Go through all relevant boxes sequentially. + const AvifInfoInternalStatus status = + ParseFile(&internal_stream, &num_parsed_boxes, &internal_features); + if (status == kFound && features != NULL) { + memcpy(features, &internal_features.primary_item_features, + sizeof(*features)); + } + return AvifInfoInternalConvertStatus(status); +} diff --git a/ext/standard/libavifinfo/avifinfo.h b/ext/standard/libavifinfo/avifinfo.h new file mode 100644 index 0000000000000..4c898c2efcc5c --- /dev/null +++ b/ext/standard/libavifinfo/avifinfo.h @@ -0,0 +1,92 @@ +// Copyright (c) 2021, Alliance for Open Media. All rights reserved +// +// This source code is subject to the terms of the BSD 2 Clause License and +// the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License +// was not distributed with this source code in the LICENSE file, you can +// obtain it at www.aomedia.org/license/software. If the Alliance for Open +// Media Patent License 1.0 was not distributed with this source code in the +// PATENTS file, you can obtain it at www.aomedia.org/license/patent. + +#ifndef AVIFINFO_H_ +#define AVIFINFO_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//------------------------------------------------------------------------------ + +typedef enum { + kAvifInfoOk, // The file was correctly parsed and the requested + // information was extracted. It is not guaranteed + // that the input bitstream is a valid complete + // AVIF file. + kAvifInfoNotEnoughData, // The input bitstream was correctly parsed until + // now but bytes are missing. The request should be + // repeated with more input bytes. + kAvifInfoTooComplex, // The input bitstream was correctly parsed until + // now but it is too complex. The parsing was + // stopped to avoid any timeout or crash. + kAvifInfoInvalidFile, // The input bitstream is not a valid AVIF file, + // truncated or not. +} AvifInfoStatus; + +typedef struct { + uint32_t width, height; // In number of pixels. Ignores mirror and rotation. + uint32_t bit_depth; // Likely 8, 10 or 12 bits per channel per pixel. + uint32_t num_channels; // Likely 1, 2, 3 or 4 channels: + // (1 monochrome or 3 colors) + (0 or 1 alpha) +} AvifInfoFeatures; + +//------------------------------------------------------------------------------ +// Fixed-size input API +// Use this API if a raw byte array of fixed size is available as input. + +// Parses the 'data' and returns kAvifInfoOk if it is identified as an AVIF. +// The file type can be identified in the first 12 bytes of most AVIF files. +AvifInfoStatus AvifInfoIdentify(const uint8_t* data, size_t data_size); + +// Parses the identified AVIF 'data' and extracts its 'features'. +// 'data' can be partial but must point to the beginning of the AVIF file. +// The 'features' can be parsed in the first 450 bytes of most AVIF files. +// 'features' are set to 0 unless kAvifInfoOk is returned. +AvifInfoStatus AvifInfoGetFeatures(const uint8_t* data, size_t data_size, + AvifInfoFeatures* features); + +//------------------------------------------------------------------------------ +// Streamed input API +// Use this API if the input bytes must be fetched and/or if the AVIF payload +// size is unknown. Implement the two function signatures below and pass them to +// AvifInfoRead*() with a 'stream', which can be anything (file, struct etc.). + +// Reads 'num_bytes' from the 'stream'. +// The position in the 'stream' must be advanced by 'num_bytes'. +// Returns a pointer to the 'num_bytes' or null if it cannot be fulfilled. +// The returned data must remain valid until the next read. +typedef const uint8_t* (*read_stream_t)(void* stream, size_t num_bytes); +// Advances the position in the 'stream' by 'num_bytes'. +typedef void (*skip_stream_t)(void* stream, size_t num_bytes); + +// Maximum number of bytes requested per read. There is no limit per skip. +#define AVIFINFO_MAX_NUM_READ_BYTES 64 + +// Same as AvifInfo*() but takes a 'stream' as input. AvifInfo*Stream() does +// not access the 'stream' directly but passes it as is to 'read' and 'skip'. +// 'read' cannot be null. If 'skip' is null, 'read' is called instead. +AvifInfoStatus AvifInfoIdentifyStream(void* stream, read_stream_t read, + skip_stream_t skip); +// Can be called right after AvifInfoIdentifyStream() with the same 'stream'. +AvifInfoStatus AvifInfoGetFeaturesStream(void* stream, read_stream_t read, + skip_stream_t skip, + AvifInfoFeatures* features); + +//------------------------------------------------------------------------------ + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // AVIFINFO_H_ diff --git a/ext/standard/tests/image/getimagesize.phpt b/ext/standard/tests/image/getimagesize.phpt index 0a1002d2934a1..472be1d25e366 100644 --- a/ext/standard/tests/image/getimagesize.phpt +++ b/ext/standard/tests/image/getimagesize.phpt @@ -70,15 +70,19 @@ array(17) { string(9) "image/bmp" } ["test1pix.avif"]=> - array(5) { + array(7) { [0]=> - int(0) + int(102) [1]=> - int(0) + int(121) [2]=> int(19) [3]=> - string(20) "width="0" height="0"" + string(24) "width="102" height="121"" + ["bits"]=> + int(8) + ["channels"]=> + int(4) ["mime"]=> string(10) "image/avif" } From 30a3280df73c0751cab8b342824b8d9a6ba91e3c Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sun, 12 Dec 2021 12:31:07 +0100 Subject: [PATCH 0282/1346] Oracle Client 10g is no longer supported Thus, we drop respective config option for Windows. --- NEWS | 2 ++ UPGRADING | 5 ++++ ext/oci8/config.w32 | 56 --------------------------------------------- 3 files changed, 7 insertions(+), 56 deletions(-) diff --git a/NEWS b/NEWS index ab7fa8554ba37..0a53434c36a9f 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,8 @@ PHP NEWS - OCI8: . Added oci8.prefetch_lob_size directive to tune LOB query performance + . Support for building against Oracle Client libraries 10.1 and 10.2 has been + dropped. Oracle Client libraries 11.2 or newer are now required. - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. diff --git a/UPGRADING b/UPGRADING index 86dd792ca484d..b0a3fffb7add2 100644 --- a/UPGRADING +++ b/UPGRADING @@ -157,6 +157,11 @@ PHP 8.2 UPGRADE NOTES . Windows specific error messages are no longer localized, but instead in English to better match PHP error messages. +- OCI8: + . Since building against Oracle Client 10g is no longer supported anyway, + the configuration option --with-oci8 has been dropped. --with-oci8-11g, + --with-oci8-12c and --with-oci8-19 are still supported. + ======================================== 13. Other Changes ======================================== diff --git a/ext/oci8/config.w32 b/ext/oci8/config.w32 index 1c94c1578995c..8d17878c77644 100644 --- a/ext/oci8/config.w32 +++ b/ext/oci8/config.w32 @@ -1,19 +1,5 @@ // vim:ft=javascript -if (PHP_OCI8 != "no" && PHP_OCI8_11G != "no") { - if (!PHP_OCI8_SHARED && !PHP_OCI8_11G_SHARED) { - WARNING("oci8 and oci8-11g provide the same extension and cannot both be built statically"); - PHP_OCI8 = "no" - } -} - -if (PHP_OCI8 != "no" && PHP_OCI8_12C != "no") { - if (!PHP_OCI8_SHARED && !PHP_OCI8_12C_SHARED) { - WARNING("oci8 and oci8-12c provide the same extension and cannot both be built statically"); - PHP_OCI8 = "no" - } -} - if (PHP_OCI8_11G != "no" && PHP_OCI8_12C != "no") { if (!PHP_OCI8_11G_SHARED && !PHP_OCI8_12C_SHARED) { WARNING("oci8-11g and oci8-12c provide the same extension and cannot both be built statically"); @@ -21,13 +7,6 @@ if (PHP_OCI8_11G != "no" && PHP_OCI8_12C != "no") { } } -if (PHP_OCI8 != "no" && PHP_OCI8_19 != "no") { - if (!PHP_OCI8_SHARED && !PHP_OCI8_19_SHARED) { - WARNING("oci8 and oci8-19 provide the same extension and cannot both be built statically"); - PHP_OCI8 = "no" - } -} - if (PHP_OCI8_11G != "no" && PHP_OCI8_19 != "no") { if (!PHP_OCI8_11G_SHARED && !PHP_OCI8_19_SHARED) { WARNING("oci8-11g and oci8-19 provide the same extension and cannot both be built statically"); @@ -42,41 +21,6 @@ if (PHP_OCI8_12C != "no" && PHP_OCI8_19 != "no") { } } -ARG_WITH("oci8", "OCI8 support", "no"); - -if (PHP_OCI8 != "no") { - - oci8_dirs = new Array( - PHP_OCI8 - ); - - oci8_lib_paths = ""; - oci8_inc_paths = ""; - - // find the Oracle install - for (i = 0; i < oci8_dirs.length; i++) { - oci8_lib_paths += oci8_dirs[i] + "\\lib;"; - oci8_lib_paths += oci8_dirs[i] + "\\lib\\msvc;"; - oci8_inc_paths += oci8_dirs[i] + "\\include;"; - } - - oci8_inc_paths += PHP_PHP_BUILD + "\\include\\instantclient;" - oci8_lib_paths += PHP_PHP_BUILD + "\\lib\\instantclient;"; - - if (CHECK_HEADER_ADD_INCLUDE("oci.h", "CFLAGS_OCI8", oci8_inc_paths) && - CHECK_LIB("oci.lib", "oci8", oci8_lib_paths)) - { - EXTENSION('oci8', 'oci8.c oci8_lob.c oci8_statement.c oci8_collection.c oci8_interface.c oci8_failover.c'); - - AC_DEFINE('HAVE_OCI8', 1); - AC_DEFINE('HAVE_OCI_INSTANT_CLIENT', 1); - - } else { - WARNING("oci8 not enabled: Oracle Database client libraries or Oracle 10g Instant Client not found"); - PHP_OCI8 = "no" - } -} - ARG_WITH("oci8-11g", "OCI8 support using Oracle 11g Instant Client", "no"); if (PHP_OCI8_11G != "no") { From 3a3eeb4f833613c6bf8e1055e0845d29056bb46b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 16 Dec 2021 12:32:09 +0300 Subject: [PATCH 0283/1346] Fixed build in separate directory --- ext/standard/config.m4 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index 9ca92c610b9ed..2e78b2df01888 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -463,5 +463,7 @@ PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32. random.c net.c hrtime.c crc32_x86.c libavifinfo/avifinfo.c,,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) +PHP_ADD_BUILD_DIR($ext_builddir/libavifinfo) + PHP_ADD_MAKEFILE_FRAGMENT PHP_INSTALL_HEADERS([ext/standard/]) From 79fac32d6bf8c480d0e930da752f61b0d11543e1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 16 Dec 2021 17:37:01 +0300 Subject: [PATCH 0284/1346] Don't call zend_attach/detach_symbol_table() for op_arrays without local variables --- Zend/zend_execute.c | 4 +++- Zend/zend_vm_def.h | 15 +++++++++++---- Zend/zend_vm_execute.h | 30 ++++++++++++++++++++++-------- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8415f9b87d908..c332201a8fe78 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3839,7 +3839,9 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu EX(call) = NULL; EX(return_value) = return_value; - zend_attach_symbol_table(execute_data); + if (op_array->last_var) { + zend_attach_symbol_table(execute_data); + } if (!ZEND_MAP_PTR(op_array->run_time_cache)) { void *ptr; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9408b66408c8f..7105ca320bc55 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2863,7 +2863,9 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) { - zend_detach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_detach_symbol_table(execute_data); + } zend_destroy_static_vars(&EX(func)->op_array); destroy_op_array(&EX(func)->op_array); efree_size(EX(func), sizeof(zend_op_array)); @@ -2874,7 +2876,9 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); - zend_attach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_attach_symbol_table(execute_data); + } if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -2905,11 +2909,14 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); - zend_detach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_detach_symbol_table(execute_data); + } old_execute_data = EX(prev_execute_data); while (old_execute_data) { if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { - if (old_execute_data->symbol_table == symbol_table) { + if (old_execute_data->symbol_table == symbol_table + && old_execute_data->func->op_array.last_var > 0) { zend_attach_symbol_table(old_execute_data); } break; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6a6476b2ce526..d6e67c16dbd3a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1145,7 +1145,9 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) { - zend_detach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_detach_symbol_table(execute_data); + } zend_destroy_static_vars(&EX(func)->op_array); destroy_op_array(&EX(func)->op_array); efree_size(EX(func), sizeof(zend_op_array)); @@ -1156,7 +1158,9 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); - zend_attach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_attach_symbol_table(execute_data); + } if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -1187,11 +1191,14 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); - zend_detach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_detach_symbol_table(execute_data); + } old_execute_data = EX(prev_execute_data); while (old_execute_data) { if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { - if (old_execute_data->symbol_table == symbol_table) { + if (old_execute_data->symbol_table == symbol_table + && old_execute_data->func->op_array.last_var > 0) { zend_attach_symbol_table(old_execute_data); } break; @@ -55398,7 +55405,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) LOAD_NEXT_OPLINE(); ZEND_VM_LEAVE(); } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) { - zend_detach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_detach_symbol_table(execute_data); + } zend_destroy_static_vars(&EX(func)->op_array); destroy_op_array(&EX(func)->op_array); efree_size(EX(func), sizeof(zend_op_array)); @@ -55409,7 +55418,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); - zend_attach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_attach_symbol_table(execute_data); + } if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); HANDLE_EXCEPTION_LEAVE(); @@ -55440,11 +55451,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) } else /* if (call_kind == ZEND_CALL_TOP_CODE) */ { zend_array *symbol_table = EX(symbol_table); - zend_detach_symbol_table(execute_data); + if (EX(func)->op_array.last_var > 0) { + zend_detach_symbol_table(execute_data); + } old_execute_data = EX(prev_execute_data); while (old_execute_data) { if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { - if (old_execute_data->symbol_table == symbol_table) { + if (old_execute_data->symbol_table == symbol_table + && old_execute_data->func->op_array.last_var > 0) { zend_attach_symbol_table(old_execute_data); } break; From 67bb79259baef3586b1bbe1f9026e371ed5e27b7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 16 Dec 2021 19:42:29 +0300 Subject: [PATCH 0285/1346] Don't execute INCLUDE for empty op_arrays. --- Zend/zend_vm_def.h | 20 ++++++++--- Zend/zend_vm_execute.h | 80 +++++++++++++++++++++++++++++++++--------- 2 files changed, 80 insertions(+), 20 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7105ca320bc55..4d0b68873a7b1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6286,10 +6286,24 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSER if (RETURN_VALUE_USED(opline)) { ZVAL_TRUE(EX_VAR(opline->result.var)); } - } else if (EXPECTED(new_op_array != NULL)) { + } else if (UNEXPECTED(new_op_array == NULL)) { + if (RETURN_VALUE_USED(opline)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); + } + } else if (new_op_array->last == 1 + && new_op_array->opcodes[0].opcode == ZEND_RETURN + && new_op_array->opcodes[0].op1_type == IS_CONST) { + if (RETURN_VALUE_USED(opline)) { + const zend_op *op = new_op_array->opcodes; + + ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1)); + } + zend_destroy_static_vars(new_op_array); + destroy_op_array(new_op_array); + efree_size(new_op_array, sizeof(zend_op_array)); + } else { zval *return_value = NULL; zend_execute_data *call; - if (RETURN_VALUE_USED(opline)) { return_value = EX_VAR(opline->result.var); } @@ -6328,8 +6342,6 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSER UNDEF_RESULT(); HANDLE_EXCEPTION(); } - } else if (RETURN_VALUE_USED(opline)) { - ZVAL_FALSE(EX_VAR(opline->result.var)); } FREE_OP1(); ZEND_VM_NEXT_OPCODE(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d6e67c16dbd3a..3234a9d711c72 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4864,10 +4864,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN if (RETURN_VALUE_USED(opline)) { ZVAL_TRUE(EX_VAR(opline->result.var)); } - } else if (EXPECTED(new_op_array != NULL)) { + } else if (UNEXPECTED(new_op_array == NULL)) { + if (RETURN_VALUE_USED(opline)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); + } + } else if (new_op_array->last == 1 + && new_op_array->opcodes[0].opcode == ZEND_RETURN + && new_op_array->opcodes[0].op1_type == IS_CONST) { + if (RETURN_VALUE_USED(opline)) { + const zend_op *op = new_op_array->opcodes; + + ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1)); + } + zend_destroy_static_vars(new_op_array); + destroy_op_array(new_op_array); + efree_size(new_op_array, sizeof(zend_op_array)); + } else { zval *return_value = NULL; zend_execute_data *call; - if (RETURN_VALUE_USED(opline)) { return_value = EX_VAR(opline->result.var); } @@ -4906,8 +4920,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN UNDEF_RESULT(); HANDLE_EXCEPTION(); } - } else if (RETURN_VALUE_USED(opline)) { - ZVAL_FALSE(EX_VAR(opline->result.var)); } ZEND_VM_NEXT_OPCODE(); @@ -4934,10 +4946,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER_ if (RETURN_VALUE_USED(opline)) { ZVAL_TRUE(EX_VAR(opline->result.var)); } - } else if (EXPECTED(new_op_array != NULL)) { + } else if (UNEXPECTED(new_op_array == NULL)) { + if (RETURN_VALUE_USED(opline)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); + } + } else if (new_op_array->last == 1 + && new_op_array->opcodes[0].opcode == ZEND_RETURN + && new_op_array->opcodes[0].op1_type == IS_CONST) { + if (RETURN_VALUE_USED(opline)) { + const zend_op *op = new_op_array->opcodes; + + ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1)); + } + zend_destroy_static_vars(new_op_array); + destroy_op_array(new_op_array); + efree_size(new_op_array, sizeof(zend_op_array)); + } else { zval *return_value = NULL; zend_execute_data *call; - if (RETURN_VALUE_USED(opline)) { return_value = EX_VAR(opline->result.var); } @@ -4976,8 +5002,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } - } else if (RETURN_VALUE_USED(opline)) { - ZVAL_FALSE(EX_VAR(opline->result.var)); } FREE_OP(opline->op1_type, opline->op1.var); ZEND_VM_NEXT_OPCODE(); @@ -14502,10 +14526,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA if (RETURN_VALUE_USED(opline)) { ZVAL_TRUE(EX_VAR(opline->result.var)); } - } else if (EXPECTED(new_op_array != NULL)) { + } else if (UNEXPECTED(new_op_array == NULL)) { + if (RETURN_VALUE_USED(opline)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); + } + } else if (new_op_array->last == 1 + && new_op_array->opcodes[0].opcode == ZEND_RETURN + && new_op_array->opcodes[0].op1_type == IS_CONST) { + if (RETURN_VALUE_USED(opline)) { + const zend_op *op = new_op_array->opcodes; + + ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1)); + } + zend_destroy_static_vars(new_op_array); + destroy_op_array(new_op_array); + efree_size(new_op_array, sizeof(zend_op_array)); + } else { zval *return_value = NULL; zend_execute_data *call; - if (RETURN_VALUE_USED(opline)) { return_value = EX_VAR(opline->result.var); } @@ -14544,8 +14582,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA UNDEF_RESULT(); HANDLE_EXCEPTION(); } - } else if (RETURN_VALUE_USED(opline)) { - ZVAL_FALSE(EX_VAR(opline->result.var)); } zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); ZEND_VM_NEXT_OPCODE(); @@ -38644,10 +38680,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE if (RETURN_VALUE_USED(opline)) { ZVAL_TRUE(EX_VAR(opline->result.var)); } - } else if (EXPECTED(new_op_array != NULL)) { + } else if (UNEXPECTED(new_op_array == NULL)) { + if (RETURN_VALUE_USED(opline)) { + ZVAL_FALSE(EX_VAR(opline->result.var)); + } + } else if (new_op_array->last == 1 + && new_op_array->opcodes[0].opcode == ZEND_RETURN + && new_op_array->opcodes[0].op1_type == IS_CONST) { + if (RETURN_VALUE_USED(opline)) { + const zend_op *op = new_op_array->opcodes; + + ZVAL_COPY(EX_VAR(opline->result.var), RT_CONSTANT(op, op->op1)); + } + zend_destroy_static_vars(new_op_array); + destroy_op_array(new_op_array); + efree_size(new_op_array, sizeof(zend_op_array)); + } else { zval *return_value = NULL; zend_execute_data *call; - if (RETURN_VALUE_USED(opline)) { return_value = EX_VAR(opline->result.var); } @@ -38686,8 +38736,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE UNDEF_RESULT(); HANDLE_EXCEPTION(); } - } else if (RETURN_VALUE_USED(opline)) { - ZVAL_FALSE(EX_VAR(opline->result.var)); } ZEND_VM_NEXT_OPCODE(); From 192ea91debe10ba23f1576f43a666f5947ac3943 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 16 Dec 2021 21:44:43 +0300 Subject: [PATCH 0286/1346] Avoid useless symbol table reattaching on retutn from an included op_array --- Zend/zend_compile.h | 1 + Zend/zend_vm_def.h | 36 +++++++++++++-------- Zend/zend_vm_execute.h | 72 ++++++++++++++++++++++++++---------------- 3 files changed, 67 insertions(+), 42 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 65d675d77f3fd..3e534e88ac4d2 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -556,6 +556,7 @@ struct _zend_execute_data { /* to prevent optimization in RETURN handler and */ /* keep all local variables for "fcall_end" handler */ #define ZEND_CALL_JIT_RESERVED (1 << 29) /* reserved for tracing JIT */ +#define ZEND_CALL_NEEDS_REATTACH (1 << 30) #define ZEND_CALL_SEND_ARG_BY_REF (1u << 31) #define ZEND_CALL_NESTED_FUNCTION (ZEND_CALL_FUNCTION | ZEND_CALL_NESTED) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4d0b68873a7b1..4c691fe22b399 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2865,19 +2865,21 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) { if (EX(func)->op_array.last_var > 0) { zend_detach_symbol_table(execute_data); + call_info |= ZEND_CALL_NEEDS_REATTACH; } zend_destroy_static_vars(&EX(func)->op_array); destroy_op_array(&EX(func)->op_array); efree_size(EX(func), sizeof(zend_op_array)); -#ifdef ZEND_PREFER_RELOAD - call_info = EX_CALL_INFO(); -#endif old_execute_data = execute_data; execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); - if (EX(func)->op_array.last_var > 0) { - zend_attach_symbol_table(execute_data); + if (call_info & ZEND_CALL_NEEDS_REATTACH) { + if (EX(func)->op_array.last_var > 0) { + zend_attach_symbol_table(execute_data); + } else { + ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); + } } if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); @@ -2911,17 +2913,23 @@ ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) if (EX(func)->op_array.last_var > 0) { zend_detach_symbol_table(execute_data); - } - old_execute_data = EX(prev_execute_data); - while (old_execute_data) { - if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { - if (old_execute_data->symbol_table == symbol_table - && old_execute_data->func->op_array.last_var > 0) { - zend_attach_symbol_table(old_execute_data); + call_info |= ZEND_CALL_NEEDS_REATTACH; + } + if (call_info & ZEND_CALL_NEEDS_REATTACH) { + old_execute_data = EX(prev_execute_data); + while (old_execute_data) { + if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { + if (old_execute_data->symbol_table == symbol_table) { + if (old_execute_data->func->op_array.last_var > 0) { + zend_attach_symbol_table(old_execute_data); + } else { + ZEND_ADD_CALL_FLAG(old_execute_data, ZEND_CALL_NEEDS_REATTACH); + } + } + break; } - break; + old_execute_data = old_execute_data->prev_execute_data; } - old_execute_data = old_execute_data->prev_execute_data; } EG(current_execute_data) = EX(prev_execute_data); ZEND_VM_RETURN(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3234a9d711c72..349974a92e525 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1147,19 +1147,21 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) { if (EX(func)->op_array.last_var > 0) { zend_detach_symbol_table(execute_data); + call_info |= ZEND_CALL_NEEDS_REATTACH; } zend_destroy_static_vars(&EX(func)->op_array); destroy_op_array(&EX(func)->op_array); efree_size(EX(func), sizeof(zend_op_array)); -#ifdef ZEND_PREFER_RELOAD - call_info = EX_CALL_INFO(); -#endif old_execute_data = execute_data; execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); - if (EX(func)->op_array.last_var > 0) { - zend_attach_symbol_table(execute_data); + if (call_info & ZEND_CALL_NEEDS_REATTACH) { + if (EX(func)->op_array.last_var > 0) { + zend_attach_symbol_table(execute_data); + } else { + ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); + } } if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); @@ -1193,17 +1195,23 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper if (EX(func)->op_array.last_var > 0) { zend_detach_symbol_table(execute_data); - } - old_execute_data = EX(prev_execute_data); - while (old_execute_data) { - if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { - if (old_execute_data->symbol_table == symbol_table - && old_execute_data->func->op_array.last_var > 0) { - zend_attach_symbol_table(old_execute_data); + call_info |= ZEND_CALL_NEEDS_REATTACH; + } + if (call_info & ZEND_CALL_NEEDS_REATTACH) { + old_execute_data = EX(prev_execute_data); + while (old_execute_data) { + if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { + if (old_execute_data->symbol_table == symbol_table) { + if (old_execute_data->func->op_array.last_var > 0) { + zend_attach_symbol_table(old_execute_data); + } else { + ZEND_ADD_CALL_FLAG(old_execute_data, ZEND_CALL_NEEDS_REATTACH); + } + } + break; } - break; + old_execute_data = old_execute_data->prev_execute_data; } - old_execute_data = old_execute_data->prev_execute_data; } EG(current_execute_data) = EX(prev_execute_data); ZEND_VM_RETURN(); @@ -55455,19 +55463,21 @@ ZEND_API void execute_ex(zend_execute_data *ex) } else if (EXPECTED((call_info & ZEND_CALL_TOP) == 0)) { if (EX(func)->op_array.last_var > 0) { zend_detach_symbol_table(execute_data); + call_info |= ZEND_CALL_NEEDS_REATTACH; } zend_destroy_static_vars(&EX(func)->op_array); destroy_op_array(&EX(func)->op_array); efree_size(EX(func), sizeof(zend_op_array)); -#ifdef ZEND_PREFER_RELOAD - call_info = EX_CALL_INFO(); -#endif old_execute_data = execute_data; execute_data = EG(current_execute_data) = EX(prev_execute_data); zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); - if (EX(func)->op_array.last_var > 0) { - zend_attach_symbol_table(execute_data); + if (call_info & ZEND_CALL_NEEDS_REATTACH) { + if (EX(func)->op_array.last_var > 0) { + zend_attach_symbol_table(execute_data); + } else { + ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_NEEDS_REATTACH); + } } if (UNEXPECTED(EG(exception) != NULL)) { zend_rethrow_exception(execute_data); @@ -55501,17 +55511,23 @@ ZEND_API void execute_ex(zend_execute_data *ex) if (EX(func)->op_array.last_var > 0) { zend_detach_symbol_table(execute_data); - } - old_execute_data = EX(prev_execute_data); - while (old_execute_data) { - if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { - if (old_execute_data->symbol_table == symbol_table - && old_execute_data->func->op_array.last_var > 0) { - zend_attach_symbol_table(old_execute_data); + call_info |= ZEND_CALL_NEEDS_REATTACH; + } + if (call_info & ZEND_CALL_NEEDS_REATTACH) { + old_execute_data = EX(prev_execute_data); + while (old_execute_data) { + if (old_execute_data->func && (ZEND_CALL_INFO(old_execute_data) & ZEND_CALL_HAS_SYMBOL_TABLE)) { + if (old_execute_data->symbol_table == symbol_table) { + if (old_execute_data->func->op_array.last_var > 0) { + zend_attach_symbol_table(old_execute_data); + } else { + ZEND_ADD_CALL_FLAG(old_execute_data, ZEND_CALL_NEEDS_REATTACH); + } + } + break; } - break; + old_execute_data = old_execute_data->prev_execute_data; } - old_execute_data = old_execute_data->prev_execute_data; } EG(current_execute_data) = EX(prev_execute_data); ZEND_VM_RETURN(); From a5f782170bcb116d2c2092b68c1333239961ed8d Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sun, 19 Dec 2021 10:04:09 -0500 Subject: [PATCH 0287/1346] Fix typos in opcache code comments, tests (#7794) --- ext/opcache/ZendAccelerator.c | 4 +- ext/opcache/jit/vtune/jitprofiling.h | 4 +- ext/opcache/jit/zend_jit.h | 2 +- ext/opcache/jit/zend_jit_arm64.dasc | 44 ++++++++++---------- ext/opcache/jit/zend_jit_trace.c | 2 +- ext/opcache/jit/zend_jit_x86.dasc | 8 ++-- ext/opcache/tests/jit/and_001.phpt | 2 +- ext/opcache/tests/jit/assign_045.phpt | 2 +- ext/opcache/tests/jit/assign_046.phpt | 2 +- ext/opcache/tests/jit/assign_dim_op_006.phpt | 2 +- ext/opcache/tests/jit/fetch_r_001.phpt | 2 +- 11 files changed, 37 insertions(+), 37 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 2b7c31fe60789..1b976d8656ab4 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2349,7 +2349,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, zend_map_ptr_extend(ZCSG(map_ptr_last)); return entry->ce; } - ZEND_ASSERT(0); // entry = entry->next; // This shouldn't be posible ??? + ZEND_ASSERT(0); // entry = entry->next; // This shouldn't be possible ??? } } @@ -3515,7 +3515,7 @@ static void preload_restart(void) } static size_t preload_try_strip_filename(zend_string *filename) { - /*FIXME: better way to hanlde eval()'d code? see COMPILED_STRING_DESCRIPTION_FORMAT */ + /*FIXME: better way to handle eval()'d code? see COMPILED_STRING_DESCRIPTION_FORMAT */ if (ZSTR_LEN(filename) > sizeof(" eval()'d code") && *(ZSTR_VAL(filename) + ZSTR_LEN(filename) - sizeof(" eval()'d code")) == ':') { const char *cfilename = ZSTR_VAL(filename); diff --git a/ext/opcache/jit/vtune/jitprofiling.h b/ext/opcache/jit/vtune/jitprofiling.h index 3e166c04d4359..21d23f8ec7d99 100644 --- a/ext/opcache/jit/vtune/jitprofiling.h +++ b/ext/opcache/jit/vtune/jitprofiling.h @@ -316,7 +316,7 @@ typedef enum _iJIT_IsProfilingActiveFlags */ typedef struct _LineNumberInfo { - unsigned int Offset; /**<\brief Offset from the begining of the code region. */ + unsigned int Offset; /**<\brief Offset from the beginning of the code region. */ unsigned int LineNumber; /**<\brief Matching source line number offset (from beginning of source file). */ } *pLineNumberInfo, LineNumberInfo; @@ -670,7 +670,7 @@ unsigned int JITAPI iJIT_GetNewMethodID(void); iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive(void); /** - * @brief Reports infomation about JIT-compiled code to the agent. + * @brief Reports information about JIT-compiled code to the agent. * * The reported information is used to attribute samples obtained from any * Intel(R) VTune(TM) Amplifier collector. This API needs to be called diff --git a/ext/opcache/jit/zend_jit.h b/ext/opcache/jit/zend_jit.h index 21d1774c111b6..d22422181af9c 100644 --- a/ext/opcache/jit/zend_jit.h +++ b/ext/opcache/jit/zend_jit.h @@ -75,7 +75,7 @@ #define ZEND_JIT_DEBUG_TRACE_TSSA (1<<19) #define ZEND_JIT_DEBUG_TRACE_EXIT_INFO (1<<20) -#define ZEND_JIT_DEBUG_PERSISTENT 0x1f0 /* profile and debbuger flags can't be changed at run-time */ +#define ZEND_JIT_DEBUG_PERSISTENT 0x1f0 /* profile and debugger flags can't be changed at run-time */ #define ZEND_JIT_TRACE_MAX_LENGTH 1024 /* max length of single trace */ #define ZEND_JIT_TRACE_MAX_EXITS 512 /* max number of side exits per trace */ diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index ee89defac900f..7bae3752d7137 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -1106,7 +1106,7 @@ static bool logical_immediate_p(uint64_t value, uint32_t reg_size) | // In x64, if the range of this LONG value can be represented via INT type, only move the low 32 bits into dst_addr. | // Note that imm32 is signed extended to 64 bits during mov. | // In aarch64, we choose to handle both cases in the same way. Even though 4 mov's are used for 64-bit value and 2 mov's are -| // needed for 32-bit value, an extra ext insn is needed for 32-bit vlaue. +| // needed for 32-bit value, an extra ext insn is needed for 32-bit value. | SET_ZVAL_LVAL dst_addr, Z_LVAL_P(zv), Rx(tmp_reg1), Rx(tmp_reg2) || } || } @@ -1794,7 +1794,7 @@ static int zend_jit_interrupt_handler_stub(dasm_State **Dst) | ldp x29, x30, [sp], # SPAD // stack alignment | JMP_IP TMP1 } else { - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #1 // ZEND_VM_ENTER | ret @@ -1821,7 +1821,7 @@ static int zend_jit_exception_handler_stub(dasm_State **Dst) } else { | mov FCARG1x, FP | EXT_CALL handler, REG0 - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | tbnz RETVALw, #31, >1 | mov RETVALw, #1 // ZEND_VM_ENTER @@ -1909,7 +1909,7 @@ static int zend_jit_leave_function_stub(dasm_State **Dst) | ldp x29, x30, [sp], # SPAD // stack alignment } else { | mov FCARG2x, FP - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment } | TST_32_WITH_CONST FCARG1w, ZEND_CALL_TOP, TMP1w @@ -1947,7 +1947,7 @@ static int zend_jit_leave_throw_stub(dasm_State **Dst) |5: | // opline = EG(exception_op); | LOAD_IP_ADDR_ZTS executor_globals, exception_op, TMP2 - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #2 // ZEND_VM_LEAVE | ret @@ -2418,7 +2418,7 @@ static int zend_jit_trace_halt_stub(dasm_State **Dst) | mov IP, xzr // PC must be zero | ret } else { - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | movn RETVALx, #0 // ZEND_VM_RETURN (-1) | ret @@ -2492,7 +2492,7 @@ static int zend_jit_trace_exit_stub(dasm_State **Dst) | ldp x29, x30, [sp], # SPAD // stack alignment | JMP_IP TMP1 } else { - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #1 // ZEND_VM_ENTER | ret @@ -2536,7 +2536,7 @@ static int zend_jit_trace_exit_stub(dasm_State **Dst) | tst RETVALw, RETVALw | blt ->trace_halt | - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #1 // ZEND_VM_ENTER | ret @@ -2556,7 +2556,7 @@ static int zend_jit_trace_escape_stub(dasm_State **Dst) | ldp x29, x30, [sp], # SPAD // stack alignment | JMP_IP, TMP1 } else { - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #1 // ZEND_VM_ENTER | ret @@ -3038,7 +3038,7 @@ static int zend_jit_patch(const void *code, size_t size, uint32_t jmp_table_size if (((ins ^ (uint32_t)delta) & 0x01ffffffu) == 0) { delta = (uint32_t*)to_addr - ins_ptr; if (((delta + 0x02000000) >> 26) != 0) { - abort(); // brnach target out of range + abort(); // branch target out of range } *ins_ptr = (ins & 0xfc000000u) | ((uint32_t)delta & 0x03ffffffu); ret++; @@ -3056,10 +3056,10 @@ static int zend_jit_patch(const void *code, size_t size, uint32_t jmp_table_size if (veneer) { delta = (uint32_t*)veneer - ins_ptr; if (((delta + 0x40000) >> 19) != 0) { - abort(); // brnach target out of range + abort(); // branch target out of range } } else { - abort(); // brnach target out of range + abort(); // branch target out of range } } *ins_ptr = (ins & 0xff00001fu) | (((uint32_t)delta & 0x7ffffu) << 5); @@ -3074,10 +3074,10 @@ static int zend_jit_patch(const void *code, size_t size, uint32_t jmp_table_size if (veneer) { delta = (uint32_t*)veneer - ins_ptr; if (((delta + 0x2000) >> 14) != 0) { - abort(); // brnach target out of range + abort(); // branch target out of range } } else { - abort(); // brnach target out of range + abort(); // branch target out of range } } *ins_ptr = (ins & 0xfff8001fu) | (((uint32_t)delta & 0x3fffu) << 5); @@ -3169,7 +3169,7 @@ static int zend_jit_trace_return(dasm_State **Dst, bool original_handler, const | ldr REG0, [IP, REG0] | blr REG0 } - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment if (!original_handler || !opline || (opline->opcode != ZEND_RETURN @@ -3452,7 +3452,7 @@ static int zend_jit_tail_handler(dasm_State **Dst, const zend_op *opline) | ldp x29, x30, [sp], # SPAD // stack alignment } else { | mov FCARG1x, FP - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment } | EXT_JMP handler, REG0 @@ -4972,7 +4972,7 @@ static int zend_jit_concat_helper(dasm_State **Dst, } | LOAD_ZVAL_ADDR FCARG2x, op2_addr | EXT_CALL zend_jit_fast_assign_concat_helper, REG0 - /* concatination with itself may reduce refcount */ + /* concatenation with itself may reduce refcount */ op2_info |= MAY_BE_RC1; } else { if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { @@ -4986,7 +4986,7 @@ static int zend_jit_concat_helper(dasm_State **Dst, | EXT_CALL zend_jit_fast_concat_tmp_helper, REG0 } } - /* concatination with empty string may increase refcount */ + /* concatenation with empty string may increase refcount */ op2_info |= MAY_BE_RCN; | FREE_OP op2_type, op2, op2_info, 0, opline, ZREG_TMP1, ZREG_TMP2 |5: @@ -5011,7 +5011,7 @@ static int zend_jit_concat_helper(dasm_State **Dst, | LOAD_ZVAL_ADDR CARG3, op2_addr | SET_EX_OPLINE opline, REG0 | EXT_CALL concat_function, REG0 - /* concatination with empty string may increase refcount */ + /* concatenation with empty string may increase refcount */ op1_info |= MAY_BE_RCN; op2_info |= MAY_BE_RCN; | FREE_OP op1_type, op1, op1_info, 0, NULL, ZREG_TMP1, ZREG_TMP2 @@ -9528,7 +9528,7 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend | ldp x29, x30, [sp], # SPAD // stack alignment | JMP_IP TMP1 } else { - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #1 // ZEND_VM_ENTER | ret @@ -10865,7 +10865,7 @@ static int zend_jit_leave_func(dasm_State **Dst, // the value of execute_data in execute_ex() | NIY // TODO #else - | ldp FP, RX, T2 // retore FP and IP + | ldp FP, RX, T2 // restore FP and IP | ldp x29, x30, [sp], # NR_SPAD // stack alignment | mov RETVALx, #2 // ZEND_VM_LEAVE ???? | ret @@ -14832,7 +14832,7 @@ static bool zend_jit_fetch_indirect_var(dasm_State **Dst, const zend_op *opline, | IF_NOT_ZVAL_TYPE var_addr, IS_INDIRECT, &exit_addr, ZREG_TMP1 | GET_ZVAL_PTR FCARG1x, var_addr, TMP1 } else { - /* May be already loaded into FCARG1a or RAX by previus FETCH_OBJ_W/DIM_W */ + /* May be already loaded into FCARG1a or RAX by previous FETCH_OBJ_W/DIM_W */ if (opline->op1_type != IS_VAR || (opline-1)->result_type != IS_VAR || (opline-1)->result.var != opline->op1.var || diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index ab3faca7e05dc..b941447f86103 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -7854,7 +7854,7 @@ int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registers_buf zend_jit_trace_info *t = &zend_jit_traces[trace_num]; int repeat_last_opline = 0; - /* Deoptimizatoion of VM stack state */ + /* Deoptimization of VM stack state */ uint32_t i; uint32_t stack_size = t->exit_info[exit_num].stack_size; zend_jit_trace_stack *stack = t->stack_map + t->exit_info[exit_num].stack_offset; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 825a58207822d..bc5c298650e2f 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -5425,7 +5425,7 @@ static int zend_jit_concat_helper(dasm_State **Dst, } | LOAD_ZVAL_ADDR FCARG2a, op2_addr | EXT_CALL zend_jit_fast_assign_concat_helper, r0 - /* concatination with itself may reduce refcount */ + /* concatenation with itself may reduce refcount */ op2_info |= MAY_BE_RC1; } else { if (Z_REG(res_addr) != ZREG_FCARG1 || Z_OFFSET(res_addr) != 0) { @@ -5447,7 +5447,7 @@ static int zend_jit_concat_helper(dasm_State **Dst, | add r4, 12 |.endif } - /* concatination with empty string may increase refcount */ + /* concatenation with empty string may increase refcount */ op2_info |= MAY_BE_RCN; | FREE_OP op2_type, op2, op2_info, 0, opline |5: @@ -5481,7 +5481,7 @@ static int zend_jit_concat_helper(dasm_State **Dst, |.if not(X64) | add r4, 12 |.endif - /* concatination with empty string may increase refcount */ + /* concatenation with empty string may increase refcount */ op1_info |= MAY_BE_RCN; op2_info |= MAY_BE_RCN; | FREE_OP op1_type, op1, op1_info, 0, NULL @@ -15700,7 +15700,7 @@ static bool zend_jit_fetch_indirect_var(dasm_State **Dst, const zend_op *opline, | IF_NOT_ZVAL_TYPE var_addr, IS_INDIRECT, &exit_addr | GET_ZVAL_PTR FCARG1a, var_addr } else { - /* May be already loaded into FCARG1a or RAX by previus FETCH_OBJ_W/DIM_W */ + /* May be already loaded into FCARG1a or RAX by previous FETCH_OBJ_W/DIM_W */ if (opline->op1_type != IS_VAR || (opline-1)->result_type != IS_VAR || (opline-1)->result.var != opline->op1.var || diff --git a/ext/opcache/tests/jit/and_001.phpt b/ext/opcache/tests/jit/and_001.phpt index f44bb4e13fb87..273310f1f5efd 100644 --- a/ext/opcache/tests/jit/and_001.phpt +++ b/ext/opcache/tests/jit/and_001.phpt @@ -1,5 +1,5 @@ --TEST-- -JIT BW_AND: 001 (emty string) +JIT BW_AND: 001 (empty string) --INI-- opcache.enable=1 opcache.enable_cli=1 diff --git a/ext/opcache/tests/jit/assign_045.phpt b/ext/opcache/tests/jit/assign_045.phpt index 6c5c204f66f4f..f9e7d31db5d2f 100644 --- a/ext/opcache/tests/jit/assign_045.phpt +++ b/ext/opcache/tests/jit/assign_045.phpt @@ -1,5 +1,5 @@ --TEST-- -JIT ASSIGN: incorrect assumption about in-memeory zval type +JIT ASSIGN: incorrect assumption about in-memory zval type --INI-- opcache.enable=1 opcache.enable_cli=1 diff --git a/ext/opcache/tests/jit/assign_046.phpt b/ext/opcache/tests/jit/assign_046.phpt index fe27bdd3a2933..201f619f11bdf 100644 --- a/ext/opcache/tests/jit/assign_046.phpt +++ b/ext/opcache/tests/jit/assign_046.phpt @@ -1,5 +1,5 @@ --TEST-- -JIT ASSIGN: incorrect assumption about in-memeory zval type +JIT ASSIGN: incorrect assumption about in-memory zval type --INI-- opcache.enable=1 opcache.enable_cli=1 diff --git a/ext/opcache/tests/jit/assign_dim_op_006.phpt b/ext/opcache/tests/jit/assign_dim_op_006.phpt index 075a6c34e95d9..0ed14cf9ae8ed 100644 --- a/ext/opcache/tests/jit/assign_dim_op_006.phpt +++ b/ext/opcache/tests/jit/assign_dim_op_006.phpt @@ -1,5 +1,5 @@ --TEST-- -JIT ASSIGN_DIM_OP 006: Cloberring array be user error handler +JIT ASSIGN_DIM_OP 006: Clobbering array be user error handler --INI-- opcache.enable=1 opcache.enable_cli=1 diff --git a/ext/opcache/tests/jit/fetch_r_001.phpt b/ext/opcache/tests/jit/fetch_r_001.phpt index db5b7ba42bd74..53b49a98d8922 100644 --- a/ext/opcache/tests/jit/fetch_r_001.phpt +++ b/ext/opcache/tests/jit/fetch_r_001.phpt @@ -1,5 +1,5 @@ --TEST-- -FETCH_R: 001 result reference counter may be decremented befor use +FETCH_R: 001 result reference counter may be decremented before use --INI-- opcache.enable=1 opcache.enable_cli=1 From 9a594174456b4c0938894a1e3ba61091222f6471 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sun, 19 Dec 2021 10:12:35 -0500 Subject: [PATCH 0288/1346] [skip ci] Document how to quickly check if jit .dasc files transpile, how to test the jit in different architectures. (#7768) --- ext/opcache/jit/Dockerfile.arm64.example | 15 +++ ext/opcache/jit/README.md | 116 ++++++++++++++++++++++- sapi/fuzzer/README.md | 2 +- 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 ext/opcache/jit/Dockerfile.arm64.example diff --git a/ext/opcache/jit/Dockerfile.arm64.example b/ext/opcache/jit/Dockerfile.arm64.example new file mode 100644 index 0000000000000..e7b6a03b2db89 --- /dev/null +++ b/ext/opcache/jit/Dockerfile.arm64.example @@ -0,0 +1,15 @@ +# Force this to build with arm64 even when the host architecture is different. +# This requires that cross-compilation support be enabled with the steps in https://www.docker.com/blog/faster-multi-platform-builds-dockerfile-cross-compilation-guide/ +FROM --platform=arm64 ubuntu:20.04 +RUN apt-get update -y +# DEBIAN_FRONTEND=noninteractive is needed to stop the tzdata installation from hanging. +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get install -y tzdata +RUN apt-get install -y pkg-config build-essential autoconf bison re2c \ + libxml2-dev libsqlite3-dev + +ADD . /php-src/ +WORKDIR /php-src +RUN ./buildconf +# Compile a minimal debug build. --enable-debug adds runtime assertions and is slower than regular builds. +RUN ./configure --enable-debug --disable-all --enable-opcache && make clean && make -j$(nproc) diff --git a/ext/opcache/jit/README.md b/ext/opcache/jit/README.md index 2cc08d2827a23..3119f37811cf8 100644 --- a/ext/opcache/jit/README.md +++ b/ext/opcache/jit/README.md @@ -24,5 +24,119 @@ was almost 100 times slower, making it prohibitively expensive to use. [The unofficial DynASM Documentation](https://corsix.github.io/dynasm-doc/tutorial.html) has a tutorial, reference, and instruction listing. -`zend_jit_x86.dasc` gets automatically converted to `zend_jit_x86.c` by the bundled +In x86 builds, `zend_jit_x86.dasc` gets automatically converted to `zend_jit_x86.c` by the bundled `dynasm` during `make`. + +In arm64 builds, `zend_jit_arm64.dasc` gets automatically converted to `zend_jit_arm64.c` by the bundled +`dynasm` during `make`. + +Running tests of the JIT +------------------------ + +Then, to test the JIT, e.g. with opcache.jit=tracing, an example command +based on what is used to test in Azure CI: + +``` +make test TESTS="-d opcache.jit_buffer_size=16M -d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.protect_memory=1 -d opcache.jit=tracing --repeat 2 --show-diff -j$(nproc) ext/opcache Zend" +``` + +- `opcache.jit_buffer_size=16M` enables the JIT in tests by providing 16 megabytes of + memory to use with the JIT to test with. +- `opcache.protect_memory=1` will detect writing to memory that is meant to be + read-only, which is sometimes the cause of opcache bugs. +- `--repeat 2` is optional, but used in CI since some JIT bugs only show up after processing a + request multiple times (the first request compiles the trace and the second executes it) +- `-j$(nproc)` runs as many workers to run tests as there are CPUs. +- `ext/opcache/` and `Zend` are the folders with the tests to run, in this case opcache + and the Zend engine itself. If no folders are provided, all tests are run. + +When investigating test failures such as segmentation faults, +configuring the build of php with `--enable-address-sanitizer` to enable +[AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer) is often useful. + +Some of the time, adding `-m --show-mem` to the `TESTS` configuration is also useful to test with [valgrind](https://valgrind.org/) to detect out of bounds memory accesses. +Using valgrind is slower at detecting invalid memory read/writes than AddressSanitizer when running large numbers of tests, but does not require rebuilding php. + +Note that the JIT supports 3 different architectures: `X86_64`, `i386`, and `arm64`. + +Miscellaneous +------------- + +### Checking dasc files for in a different architecture + +The following command can be run to manually check if the modified `.dasc code` is at least transpilable +for an architecture you're not using, e.g.: + +For arm64: `ext/opcache/minilua ext/opcache/jit/dynasm/dynasm.lua -D ARM64=1 -o ext/opcache/jit/zend_jit_arm64.ignored.c ext/opcache/jit/zend_jit_arm64.dasc` + +For x86_64: `ext/opcache/minilua ext/opcache/jit/dynasm/dynasm.lua -D X64=1 -o ext/opcache/jit/zend_jit_x86.ignored.c ext/opcache/jit/zend_jit_x86.dasc` + +For i386 (i.e. 32-bit): `ext/opcache/minilua ext/opcache/jit/dynasm/dynasm.lua -o ext/opcache/jit/zend_jit_x86.ignored.c ext/opcache/jit/zend_jit_x86.dasc` + +### How to build 32-bit builds on x86_64 environments + +Refer to [../../../azure/i386](../../../azure/i386/apt.yml) for examples of +dependencies to install. + +If you are running this natively (outside of Docker or a VM): + +- Consider running in docker/a VM instead if you are unfamiliar with this. +- Avoid purging packages. +- Avoid `-y` - if the package manager warns you that the dependencies conflict + then **don't** try to force install them. + +#### Prerequisites for 32-bit builds + +This assumes you are using a Debian-based Linux distribution and have already +set up prerequisites for regular development. + +``` +sudo dpkg --add-architecture i386 +sudo apt-get update -y +# As well as anything else from azure/i386/apt.yml that you're testing locally +sudo apt-get install \ + gcc-multilib g++-multilib \ + libxml2-dev:i386 \ + libc6:i386 +``` + +#### Compiling 32-bit builds + +This assumes you are using a Debian-based Linux distribution and have already +set up prerequisites for 32-bit development. + +``` +export LDFLAGS=-L/usr/lib/i386-linux-gnu +export CFLAGS='-m32' +export CXXFLAGS='-m32' +export PKG_CONFIG=/usr/bin/i686-linux-gnu-pkg-config +./configure --disable-all --enable-opcache --build=i686-pc-linux-gnu +make -j$(nproc) +``` + +#### Running tests of the JIT on 32-bit builds + +See the section "Running tests of the JIT". + +### Testing the jit with arm64 on x86 computers + +https://www.docker.com/blog/faster-multi-platform-builds-dockerfile-cross-compilation-guide/ +may be useful for local development. + +Note that this is slower than compiling and testing natively. + +``` +# After following steps in https://www.docker.com/blog/faster-multi-platform-builds-dockerfile-cross-compilation-guide/ +cp .gitignore .dockerignore +echo .git >> .dockerignore + +docker build --network=host -t php-src-arm64-example -f ext/opcache/jit/Dockerfile.arm64.example . +docker run -it --rm php-src-arm64-example +``` + +Then, the docker image can be used to run tests with `make test`. +For example, to test `ext/opcache` in parallel with the tracing JIT enabled: + +``` +docker run -it php-src-arms-example make test TESTS="-d opcache.jit_buffer_size=16M -d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.protect_memory=1 -d opcache.jit=tracing --repeat 2 --show-diff -j$(nproc) ext/opcache" +``` diff --git a/sapi/fuzzer/README.md b/sapi/fuzzer/README.md index 2099a34bfbf40..63de20aa1ca76 100644 --- a/sapi/fuzzer/README.md +++ b/sapi/fuzzer/README.md @@ -1,7 +1,7 @@ Fuzzing SAPI for PHP -------------------- -The following `./configure` options can be used to enable the fuzzing SAPI, as well as all availablefuzzers. If you don't build the exif/json/mbstring extensions, fuzzers for these extensions will not be built. +The following `./configure` options can be used to enable the fuzzing SAPI, as well as all available fuzzers. If you don't build the exif/json/mbstring extensions, fuzzers for these extensions will not be built. ```sh CC=clang CXX=clang++ \ From 29696dd54b4a39f6c2acafbd947be41bfacd7e80 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 19 Dec 2021 15:38:30 +0100 Subject: [PATCH 0289/1346] Add triage label when removing feedback label --- .github/workflows/remove-needs-feedback.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/remove-needs-feedback.yml b/.github/workflows/remove-needs-feedback.yml index 6f8e5a3362cb1..8f6dfc47f1664 100644 --- a/.github/workflows/remove-needs-feedback.yml +++ b/.github/workflows/remove-needs-feedback.yml @@ -13,3 +13,6 @@ jobs: - uses: actions-ecosystem/action-remove-labels@v1 with: labels: "Status: Needs Feedback" + - uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Status: Needs Triage" From 3414ae6c0c4e66107a3d6a1a35119cede31803c4 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 10 Dec 2021 19:41:00 +0000 Subject: [PATCH 0290/1346] sockets: add SO_INCOMING_CPU constant get/set the cpu attached to a socket, no special treatment needed, it is simply an integer. Closes GH-7753. --- UPGRADING | 3 +++ ext/sockets/sockets.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/UPGRADING b/UPGRADING index b0a3fffb7add2..4d918a85bfc17 100644 --- a/UPGRADING +++ b/UPGRADING @@ -145,6 +145,9 @@ PHP 8.2 UPGRADE NOTES - COM_DOTNET: . LOCALE_NEUTRAL +- Sockets: + . SO_INCOMING_CPU + ======================================== 11. Changes to INI File Handling ======================================== diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 1df6eaa09d659..6b52bb5c7cc56 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -545,6 +545,9 @@ static PHP_MINIT_FUNCTION(sockets) #ifdef SO_MARK REGISTER_LONG_CONSTANT("SO_MARK", SO_MARK, CONST_CS | CONST_PERSISTENT); #endif +#ifdef SO_INCOMING_CPU + REGISTER_LONG_CONSTANT("SO_INCOMING_CPU", SO_INCOMING_CPU, CONST_CS | CONST_PERSISTENT); +#endif #ifdef TCP_NODELAY REGISTER_LONG_CONSTANT("TCP_NODELAY", TCP_NODELAY, CONST_CS | CONST_PERSISTENT); #endif From 32e2d97a265a3137eaa642857156e5d49521d846 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Mon, 20 Dec 2021 09:27:06 -0500 Subject: [PATCH 0291/1346] Allow internal functions to declare if they support compile-time evaluation, add functions. (#7780) https://wiki.php.net/rfc/strtolower-ascii means that these functions no longer depend on the current locale in php 8.2. Before that, this was unsafe to evaluate at compile time. Followup to GH-7506 Add strcmp/strcasecmp/strtolower/strtoupper functions Add bin2hex/hex2bin and related functions Update test of garbage collection using strtolower to use something else to create a refcounted string --- Zend/Optimizer/sccp.c | 60 ++------ Zend/tests/bug38623.phpt | 8 +- Zend/zend_API.h | 11 ++ Zend/zend_builtin_functions.stub.php | 4 + Zend/zend_builtin_functions_arginfo.h | 10 +- Zend/zend_compile.h | 5 +- build/gen_stub.php | 12 ++ ext/pcre/php_pcre.stub.php | 1 + ext/pcre/php_pcre_arginfo.h | 4 +- ext/standard/basic_functions.stub.php | 189 +++++++++++++++++++++---- ext/standard/basic_functions_arginfo.h | 140 +++++++++--------- 11 files changed, 290 insertions(+), 154 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index ff11daa8d3720..631037a2a8e8e 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -799,59 +799,21 @@ static inline zend_result ct_eval_array_key_exists(zval *result, zval *op1, zval return SUCCESS; } -static bool can_ct_eval_func_call(zend_string *name, uint32_t num_args, zval **args) { - /* Functions in this list must always produce the same result for the same arguments, +static bool can_ct_eval_func_call(zend_function *func, zend_string *name, uint32_t num_args, zval **args) { + /* Precondition: func->type == ZEND_INTERNAL_FUNCTION, this is a global function */ + /* Functions setting ZEND_ACC_COMPILE_TIME_EVAL (@compile-time-eval) must always produce the same result for the same arguments, * and have no dependence on global state (such as locales). It is okay if they throw * or warn on invalid arguments, as we detect this and will discard the evaluation result. */ - if (false - || zend_string_equals_literal(name, "array_diff") - || zend_string_equals_literal(name, "array_diff_assoc") - || zend_string_equals_literal(name, "array_diff_key") - || zend_string_equals_literal(name, "array_flip") - || zend_string_equals_literal(name, "array_is_list") - || zend_string_equals_literal(name, "array_key_exists") - || zend_string_equals_literal(name, "array_keys") - || zend_string_equals_literal(name, "array_merge") - || zend_string_equals_literal(name, "array_merge_recursive") - || zend_string_equals_literal(name, "array_replace") - || zend_string_equals_literal(name, "array_replace_recursive") - || zend_string_equals_literal(name, "array_unique") - || zend_string_equals_literal(name, "array_values") - || zend_string_equals_literal(name, "base64_decode") - || zend_string_equals_literal(name, "base64_encode") + if (func->common.fn_flags & ZEND_ACC_COMPILE_TIME_EVAL) { + /* This has @compile-time-eval in stub info and uses a macro such as ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE */ + return true; + } #ifndef ZEND_WIN32 - /* On Windows this function may be code page dependent. */ - || zend_string_equals_literal(name, "dirname") -#endif - || zend_string_equals_literal(name, "explode") - || zend_string_equals_literal(name, "imagetypes") - || zend_string_equals_literal(name, "in_array") - || zend_string_equals_literal(name, "implode") - || zend_string_equals_literal(name, "ltrim") - || zend_string_equals_literal(name, "php_sapi_name") - || zend_string_equals_literal(name, "php_uname") - || zend_string_equals_literal(name, "phpversion") - || zend_string_equals_literal(name, "pow") - || zend_string_equals_literal(name, "preg_quote") - || zend_string_equals_literal(name, "rawurldecode") - || zend_string_equals_literal(name, "rawurlencode") - || zend_string_equals_literal(name, "rtrim") - || zend_string_equals_literal(name, "serialize") - || zend_string_equals_literal(name, "str_contains") - || zend_string_equals_literal(name, "str_ends_with") - || zend_string_equals_literal(name, "str_replace") - || zend_string_equals_literal(name, "str_split") - || zend_string_equals_literal(name, "str_starts_with") - || zend_string_equals_literal(name, "strpos") - || zend_string_equals_literal(name, "strstr") - || zend_string_equals_literal(name, "substr") - || zend_string_equals_literal(name, "trim") - || zend_string_equals_literal(name, "urldecode") - || zend_string_equals_literal(name, "urlencode") - || zend_string_equals_literal(name, "version_compare") - ) { + /* On Windows this function may be code page dependent. */ + if (zend_string_equals_literal(name, "dirname")) { return true; } +#endif if (num_args == 2) { if (zend_string_equals_literal(name, "str_repeat")) { @@ -918,7 +880,7 @@ static inline zend_result ct_eval_func_call( } } - if (!can_ct_eval_func_call(name, num_args, args)) { + if (!can_ct_eval_func_call(func, name, num_args, args)) { return FAILURE; } diff --git a/Zend/tests/bug38623.phpt b/Zend/tests/bug38623.phpt index 873cdf42d4616..5060850054d10 100644 --- a/Zend/tests/bug38623.phpt +++ b/Zend/tests/bug38623.phpt @@ -2,8 +2,14 @@ Bug #38623 (leaks in a tricky code with switch() and exceptions) --FILE-- aliasType = $aliasType; $this->alias = $alias; $this->isDeprecated = $isDeprecated; + $this->supportsCompileTimeEval = $supportsCompileTimeEval; $this->verify = $verify; $this->args = $args; $this->return = $return; @@ -1155,6 +1159,10 @@ public function getFunctionEntry(): string { "\tZEND_NS_FE(\"%s\", %s, %s)\n", addslashes($namespace), $declarationName, $this->getArgInfoName()); } else { + if ($this->supportsCompileTimeEval) { + return sprintf( + "\tZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(%s, %s)\n", $declarationName, $this->getArgInfoName()); + } return sprintf("\tZEND_FE(%s, %s)\n", $declarationName, $this->getArgInfoName()); } } else { @@ -2232,6 +2240,7 @@ function parseFunctionLike( $aliasType = null; $alias = null; $isDeprecated = false; + $supportsCompileTimeEval = false; $verify = true; $docReturnType = null; $tentativeReturnType = false; @@ -2267,6 +2276,8 @@ function parseFunctionLike( $docParamTypes[$tag->getVariableName()] = $tag->getType(); } else if ($tag->name === 'refcount') { $refcount = $tag->getValue(); + } else if ($tag->name === 'compile-time-eval') { + $supportsCompileTimeEval = true; } } } @@ -2355,6 +2366,7 @@ function parseFunctionLike( $aliasType, $alias, $isDeprecated, + $supportsCompileTimeEval, $verify, $args, $return, diff --git a/ext/pcre/php_pcre.stub.php b/ext/pcre/php_pcre.stub.php index 498219b3c41e5..006e740008745 100644 --- a/ext/pcre/php_pcre.stub.php +++ b/ext/pcre/php_pcre.stub.php @@ -35,6 +35,7 @@ function preg_replace_callback_array(array $pattern, string|array $subject, int */ function preg_split(string $pattern, string $subject, int $limit = -1, int $flags = 0): array|false {} +/** @compile-time-eval */ function preg_quote(string $str, ?string $delimiter = null): string {} /** @refcount 1 */ diff --git a/ext/pcre/php_pcre_arginfo.h b/ext/pcre/php_pcre_arginfo.h index 96c8331c0d611..bb16a6079a2b5 100644 --- a/ext/pcre/php_pcre_arginfo.h +++ b/ext/pcre/php_pcre_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: bc6f31ac17d4f5d1a60dd3dad5f671058f40a224 */ + * Stub hash: 39a19378fb1f1aca34bfdd483f5d3095558f0e09 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_preg_match, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, pattern, IS_STRING, 0) @@ -84,7 +84,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(preg_replace_callback, arginfo_preg_replace_callback) ZEND_FE(preg_replace_callback_array, arginfo_preg_replace_callback_array) ZEND_FE(preg_split, arginfo_preg_split) - ZEND_FE(preg_quote, arginfo_preg_quote) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(preg_quote, arginfo_preg_quote) ZEND_FE(preg_grep, arginfo_preg_grep) ZEND_FE(preg_last_error, arginfo_preg_last_error) ZEND_FE(preg_last_error_msg, arginfo_preg_last_error_msg) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 1719b1453795a..51751b7776dac 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -126,8 +126,10 @@ function pos(array|object $array): mixed {} function key(array|object $array): int|string|null {} +/** @compile-time-eval */ function min(mixed $value, mixed ...$values): mixed {} +/** @compile-time-eval */ function max(mixed $value, mixed ...$values): mixed {} /** @return true */ @@ -136,8 +138,14 @@ function array_walk(array|object &$array, callable $callback, mixed $arg = UNKNO /** @return true */ function array_walk_recursive(array|object &$array, callable $callback, mixed $arg = UNKNOWN): bool {} +/** + * @compile-time-eval + */ function in_array(mixed $needle, array $haystack, bool $strict = false): bool {} +/** + * @compile-time-eval + */ function array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false {} /** @prefer-ref $array */ @@ -176,24 +184,48 @@ function array_splice(array &$array, int $offset, ?int $length = null, mixed $re function array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array {} +/** + * @compile-time-eval + */ function array_merge(array ...$arrays): array {} +/** + * @compile-time-eval + */ function array_merge_recursive(array ...$arrays): array {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function array_replace(array $array, array ...$replacements): array {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function array_replace_recursive(array $array, array ...$replacements): array {} -/** @return array */ +/** + * @return array + * @compile-time-eval + */ function array_keys(array $array, mixed $filter_value = UNKNOWN, bool $strict = false): array {} +/** + * @compile-time-eval + */ function array_key_first(array $array): int|string|null {} +/** + * @compile-time-eval + */ function array_key_last(array $array): int|string|null {} -/** @return array */ +/** + * @return array + * @compile-time-eval + */ function array_values(array $array): array {} /** @@ -213,12 +245,19 @@ function array_pad(array $array, int $length, mixed $value): array {} /** * @return array * @refcount 1 + * @compile-time-eval */ function array_flip(array $array): array {} -/** @refcount 1 */ +/** + * @refcount 1 + * @compile-time-eval + */ function array_change_key_case(array $array, int $case = CASE_LOWER): array {} +/** + * @compile-time-eval + */ function array_unique(array $array, int $flags = SORT_STRING): array {} /** @refcount 1 */ @@ -260,15 +299,22 @@ function array_intersect_uassoc(array $array, ...$rest): array {} */ function array_uintersect_uassoc(array $array, ...$rest): array {} -/** @refcount 1 */ +/** + * @refcount 1 + * @compile-time-eval + */ function array_diff_key(array $array, array ...$arrays): array {} /** * @param array|callable $rest * @refcount 1 + * @compile-time-eval */ function array_diff_ukey(array $array, ...$rest): array {} +/** + * @compile-time-eval + */ function array_diff(array $array, array ...$arrays): array {} /** @@ -277,7 +323,10 @@ function array_diff(array $array, array ...$arrays): array {} */ function array_udiff(array $array, ...$rest): array {} -/** @refcount 1 */ +/** + * @refcount 1 + * @compile-time-eval + */ function array_diff_assoc(array $array, array ...$arrays): array {} /** @@ -336,10 +385,16 @@ function array_is_list(array $array): bool {} /* base64.c */ -/** @refcount 1 */ +/** + * @refcount 1 + * @compile-time-eval + */ function base64_encode(string $string): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function base64_decode(string $string, bool $strict = false): string|false {} /* basic_functions.c */ @@ -517,6 +572,7 @@ function get_browser(?string $user_agent = null, bool $return_array = false): ob /* crc32.c */ +/** @compile-time-eval */ function crc32(string $string): int {} /* crypt.c */ @@ -708,10 +764,16 @@ function assert_options(int $option, mixed $value = UNKNOWN): mixed {} /* string.c */ -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function bin2hex(string $string): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function hex2bin(string $string): string|false {} function strspn(string $string, string $characters, int $offset = 0, ?int $length = null): int {} @@ -725,13 +787,16 @@ function nl_langinfo(int $item): string|false {} function strcoll(string $string1, string $string2): int {} +/** @compile-time-eval */ function trim(string $string, string $characters = " \n\r\t\v\0"): string {} +/** @compile-time-eval */ function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** @alias rtrim */ function chop(string $string, string $characters = " \n\r\t\v\0"): string {} +/** @compile-time-eval */ function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** @refcount 1 */ @@ -740,9 +805,13 @@ function wordwrap(string $string, int $width = 75, string $break = "\n", bool $c /** * @return array * @refcount 1 + * @compile-time-eval */ function explode(string $separator, string $string, int $limit = PHP_INT_MAX): array {} +/** + * @compile-time-eval + */ function implode(string|array $separator, ?array $array = null): string {} /** @alias implode */ @@ -751,8 +820,10 @@ function join(string|array $separator, ?array $array = null): string {} /** @refcount 1 */ function strtok(string $string, ?string $token = null): string|false {} +/** @compile-time-eval */ function strtoupper(string $string): string {} +/** @compile-time-eval */ function strtolower(string $string): string {} /** @refcount 1 */ @@ -776,26 +847,34 @@ function strstr(string $haystack, string $needle, bool $before_needle = false): /** @alias strstr */ function strchr(string $haystack, string $needle, bool $before_needle = false): string|false {} +/** @compile-time-eval */ function strpos(string $haystack, string $needle, int $offset = 0): int|false {} +/** @compile-time-eval */ function stripos(string $haystack, string $needle, int $offset = 0): int|false {} +/** @compile-time-eval */ function strrpos(string $haystack, string $needle, int $offset = 0): int|false {} +/** @compile-time-eval */ function strripos(string $haystack, string $needle, int $offset = 0): int|false {} /** @refcount 1 */ function strrchr(string $haystack, string $needle): string|false {} +/** @compile-time-eval */ function str_contains(string $haystack, string $needle): bool {} +/** @compile-time-eval */ function str_starts_with(string $haystack, string $needle): bool {} +/** @compile-time-eval */ function str_ends_with(string $haystack, string $needle): bool {} /** @refcount 1 */ function chunk_split(string $string, int $length = 76, string $separator = "\r\n"): string {} +/** @compile-time-eval */ function substr(string $string, int $offset, ?int $length = null): string {} /** @return string|array */ @@ -804,21 +883,33 @@ function substr_replace(array|string $string, array|string $replace, array|int $ /** @refcount 1 */ function quotemeta(string $string): string {} +/** @compile-time-eval */ function ord(string $character): int {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function chr(int $codepoint): string {} +/** @compile-time-eval */ function ucfirst(string $string): string {} +/** @compile-time-eval */ function lcfirst(string $string): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function ucwords(string $string, string $separators = " \t\r\n\f\v"): string {} function strtr(string $string, string|array $from, ?string $to = null): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function strrev(string $string): string {} /** @param float $percent */ @@ -837,12 +928,14 @@ function stripslashes(string $string): string {} /** * @param int $count * @return string|array + * @compile-time-eval */ function str_replace(array|string $search, array|string $replace, string|array $subject, &$count = null): string|array {} /** * @param int $count * @return string|array + * @compile-time-eval */ function str_ireplace(array|string $search, array|string $replace, string|array $subject, &$count = null): string|array {} @@ -913,6 +1006,7 @@ function str_word_count(string $string, int $format = 0, ?string $characters = n /** * @return array * @refcount 1 + * @compile-time-eval */ function str_split(string $string, int $length = 1): array {} @@ -1324,16 +1418,25 @@ function getimagesizefromstring(string $string, &$image_info = null): array|fals /** @return true */ function phpinfo(int $flags = INFO_ALL): bool {} // make return type void -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function phpversion(?string $extension = null): string|false {} /** @return true */ -function phpcredits(int $flags = CREDITS_ALL): bool {} // make return type void +function phpcredits(int $flags = CREDITS_ALL): bool {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function php_sapi_name(): string|false {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function php_uname(string $mode = "a"): string {} /** @refcount 1 */ @@ -1414,16 +1517,22 @@ function expm1(float $num): float {} function log1p(float $num): float {} +/** @compile-time-eval */ function pi(): float {} +/** @compile-time-eval */ function is_finite(float $num): bool {} +/** @compile-time-eval */ function is_nan(float $num): bool {} +/** @compile-time-eval */ function intdiv(int $num1, int $num2): int {} +/** @compile-time-eval */ function is_infinite(float $num): bool {} +/** @compile-time-eval */ function pow(mixed $num, mixed $exponent): int|float|object {} function exp(float $num): float {} @@ -1440,19 +1549,31 @@ function deg2rad(float $num): float {} function rad2deg(float $num): float {} +/** @compile-time-eval */ function bindec(string $binary_string): int|float {} +/** @compile-time-eval */ function hexdec(string $hex_string): int|float {} +/** @compile-time-eval */ function octdec(string $octal_string): int|float {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function decbin(int $num): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function decoct(int $num): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function dechex(int $num): string {} /** @refcount 1 */ @@ -1847,16 +1968,28 @@ function uniqid(string $prefix = "", bool $more_entropy = false): string {} */ function parse_url(https://redirect.github.com/string%20$url,%20int%20$component%20=%20-1): int|string|array|null|false {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function urlencode(string $string): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function urldecode(string $string): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function rawurlencode(string $string): string {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function rawurldecode(string $string): string {} /** @@ -1911,7 +2044,10 @@ function var_export(mixed $value, bool $return = false): ?string {} function debug_zval_dump(mixed $value, mixed ...$values): void {} -/** @refcount 1 */ +/** + * @compile-time-eval + * @refcount 1 + */ function serialize(mixed $value): string {} function unserialize(string $data, array $options = []): mixed {} @@ -1922,6 +2058,7 @@ function memory_get_peak_usage(bool $real_usage = false): int {} /* versioning.c */ +/** @compile-time-eval */ function version_compare(string $version1, string $version2, ?string $operator = null): int|bool {} /* win32/codepage.c */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index ab7776d630919..155266c5d436d 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 96393b26861733e5c7fc9a12095a29c07ed73928 */ + * Stub hash: 0191861a660a4055650879e5a0dafd0853a6776b */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2888,12 +2888,12 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(current, arginfo_current) ZEND_FALIAS(pos, current, arginfo_pos) ZEND_FE(key, arginfo_key) - ZEND_FE(min, arginfo_min) - ZEND_FE(max, arginfo_max) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(min, arginfo_min) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(max, arginfo_max) ZEND_FE(array_walk, arginfo_array_walk) ZEND_FE(array_walk_recursive, arginfo_array_walk_recursive) - ZEND_FE(in_array, arginfo_in_array) - ZEND_FE(array_search, arginfo_array_search) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(in_array, arginfo_in_array) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_search, arginfo_array_search) ZEND_FE(extract, arginfo_extract) ZEND_FE(compact, arginfo_compact) ZEND_FE(array_fill, arginfo_array_fill) @@ -2905,21 +2905,21 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(array_unshift, arginfo_array_unshift) ZEND_FE(array_splice, arginfo_array_splice) ZEND_FE(array_slice, arginfo_array_slice) - ZEND_FE(array_merge, arginfo_array_merge) - ZEND_FE(array_merge_recursive, arginfo_array_merge_recursive) - ZEND_FE(array_replace, arginfo_array_replace) - ZEND_FE(array_replace_recursive, arginfo_array_replace_recursive) - ZEND_FE(array_keys, arginfo_array_keys) - ZEND_FE(array_key_first, arginfo_array_key_first) - ZEND_FE(array_key_last, arginfo_array_key_last) - ZEND_FE(array_values, arginfo_array_values) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_merge, arginfo_array_merge) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_merge_recursive, arginfo_array_merge_recursive) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_replace, arginfo_array_replace) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_replace_recursive, arginfo_array_replace_recursive) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_keys, arginfo_array_keys) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_key_first, arginfo_array_key_first) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_key_last, arginfo_array_key_last) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_values, arginfo_array_values) ZEND_FE(array_count_values, arginfo_array_count_values) ZEND_FE(array_column, arginfo_array_column) ZEND_FE(array_reverse, arginfo_array_reverse) ZEND_FE(array_pad, arginfo_array_pad) - ZEND_FE(array_flip, arginfo_array_flip) - ZEND_FE(array_change_key_case, arginfo_array_change_key_case) - ZEND_FE(array_unique, arginfo_array_unique) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_flip, arginfo_array_flip) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_change_key_case, arginfo_array_change_key_case) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_unique, arginfo_array_unique) ZEND_FE(array_intersect_key, arginfo_array_intersect_key) ZEND_FE(array_intersect_ukey, arginfo_array_intersect_ukey) ZEND_FE(array_intersect, arginfo_array_intersect) @@ -2928,11 +2928,11 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(array_uintersect_assoc, arginfo_array_uintersect_assoc) ZEND_FE(array_intersect_uassoc, arginfo_array_intersect_uassoc) ZEND_FE(array_uintersect_uassoc, arginfo_array_uintersect_uassoc) - ZEND_FE(array_diff_key, arginfo_array_diff_key) - ZEND_FE(array_diff_ukey, arginfo_array_diff_ukey) - ZEND_FE(array_diff, arginfo_array_diff) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff_key, arginfo_array_diff_key) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff_ukey, arginfo_array_diff_ukey) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff, arginfo_array_diff) ZEND_FE(array_udiff, arginfo_array_udiff) - ZEND_FE(array_diff_assoc, arginfo_array_diff_assoc) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(array_diff_assoc, arginfo_array_diff_assoc) ZEND_FE(array_diff_uassoc, arginfo_array_diff_uassoc) ZEND_FE(array_udiff_assoc, arginfo_array_udiff_assoc) ZEND_FE(array_udiff_uassoc, arginfo_array_udiff_uassoc) @@ -2948,8 +2948,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(array_chunk, arginfo_array_chunk) ZEND_FE(array_combine, arginfo_array_combine) ZEND_FE(array_is_list, arginfo_array_is_list) - ZEND_FE(base64_encode, arginfo_base64_encode) - ZEND_FE(base64_decode, arginfo_base64_decode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(base64_encode, arginfo_base64_encode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(base64_decode, arginfo_base64_decode) ZEND_FE(constant, arginfo_constant) ZEND_FE(ip2long, arginfo_ip2long) ZEND_FE(long2ip, arginfo_long2ip) @@ -3017,7 +3017,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(sys_getloadavg, arginfo_sys_getloadavg) #endif ZEND_FE(get_browser, arginfo_get_browser) - ZEND_FE(crc32, arginfo_crc32) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(crc32, arginfo_crc32) ZEND_FE(crypt, arginfo_crypt) #if HAVE_STRPTIME ZEND_DEP_FE(strptime, arginfo_strptime) @@ -3090,57 +3090,57 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(get_html_translation_table, arginfo_get_html_translation_table) ZEND_FE(assert, arginfo_assert) ZEND_FE(assert_options, arginfo_assert_options) - ZEND_FE(bin2hex, arginfo_bin2hex) - ZEND_FE(hex2bin, arginfo_hex2bin) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(bin2hex, arginfo_bin2hex) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hex2bin, arginfo_hex2bin) ZEND_FE(strspn, arginfo_strspn) ZEND_FE(strcspn, arginfo_strcspn) #if HAVE_NL_LANGINFO ZEND_FE(nl_langinfo, arginfo_nl_langinfo) #endif ZEND_FE(strcoll, arginfo_strcoll) - ZEND_FE(trim, arginfo_trim) - ZEND_FE(rtrim, arginfo_rtrim) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(trim, arginfo_trim) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rtrim, arginfo_rtrim) ZEND_FALIAS(chop, rtrim, arginfo_chop) - ZEND_FE(ltrim, arginfo_ltrim) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ltrim, arginfo_ltrim) ZEND_FE(wordwrap, arginfo_wordwrap) - ZEND_FE(explode, arginfo_explode) - ZEND_FE(implode, arginfo_implode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(explode, arginfo_explode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(implode, arginfo_implode) ZEND_FALIAS(join, implode, arginfo_join) ZEND_FE(strtok, arginfo_strtok) - ZEND_FE(strtoupper, arginfo_strtoupper) - ZEND_FE(strtolower, arginfo_strtolower) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strtoupper, arginfo_strtoupper) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strtolower, arginfo_strtolower) ZEND_FE(basename, arginfo_basename) ZEND_FE(dirname, arginfo_dirname) ZEND_FE(pathinfo, arginfo_pathinfo) ZEND_FE(stristr, arginfo_stristr) ZEND_FE(strstr, arginfo_strstr) ZEND_FALIAS(strchr, strstr, arginfo_strchr) - ZEND_FE(strpos, arginfo_strpos) - ZEND_FE(stripos, arginfo_stripos) - ZEND_FE(strrpos, arginfo_strrpos) - ZEND_FE(strripos, arginfo_strripos) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strpos, arginfo_strpos) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(stripos, arginfo_stripos) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strrpos, arginfo_strrpos) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strripos, arginfo_strripos) ZEND_FE(strrchr, arginfo_strrchr) - ZEND_FE(str_contains, arginfo_str_contains) - ZEND_FE(str_starts_with, arginfo_str_starts_with) - ZEND_FE(str_ends_with, arginfo_str_ends_with) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_contains, arginfo_str_contains) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_starts_with, arginfo_str_starts_with) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_ends_with, arginfo_str_ends_with) ZEND_FE(chunk_split, arginfo_chunk_split) - ZEND_FE(substr, arginfo_substr) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(substr, arginfo_substr) ZEND_FE(substr_replace, arginfo_substr_replace) ZEND_FE(quotemeta, arginfo_quotemeta) - ZEND_FE(ord, arginfo_ord) - ZEND_FE(chr, arginfo_chr) - ZEND_FE(ucfirst, arginfo_ucfirst) - ZEND_FE(lcfirst, arginfo_lcfirst) - ZEND_FE(ucwords, arginfo_ucwords) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ord, arginfo_ord) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(chr, arginfo_chr) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ucfirst, arginfo_ucfirst) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(lcfirst, arginfo_lcfirst) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(ucwords, arginfo_ucwords) ZEND_FE(strtr, arginfo_strtr) - ZEND_FE(strrev, arginfo_strrev) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(strrev, arginfo_strrev) ZEND_FE(similar_text, arginfo_similar_text) ZEND_FE(addcslashes, arginfo_addcslashes) ZEND_FE(addslashes, arginfo_addslashes) ZEND_FE(stripcslashes, arginfo_stripcslashes) ZEND_FE(stripslashes, arginfo_stripslashes) - ZEND_FE(str_replace, arginfo_str_replace) - ZEND_FE(str_ireplace, arginfo_str_ireplace) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_replace, arginfo_str_replace) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_ireplace, arginfo_str_ireplace) ZEND_FE(hebrev, arginfo_hebrev) ZEND_FE(nl2br, arginfo_nl2br) ZEND_FE(strip_tags, arginfo_strip_tags) @@ -3158,7 +3158,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(str_rot13, arginfo_str_rot13) ZEND_FE(str_shuffle, arginfo_str_shuffle) ZEND_FE(str_word_count, arginfo_str_word_count) - ZEND_FE(str_split, arginfo_str_split) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(str_split, arginfo_str_split) ZEND_FE(strpbrk, arginfo_strpbrk) ZEND_FE(substr_compare, arginfo_substr_compare) ZEND_FE(utf8_encode, arginfo_utf8_encode) @@ -3278,10 +3278,10 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(getimagesize, arginfo_getimagesize) ZEND_FE(getimagesizefromstring, arginfo_getimagesizefromstring) ZEND_FE(phpinfo, arginfo_phpinfo) - ZEND_FE(phpversion, arginfo_phpversion) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(phpversion, arginfo_phpversion) ZEND_FE(phpcredits, arginfo_phpcredits) - ZEND_FE(php_sapi_name, arginfo_php_sapi_name) - ZEND_FE(php_uname, arginfo_php_uname) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_sapi_name, arginfo_php_sapi_name) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_uname, arginfo_php_uname) ZEND_FE(php_ini_scanned_files, arginfo_php_ini_scanned_files) ZEND_FE(php_ini_loaded_file, arginfo_php_ini_loaded_file) ZEND_FE(iptcembed, arginfo_iptcembed) @@ -3319,12 +3319,12 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(acosh, arginfo_acosh) ZEND_FE(expm1, arginfo_expm1) ZEND_FE(log1p, arginfo_log1p) - ZEND_FE(pi, arginfo_pi) - ZEND_FE(is_finite, arginfo_is_finite) - ZEND_FE(is_nan, arginfo_is_nan) - ZEND_FE(intdiv, arginfo_intdiv) - ZEND_FE(is_infinite, arginfo_is_infinite) - ZEND_FE(pow, arginfo_pow) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pi, arginfo_pi) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_finite, arginfo_is_finite) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_nan, arginfo_is_nan) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(intdiv, arginfo_intdiv) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_infinite, arginfo_is_infinite) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pow, arginfo_pow) ZEND_FE(exp, arginfo_exp) ZEND_FE(log, arginfo_log) ZEND_FE(log10, arginfo_log10) @@ -3332,12 +3332,12 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(hypot, arginfo_hypot) ZEND_FE(deg2rad, arginfo_deg2rad) ZEND_FE(rad2deg, arginfo_rad2deg) - ZEND_FE(bindec, arginfo_bindec) - ZEND_FE(hexdec, arginfo_hexdec) - ZEND_FE(octdec, arginfo_octdec) - ZEND_FE(decbin, arginfo_decbin) - ZEND_FE(decoct, arginfo_decoct) - ZEND_FE(dechex, arginfo_dechex) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(bindec, arginfo_bindec) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hexdec, arginfo_hexdec) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(octdec, arginfo_octdec) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decbin, arginfo_decbin) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decoct, arginfo_decoct) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(dechex, arginfo_dechex) ZEND_FE(base_convert, arginfo_base_convert) ZEND_FE(number_format, arginfo_number_format) ZEND_FE(fmod, arginfo_fmod) @@ -3459,10 +3459,10 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(uniqid, arginfo_uniqid) #endif ZEND_FE(parse_url, arginfo_parse_url) - ZEND_FE(urlencode, arginfo_urlencode) - ZEND_FE(urldecode, arginfo_urldecode) - ZEND_FE(rawurlencode, arginfo_rawurlencode) - ZEND_FE(rawurldecode, arginfo_rawurldecode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urlencode, arginfo_urlencode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urldecode, arginfo_urldecode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurlencode, arginfo_rawurlencode) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurldecode, arginfo_rawurldecode) ZEND_FE(get_headers, arginfo_get_headers) ZEND_FE(stream_bucket_make_writeable, arginfo_stream_bucket_make_writeable) ZEND_FE(stream_bucket_prepend, arginfo_stream_bucket_prepend) @@ -3475,11 +3475,11 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(var_dump, arginfo_var_dump) ZEND_FE(var_export, arginfo_var_export) ZEND_FE(debug_zval_dump, arginfo_debug_zval_dump) - ZEND_FE(serialize, arginfo_serialize) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(serialize, arginfo_serialize) ZEND_FE(unserialize, arginfo_unserialize) ZEND_FE(memory_get_usage, arginfo_memory_get_usage) ZEND_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage) - ZEND_FE(version_compare, arginfo_version_compare) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(version_compare, arginfo_version_compare) #if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set) #endif From d4920f42841b068a50cd681ef4b055ff4f94ab00 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 20 Dec 2021 18:12:10 +0000 Subject: [PATCH 0292/1346] Move ctype test out from Zend and into ctype extension --- {Zend => ext/ctype}/tests/lc_ctype_inheritance.phpt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {Zend => ext/ctype}/tests/lc_ctype_inheritance.phpt (100%) diff --git a/Zend/tests/lc_ctype_inheritance.phpt b/ext/ctype/tests/lc_ctype_inheritance.phpt similarity index 100% rename from Zend/tests/lc_ctype_inheritance.phpt rename to ext/ctype/tests/lc_ctype_inheritance.phpt From aa35499b1c6a7adfa5de453736a0f0626378f69a Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 21 Dec 2021 07:17:12 +0100 Subject: [PATCH 0293/1346] Use new param API in ext/pcntl (#7751) --- ext/pcntl/pcntl.c | 161 ++++++++++++++++++++++++++-------------------- 1 file changed, 92 insertions(+), 69 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 645b211952b9f..61fe69d123e93 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -521,9 +521,7 @@ PHP_FUNCTION(pcntl_fork) { pid_t id; - if (zend_parse_parameters_none() == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_NONE(); id = fork(); if (id == -1) { @@ -540,9 +538,9 @@ PHP_FUNCTION(pcntl_alarm) { zend_long seconds; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &seconds) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(seconds); + ZEND_PARSE_PARAMETERS_END(); RETURN_LONG((zend_long) alarm(seconds)); } @@ -592,9 +590,13 @@ PHP_FUNCTION(pcntl_waitpid) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lz", &pid, &z_status, &options, &z_rusage) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(2, 4) + Z_PARAM_LONG(pid) + Z_PARAM_ZVAL(z_status) + Z_PARAM_OPTIONAL + Z_PARAM_LONG(options) + Z_PARAM_ZVAL(z_rusage) + ZEND_PARSE_PARAMETERS_END(); status = zval_get_long(z_status); @@ -641,9 +643,12 @@ PHP_FUNCTION(pcntl_wait) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|lz", &z_status, &options, &z_rusage) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 3) + Z_PARAM_ZVAL(z_status) + Z_PARAM_OPTIONAL + Z_PARAM_LONG(options) + Z_PARAM_ZVAL(z_rusage) + ZEND_PARSE_PARAMETERS_END(); status = zval_get_long(z_status); #ifdef HAVE_WAIT3 @@ -689,9 +694,9 @@ PHP_FUNCTION(pcntl_wifexited) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef WIFEXITED int int_status_word = (int) status_word; @@ -709,9 +714,9 @@ PHP_FUNCTION(pcntl_wifstopped) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef WIFSTOPPED int int_status_word = (int) status_word; @@ -729,9 +734,9 @@ PHP_FUNCTION(pcntl_wifsignaled) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef WIFSIGNALED int int_status_word = (int) status_word; @@ -743,14 +748,15 @@ PHP_FUNCTION(pcntl_wifsignaled) RETURN_FALSE; } /* }}} */ + /* {{{ Returns true if the child status code represents a process that was resumed due to a SIGCONT signal */ PHP_FUNCTION(pcntl_wifcontinued) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef HAVE_WCONTINUED int int_status_word = (int) status_word; @@ -768,9 +774,9 @@ PHP_FUNCTION(pcntl_wexitstatus) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef WEXITSTATUS int int_status_word = (int) status_word; @@ -786,9 +792,9 @@ PHP_FUNCTION(pcntl_wtermsig) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef WTERMSIG int int_status_word = (int) status_word; @@ -804,9 +810,9 @@ PHP_FUNCTION(pcntl_wstopsig) { zend_long status_word; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &status_word) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(status_word) + ZEND_PARSE_PARAMETERS_END(); #ifdef WSTOPSIG int int_status_word = (int) status_word; @@ -833,9 +839,12 @@ PHP_FUNCTION(pcntl_exec) size_t path_len; zend_ulong key_num; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|aa", &path, &path_len, &args, &envs) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 3) + Z_PARAM_PATH(path, path_len) + Z_PARAM_OPTIONAL + Z_PARAM_ARRAY(args) + Z_PARAM_ARRAY(envs) + ZEND_PARSE_PARAMETERS_END(); if (ZEND_NUM_ARGS() > 1) { /* Build argument list */ @@ -932,9 +941,12 @@ PHP_FUNCTION(pcntl_signal) bool restart_syscalls_is_null = 1; char *error = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|b!", &signo, &handle, &restart_syscalls, &restart_syscalls_is_null) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(2, 3) + Z_PARAM_LONG(signo) + Z_PARAM_ZVAL(handle) + Z_PARAM_OPTIONAL + Z_PARAM_BOOL_OR_NULL(restart_syscalls, restart_syscalls_is_null) + ZEND_PARSE_PARAMETERS_END(); if (signo < 1) { zend_argument_value_error(1, "must be greater than or equal to 1"); @@ -1011,9 +1023,9 @@ PHP_FUNCTION(pcntl_signal_get_handler) zval *prev_handle; zend_long signo; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &signo) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(signo) + ZEND_PARSE_PARAMETERS_END(); if (signo < 1 || signo > 32) { zend_argument_value_error(1, "must be between 1 and 32"); @@ -1030,9 +1042,7 @@ PHP_FUNCTION(pcntl_signal_get_handler) /* {{{ Dispatch signals to signal handlers */ PHP_FUNCTION(pcntl_signal_dispatch) { - if (zend_parse_parameters_none() == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_NONE(); pcntl_signal_dispatch(); RETURN_TRUE; @@ -1047,9 +1057,12 @@ PHP_FUNCTION(pcntl_sigprocmask) zval *user_set, *user_oldset = NULL, *user_signo; sigset_t set, oldset; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|z", &how, &user_set, &user_oldset) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(2, 3) + Z_PARAM_LONG(how) + Z_PARAM_ARRAY(user_set) + Z_PARAM_OPTIONAL + Z_PARAM_ZVAL(user_oldset) + ZEND_PARSE_PARAMETERS_END(); if (sigemptyset(&set) != 0 || sigemptyset(&oldset) != 0) { PCNTL_G(last_error) = errno; @@ -1103,13 +1116,19 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{ struct timespec timeout; if (timedwait) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|zll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 4) + Z_PARAM_ARRAY(user_set) + Z_PARAM_OPTIONAL + Z_PARAM_ZVAL(user_siginfo) + Z_PARAM_LONG(tv_sec) + Z_PARAM_LONG(tv_nsec) + ZEND_PARSE_PARAMETERS_END(); } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z", &user_set, &user_siginfo) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 2) + Z_PARAM_ARRAY(user_set) + Z_PARAM_OPTIONAL + Z_PARAM_ZVAL(user_siginfo) + ZEND_PARSE_PARAMETERS_END(); } if (sigemptyset(&set) != 0) { @@ -1231,9 +1250,11 @@ PHP_FUNCTION(pcntl_getpriority) bool pid_is_null = 1; int pri; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!l", &pid, &pid_is_null, &who) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(0, 2) + Z_PARAM_OPTIONAL + Z_PARAM_LONG_OR_NULL(pid, pid_is_null) + Z_PARAM_LONG(who) + ZEND_PARSE_PARAMETERS_END(); /* needs to be cleared, since any returned value is valid */ errno = 0; @@ -1270,9 +1291,12 @@ PHP_FUNCTION(pcntl_setpriority) bool pid_is_null = 1; zend_long pri; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!l", &pri, &pid, &pid_is_null, &who) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 3) + Z_PARAM_LONG(pri) + Z_PARAM_OPTIONAL + Z_PARAM_LONG_OR_NULL(pid, pid_is_null) + Z_PARAM_LONG(who) + ZEND_PARSE_PARAMETERS_END(); if (setpriority(who, pid_is_null ? getpid() : pid, pri)) { PCNTL_G(last_error) = errno; @@ -1304,9 +1328,7 @@ PHP_FUNCTION(pcntl_setpriority) /* {{{ Retrieve the error number set by the last pcntl function which failed. */ PHP_FUNCTION(pcntl_get_last_error) { - if (zend_parse_parameters_none() == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_NONE(); RETURN_LONG(PCNTL_G(last_error)); } @@ -1317,9 +1339,9 @@ PHP_FUNCTION(pcntl_strerror) { zend_long error; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &error) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_LONG(error) + ZEND_PARSE_PARAMETERS_END(); RETURN_STRING(strerror(error)); } @@ -1437,9 +1459,10 @@ PHP_FUNCTION(pcntl_async_signals) { bool on, on_is_null = 1; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b!", &on, &on_is_null) == FAILURE) { - RETURN_THROWS(); - } + ZEND_PARSE_PARAMETERS_START(0, 1) + Z_PARAM_OPTIONAL + Z_PARAM_BOOL_OR_NULL(on, on_is_null) + ZEND_PARSE_PARAMETERS_END(); if (on_is_null) { RETURN_BOOL(PCNTL_G(async_signals)); From 1a4d2dd96276b14ecb456faeb98c354985102908 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 21 Dec 2021 06:18:11 +0000 Subject: [PATCH 0294/1346] zend alloc USE_ZEND_ALLOC_HUGE_PAGES option support on solaris based systems (#7789) --- Zend/zend_alloc.c | 20 ++++++++++++++------ configure.ac | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 12b4ce900e041..ace032e5e72d5 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -662,6 +662,18 @@ static zend_always_inline int zend_mm_bitset_is_free_range(zend_mm_bitset *bitse /* Chunks */ /**********/ +static zend_always_inline void zend_mm_hugepage(void* ptr, size_t size) +{ +#if defined(MADV_HUGEPAGE) + (void)madvise(ptr, size, MADV_HUGEPAGE); +#elif defined(HAVE_MEMCNTL) + struct memcntl_mha m = {.mha_cmd = MHA_MAPSIZE_VA, .mha_pagesize = ZEND_MM_CHUNK_SIZE, .mha_flags = 0}; + (void)memcntl(ptr, size, MC_HAT_ADVISE, (char *)&m, 0, 0); +#else + zend_error_noreturn(E_WARNING, "huge_pages: thp unsupported on this platform"); +#endif +} + static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment) { void *ptr = zend_mm_mmap(size); @@ -669,11 +681,9 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment) if (ptr == NULL) { return NULL; } else if (ZEND_MM_ALIGNED_OFFSET(ptr, alignment) == 0) { -#ifdef MADV_HUGEPAGE if (zend_mm_use_huge_pages) { - madvise(ptr, size, MADV_HUGEPAGE); + zend_mm_hugepage(ptr, size); } -#endif return ptr; } else { size_t offset; @@ -702,11 +712,9 @@ static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment) if (alignment > REAL_PAGE_SIZE) { zend_mm_munmap((char*)ptr + size, alignment - REAL_PAGE_SIZE); } -# ifdef MADV_HUGEPAGE if (zend_mm_use_huge_pages) { - madvise(ptr, size, MADV_HUGEPAGE); + zend_mm_hugepage(ptr, size); } -# endif #endif return ptr; } diff --git a/configure.ac b/configure.ac index db1cac4ca6018..6ad00bc22217c 100644 --- a/configure.ac +++ b/configure.ac @@ -587,6 +587,7 @@ inet_ntop \ inet_pton \ localtime_r \ lchown \ +memcntl \ memmove \ mkstemp \ mmap \ From ebace1d7d04a15d8eb3e88cee6c990b60b745ed4 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 21 Dec 2021 06:23:22 +0000 Subject: [PATCH 0295/1346] pcntl add ECAPMODE from FreeBSD (#7716) --- ext/pcntl/pcntl.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 61fe69d123e93..463dca61891cf 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -446,6 +446,9 @@ static void php_pcntl_register_errno_constants(INIT_FUNC_ARGS) #ifdef EUSERS REGISTER_PCNTL_ERRNO_CONSTANT(EUSERS); #endif +#ifdef ECAPMODE + REGISTER_PCNTL_ERRNO_CONSTANT(ECAPMODE); +#endif } static PHP_GINIT_FUNCTION(pcntl) From 3c73225125ea1ddd4c37d7ff93b73bce7089415f Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 21 Jul 2021 19:22:19 +0200 Subject: [PATCH 0296/1346] New internal interface for fast text conversion in mbstring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When converting text to/from wchars, mbstring makes one function call for each and every byte or wchar to be converted. Typically, each of these conversion functions contains a state machine, and its state has to be restored and then saved for every single one of these calls. It doesn't take much to see that this is grossly inefficient. Instead of converting one byte or wchar on each call, the new conversion functions will either fill up or drain a whole buffer of wchars on each call. In benchmarks, this is about 3-10× faster. Adding the new, faster conversion functions for all supported legacy text encodings still needs some work. Also, all the code which uses the old-style conversion functions needs to be converted to use the new ones. After that, the old code can be dropped. (The mailparse extension will also have to be fixed up so it will still compile.) --- ext/mbstring/libmbfl/filters/mbfilter_7bit.c | 2 + .../libmbfl/filters/mbfilter_base64.c | 2 + ext/mbstring/libmbfl/filters/mbfilter_big5.c | 8 +- .../libmbfl/filters/mbfilter_cp5022x.c | 12 +- .../libmbfl/filters/mbfilter_cp51932.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_cp932.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_cp936.c | 4 +- .../libmbfl/filters/mbfilter_euc_cn.c | 4 +- .../libmbfl/filters/mbfilter_euc_jp.c | 128 ++- .../libmbfl/filters/mbfilter_euc_jp_2004.c | 4 +- .../libmbfl/filters/mbfilter_euc_jp_win.c | 4 +- .../libmbfl/filters/mbfilter_euc_kr.c | 4 +- .../libmbfl/filters/mbfilter_euc_tw.c | 4 +- .../libmbfl/filters/mbfilter_gb18030.c | 4 +- .../libmbfl/filters/mbfilter_htmlent.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_hz.c | 4 +- .../libmbfl/filters/mbfilter_iso2022_jp_ms.c | 4 +- .../libmbfl/filters/mbfilter_iso2022_kr.c | 4 +- .../libmbfl/filters/mbfilter_iso2022jp_2004.c | 4 +- .../filters/mbfilter_iso2022jp_mobile.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_jis.c | 225 ++++- .../libmbfl/filters/mbfilter_qprint.c | 2 + .../libmbfl/filters/mbfilter_singlebyte.c | 766 +++++++++++------- ext/mbstring/libmbfl/filters/mbfilter_sjis.c | 119 ++- .../libmbfl/filters/mbfilter_sjis_2004.c | 4 +- .../libmbfl/filters/mbfilter_sjis_mac.c | 4 +- .../libmbfl/filters/mbfilter_sjis_mobile.c | 12 +- ext/mbstring/libmbfl/filters/mbfilter_ucs2.c | 133 ++- ext/mbstring/libmbfl/filters/mbfilter_ucs4.c | 140 +++- ext/mbstring/libmbfl/filters/mbfilter_uhc.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_utf16.c | 205 ++++- ext/mbstring/libmbfl/filters/mbfilter_utf32.c | 149 +++- ext/mbstring/libmbfl/filters/mbfilter_utf7.c | 283 ++++++- .../libmbfl/filters/mbfilter_utf7imap.c | 4 +- ext/mbstring/libmbfl/filters/mbfilter_utf8.c | 161 +++- .../libmbfl/filters/mbfilter_utf8_mobile.c | 16 +- .../libmbfl/filters/mbfilter_uuencode.c | 2 + ext/mbstring/libmbfl/mbfl/mbfilter.c | 95 ++- ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c | 4 +- ext/mbstring/libmbfl/mbfl/mbfilter_pass.c | 2 + ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c | 2 + ext/mbstring/libmbfl/mbfl/mbfl_convert.c | 93 +++ ext/mbstring/libmbfl/mbfl/mbfl_convert.h | 3 + ext/mbstring/libmbfl/mbfl/mbfl_encoding.h | 93 ++- ext/mbstring/mbstring.c | 12 +- ext/mbstring/tests/armscii8_encoding.phpt | 4 + ext/mbstring/tests/bug65045.phpt | 24 +- ext/mbstring/tests/cp1252_encoding.phpt | 4 + ext/mbstring/tests/cp1254_encoding.phpt | 4 + ext/mbstring/tests/cp850_encoding.phpt | 6 +- ext/mbstring/tests/cp866_encoding.phpt | 3 + ext/mbstring/tests/encoding_tests.inc | 8 + .../tests/illformed_utf_sequences.phpt | 1 - ext/mbstring/tests/iso2022jp_encoding.phpt | 1 + ext/mbstring/tests/iso8859_encodings.phpt | 4 + ext/mbstring/tests/koi8r_encoding.phpt | 3 + ext/mbstring/tests/koi8u_encoding.phpt | 3 + .../mb_substitute_character_variation2.phpt | 2 +- ext/mbstring/tests/utf_encodings.phpt | 38 +- 59 files changed, 2436 insertions(+), 414 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c index dbf8993128472..0a6fe78957084 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_7bit.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_7bit.c @@ -39,6 +39,8 @@ const mbfl_encoding mbfl_encoding_7bit = { NULL, MBFL_ENCTYPE_SBCS, NULL, + NULL, + NULL, NULL }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_base64.c b/ext/mbstring/libmbfl/filters/mbfilter_base64.c index 04161c94ab3bc..86700c84990da 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_base64.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_base64.c @@ -39,6 +39,8 @@ const mbfl_encoding mbfl_encoding_base64 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, NULL, + NULL, + NULL, NULL }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c index 561ab8c225ae0..2ba32ee04563d 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c @@ -63,7 +63,9 @@ const mbfl_encoding mbfl_encoding_big5 = { mblen_table_big5, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_big5_wchar, - &vtbl_wchar_big5 + &vtbl_wchar_big5, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_cp950 = { @@ -74,7 +76,9 @@ const mbfl_encoding mbfl_encoding_cp950 = { mblen_table_big5, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp950_wchar, - &vtbl_wchar_cp950 + &vtbl_wchar_cp950, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_big5_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index deb6e8ee0204f..a67b538bb4311 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -55,7 +55,9 @@ const mbfl_encoding mbfl_encoding_cp50220 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50220_wchar, - &vtbl_wchar_cp50220 + &vtbl_wchar_cp50220, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_cp50221 = { @@ -66,7 +68,9 @@ const mbfl_encoding mbfl_encoding_cp50221 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50221_wchar, - &vtbl_wchar_cp50221 + &vtbl_wchar_cp50221, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_cp50222 = { @@ -77,7 +81,9 @@ const mbfl_encoding mbfl_encoding_cp50222 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50222_wchar, - &vtbl_wchar_cp50222 + &vtbl_wchar_cp50222, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_cp50220_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c index c0069a93fb98b..2f7193462e025 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c @@ -65,7 +65,9 @@ const mbfl_encoding mbfl_encoding_cp51932 = { mblen_table_eucjp, 0, &vtbl_cp51932_wchar, - &vtbl_wchar_cp51932 + &vtbl_wchar_cp51932, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_cp51932_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c index 9c24fa64494f2..06ac6b22b26f2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c @@ -64,7 +64,9 @@ const mbfl_encoding mbfl_encoding_cp932 = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp932_wchar, - &vtbl_wchar_cp932 + &vtbl_wchar_cp932, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_cp932_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c index 22a759ee79ff4..f12523dedca2a 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c @@ -63,7 +63,9 @@ const mbfl_encoding mbfl_encoding_cp936 = { mblen_table_cp936, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp936_wchar, - &vtbl_wchar_cp936 + &vtbl_wchar_cp936, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_cp936_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c index 01c48e433eedd..0465a814ff3d8 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c @@ -63,7 +63,9 @@ const mbfl_encoding mbfl_encoding_euc_cn = { mblen_table_euccn, 0, &vtbl_euccn_wchar, - &vtbl_wchar_euccn + &vtbl_wchar_euccn, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_euccn_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c index 7dd095862ec87..d83c47bd67006 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c @@ -34,6 +34,8 @@ #include "unicode_table_jis.h" static int mbfl_filt_conv_eucjp_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_eucjp_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_eucjp(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -64,7 +66,9 @@ const mbfl_encoding mbfl_encoding_euc_jp = { mblen_table_eucjp, 0, &vtbl_eucjp_wchar, - &vtbl_wchar_eucjp + &vtbl_wchar_eucjp, + mb_eucjp_to_wchar, + mb_wchar_to_eucjp }; const struct mbfl_convert_vtbl vtbl_eucjp_wchar = { @@ -243,3 +247,125 @@ mbfl_filt_conv_wchar_eucjp(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_eucjp_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c >= 0xA1 && c <= 0xFE && p < e) { + /* JISX 0208 */ + unsigned char c2 = *p++; + if (c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int s = (c - 0xA1)*94 + c2 - 0xA1; + if (s < jisx0208_ucs_table_size) { + uint32_t w = jisx0208_ucs_table[s]; + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c == 0x8E && p < e) { + /* Kana */ + unsigned char c2 = *p++; + *out++ = (c2 >= 0xA1 && c2 <= 0xDF) ? 0xFEC0 + c2 : MBFL_BAD_INPUT; + } else if (c == 0x8F) { + /* JISX 0212 */ + if ((e - p) >= 2) { + unsigned char c2 = *p++; + unsigned char c3 = *p++; + if (c3 >= 0xA1 && c3 <= 0xFE && c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int s = (c2 - 0xA1)*94 + c3 - 0xA1; + if (s < jisx0212_ucs_table_size) { + uint32_t w = jisx0212_ucs_table[s]; + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + p = e; /* Jump to end of string */ + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_eucjp(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w == 0xAF) { /* U+00AF is MACRON */ + s = 0xA2B4; /* Use JIS X 0212 overline */ + } else if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } + + if (s == 0) { + if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else if (w == 0) { + out = mb_convert_buf_add(out, 0); + continue; + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_eucjp); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + } + + if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else if (s < 0x100) { + out = mb_convert_buf_add2(out, 0x8E, s); + } else if (s < 0x8080) { + out = mb_convert_buf_add2(out, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 3); + out = mb_convert_buf_add3(out, 0x8F, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c index 0709a9f12d075..e4f919304e2b8 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_2004.c @@ -43,7 +43,9 @@ const mbfl_encoding mbfl_encoding_eucjp2004 = { mblen_table_eucjp, 0, &vtbl_eucjp2004_wchar, - &vtbl_wchar_eucjp2004 + &vtbl_wchar_eucjp2004, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_eucjp2004_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c index 1209e63148f75..49e7f9dccd279 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c @@ -65,7 +65,9 @@ const mbfl_encoding mbfl_encoding_eucjp_win = { mblen_table_eucjp, 0, &vtbl_eucjpwin_wchar, - &vtbl_wchar_eucjpwin + &vtbl_wchar_eucjpwin, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_eucjpwin_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c index 8362138d15a13..70c4e3f9d5949 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c @@ -62,7 +62,9 @@ const mbfl_encoding mbfl_encoding_euc_kr = { mblen_table_euckr, 0, &vtbl_euckr_wchar, - &vtbl_wchar_euckr + &vtbl_wchar_euckr, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_euckr_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c index e2c3bceaa509a..f505ca17a3923 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c @@ -64,7 +64,9 @@ const mbfl_encoding mbfl_encoding_euc_tw = { mblen_table_euctw, 0, &vtbl_euctw_wchar, - &vtbl_wchar_euctw + &vtbl_wchar_euctw, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_euctw_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c index 4a8939523a5bf..00494daf358f0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c @@ -45,7 +45,9 @@ const mbfl_encoding mbfl_encoding_gb18030 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_gb18030_wchar, - &vtbl_wchar_gb18030 + &vtbl_wchar_gb18030, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_gb18030_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c index 3a7e879ceaab4..bf6a0ec2cc479 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_htmlent.c @@ -61,7 +61,9 @@ const mbfl_encoding mbfl_encoding_html_ent = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_html_wchar, - &vtbl_wchar_html + &vtbl_wchar_html, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_wchar_html = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.c b/ext/mbstring/libmbfl/filters/mbfilter_hz.c index 722d73dd40c64..3370cd93ef88b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_hz.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.c @@ -43,7 +43,9 @@ const mbfl_encoding mbfl_encoding_hz = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_hz_wchar, - &vtbl_wchar_hz + &vtbl_wchar_hz, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_hz_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c index 41d4088c475e8..f26cbbeb8aa97 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c @@ -46,7 +46,9 @@ const mbfl_encoding mbfl_encoding_2022jpms = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022jpms_wchar, - &vtbl_wchar_2022jpms + &vtbl_wchar_2022jpms, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_2022jpms_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c index f012656b1974b..cbb32bd635e3f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c @@ -47,7 +47,9 @@ const mbfl_encoding mbfl_encoding_2022kr = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022kr_wchar, - &vtbl_wchar_2022kr + &vtbl_wchar_2022kr, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_wchar_2022kr = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c index c54941f23dcbb..45b71a8a98bde 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_2004.c @@ -43,7 +43,9 @@ const mbfl_encoding mbfl_encoding_2022jp_2004 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022jp_2004_wchar, - &vtbl_wchar_2022jp_2004 + &vtbl_wchar_2022jp_2004, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_2022jp_2004_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c index 3d289f1191595..450ac0c932f8c 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c @@ -48,7 +48,9 @@ const mbfl_encoding mbfl_encoding_2022jp_kddi = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022jp_kddi_wchar, - &vtbl_wchar_2022jp_kddi + &vtbl_wchar_2022jp_kddi, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_2022jp_kddi_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.c b/ext/mbstring/libmbfl/filters/mbfilter_jis.c index 9de18964ccef2..b175743a4afbe 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_jis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.c @@ -34,6 +34,8 @@ #include "unicode_table_jis.h" static int mbfl_filt_conv_jis_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_iso2022jp_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_iso2022jp(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); const mbfl_encoding mbfl_encoding_jis = { mbfl_no_encoding_jis, @@ -43,7 +45,9 @@ const mbfl_encoding mbfl_encoding_jis = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_jis_wchar, - &vtbl_wchar_jis + &vtbl_wchar_jis, + mb_iso2022jp_to_wchar, + NULL }; const mbfl_encoding mbfl_encoding_2022jp = { @@ -54,7 +58,9 @@ const mbfl_encoding mbfl_encoding_2022jp = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_2022jp_wchar, - &vtbl_wchar_2022jp + &vtbl_wchar_2022jp, + mb_iso2022jp_to_wchar, + mb_wchar_to_iso2022jp }; const struct mbfl_convert_vtbl vtbl_jis_wchar = { @@ -446,3 +452,218 @@ mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter) return 0; } + +#define ASCII 0 +#define JISX_0201_LATIN 1 +#define JISX_0201_KANA 2 +#define JISX_0208 3 +#define JISX_0212 4 + +static size_t mb_iso2022jp_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c == 0x1B) { + /* ESC seen; this is an escape sequence */ + if ((e - p) < 2) { + *out++ = MBFL_BAD_INPUT; + continue; + } + + unsigned char c2 = *p++; + if (c2 == '$') { + unsigned char c3 = *p++; + if (c3 == '@' || c3 == 'B') { + *state = JISX_0208; + } else if (c3 == '(') { + if (p == e) { + *out++ = MBFL_BAD_INPUT; + break; + } + unsigned char c4 = *p++; + if (c4 == '@' || c4 == 'B') { + *state = JISX_0208; + } else if (c4 == 'D') { + *state = JISX_0212; + } else { + if ((limit - out) < 3) { + p -= 4; + break; + } + *out++ = MBFL_BAD_INPUT; + *out++ = '$'; + *out++ = '('; + p--; + } + } else { + if ((limit - out) < 2) { + p -= 3; + break; + } + *out++ = MBFL_BAD_INPUT; + *out++ = '$'; + p--; + } + } else if (c2 == '(') { + unsigned char c3 = *p++; + if (c3 == 'B' || c3 == 'H') { + *state = ASCII; + } else if (c3 == 'J') { + *state = JISX_0201_LATIN; + } else if (c3 == 'I') { + *state = JISX_0201_KANA; + } else { + if ((limit - out) < 2) { + p -= 3; + break; + } + *out++ = MBFL_BAD_INPUT; + *out++ = '('; + p--; + } + } else { + *out++ = MBFL_BAD_INPUT; + p--; + } + } else if (c == 0xE) { + /* "Kana In" marker; this is just for JIS-7/8, but we also accept it for ISO-2022-JP */ + *state = JISX_0201_KANA; + } else if (c == 0xF) { + /* "Kana Out" marker */ + *state = ASCII; + } else if (*state == JISX_0201_LATIN && c == 0x5C) { /* YEN SIGN */ + *out++ = 0xA5; + } else if (*state == JISX_0201_LATIN && c == 0x7E) { /* OVER LINE */ + *out++ = 0x203E; + } else if (*state == JISX_0201_KANA && c > 0x20 && c < 0x60) { + *out++ = 0xFF40 + c; + } else if (*state >= JISX_0208 && c > 0x20 && c < 0x7F) { + if (p == e) { + *out++ = MBFL_BAD_INPUT; + break; + } + unsigned char c2 = *p++; + if (c2 > 0x20 && c2 < 0x7F) { + unsigned int s = (c - 0x21)*94 + c2 - 0x21; + uint32_t w = 0; + if (*state == JISX_0208) { + if (s < jisx0208_ucs_table_size) { + w = jisx0208_ucs_table[s]; + } + if (!w) { + w = MBFL_BAD_INPUT; + } + } else { + if (s < jisx0212_ucs_table_size) { + w = jisx0212_ucs_table[s]; + } + if (!w) { + w = MBFL_BAD_INPUT; + } + } + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c < 0x80) { + *out++ = c; + } else if (c >= 0xA1 && c <= 0xDF) { + *out++ = 0xFEC0 + c; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_iso2022jp(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } + + if (s == 0) { + if (w == 0xA5) { /* YEN SIGN */ + s = 0x1005C; + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else if (w != 0) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_iso2022jp); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + } else if ((s >= 0x80 && s < 0x2121) || (s > 0x8080)) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_iso2022jp); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + + if (s < 0x80) { /* ASCII */ + if (buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + buf->state = ASCII; + } + out = mb_convert_buf_add(out, s); + } else if (s < 0x8080) { /* JIS X 0208 */ + if (buf->state != JISX_0208) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 5); + out = mb_convert_buf_add3(out, 0x1B, '$', 'B'); + buf->state = JISX_0208; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0x7F, s & 0x7F); + } else if (s < 0x10000) { /* JIS X 0212 */ + if (buf->state != JISX_0212) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 6); + out = mb_convert_buf_add4(out, 0x1B, '$', '(', 'D'); + buf->state = JISX_0212; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0x7F, s & 0x7F); + } else { /* X 0201 Latin */ + if (buf->state != JISX_0201_LATIN) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add3(out, 0x1B, '(', 'J'); + buf->state = JISX_0201_LATIN; + } + out = mb_convert_buf_add(out, s & 0x7F); + } + } + + if (end && buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 3); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c index 2c9e82348726d..8f3aa16b9c579 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_qprint.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_qprint.c @@ -41,6 +41,8 @@ const mbfl_encoding mbfl_encoding_qprint = { NULL, MBFL_ENCTYPE_GL_UNSAFE, NULL, + NULL, + NULL, NULL }; diff --git a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c index 43ab8a2e48718..2020bc3ab09d0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c @@ -16,16 +16,18 @@ #define CK(statement) do { if ((statement) < 0) return (-1); } while (0) +static inline uint32_t coalesce(uint32_t a, uint32_t b) +{ + return a ? a : b; +} + /* Helper for single-byte encodings which use a conversion table */ static int mbfl_conv_singlebyte_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[]) { if (c < tbl_min) { CK((*filter->output_function)(c, filter->data)); } else { - int s = tbl[c - tbl_min]; - if (!s) - s = MBFL_BAD_INPUT; - CK((*filter->output_function)(s, filter->data)); + CK((*filter->output_function)(coalesce(tbl[c - tbl_min], MBFL_BAD_INPUT), filter->data)); } return 0; } @@ -52,6 +54,8 @@ static int mbfl_conv_reverselookup_table(int c, mbfl_convert_filter *filter, int #define DEF_SB(id, name, mime_name, aliases) \ static int mbfl_filt_conv_##id##_wchar(int c, mbfl_convert_filter *filter); \ static int mbfl_filt_conv_wchar_##id(int c, mbfl_convert_filter *filter); \ + static size_t mb_##id##_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); \ + static void mb_wchar_to_##id(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); \ static const struct mbfl_convert_vtbl vtbl_##id##_wchar = { \ mbfl_no_encoding_##id, \ mbfl_no_encoding_wchar, \ @@ -78,7 +82,9 @@ static int mbfl_conv_reverselookup_table(int c, mbfl_convert_filter *filter, int NULL, \ MBFL_ENCTYPE_SBCS, \ &vtbl_##id##_wchar, \ - &vtbl_wchar_##id \ + &vtbl_wchar_##id, \ + mb_##id##_to_wchar, \ + mb_wchar_to_##id \ } /* For single-byte encodings which use a conversion table */ @@ -89,6 +95,41 @@ static int mbfl_conv_reverselookup_table(int c, mbfl_convert_filter *filter, int static int mbfl_filt_conv_wchar_##id(int c, mbfl_convert_filter *filter) { \ return mbfl_conv_reverselookup_table(c, filter, tbl_min, tbl); \ } \ + static size_t mb_##id##_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) \ + { \ + unsigned char *p = *in, *e = p + *in_len; \ + uint32_t *out = buf, *limit = buf + bufsize; \ + while (p < e && out < limit) { \ + unsigned char c = *p++; \ + *out++ = (c < tbl_min) ? c : coalesce(tbl[c - tbl_min], MBFL_BAD_INPUT); \ + } \ + *in_len = e - p; \ + *in = p; \ + return out - buf; \ + } \ + static void mb_wchar_to_##id(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) \ + { \ + unsigned char *out, *limit; \ + MB_CONVERT_BUF_LOAD(buf, out, limit); \ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); \ + while (len--) { \ + uint32_t w = *in++; \ + if (w < tbl_min) { \ + out = mb_convert_buf_add(out, w & 0xFF); \ + } else { \ + for (int i = 0; i < 256 - tbl_min; i++) { \ + if (w == tbl[i]) { \ + out = mb_convert_buf_add(out, i + tbl_min); \ + goto next_iteration; \ + } \ + } \ + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_##id); \ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); \ + next_iteration: ; \ + } \ + } \ + MB_CONVERT_BUF_STORE(buf, out, limit); \ + } \ DEF_SB(id, name, mime_name, aliases) /* The grand-daddy of them all: ASCII */ @@ -97,11 +138,7 @@ DEF_SB(ascii, "ASCII", "US-ASCII", ascii_aliases); static int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter) { - if (c < 0x80) { - CK((*filter->output_function)(c, filter->data)); - } else { - CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data)); - } + CK((*filter->output_function)((c < 0x80) ? c : MBFL_BAD_INPUT, filter->data)); return 0; } @@ -115,6 +152,40 @@ static int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter) return 0; } +static size_t mb_ascii_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + *out++ = (c < 0x80) ? c : MBFL_BAD_INPUT; + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_ascii(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + if (w < 0x80) { + out = mb_convert_buf_add(out, w & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_ascii); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + /* ISO-8859-X */ static const char *iso8859_1_aliases[] = {"ISO8859-1", "latin1", NULL}; @@ -135,260 +206,293 @@ static int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter) return 0; } +static size_t mb_8859_1_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + *out++ = *p++; + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_8859_1(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + if (w < 0x100) { + out = mb_convert_buf_add(out, w); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_8859_1); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + static const char *iso8859_2_aliases[] = {"ISO8859-2", "latin2", NULL}; static const unsigned short iso8859_2_ucs_table[] = { - 0X00A0, 0X0104, 0X02D8, 0X0141, 0X00A4, 0X013D, 0X015A, 0X00A7, - 0X00A8, 0X0160, 0X015E, 0X0164, 0X0179, 0X00AD, 0X017D, 0X017B, - 0X00B0, 0X0105, 0X02DB, 0X0142, 0X00B4, 0X013E, 0X015B, 0X02C7, - 0X00B8, 0X0161, 0X015F, 0X0165, 0X017A, 0X02DD, 0X017E, 0X017C, - 0X0154, 0X00C1, 0X00C2, 0X0102, 0X00C4, 0X0139, 0X0106, 0X00C7, - 0X010C, 0X00C9, 0X0118, 0X00CB, 0X011A, 0X00CD, 0X00CE, 0X010E, - 0X0110, 0X0143, 0X0147, 0X00D3, 0X00D4, 0X0150, 0X00D6, 0X00D7, - 0X0158, 0X016E, 0X00DA, 0X0170, 0X00DC, 0X00DD, 0X0162, 0X00DF, - 0X0155, 0X00E1, 0X00E2, 0X0103, 0X00E4, 0X013A, 0X0107, 0X00E7, - 0X010D, 0X00E9, 0X0119, 0X00EB, 0X011B, 0X00ED, 0X00EE, 0X010F, - 0X0111, 0X0144, 0X0148, 0X00F3, 0X00F4, 0X0151, 0X00F6, 0X00F7, - 0X0159, 0X016F, 0X00FA, 0X0171, 0X00FC, 0X00FD, 0X0163, 0X02D9 + 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, + 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, + 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, + 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 }; DEF_SB_TBL(8859_2, "ISO-8859-2", "ISO-8859-2", iso8859_2_aliases, 0xA0, iso8859_2_ucs_table); static const char *iso8859_3_aliases[] = {"ISO8859-3", "latin3", NULL}; static const unsigned short iso8859_3_ucs_table[] = { - 0X00A0, 0X0126, 0X02D8, 0X00A3, 0X00A4, 0X0000, 0X0124, 0X00A7, - 0X00A8, 0X0130, 0X015E, 0X011E, 0X0134, 0X00AD, 0X0000, 0X017B, - 0X00B0, 0X0127, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X0125, 0X00B7, - 0X00B8, 0X0131, 0X015F, 0X011F, 0X0135, 0X00BD, 0X0000, 0X017C, - 0X00C0, 0X00C1, 0X00C2, 0X0000, 0X00C4, 0X010A, 0X0108, 0X00C7, - 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, - 0X0000, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X0120, 0X00D6, 0X00D7, - 0X011C, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X016C, 0X015C, 0X00DF, - 0X00E0, 0X00E1, 0X00E2, 0X0000, 0X00E4, 0X010B, 0X0109, 0X00E7, - 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, - 0X0000, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X0121, 0X00F6, 0X00F7, - 0X011D, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X016D, 0X015D, 0X02D9 + 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, + 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B, + 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, + 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, + 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, + 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 }; DEF_SB_TBL(8859_3, "ISO-8859-3", "ISO-8859-3", iso8859_3_aliases, 0xA0, iso8859_3_ucs_table); static const char *iso8859_4_aliases[] = {"ISO8859-4", "latin4", NULL}; static const unsigned short iso8859_4_ucs_table[] = { - 0X00A0, 0X0104, 0X0138, 0X0156, 0X00A4, 0X0128, 0X013B, 0X00A7, - 0X00A8, 0X0160, 0X0112, 0X0122, 0X0166, 0X00AD, 0X017D, 0X00AF, - 0X00B0, 0X0105, 0X02DB, 0X0157, 0X00B4, 0X0129, 0X013C, 0X02C7, - 0X00B8, 0X0161, 0X0113, 0X0123, 0X0167, 0X014A, 0X017E, 0X014B, - 0X0100, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X012E, - 0X010C, 0X00C9, 0X0118, 0X00CB, 0X0116, 0X00CD, 0X00CE, 0X012A, - 0X0110, 0X0145, 0X014C, 0X0136, 0X00D4, 0X00D5, 0X00D6, 0X00D7, - 0X00D8, 0X0172, 0X00DA, 0X00DB, 0X00DC, 0X0168, 0X016A, 0X00DF, - 0X0101, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X012F, - 0X010D, 0X00E9, 0X0119, 0X00EB, 0X0117, 0X00ED, 0X00EE, 0X012B, - 0X0111, 0X0146, 0X014D, 0X0137, 0X00F4, 0X00F5, 0X00F6, 0X00F7, - 0X00F8, 0X0173, 0X00FA, 0X00FB, 0X00FC, 0X0169, 0X016B, 0X02D9 + 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, + 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, + 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, + 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, + 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, + 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9 }; DEF_SB_TBL(8859_4, "ISO-8859-4", "ISO-8859-4", iso8859_4_aliases, 0xA0, iso8859_4_ucs_table); static const char *iso8859_5_aliases[] = {"ISO8859-5", "cyrillic", NULL}; static const unsigned short iso8859_5_ucs_table[] = { - 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, - 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, + 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, + 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, - 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f + 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F }; DEF_SB_TBL(8859_5, "ISO-8859-5", "ISO-8859-5", iso8859_5_aliases, 0xA0, iso8859_5_ucs_table); static const char *iso8859_6_aliases[] = {"ISO8859-6", "arabic", NULL}; static const unsigned short iso8859_6_ucs_table[] = { - 0X00A0, 0X0000, 0X0000, 0X0000, 0X00A4, 0X0000, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X060C, 0X00AD, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X061B, 0X0000, 0X0000, 0X0000, 0X061F, - 0X0000, 0X0621, 0X0622, 0X0623, 0X0624, 0X0625, 0X0626, 0X0627, - 0X0628, 0X0629, 0X062A, 0X062B, 0X062C, 0X062D, 0X062E, 0X062F, - 0X0630, 0X0631, 0X0632, 0X0633, 0X0634, 0X0635, 0X0636, 0X0637, - 0X0638, 0X0639, 0X063A, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, - 0X0640, 0X0641, 0X0642, 0X0643, 0X0644, 0X0645, 0X0646, 0X0647, - 0X0648, 0X0649, 0X064A, 0X064B, 0X064C, 0X064D, 0X064E, 0X064F, - 0X0650, 0X0651, 0X0652, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000 + 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; DEF_SB_TBL(8859_6, "ISO-8859-6", "ISO-8859-6", iso8859_6_aliases, 0xA0, iso8859_6_ucs_table); static const char *iso8859_7_aliases[] = {"ISO8859-7", "greek", NULL}; static const unsigned short iso8859_7_ucs_table[] = { - 0X00A0, 0X2018, 0X2019, 0X00A3, 0X20AC, 0X20AF, 0X00A6, 0X00A7, - 0X00A8, 0X00A9, 0X037A, 0X00AB, 0X00AC, 0X00AD, 0X0000, 0X2015, - 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X0384, 0X0385, 0X0386, 0X00B7, - 0X0388, 0X0389, 0X038A, 0X00BB, 0X038C, 0X00BD, 0X038E, 0X038F, - 0X0390, 0X0391, 0X0392, 0X0393, 0X0394, 0X0395, 0X0396, 0X0397, - 0X0398, 0X0399, 0X039A, 0X039B, 0X039C, 0X039D, 0X039E, 0X039F, - 0X03A0, 0X03A1, 0X0000, 0X03A3, 0X03A4, 0X03A5, 0X03A6, 0X03A7, - 0X03A8, 0X03A9, 0X03AA, 0X03AB, 0X03AC, 0X03AD, 0X03AE, 0X03AF, - 0X03B0, 0X03B1, 0X03B2, 0X03B3, 0X03B4, 0X03B5, 0X03B6, 0X03B7, - 0X03B8, 0X03B9, 0X03BA, 0X03BB, 0X03BC, 0X03BD, 0X03BE, 0X03BF, - 0X03C0, 0X03C1, 0X03C2, 0X03C3, 0X03C4, 0X03C5, 0X03C6, 0X03C7, - 0X03C8, 0X03C9, 0X03CA, 0X03CB, 0X03CC, 0X03CD, 0X03CE, 0X0000 + 0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 }; DEF_SB_TBL(8859_7, "ISO-8859-7", "ISO-8859-7", iso8859_7_aliases, 0xA0, iso8859_7_ucs_table); static const char *iso8859_8_aliases[] = {"ISO8859-8", "hebrew", NULL}; static const unsigned short iso8859_8_ucs_table[] = { - 0X00A0, 0X0000, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7, - 0X00A8, 0X00A9, 0X00D7, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF, - 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7, - 0X00B8, 0X00B9, 0X00F7, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, - 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X0000, 0X2017, - 0X05D0, 0X05D1, 0X05D2, 0X05D3, 0X05D4, 0X05D5, 0X05D6, 0X05D7, - 0X05D8, 0X05D9, 0X05DA, 0X05DB, 0X05DC, 0X05DD, 0X05DE, 0X05DF, - 0X05E0, 0X05E1, 0X05E2, 0X05E3, 0X05E4, 0X05E5, 0X05E6, 0X05E7, - 0X05E8, 0X05E9, 0X05EA, 0X0000, 0X0000, 0X200E, 0X200F, 0X0000 + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 }; DEF_SB_TBL(8859_8, "ISO-8859-8", "ISO-8859-8", iso8859_8_aliases, 0xA0, iso8859_8_ucs_table); static const char *iso8859_9_aliases[] = {"ISO8859-9", "latin5", NULL}; static const unsigned short iso8859_9_ucs_table[] = { - 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7, - 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF, - 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7, - 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF, - 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7, - 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, - 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7, - 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF, - 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7, - 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, - 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7, - 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF }; DEF_SB_TBL(8859_9, "ISO-8859-9", "ISO-8859-9", iso8859_9_aliases, 0xA0, iso8859_9_ucs_table); static const char *iso8859_10_aliases[] = {"ISO8859-10", "latin6", NULL}; static const unsigned short iso8859_10_ucs_table[] = { - 0X00A0, 0X0104, 0X0112, 0X0122, 0X012A, 0X0128, 0X0136, 0X00A7, - 0X013B, 0X0110, 0X0160, 0X0166, 0X017D, 0X00AD, 0X016A, 0X014A, - 0X00B0, 0X0105, 0X0113, 0X0123, 0X012B, 0X0129, 0X0137, 0X00B7, - 0X013C, 0X0111, 0X0161, 0X0167, 0X017E, 0X2015, 0X016B, 0X014B, - 0X0100, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X012E, - 0X010C, 0X00C9, 0X0118, 0X00CB, 0X0116, 0X00CD, 0X00CE, 0X00CF, - 0X00D0, 0X0145, 0X014C, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X0168, - 0X00D8, 0X0172, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF, - 0X0101, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X012F, - 0X010D, 0X00E9, 0X0119, 0X00EB, 0X0117, 0X00ED, 0X00EE, 0X00EF, - 0X00F0, 0X0146, 0X014D, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X0169, - 0X00F8, 0X0173, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X0138 + 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, + 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, + 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, + 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, + 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, + 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138 }; DEF_SB_TBL(8859_10, "ISO-8859-10", "ISO-8859-10", iso8859_10_aliases, 0xA0, iso8859_10_ucs_table); static const char *iso8859_13_aliases[] = {"ISO8859-13", NULL}; static const unsigned short iso8859_13_ucs_table[] = { - 0X00A0, 0X201D, 0X00A2, 0X00A3, 0X00A4, 0X201E, 0X00A6, 0X00A7, - 0X00D8, 0X00A9, 0X0156, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00C6, - 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X201C, 0X00B5, 0X00B6, 0X00B7, - 0X00F8, 0X00B9, 0X0157, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00E6, - 0X0104, 0X012E, 0X0100, 0X0106, 0X00C4, 0X00C5, 0X0118, 0X0112, - 0X010C, 0X00C9, 0X0179, 0X0116, 0X0122, 0X0136, 0X012A, 0X013B, - 0X0160, 0X0143, 0X0145, 0X00D3, 0X014C, 0X00D5, 0X00D6, 0X00D7, - 0X0172, 0X0141, 0X015A, 0X016A, 0X00DC, 0X017B, 0X017D, 0X00DF, - 0X0105, 0X012F, 0X0101, 0X0107, 0X00E4, 0X00E5, 0X0119, 0X0113, - 0X010D, 0X00E9, 0X017A, 0X0117, 0X0123, 0X0137, 0X012B, 0X013C, - 0X0161, 0X0144, 0X0146, 0X00F3, 0X014D, 0X00F5, 0X00F6, 0X00F7, - 0X0173, 0X0142, 0X015B, 0X016B, 0X00FC, 0X017C, 0X017E, 0X2019 + 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, + 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019 }; DEF_SB_TBL(8859_13, "ISO-8859-13", "ISO-8859-13", iso8859_13_aliases, 0xA0, iso8859_13_ucs_table); static const char *iso8859_14_aliases[] = {"ISO8859-14", "latin8", NULL}; static const unsigned short iso8859_14_ucs_table[] = { - 0X00A0, 0X1E02, 0X1E03, 0X00A3, 0X010A, 0X010B, 0X1E0A, 0X00A7, - 0X1E80, 0X00A9, 0X1E82, 0X1E0B, 0X1EF2, 0X00AD, 0X00AE, 0X0178, - 0X1E1E, 0X1E1F, 0X0120, 0X0121, 0X1E40, 0X1E41, 0X00B6, 0X1E56, - 0X1E81, 0X1E57, 0X1E83, 0X1E60, 0X1EF3, 0X1E84, 0X1E85, 0X1E61, - 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7, - 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, - 0X0174, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X1E6A, - 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X0176, 0X00DF, - 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7, - 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, - 0X0175, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X1E6B, - 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X0177, 0X00FF + 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, + 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, + 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, + 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF }; DEF_SB_TBL(8859_14, "ISO-8859-14", "ISO-8859-14", iso8859_14_aliases, 0xA0, iso8859_14_ucs_table); static const char *iso8859_15_aliases[] = {"ISO8859-15", NULL}; static const unsigned short iso8859_15_ucs_table[] = { - 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X20AC, 0X00A5, 0X0160, 0X00A7, - 0X0161, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF, - 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X017D, 0X00B5, 0X00B6, 0X00B7, - 0X017E, 0X00B9, 0X00BA, 0X00BB, 0X0152, 0X0153, 0X0178, 0X00BF, - 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7, - 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, - 0X00D0, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7, - 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X00DD, 0X00DE, 0X00DF, - 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7, - 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, - 0X00F0, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7, - 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X00FD, 0X00FE, 0X00FF + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, + 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, + 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF }; DEF_SB_TBL(8859_15, "ISO-8859-15", "ISO-8859-15", iso8859_15_aliases, 0xA0, iso8859_15_ucs_table); static const char *iso8859_16_aliases[] = {"ISO8859-16", NULL}; static const unsigned short iso8859_16_ucs_table[] = { - 0X00A0, 0X0104, 0X0105, 0X0141, 0X20AC, 0X201E, 0X0160, 0X00A7, - 0X0161, 0X00A9, 0X0218, 0X00AB, 0X0179, 0X00AD, 0X017A, 0X017B, - 0X00B0, 0X00B1, 0X010C, 0X0142, 0X017D, 0X201D, 0X00B6, 0X00B7, - 0X017E, 0X010D, 0X0219, 0X00BB, 0X0152, 0X0153, 0X0178, 0X017C, - 0X00C0, 0X00C1, 0X00C2, 0X0102, 0X00C4, 0X0106, 0X00C6, 0X00C7, - 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, - 0X0110, 0X0143, 0X00D2, 0X00D3, 0X00D4, 0X0150, 0X00D6, 0X015A, - 0X0170, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0118, 0X021A, 0X00DF, - 0X00E0, 0X00E1, 0X00E2, 0X0103, 0X00E4, 0X0107, 0X00E6, 0X00E7, - 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, - 0X0111, 0X0144, 0X00F2, 0X00F3, 0X00F4, 0X0151, 0X00F6, 0X015B, - 0X0171, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0119, 0X021B, 0X00FF + 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, + 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B, + 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, + 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, + 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, + 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF }; DEF_SB_TBL(8859_16, "ISO-8859-16", "ISO-8859-16", iso8859_16_aliases, 0xA0, iso8859_16_ucs_table); static const char *cp1251_aliases[] = {"CP1251", "CP-1251", "WINDOWS-1251", NULL}; static const unsigned short cp1251_ucs_table[] = { - 0X0402, 0X0403, 0X201A, 0X0453, 0X201E, 0X2026, 0X2020, 0X2021, - 0X20AC, 0X2030, 0X0409, 0X2039, 0X040A, 0X040C, 0X040B, 0X040F, - 0X0452, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014, - 0X0000, 0X2122, 0X0459, 0X203A, 0X045A, 0X045C, 0X045B, 0X045F, - 0X00A0, 0X040E, 0X045E, 0X0408, 0X00A4, 0X0490, 0X00A6, 0X00A7, - 0X0401, 0X00A9, 0X0404, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X0407, - 0X00B0, 0X00B1, 0X0406, 0X0456, 0X0491, 0X00B5, 0X00B6, 0X00B7, - 0X0451, 0X2116, 0X0454, 0X00BB, 0X0458, 0X0405, 0X0455, 0X0457, - 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417, - 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F, - 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427, - 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F, - 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437, - 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F, - 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447, - 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F }; DEF_SB_TBL(cp1251, "Windows-1251", "Windows-1251", cp1251_aliases, 0x80, cp1251_ucs_table); static const char *cp1252_aliases[] = {"cp1252", NULL}; static const unsigned short cp1252_ucs_table[] = { - 0X20AC,0X0000,0X201A,0X0192,0X201E,0X2026,0X2020,0X2021, - 0X02C6,0X2030,0X0160,0X2039,0X0152,0X0000,0X017D,0X0000, - 0X0000,0X2018,0X2019,0X201C,0X201D,0X2022,0X2013,0X2014, - 0X02DC,0X2122,0X0161,0X203A,0X0153,0X0000,0X017E,0X0178 + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178 }; DEF_SB(cp1252, "Windows-1252", "Windows-1252", cp1252_aliases); static int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter) { - if (c >= 0x100) { + if (c >= 0x100) { for (int n = 0; n < 32; n++) { if (c == cp1252_ucs_table[n]) { CK((*filter->output_function)(0x80 + n, filter->data)); @@ -407,157 +511,193 @@ static int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter) static int mbfl_filt_conv_cp1252_wchar(int c, mbfl_convert_filter *filter) { int s; - if (c >= 0x80 && c < 0xA0) { - s = cp1252_ucs_table[c - 0x80]; - if (!s) - s = MBFL_BAD_INPUT; + s = coalesce(cp1252_ucs_table[c - 0x80], MBFL_BAD_INPUT); } else { s = c; } - CK((*filter->output_function)(s, filter->data)); return 0; } +static size_t mb_cp1252_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c >= 0x80 && c < 0xA0) { + *out++ = coalesce(cp1252_ucs_table[c - 0x80], MBFL_BAD_INPUT); + } else { + *out++ = c; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_cp1252(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + + if (w >= 0x100) { + for (int i = 0; i < 32; i++) { + if (w == cp1252_ucs_table[i]) { + out = mb_convert_buf_add(out, i + 0x80); + goto continue_cp1252; + } + } + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp1252); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } else if (w <= 0x7F || w >= 0xA0) { + out = mb_convert_buf_add(out, w); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp1252); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + continue_cp1252: ; + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + static const char *cp1254_aliases[] = {"CP1254", "CP-1254", "WINDOWS-1254", NULL}; static const unsigned short cp1254_ucs_table[] = { - 0X20AC, 0X0000, 0X201A, 0X0192, 0X201E, 0X2026, 0X2020, 0X2021, - 0X02C6, 0X2030, 0X0160, 0X2039, 0X0152, 0X0000, 0X0000, 0X0000, - 0X0000, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014, - 0X02DC, 0X2122, 0X0161, 0X203A, 0X0153, 0X0000, 0X0000, 0X0178, - 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7, - 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF, - 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7, - 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF, - 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7, - 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, - 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7, - 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF, - 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7, - 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, - 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7, - 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF + 0x20AC, 0X0000, 0X201A, 0X0192, 0X201E, 0X2026, 0X2020, 0X2021, + 0X02C6, 0X2030, 0X0160, 0X2039, 0X0152, 0X0000, 0X0000, 0X0000, + 0X0000, 0X2018, 0X2019, 0X201C, 0X201D, 0X2022, 0X2013, 0X2014, + 0X02DC, 0X2122, 0X0161, 0X203A, 0X0153, 0X0000, 0X0000, 0X0178, + 0X00A0, 0X00A1, 0X00A2, 0X00A3, 0X00A4, 0X00A5, 0X00A6, 0X00A7, + 0X00A8, 0X00A9, 0X00AA, 0X00AB, 0X00AC, 0X00AD, 0X00AE, 0X00AF, + 0X00B0, 0X00B1, 0X00B2, 0X00B3, 0X00B4, 0X00B5, 0X00B6, 0X00B7, + 0X00B8, 0X00B9, 0X00BA, 0X00BB, 0X00BC, 0X00BD, 0X00BE, 0X00BF, + 0X00C0, 0X00C1, 0X00C2, 0X00C3, 0X00C4, 0X00C5, 0X00C6, 0X00C7, + 0X00C8, 0X00C9, 0X00CA, 0X00CB, 0X00CC, 0X00CD, 0X00CE, 0X00CF, + 0X011E, 0X00D1, 0X00D2, 0X00D3, 0X00D4, 0X00D5, 0X00D6, 0X00D7, + 0X00D8, 0X00D9, 0X00DA, 0X00DB, 0X00DC, 0X0130, 0X015E, 0X00DF, + 0X00E0, 0X00E1, 0X00E2, 0X00E3, 0X00E4, 0X00E5, 0X00E6, 0X00E7, + 0X00E8, 0X00E9, 0X00EA, 0X00EB, 0X00EC, 0X00ED, 0X00EE, 0X00EF, + 0X011F, 0X00F1, 0X00F2, 0X00F3, 0X00F4, 0X00F5, 0X00F6, 0X00F7, + 0X00F8, 0X00F9, 0X00FA, 0X00FB, 0X00FC, 0X0131, 0X015F, 0X00FF }; DEF_SB_TBL(cp1254, "Windows-1254", "Windows-1254", cp1254_aliases, 0x80, cp1254_ucs_table); static const char *cp866_aliases[] = {"CP-866", "IBM866", "IBM-866", NULL}; static const unsigned short cp866_ucs_table[] = { - 0X0410, 0X0411, 0X0412, 0X0413, 0X0414, 0X0415, 0X0416, 0X0417, - 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, 0X041F, - 0X0420, 0X0421, 0X0422, 0X0423, 0X0424, 0X0425, 0X0426, 0X0427, - 0X0428, 0X0429, 0X042A, 0X042B, 0X042C, 0X042D, 0X042E, 0X042F, - 0X0430, 0X0431, 0X0432, 0X0433, 0X0434, 0X0435, 0X0436, 0X0437, - 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, 0X043F, - 0X2591, 0X2592, 0X2593, 0X2502, 0X2524, 0X2561, 0X2562, 0X2556, - 0X2555, 0X2563, 0X2551, 0X2557, 0X255D, 0X255C, 0X255B, 0X2510, - 0X2514, 0X2534, 0X252C, 0X251C, 0X2500, 0X253C, 0X255E, 0X255F, - 0X255A, 0X2554, 0X2569, 0X2566, 0X2560, 0X2550, 0X256C, 0X2567, - 0X2568, 0X2564, 0X2565, 0X2559, 0X2558, 0X2552, 0X2553, 0X256B, - 0X256A, 0X2518, 0X250C, 0X2588, 0X2584, 0X258C, 0X2590, 0X2580, - 0X0440, 0X0441, 0X0442, 0X0443, 0X0444, 0X0445, 0X0446, 0X0447, - 0X0448, 0X0449, 0X044A, 0X044B, 0X044C, 0X044D, 0X044E, 0X044F, - 0X0401, 0X0451, 0X0404, 0X0454, 0X0407, 0X0457, 0X040E, 0X045E, - 0X00B0, 0X2219, 0X00B7, 0X221A, 0X2116, 0X00A4, 0X25A0, 0X00A0 + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 }; DEF_SB_TBL(cp866, "CP866", "CP866", cp866_aliases, 0x80, cp866_ucs_table); static const char *cp850_aliases[] = {"CP-850", "IBM850", "IBM-850", NULL}; static const unsigned short cp850_ucs_table[] = { - 0X00C7, 0X00FC, 0X00E9, 0X00E2, 0X00E4, 0X00E0, 0X00E5, 0X00E7, - 0X00EA, 0X00EB, 0X00E8, 0X00EF, 0X00EE, 0X00EC, 0X00C4, 0X00C5, - 0X00C9, 0X00E6, 0X00C6, 0X00F4, 0X00F6, 0X00F2, 0X00FB, 0X00F9, - 0X00FF, 0X00D6, 0X00DC, 0X00F8, 0X00A3, 0X00D8, 0X00D7, 0X0192, - 0X00E1, 0X00ED, 0X00F3, 0X00FA, 0X00F1, 0X00D1, 0X00AA, 0X00BA, - 0X00BF, 0X00AE, 0X00AC, 0X00BD, 0X00BC, 0X00A1, 0X00AB, 0X00BB, - 0X2591, 0X2592, 0X2593, 0X2502, 0X2524, 0X00C1, 0X00C2, 0X00C0, - 0X00A9, 0X2563, 0X2551, 0X2557, 0X255D, 0X00A2, 0X00A5, 0X2510, - 0X2514, 0X2534, 0X252C, 0X251C, 0X2500, 0X253C, 0X00E3, 0X00C3, - 0X255A, 0X2554, 0X2569, 0X2566, 0X2560, 0X2550, 0X256C, 0X00A4, - 0X00F0, 0X00D0, 0X00CA, 0X00CB, 0X00C8, 0X0131, 0X00CD, 0X00CE, - 0X00CF, 0X2518, 0X250C, 0X2588, 0X2584, 0X00A6, 0X00CC, 0X2580, - 0X00D3, 0X00DF, 0X00D4, 0X00D2, 0X00F5, 0X00D5, 0X00B5, 0X00FE, - 0X00DE, 0X00DA, 0X00DB, 0X00D9, 0X00FD, 0X00DD, 0X00AF, 0X00B4, - 0X00AD, 0X00B1, 0X2017, 0X00BE, 0X00B6, 0X00A7, 0X00F7, 0X00B8, - 0X00B0, 0X00A8, 0X00B7, 0X00B9, 0X00B3, 0X00B2, 0X25A0, 0X00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; DEF_SB_TBL(cp850, "CP850", "CP850", cp850_aliases, 0x80, cp850_ucs_table); static const char *koi8r_aliases[] = {"KOI8R", NULL}; static const unsigned short koi8r_ucs_table[] = { - 0X2500, 0X2502, 0X250C, 0X2510, 0X2514, 0X2518, 0X251C, 0X2524, - 0X252C, 0X2534, 0X253C, 0X2580, 0X2584, 0X2588, 0X258C, 0X2590, - 0X2591, 0X2592, 0X2593, 0X2320, 0X25A0, 0X2219, 0X221A, 0X2248, - 0X2264, 0X2265, 0X00A0, 0X2321, 0X00B0, 0X00B2, 0X00B7, 0X00F7, - 0X2550, 0X2551, 0X2552, 0X0451, 0X2553, 0X2554, 0X2555, 0X2556, - 0X2557, 0X2558, 0X2559, 0X255A, 0X255B, 0X255C, 0X255D, 0X255E, - 0X255F, 0X2560, 0X2561, 0X0401, 0X2562, 0X2563, 0X2564, 0X2565, - 0X2566, 0X2567, 0X2568, 0X2569, 0X256A, 0X256B, 0X256C, 0X00A9, - 0X044E, 0X0430, 0X0431, 0X0446, 0X0434, 0X0435, 0X0444, 0X0433, - 0X0445, 0X0438, 0X0439, 0X043A, 0X043B, 0X043C, 0X043D, 0X043E, - 0X043F, 0X044F, 0X0440, 0X0441, 0X0442, 0X0443, 0X0436, 0X0432, - 0X044C, 0X044B, 0X0437, 0X0448, 0X044D, 0X0449, 0X0447, 0X044A, - 0X042E, 0X0410, 0X0411, 0X0426, 0X0414, 0X0415, 0X0424, 0X0413, - 0X0425, 0X0418, 0X0419, 0X041A, 0X041B, 0X041C, 0X041D, 0X041E, - 0X041F, 0X042F, 0X0420, 0X0421, 0X0422, 0X0423, 0X0416, 0X0412, - 0X042C, 0X042B, 0X0417, 0X0428, 0X042D, 0X0429, 0X0427, 0X042A + 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, + 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, + 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, + 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, + 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, + 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, + 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9, + 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, + 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, + 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, + 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A }; DEF_SB_TBL(koi8r, "KOI8-R", "KOI8-R", koi8r_aliases, 0x80, koi8r_ucs_table); static const char *koi8u_aliases[] = {"KOI8U", NULL}; static const unsigned short koi8u_ucs_table[] = { - 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, - 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, - 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, - 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, - 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, - 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E, - 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, - 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9, - 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, - 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, - 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, - 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, - 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, - 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, - 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, - 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A + 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, + 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, + 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, + 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, + 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, + 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E, + 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9, + 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, + 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, + 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, + 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, + 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, + 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, + 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, + 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A }; DEF_SB_TBL(koi8u, "KOI8-U", "KOI8-U", koi8u_aliases, 0x80, koi8u_ucs_table); static const char *armscii8_aliases[] = {"ArmSCII8", "ARMSCII-8", "ARMSCII8", NULL}; static const unsigned short armscii8_ucs_table[] = { - 0X00A0, 0X0000, 0X0587, 0X0589, 0X0029, 0X0028, 0X00BB, 0X00AB, - 0X2014, 0X002E, 0X055D, 0X002C, 0X002D, 0X058A, 0X2026, 0X055C, - 0X055B, 0X055E, 0X0531, 0X0561, 0X0532, 0X0562, 0X0533, 0X0563, - 0X0534, 0X0564, 0X0535, 0X0565, 0X0536, 0X0566, 0X0537, 0X0567, - 0X0538, 0X0568, 0X0539, 0X0569, 0X053A, 0X056A, 0X053B, 0X056B, - 0X053C, 0X056C, 0X053D, 0X056D, 0X053E, 0X056E, 0X053F, 0X056F, - 0X0540, 0X0570, 0X0541, 0X0571, 0X0542, 0X0572, 0X0543, 0X0573, - 0X0544, 0X0574, 0X0545, 0X0575, 0X0546, 0X0576, 0X0547, 0X0577, - 0X0548, 0X0578, 0X0549, 0X0579, 0X054A, 0X057A, 0X054B, 0X057B, - 0X054C, 0X057C, 0X054D, 0X057D, 0X054E, 0X057E, 0X054F, 0X057F, - 0X0550, 0X0580, 0X0551, 0X0581, 0X0552, 0X0582, 0X0553, 0X0583, - 0X0554, 0X0584, 0X0555, 0X0585, 0X0556, 0X0586, 0X055A, 0X0000 + 0x00A0, 0x0000, 0x0587, 0x0589, 0x0029, 0x0028, 0x00BB, 0x00AB, + 0x2014, 0x002E, 0x055D, 0x002C, 0x002D, 0x058A, 0x2026, 0x055C, + 0x055B, 0x055E, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, + 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, + 0x0538, 0x0568, 0x0539, 0x0569, 0x053A, 0x056A, 0x053B, 0x056B, + 0x053C, 0x056C, 0x053D, 0x056D, 0x053E, 0x056E, 0x053F, 0x056F, + 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, + 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, + 0x0548, 0x0578, 0x0549, 0x0579, 0x054A, 0x057A, 0x054B, 0x057B, + 0x054C, 0x057C, 0x054D, 0x057D, 0x054E, 0x057E, 0x054F, 0x057F, + 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, + 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055A, 0x0000 }; static const unsigned char ucs_armscii8_table[] = { - 0XA5, 0XA4, 0X2A, 0X2B, 0XAB, 0XAC, 0XA9, 0X2F + 0xA5, 0xA4, 0x2A, 0x2B, 0xAB, 0xAC, 0xA9, 0x2F }; DEF_SB(armscii8, "ArmSCII-8", "ArmSCII-8", armscii8_aliases); static int mbfl_filt_conv_armscii8_wchar(int c, mbfl_convert_filter *filter) { - int s; - - if (c < 0xA0) { - s = c; - } else { - s = armscii8_ucs_table[c - 0xA0]; - if (!s) - s = MBFL_BAD_INPUT; - } - - CK((*filter->output_function)(s, filter->data)); + CK((*filter->output_function)((c < 0xA0) ? c : coalesce(armscii8_ucs_table[c - 0xA0], MBFL_BAD_INPUT), filter->data)); return 0; } @@ -580,3 +720,47 @@ static int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter) } return 0; } + +static size_t mb_armscii8_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + *out++ = (c < 0xA0) ? c : coalesce(armscii8_ucs_table[c - 0xA0], MBFL_BAD_INPUT); + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_armscii8(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + + if (w >= 0x28 && w <= 0x2F) { + out = mb_convert_buf_add(out, ucs_armscii8_table[w - 0x28]); + } else if (w < 0xA0) { + out = mb_convert_buf_add(out, w); + } else { + for (int i = 0; i < 0x60; i++) { + if (w == armscii8_ucs_table[i]) { + out = mb_convert_buf_add(out, 0xA0 + i); + goto continue_armscii8; + } + } + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_armscii8); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + continue_armscii8: ; + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c index ef59026a9eea1..1fd372edc8f47 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis.c @@ -37,6 +37,8 @@ #include "unicode_table_jis.h" static int mbfl_filt_conv_sjis_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_sjis_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_sjis(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -67,7 +69,9 @@ const mbfl_encoding mbfl_encoding_sjis = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_wchar, - &vtbl_wchar_sjis + &vtbl_wchar_sjis, + mb_sjis_to_wchar, + mb_wchar_to_sjis }; const struct mbfl_convert_vtbl vtbl_sjis_wchar = { @@ -256,3 +260,116 @@ int mbfl_filt_conv_wchar_sjis(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_sjis_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c == 0x5C) { + *out++ = 0xA5; + } else if (c == 0x7E) { + *out++ = 0x203E; + } else if (c <= 0x7F) { + *out++ = c; + } else if (c >= 0xA1 && c <= 0xDF) { /* Kana */ + *out++ = 0xFEC0 + c; + } else if (c > 0x80 && c <= 0xEF && c != 0xA0 && p < e) { + unsigned char c2 = *p++; + if (c2 >= 0x40 && c2 <= 0xFC && c2 != 0x7F) { + unsigned int s1, s2; + SJIS_DECODE(c, c2, s1, s2); + uint32_t w = (s1 - 0x21)*94 + s2 - 0x21; + if (w < jisx0208_ucs_table_size) { + w = jisx0208_ucs_table[w]; + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_sjis(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w == 0x5C) { + /* Unicode 0x5C is a backslash; but Shift-JIS uses 0x5C for the + * Yen sign. JIS X 0208 kuten 0x2140 is a backslash. */ + s = 0x2140; + } else if (w == 0x7E) { + /* Unicode 0x7E is a tilde, but Shift-JIS uses 0x7E for overline (or + * macron). JIS X 0208 kuten 0x2141 is 'WAVE DASH' */ + s = 0x2141; + } else if (w == 0xAF || w == 0x203E) { /* U+00AF is MACRON, U+203E is OVERLINE */ + s = 0x7E; /* Halfwidth overline/macron */ + } else if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } + + if (s == 0) { + if (w == 0xA5) { /* YEN SIGN */ + s = 0x5C; + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else if (w != 0) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_sjis); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + } else if (s >= 0x8080) { /* JIS X 0212; not supported */ + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_sjis); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + + if (s <= 0xFF) { + /* Latin/Kana */ + out = mb_convert_buf_add(out, s); + } else { + /* Kanji */ + unsigned int c1 = (s >> 8) & 0xFF, c2 = s & 0xFF, s2; + SJIS_ENCODE(c1, c2, s, s2); + out = mb_convert_buf_add2(out, s, s2); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c index 19602dd9da4da..993fc151dec4a 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c @@ -48,7 +48,9 @@ const mbfl_encoding mbfl_encoding_sjis2004 = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis2004_wchar, - &vtbl_wchar_sjis2004 + &vtbl_wchar_sjis2004, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_sjis2004_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c index e24e0b1a3f7cb..97fbb59e50583 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mac.c @@ -50,7 +50,9 @@ const mbfl_encoding mbfl_encoding_sjis_mac = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_mac_wchar, - &vtbl_wchar_sjis_mac + &vtbl_wchar_sjis_mac, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_sjis_mac_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c index 4eaa1c2557512..38ec5fe11d89f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_sjis_mobile.c @@ -52,7 +52,9 @@ const mbfl_encoding mbfl_encoding_sjis_docomo = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_docomo_wchar, - &vtbl_wchar_sjis_docomo + &vtbl_wchar_sjis_docomo, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_sjis_kddi = { @@ -63,7 +65,9 @@ const mbfl_encoding mbfl_encoding_sjis_kddi = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_kddi_wchar, - &vtbl_wchar_sjis_kddi + &vtbl_wchar_sjis_kddi, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_sjis_sb = { @@ -74,7 +78,9 @@ const mbfl_encoding mbfl_encoding_sjis_sb = { mblen_table_sjis, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_sjis_sb_wchar, - &vtbl_wchar_sjis_sb + &vtbl_wchar_sjis_sb, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_sjis_docomo_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c index 388a901fe66d2..9ee1e4bf63a89 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs2.c @@ -31,6 +31,11 @@ #include "mbfilter_ucs2.h" static int mbfl_filt_conv_ucs2_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_ucs2_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static size_t mb_ucs2be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_ucs2be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static size_t mb_ucs2le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_ucs2le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const char *mbfl_encoding_ucs2_aliases[] = {"ISO-10646-UCS-2", "UCS2" , "UNICODE", NULL}; @@ -49,7 +54,9 @@ const mbfl_encoding mbfl_encoding_ucs2 = { NULL, MBFL_ENCTYPE_WCS2, &vtbl_ucs2_wchar, - &vtbl_wchar_ucs2 + &vtbl_wchar_ucs2, + mb_ucs2_to_wchar, + mb_wchar_to_ucs2be }; const mbfl_encoding mbfl_encoding_ucs2be = { @@ -60,7 +67,9 @@ const mbfl_encoding mbfl_encoding_ucs2be = { NULL, MBFL_ENCTYPE_WCS2, &vtbl_ucs2be_wchar, - &vtbl_wchar_ucs2be + &vtbl_wchar_ucs2be, + mb_ucs2be_to_wchar, + mb_wchar_to_ucs2be }; const mbfl_encoding mbfl_encoding_ucs2le = { @@ -71,7 +80,9 @@ const mbfl_encoding mbfl_encoding_ucs2le = { NULL, MBFL_ENCTYPE_WCS2, &vtbl_ucs2le_wchar, - &vtbl_wchar_ucs2le + &vtbl_wchar_ucs2le, + mb_ucs2le_to_wchar, + mb_wchar_to_ucs2le }; const struct mbfl_convert_vtbl vtbl_ucs2_wchar = { @@ -216,3 +227,119 @@ static int mbfl_filt_conv_ucs2_wchar_flush(mbfl_convert_filter *filter) return 0; } + +#define DETECTED_BE 1 +#define DETECTED_LE 2 + +static size_t mb_ucs2_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + if (*state == DETECTED_BE) { + return mb_ucs2be_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*state == DETECTED_LE) { + return mb_ucs2le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*in_len >= 2) { + unsigned char *p = *in; + unsigned char c1 = *p++; + unsigned char c2 = *p++; + uint32_t w = (c1 << 8) | c2; + + if (w == 0xFFFE) { + /* Little-endian BOM */ + *in = p; + *in_len -= 2; + *state = DETECTED_LE; + return mb_ucs2le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (w == 0xFEFF) { + /* Big-endian BOM; don't send it to output */ + *in = p; + *in_len -= 2; + } + } + + *state = DETECTED_BE; + return mb_ucs2be_to_wchar(in, in_len, buf, bufsize, NULL); +} + +static size_t mb_ucs2be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + (*in_len & ~1); + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + uint32_t w = (c1 << 8) | c2; + *out++ = w; + } + + if (p == e && (*in_len & 0x1) && out < limit) { + /* There is 1 trailing byte, which shouldn't be there */ + *out++ = MBFL_BAD_INPUT; + p++; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_ucs2be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + if (w < MBFL_WCSPLANE_UCS2MAX) { + out = mb_convert_buf_add2(out, (w >> 8) & 0xFF, w & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_ucs2be); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + +static size_t mb_ucs2le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + (*in_len & ~1); + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + uint32_t w = (c2 << 8) | c1; + *out++ = w; + } + + if (p == e && (*in_len & 0x1) && out < limit) { + /* There is 1 trailing byte, which shouldn't be there */ + *out++ = MBFL_BAD_INPUT; + p++; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_ucs2le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + if (w < MBFL_WCSPLANE_UCS2MAX) { + out = mb_convert_buf_add2(out, w & 0xFF, (w >> 8) & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_ucs2le); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c index 6676f67c3ac22..c7f5fb2ac04fa 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c @@ -30,6 +30,12 @@ #include "mbfilter.h" #include "mbfilter_ucs4.h" +static size_t mb_ucs4_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static size_t mb_ucs4be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_ucs4be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static size_t mb_ucs4le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_ucs4le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); + static const char *mbfl_encoding_ucs4_aliases[] = {"ISO-10646-UCS-4", "UCS4", NULL}; /* This library historically had encodings called 'byte4be' and 'byte4le' @@ -48,7 +54,9 @@ const mbfl_encoding mbfl_encoding_ucs4 = { NULL, MBFL_ENCTYPE_WCS4, &vtbl_ucs4_wchar, - &vtbl_wchar_ucs4 + &vtbl_wchar_ucs4, + mb_ucs4_to_wchar, + mb_wchar_to_ucs4be }; const mbfl_encoding mbfl_encoding_ucs4be = { @@ -59,7 +67,9 @@ const mbfl_encoding mbfl_encoding_ucs4be = { NULL, MBFL_ENCTYPE_WCS4, &vtbl_ucs4be_wchar, - &vtbl_wchar_ucs4be + &vtbl_wchar_ucs4be, + mb_ucs4be_to_wchar, + mb_wchar_to_ucs4be }; const mbfl_encoding mbfl_encoding_ucs4le = { @@ -70,7 +80,9 @@ const mbfl_encoding mbfl_encoding_ucs4le = { NULL, MBFL_ENCTYPE_WCS4, &vtbl_ucs4le_wchar, - &vtbl_wchar_ucs4le + &vtbl_wchar_ucs4le, + mb_ucs4le_to_wchar, + mb_wchar_to_ucs4le }; const struct mbfl_convert_vtbl vtbl_ucs4_wchar = { @@ -296,3 +308,125 @@ static int mbfl_filt_conv_ucs4_wchar_flush(mbfl_convert_filter *filter) return 0; } + +#define DETECTED_BE 1 +#define DETECTED_LE 2 + +static size_t mb_ucs4_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + if (*state == DETECTED_BE) { + return mb_ucs4be_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*state == DETECTED_LE) { + return mb_ucs4le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*in_len >= 4) { + unsigned char *p = *in; + unsigned char c1 = *p++; + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; + + if (w == 0xFFFE0000) { + /* Little-endian BOM */ + *in = p; + *in_len -= 4; + *state = DETECTED_LE; + return mb_ucs4le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (w == 0xFEFF) { + /* Big-endian BOM; don't send it to output */ + *in = p; + *in_len -= 4; + } + } + + *state = DETECTED_BE; + return mb_ucs4be_to_wchar(in, in_len, buf, bufsize, NULL); +} + +static size_t mb_ucs4be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + (*in_len & ~3); + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; + *out++ = w; + } + + if (p == e && (*in_len & 0x3) && out < limit) { + /* There are 1-3 trailing bytes, which shouldn't be there */ + *out++ = MBFL_BAD_INPUT; + p = *in + *in_len; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_ucs4be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + + while (len--) { + uint32_t w = *in++; + if (w != MBFL_BAD_INPUT) { + out = mb_convert_buf_add4(out, (w >> 24) & 0xFF, (w >> 16) & 0xFF, (w >> 8) & 0xFF, w & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_ucs4be); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + +static size_t mb_ucs4le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + (*in_len & ~3); + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1; + *out++ = w; + } + + if (p == e && (*in_len & 0x3) && out < limit) { + /* There are 1-3 trailing bytes, which shouldn't be there */ + *out++ = MBFL_BAD_INPUT; + p = *in + *in_len; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_ucs4le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + + while (len--) { + uint32_t w = *in++; + if (w != MBFL_BAD_INPUT) { + out = mb_convert_buf_add4(out, w & 0xFF, (w >> 8) & 0xFF, (w >> 16) & 0xFF, (w >> 24) & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_ucs4le); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c index 06300404b6e27..e465fbe2b4d4e 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c @@ -67,7 +67,9 @@ const mbfl_encoding mbfl_encoding_uhc = { mblen_table_uhc, 0, &vtbl_uhc_wchar, - &vtbl_wchar_uhc + &vtbl_wchar_uhc, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_uhc_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c index 8477367f79d87..3a3b1d5269094 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf16.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf16.c @@ -31,6 +31,11 @@ #include "mbfilter_utf16.h" static int mbfl_filt_conv_utf16_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_utf16_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static size_t mb_utf16be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_utf16be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static size_t mb_utf16le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_utf16le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const char *mbfl_encoding_utf16_aliases[] = {"utf16", NULL}; @@ -42,7 +47,9 @@ const mbfl_encoding mbfl_encoding_utf16 = { NULL, 0, &vtbl_utf16_wchar, - &vtbl_wchar_utf16 + &vtbl_wchar_utf16, + mb_utf16_to_wchar, + mb_wchar_to_utf16be }; const mbfl_encoding mbfl_encoding_utf16be = { @@ -53,7 +60,9 @@ const mbfl_encoding mbfl_encoding_utf16be = { NULL, 0, &vtbl_utf16be_wchar, - &vtbl_wchar_utf16be + &vtbl_wchar_utf16be, + mb_utf16be_to_wchar, + mb_wchar_to_utf16be }; const mbfl_encoding mbfl_encoding_utf16le = { @@ -64,7 +73,9 @@ const mbfl_encoding mbfl_encoding_utf16le = { NULL, 0, &vtbl_utf16le_wchar, - &vtbl_wchar_utf16le + &vtbl_wchar_utf16le, + mb_utf16le_to_wchar, + mb_wchar_to_utf16le }; const struct mbfl_convert_vtbl vtbl_utf16_wchar = { @@ -322,3 +333,191 @@ static int mbfl_filt_conv_utf16_wchar_flush(mbfl_convert_filter *filter) return 0; } + +#define DETECTED_BE 1 +#define DETECTED_LE 2 + +static size_t mb_utf16_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + if (*state == DETECTED_BE) { + return mb_utf16be_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*state == DETECTED_LE) { + return mb_utf16le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*in_len >= 2) { + unsigned char *p = *in; + unsigned char c1 = *p++; + unsigned char c2 = *p++; + uint16_t n = (c1 << 8) | c2; + + if (n == 0xFFFE) { + /* Little-endian BOM */ + *in = p; + *in_len -= 2; + *state = DETECTED_LE; + return mb_utf16le_to_wchar(in, in_len, buf, bufsize, NULL); + } if (n == 0xFEFF) { + /* Big-endian BOM; don't send to output */ + *in = p; + *in_len -= 2; + } + } + + *state = DETECTED_BE; + return mb_utf16be_to_wchar(in, in_len, buf, bufsize, NULL); +} + +static size_t mb_utf16be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + /* We only want to read 16-bit words out of `str`; any trailing byte will be handled at the end */ + unsigned char *p = *in, *e = p + (*in_len & ~1); + /* Set `limit` to one less than the actual amount of space in the buffer; this is because + * on some iterations of the below loop, we might produce two output words */ + uint32_t *out = buf, *limit = buf + bufsize - 1; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + uint16_t n = (c1 << 8) | c2; + + if (n >= 0xD800 && n <= 0xDBFF) { + /* Handle surrogate */ + if (p < e) { + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint16_t n2 = (c3 << 8) | c4; + + if (n2 >= 0xD800 && n2 <= 0xDBFF) { + /* Wrong; that's the first half of a surrogate pair, when we were expecting the second */ + *out++ = MBFL_BAD_INPUT; + p -= 2; + } else if (n2 >= 0xDC00 && n2 <= 0xDFFF) { + *out++ = (((n & 0x3FF) << 10) | (n2 & 0x3FF)) + 0x10000; + } else { + /* The first half of a surrogate pair was followed by a 'normal' codepoint */ + *out++ = MBFL_BAD_INPUT; + *out++ = n2; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (n >= 0xDC00 && n <= 0xDFFF) { + /* This is wrong; second part of surrogate pair has come first */ + *out++ = MBFL_BAD_INPUT; + } else { + *out++ = n; + } + } + + if (p == e && (*in_len & 0x1) && out < limit) { + /* There is an extra trailing byte (which shouldn't be there) */ + *out++ = MBFL_BAD_INPUT; + p++; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_utf16be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + + if (w < MBFL_WCSPLANE_UCS2MAX) { + out = mb_convert_buf_add2(out, (w >> 8) & 0xFF, w & 0xFF); + } else if (w < MBFL_WCSPLANE_UTF32MAX) { + uint16_t n1 = ((w >> 10) - 0x40) | 0xD800; + uint16_t n2 = (w & 0x3FF) | 0xDC00; + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add4(out, (n1 >> 8) & 0xFF, n1 & 0xFF, (n2 >> 8) & 0xFF, n2 & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf16be); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + +static size_t mb_utf16le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + /* We only want to read 16-bit words out of `str`; any trailing byte will be handled at the end */ + unsigned char *p = *in, *e = p + (*in_len & ~1); + /* Set `limit` to one less than the actual amount of space in the buffer; this is because + * on some iterations of the below loop, we might produce two output words */ + uint32_t *out = buf, *limit = buf + bufsize - 1; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + uint16_t n = (c2 << 8) | c1; + + if (n >= 0xD800 && n <= 0xDBFF) { + /* Handle surrogate */ + if (p < e) { + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint16_t n2 = (c4 << 8) | c3; + + if (n2 >= 0xD800 && n2 <= 0xDBFF) { + /* Wrong; that's the first half of a surrogate pair, when we were expecting the second */ + *out++ = MBFL_BAD_INPUT; + p -= 2; + } else if (n2 >= 0xDC00 && n2 <= 0xDFFF) { + *out++ = (((n & 0x3FF) << 10) | (n2 & 0x3FF)) + 0x10000; + } else { + /* The first half of a surrogate pair was followed by a 'normal' codepoint */ + *out++ = MBFL_BAD_INPUT; + *out++ = n2; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (n >= 0xDC00 && n <= 0xDFFF) { + /* This is wrong; second part of surrogate pair has come first */ + *out++ = MBFL_BAD_INPUT; + } else { + *out++ = n; + } + } + + if (p == e && (*in_len & 0x1) && out < limit) { + /* There is an extra trailing byte (which shouldn't be there) */ + *out++ = MBFL_BAD_INPUT; + p++; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_utf16le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + + if (w < MBFL_WCSPLANE_UCS2MAX) { + out = mb_convert_buf_add2(out, w & 0xFF, (w >> 8) & 0xFF); + } else if (w < MBFL_WCSPLANE_UTF32MAX) { + uint16_t n1 = ((w >> 10) - 0x40) | 0xD800; + uint16_t n2 = (w & 0x3FF) | 0xDC00; + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add4(out, n1 & 0xFF, (n1 >> 8) & 0xFF, n2 & 0xFF, (n2 >> 8) & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf16le); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c index ec9945e13ef50..c654e4cf51020 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c @@ -31,6 +31,11 @@ #include "mbfilter_utf32.h" static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_utf32_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static size_t mb_utf32be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_utf32be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static size_t mb_utf32le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_utf32le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const char *mbfl_encoding_utf32_aliases[] = {"utf32", NULL}; @@ -42,7 +47,9 @@ const mbfl_encoding mbfl_encoding_utf32 = { NULL, MBFL_ENCTYPE_WCS4, &vtbl_utf32_wchar, - &vtbl_wchar_utf32 + &vtbl_wchar_utf32, + mb_utf32_to_wchar, + mb_wchar_to_utf32be }; const mbfl_encoding mbfl_encoding_utf32be = { @@ -53,7 +60,9 @@ const mbfl_encoding mbfl_encoding_utf32be = { NULL, MBFL_ENCTYPE_WCS4, &vtbl_utf32be_wchar, - &vtbl_wchar_utf32be + &vtbl_wchar_utf32be, + mb_utf32be_to_wchar, + mb_wchar_to_utf32be }; const mbfl_encoding mbfl_encoding_utf32le = { @@ -64,7 +73,9 @@ const mbfl_encoding mbfl_encoding_utf32le = { NULL, MBFL_ENCTYPE_WCS4, &vtbl_utf32le_wchar, - &vtbl_wchar_utf32le + &vtbl_wchar_utf32le, + mb_utf32le_to_wchar, + mb_wchar_to_utf32le }; const struct mbfl_convert_vtbl vtbl_utf32_wchar = { @@ -229,3 +240,135 @@ static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter) return 0; } + +#define DETECTED_BE 1 +#define DETECTED_LE 2 + +static size_t mb_utf32_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + if (*state == DETECTED_BE) { + return mb_utf32be_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*state == DETECTED_LE) { + return mb_utf32le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (*in_len >= 4) { + unsigned char *p = *in; + unsigned char c1 = *p++; + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; + + if (w == 0xFFFE0000) { + /* Little-endian BOM */ + *in = p; + *in_len -= 4; + *state = DETECTED_LE; + return mb_utf32le_to_wchar(in, in_len, buf, bufsize, NULL); + } else if (w == 0xFEFF) { + /* Big-endian BOM; don't send it to output */ + *in = p; + *in_len -= 4; + } + } + + *state = DETECTED_BE; + return mb_utf32be_to_wchar(in, in_len, buf, bufsize, NULL); +} + +static size_t mb_utf32be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + (*in_len & ~3); + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; + + if (w < MBFL_WCSPLANE_UTF32MAX && (w < 0xD800 || w > 0xDFFF)) { + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + if (p == e && (*in_len & 0x3) && out < limit) { + /* There are 1-3 trailing bytes, which shouldn't be there */ + *out++ = MBFL_BAD_INPUT; + p = *in + *in_len; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_utf32be(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + + while (len--) { + uint32_t w = *in++; + if (w < MBFL_WCSPLANE_UTF32MAX) { + out = mb_convert_buf_add4(out, (w >> 24) & 0xFF, (w >> 16) & 0xFF, (w >> 8) & 0xFF, w & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf32be); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + +static size_t mb_utf32le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + (*in_len & ~3); + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c1 = *p++; + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1; + + if (w < MBFL_WCSPLANE_UTF32MAX && (w < 0xD800 || w > 0xDFFF)) { + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + if (p == e && (*in_len & 0x3) && out < limit) { + /* There are 1-3 trailing bytes, which shouldn't be there */ + *out++ = MBFL_BAD_INPUT; + p = *in + *in_len; + } + + *in_len -= (p - *in); + *in = p; + return out - buf; +} + +static void mb_wchar_to_utf32le(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + + while (len--) { + uint32_t w = *in++; + if (w < MBFL_WCSPLANE_UTF32MAX) { + out = mb_convert_buf_add4(out, w & 0xFF, (w >> 8) & 0xFF, (w >> 16) & 0xFF, (w >> 24) & 0xFF); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf32le); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 4); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c index c3144b4779584..7f843f88bb603 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7.c @@ -31,6 +31,8 @@ #include "mbfilter_utf7.h" static int mbfl_filt_conv_utf7_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_utf7_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_utf7(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mbfl_base64_table[] = { /* 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', */ @@ -55,7 +57,9 @@ const mbfl_encoding mbfl_encoding_utf7 = { NULL, MBFL_ENCTYPE_GL_UNSAFE, &vtbl_utf7_wchar, - &vtbl_wchar_utf7 + &vtbl_wchar_utf7, + mb_utf7_to_wchar, + mb_wchar_to_utf7 }; const struct mbfl_convert_vtbl vtbl_utf7_wchar = { @@ -401,3 +405,280 @@ int mbfl_filt_conv_wchar_utf7_flush(mbfl_convert_filter *filter) return 0; } + +/* Ways which a Base64-encoded section can end: */ +#define DASH 0xFD +#define ASCII 0xFE +#define ILLEGAL 0xFF + +static inline bool is_base64_end(unsigned char c) +{ + return c >= DASH; +} + +static unsigned char decode_base64(unsigned char c) +{ + if (c >= 'A' && c <= 'Z') { + return c - 65; + } else if (c >= 'a' && c <= 'z') { + return c - 71; + } else if (c >= '0' && c <= '9') { + return c + 4; + } else if (c == '+') { + return 62; + } else if (c == '/') { + return 63; + } else if (c == '-') { + return DASH; + } else if (c <= 0x7F) { + return ASCII; + } + return ILLEGAL; +} + +static uint32_t* handle_utf16_cp(uint16_t cp, uint32_t *out, uint16_t *surrogate1) +{ +retry: + if (*surrogate1) { + if (cp >= 0xDC00 && cp <= 0xDFFF) { + *out++ = ((*surrogate1 & 0x3FF) << 10) + (cp & 0x3FF) + 0x10000; + *surrogate1 = 0; + } else { + *out++ = MBFL_BAD_INPUT; + *surrogate1 = 0; + goto retry; + } + } else if (cp >= 0xD800 && cp <= 0xDBFF) { + *surrogate1 = cp; + } else if (cp >= 0xDC00 && cp <= 0xDFFF) { + /* 2nd part of surrogate pair came unexpectedly */ + *out++ = MBFL_BAD_INPUT; + } else { + *out++ = cp; + } + return out; +} + +static uint32_t* handle_base64_end(unsigned char n, unsigned char **p, uint32_t *out, bool *base64, bool abrupt, uint16_t *surrogate1) +{ + if (abrupt || *surrogate1) { + *out++ = MBFL_BAD_INPUT; + *surrogate1 = 0; + } + + if (n == ILLEGAL) { + *out++ = MBFL_BAD_INPUT; + } else if (n == ASCII) { + (*p)--; /* Unconsume byte */ + } + + *base64 = false; + return out; +} + +static size_t mb_utf7_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + ZEND_ASSERT(bufsize >= 4); /* This function will infinite-loop if called with a tiny output buffer */ + + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + bool base64 = *state & 1; + uint16_t surrogate1 = (*state >> 1); /* First half of a surrogate pair which still needs 2nd half */ + + while (p < e && out < limit) { + if (base64) { + /* Base64 section */ + if ((limit - out) < 4) { + break; + } + + unsigned char n1 = decode_base64(*p++); + if (is_base64_end(n1)) { + out = handle_base64_end(n1, &p, out, &base64, false, &surrogate1); + continue; + } else if (p == e) { + out = handle_base64_end(n1, &p, out, &base64, true, &surrogate1); + continue; + } + unsigned char n2 = decode_base64(*p++); + if (is_base64_end(n2) || p == e) { + out = handle_base64_end(n2, &p, out, &base64, true, &surrogate1); + continue; + } + unsigned char n3 = decode_base64(*p++); + if (is_base64_end(n3)) { + out = handle_base64_end(n3, &p, out, &base64, true, &surrogate1); + continue; + } + out = handle_utf16_cp((n1 << 10) | (n2 << 4) | ((n3 & 0x3C) >> 2), out, &surrogate1); + if (p == e) { + /* It is an error if trailing padding bits are not zeroes or if we were + * expecting the 2nd part of a surrogate pair when Base64 section ends */ + if ((n3 & 0x3) || surrogate1) + *out++ = MBFL_BAD_INPUT; + break; + } + + unsigned char n4 = decode_base64(*p++); + if (is_base64_end(n4) || p == e) { + out = handle_base64_end(n4, &p, out, &base64, n3 & 0x3, &surrogate1); + continue; + } + unsigned char n5 = decode_base64(*p++); + if (is_base64_end(n5) || p == e) { + out = handle_base64_end(n5, &p, out, &base64, true, &surrogate1); + continue; + } + unsigned char n6 = decode_base64(*p++); + if (is_base64_end(n6)) { + out = handle_base64_end(n6, &p, out, &base64, true, &surrogate1); + continue; + } + out = handle_utf16_cp((n3 << 14) | (n4 << 8) | (n5 << 2) | ((n6 & 0x30) >> 4), out, &surrogate1); + if (p == e) { + if ((n6 & 0xF) || surrogate1) + *out++ = MBFL_BAD_INPUT; + break; + } + + unsigned char n7 = decode_base64(*p++); + if (is_base64_end(n7) || p == e) { + out = handle_base64_end(n7, &p, out, &base64, n6 & 0xF, &surrogate1); + continue; + } + unsigned char n8 = decode_base64(*p++); + if (is_base64_end(n8)) { + out = handle_base64_end(n8, &p, out, &base64, true, &surrogate1); + continue; + } + out = handle_utf16_cp((n6 << 12) | (n7 << 6) | n8, out, &surrogate1); + } else { + /* ASCII text section */ + unsigned char c = *p++; + + if (c == '+') { + if (p < e) { + if (*p == '-') { + *out++ = '+'; + p++; + } else { + base64 = true; + } + } + /* If a + comes at the end of the input string... do nothing about it */ + } else if (c <= 0x7F) { + *out++ = c; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + } + + *state = (surrogate1 << 1) | base64; + *in_len = e - p; + *in = p; + return out - buf; +} + +static bool can_end_base64(uint32_t c) +{ + return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\'' || c == '(' || c == ')' || c == ',' || c == '.' || c == ':' || c == '?'; +} + +static bool should_direct_encode(uint32_t c) +{ + return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '\0' || c == '/' || c == '-' || can_end_base64(c); +} + +#define SAVE_CONVERSION_STATE() buf->state = (cache << 4) | (nbits << 1) | base64 +#define RESTORE_CONVERSION_STATE() base64 = (buf->state & 1); nbits = (buf->state >> 1) & 0x7; cache = (buf->state >> 4) + +static void mb_wchar_to_utf7(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + + /* Make enough space such that if the input string is all ASCII (not including '+'), + * we can copy it to the output buffer without checking for available space. + * However, if we find anything which is not plain ASCII, additional checks for + * output buffer space will be needed. */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + bool base64; + unsigned char nbits, cache; /* `nbits` is the number of cached bits; either 0, 2, or 4 */ + RESTORE_CONVERSION_STATE(); + + while (len--) { + uint32_t w = *in++; + if (base64) { + if (should_direct_encode(w)) { + /* End of Base64 section. Drain buffered bits (if any), close Base64 section */ + base64 = false; + in--; len++; /* Unconsume codepoint; it will be handled by 'ASCII section' code below */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + if (nbits) { + out = mb_convert_buf_add(out, mbfl_base64_table[(cache << (6 - nbits)) & 0x3F]); + } + nbits = cache = 0; + if (!can_end_base64(w)) { + out = mb_convert_buf_add(out, '-'); + } + } else if (w >= MBFL_WCSPLANE_UTF32MAX) { + /* Make recursive call to add an error marker character */ + SAVE_CONVERSION_STATE(); + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf7); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + RESTORE_CONVERSION_STATE(); + } else { + /* Encode codepoint, preceded by any cached bits, as Base64 */ + uint64_t bits; + if (w >= MBFL_WCSPLANE_SUPMIN) { + /* Must use surrogate pair */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, 6); + w -= 0x10000; + bits = ((uint64_t)cache << 32) | 0xD800DC00L | ((w & 0xFFC00) << 6) | (w & 0x3FF); + nbits += 32; + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 3); + bits = (cache << 16) | w; + nbits += 16; + } + + while (nbits >= 6) { + out = mb_convert_buf_add(out, mbfl_base64_table[(bits >> (nbits - 6)) & 0x3F]); + nbits -= 6; + } + cache = bits; + } + } else { + /* ASCII section */ + if (should_direct_encode(w)) { + out = mb_convert_buf_add(out, w); + } else if (w >= MBFL_WCSPLANE_UTF32MAX) { + buf->state = 0; + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf7); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + RESTORE_CONVERSION_STATE(); + } else { + out = mb_convert_buf_add(out, '+'); + base64 = true; + in--; len++; /* Unconsume codepoint; it will be handled by Base64 code above */ + } + } + } + + if (end) { + if (nbits) { + out = mb_convert_buf_add(out, mbfl_base64_table[(cache << (6 - nbits)) & 0x3F]); + } + if (base64) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 1); + out = mb_convert_buf_add(out, '-'); + } + } else { + SAVE_CONVERSION_STATE(); + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c index 473a1f56c1396..7de68dea3cc22 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf7imap.c @@ -91,7 +91,9 @@ const mbfl_encoding mbfl_encoding_utf7imap = { NULL, 0, &vtbl_utf7imap_wchar, - &vtbl_wchar_utf7imap + &vtbl_wchar_utf7imap, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_utf7imap_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c index 7c371d2e4d138..83d2158c37d10 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8.c @@ -49,6 +49,9 @@ const unsigned char mblen_table_utf8[] = { 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; +static size_t mb_utf8_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_utf8(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); + static const char *mbfl_encoding_utf8_aliases[] = {"utf8", NULL}; const mbfl_encoding mbfl_encoding_utf8 = { @@ -59,7 +62,9 @@ const mbfl_encoding mbfl_encoding_utf8 = { mblen_table_utf8, 0, &vtbl_utf8_wchar, - &vtbl_wchar_utf8 + &vtbl_wchar_utf8, + mb_utf8_to_wchar, + mb_wchar_to_utf8 }; const struct mbfl_convert_vtbl vtbl_utf8_wchar = { @@ -216,3 +221,157 @@ int mbfl_filt_conv_wchar_utf8(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_utf8_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c >= 0xC2 && c <= 0xDF) { /* 2 byte character */ + if (p < e) { + unsigned char c2 = *p++; + if ((c2 & 0xC0) != 0x80) { + *out++ = MBFL_BAD_INPUT; + if (c2 < 0x80 || (c2 >= 0xC2 && c2 <= 0xF4)) { + p--; + } + } else { + *out++ = ((c & 0x1F) << 6) | (c2 & 0x3F); + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c >= 0xE0 && c <= 0xEF) { /* 3 byte character */ + if ((e - p) >= 2) { + unsigned char c2 = *p++; + unsigned char c3 = *p++; + if ((c2 & 0xC0) != 0x80 || !((c2 >= 0x80 && c2 <= 0xBF) && ((c == 0xE0 && c2 >= 0xA0) || (c == 0xED && c2 < 0xA0) || (c > 0xE0 && c != 0xED)))) { + *out++ = MBFL_BAD_INPUT; + if (c2 < 0x80 || (c2 >= 0xC2 && c2 <= 0xF4)) { + p -= 2; + } else { + p--; + } + } else if ((c3 & 0xC0) != 0x80) { + *out++ = MBFL_BAD_INPUT; + if (c3 < 0x80 || (c3 >= 0xC2 && c3 <= 0xF4)) { + p--; + } + } else { + uint32_t decoded = ((c & 0xF) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F); + if (decoded >= 0xD800 && decoded <= 0xDFFF) { + *out++ = MBFL_BAD_INPUT; + } else { + *out++ = (decoded < 0x800) ? MBFL_BAD_INPUT : decoded; + } + } + } else { + *out++ = MBFL_BAD_INPUT; + /* Skip over some number of bytes to duplicate error-handling behavior of old implementation */ + while (p < e) { + c = *p; + if ((c & 0xC0) != 0x80) { + if (c >= 0x80 && (c < 0xC2 || c > 0xF4)) + p++; + break; + } + p++; + } + } + } else if (c >= 0xF0 && c <= 0xF4) { /* 4 byte character */ + if ((e - p) >= 3) { + unsigned char c2 = *p++; + unsigned char c3 = *p++; + unsigned char c4 = *p++; + if ((c2 & 0xC0) != 0x80) { + *out++ = MBFL_BAD_INPUT; + if (c2 < 0x80 || (c2 >= 0xC2 && c2 <= 0xF4)) { + p -= 3; + } else { + p -= 2; + } + } else if ((c3 & 0xC0) != 0x80 || !((c == 0xF0 && c2 >= 0x90) || (c == 0xF4 && c2 < 0x90) || (c > 0xF0 && c < 0xF4))) { + *out++ = MBFL_BAD_INPUT; + if (!((c == 0xF0 && c2 >= 0x90) || (c == 0xF4 && c2 < 0x90) || (c > 0xF0 && c < 0xF4))) { + if (c2 >= 0x80 && (c2 < 0xC2 || c2 > 0xF4)) { + p -= 2; + } else { + p -= 3; + } + } else if (c3 < 0x80 || (c3 >= 0xC2 && c3 <= 0xF4)) { + p -= 2; + } else { + p--; + } + } else if ((c4 & 0xC0) != 0x80) { + *out++ = MBFL_BAD_INPUT; + if (c4 < 0x80 || (c4 >= 0xC2 && c4 <= 0xF4)) { + p--; + } + } else { + uint32_t decoded = ((c & 0x7) << 18) | ((c2 & 0x3F) << 12) | ((c3 & 0x3F) << 6) | (c4 & 0x3F); + *out++ = (decoded < 0x10000) ? MBFL_BAD_INPUT : decoded; + } + } else { + *out++ = MBFL_BAD_INPUT; + /* Skip over some number of bytes to duplicate error-handling behavior of old implementation */ + if (p < e) { + unsigned char c2 = *p; + if (!((c == 0xF0 && c2 >= 0x90) || (c == 0xF4 && c2 < 0x90) || (c > 0xF0 && c < 0xF4))) { + if (c2 >= 0x80 && (c2 < 0xC2 || c2 > 0xF4)) + p++; + } else { + while (p < e) { + c = *p; + if ((c & 0xC0) != 0x80) { + if (c >= 0x80 && (c < 0xC2 || c > 0xF4)) + p++; + break; + } + p++; + } + } + } + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_utf8(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + if (w < 0x80) { + out = mb_convert_buf_add(out, w & 0xFF); + } else if (w < 0x800) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, ((w >> 6) & 0x1F) | 0xC0, (w & 0x3F) | 0x80); + } else if (w < 0x10000) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 3); + out = mb_convert_buf_add3(out, ((w >> 12) & 0xF) | 0xE0, ((w >> 6) & 0x3F) | 0x80, (w & 0x3F) | 0x80); + } else if (w < 0x110000) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + out = mb_convert_buf_add4(out, ((w >> 18) & 0x7) | 0xF0, ((w >> 12) & 0x3F) | 0x80, ((w >> 6) & 0x3F) | 0x80, (w & 0x3F) | 0x80); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_utf8); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c index 14b0094592489..04af4c0939e24 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf8_mobile.c @@ -49,7 +49,9 @@ const mbfl_encoding mbfl_encoding_utf8_docomo = { mblen_table_utf8, 0, &vtbl_utf8_docomo_wchar, - &vtbl_wchar_utf8_docomo + &vtbl_wchar_utf8_docomo, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_utf8_kddi_a = { @@ -60,7 +62,9 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_a = { mblen_table_utf8, 0, &vtbl_utf8_kddi_a_wchar, - &vtbl_wchar_utf8_kddi_a + &vtbl_wchar_utf8_kddi_a, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_utf8_kddi_b = { @@ -71,7 +75,9 @@ const mbfl_encoding mbfl_encoding_utf8_kddi_b = { mblen_table_utf8, 0, &vtbl_utf8_kddi_b_wchar, - &vtbl_wchar_utf8_kddi_b + &vtbl_wchar_utf8_kddi_b, + NULL, + NULL }; const mbfl_encoding mbfl_encoding_utf8_sb = { @@ -82,7 +88,9 @@ const mbfl_encoding mbfl_encoding_utf8_sb = { mblen_table_utf8, 0, &vtbl_utf8_sb_wchar, - &vtbl_wchar_utf8_sb + &vtbl_wchar_utf8_sb, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_utf8_docomo_wchar = { diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uuencode.c b/ext/mbstring/libmbfl/filters/mbfilter_uuencode.c index d602274db62cf..9571131aad5b9 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_uuencode.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_uuencode.c @@ -38,6 +38,8 @@ const mbfl_encoding mbfl_encoding_uuencode = { NULL, MBFL_ENCTYPE_SBCS, NULL, + NULL, + NULL, NULL }; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c index 508f942b287e8..1c93b77a9533b 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c @@ -454,49 +454,39 @@ filter_count_output(int c, void *data) return 0; } -size_t -mbfl_strlen(const mbfl_string *string) +size_t mbfl_strlen(const mbfl_string *string) { - size_t len, n, k; - unsigned char *p; + size_t len = 0; const mbfl_encoding *encoding = string->encoding; - len = 0; if (encoding->flag & MBFL_ENCTYPE_SBCS) { len = string->len; } else if (encoding->flag & MBFL_ENCTYPE_WCS2) { len = string->len/2; } else if (encoding->flag & MBFL_ENCTYPE_WCS4) { len = string->len/4; - } else if (encoding->mblen_table != NULL) { + } else if (encoding->mblen_table) { const unsigned char *mbtab = encoding->mblen_table; - n = 0; - p = string->val; - k = string->len; - /* count */ - if (p != NULL) { - while (n < k) { - unsigned m = mbtab[*p]; - n += m; - p += m; - len++; - } + unsigned char *p = string->val, *e = p + string->len; + while (p < e) { + p += mbtab[*p]; + len++; + } + } else if (encoding->to_wchar) { + uint32_t wchar_buf[128]; + unsigned char *in = string->val; + size_t in_len = string->len; + unsigned int state = 0; + + while (in_len) { + len += encoding->to_wchar(&in, &in_len, wchar_buf, 128, &state); } } else { - /* wchar filter */ - mbfl_convert_filter *filter = mbfl_convert_filter_new( - string->encoding, - &mbfl_encoding_wchar, - filter_count_output, 0, &len); + mbfl_convert_filter *filter = mbfl_convert_filter_new(string->encoding, &mbfl_encoding_wchar, filter_count_output, 0, &len); ZEND_ASSERT(filter); - /* count */ - n = string->len; - p = string->val; - if (p != NULL) { - while (n > 0) { - (*filter->filter_function)(*p++, filter); - n--; - } + unsigned char *p = string->val, *e = p + string->len; + while (p < e) { + (*filter->filter_function)(*p++, filter); } mbfl_convert_filter_delete(filter); } @@ -1232,7 +1222,7 @@ mbfl_strcut( /* Some East Asian characters, when printed at a terminal (or the like), require double * the usual amount of horizontal space. We call these "fullwidth" characters. */ -static size_t character_width(int c) +static size_t character_width(unsigned int c) { if (c < FIRST_DOUBLEWIDTH_CODEPOINT) { return 1; @@ -1260,35 +1250,44 @@ static int filter_count_width(int c, void* data) return 0; } -size_t -mbfl_strwidth(mbfl_string *string) +size_t mbfl_strwidth(mbfl_string *string) { - size_t len, n; - unsigned char *p; - mbfl_convert_filter *filter; + if (!string->len) { + return 0; + } - len = 0; - if (string->len > 0 && string->val != NULL) { - /* wchar filter */ - filter = mbfl_convert_filter_new( - string->encoding, - &mbfl_encoding_wchar, - filter_count_width, 0, &len); + size_t width = 0; + + if (string->encoding->to_wchar) { + uint32_t wchar_buf[128]; + unsigned char *in = string->val; + size_t in_len = string->len; + unsigned int state = 0; + + while (in_len) { + size_t out_len = string->encoding->to_wchar(&in, &in_len, wchar_buf, 128, &state); + while (out_len) { + /* NOTE: 'bad input' marker will be counted as 1 unit of width + * If text conversion is performed with an ordinary ASCII character as + * the 'replacement character', this will give us the correct display width. */ + width += character_width(wchar_buf[--out_len]); + } + } + } else { + mbfl_convert_filter *filter = mbfl_convert_filter_new(string->encoding, &mbfl_encoding_wchar, filter_count_width, 0, &width); ZEND_ASSERT(filter); /* feed data */ - p = string->val; - n = string->len; - while (n > 0) { + unsigned char *p = string->val, *e = p + string->len; + while (p < e) { (*filter->filter_function)(*p++, filter); - n--; } mbfl_convert_filter_flush(filter); mbfl_convert_filter_delete(filter); } - return len; + return width; } diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c index e348ddb69cc57..670b23da8cbb5 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c @@ -47,7 +47,9 @@ const mbfl_encoding mbfl_encoding_8bit = { NULL, MBFL_ENCTYPE_SBCS, &vtbl_8bit_wchar, - &vtbl_wchar_8bit + &vtbl_wchar_8bit, + NULL, + NULL }; const struct mbfl_convert_vtbl vtbl_8bit_wchar = { diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c index e43f746ecca45..3fb7e991141cd 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_pass.c @@ -42,6 +42,8 @@ const mbfl_encoding mbfl_encoding_pass = { NULL, 0, NULL, + NULL, + NULL, NULL }; diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c b/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c index a2b22c9105acc..5472d792a83cb 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_wchar.c @@ -40,5 +40,7 @@ const mbfl_encoding mbfl_encoding_wchar = { NULL, MBFL_ENCTYPE_WCS4, NULL, + NULL, + NULL, NULL }; diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c index f6e860a35aead..dc76f67964edd 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.c @@ -347,3 +347,96 @@ int mbfl_filt_conv_common_flush(mbfl_convert_filter *filter) } return 0; } + +zend_string* mb_fast_convert(zend_string *str, const mbfl_encoding *from, const mbfl_encoding *to, uint32_t replacement_char, unsigned int error_mode, unsigned int *num_errors) +{ + uint32_t wchar_buf[128]; + unsigned char *in = (unsigned char*)ZSTR_VAL(str); + size_t in_len = ZSTR_LEN(str); + unsigned int state = 0; + + mb_convert_buf buf; + mb_convert_buf_init(&buf, in_len, replacement_char, error_mode); + + while (in_len) { + size_t out_len = from->to_wchar(&in, &in_len, wchar_buf, 128, &state); + to->from_wchar(wchar_buf, out_len, &buf, !in_len); + } + + *num_errors = buf.errors; + return mb_convert_buf_result(&buf); +} + +static uint32_t* convert_cp_to_hex(uint32_t cp, uint32_t *out) +{ + bool nonzero = false; + int shift = 28; + + while (shift >= 0) { + int n = (cp >> shift) & 0xF; + if (n || nonzero) { + nonzero = true; + *out++ = mbfl_hexchar_table[n]; + } + shift -= 4; + } + + if (!nonzero) { + /* No hex digits were output by above loop */ + *out++ = '0'; + } + + return out; +} + +static size_t mb_illegal_marker(uint32_t bad_cp, uint32_t *out, unsigned int err_mode, uint32_t replacement_char) +{ + uint32_t *start = out; + + if (bad_cp == MBFL_BAD_INPUT && err_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) { + *out++ = replacement_char; + } else { + switch (err_mode) { + case MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR: + *out++ = replacement_char; + break; + + case MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG: + out[0] = 'U'; + out[1] = '+'; + out = convert_cp_to_hex(bad_cp, &out[2]); + break; + + case MBFL_OUTPUTFILTER_ILLEGAL_MODE_ENTITY: + out[0] = '&'; out[1] = '#'; out[2] = 'x'; + out = convert_cp_to_hex(bad_cp, &out[3]); + *out++ = ';'; + break; + } + } + + return out - start; +} + +void mb_illegal_output(uint32_t bad_cp, mb_from_wchar_fn fn, mb_convert_buf* buf) +{ + buf->errors++; + + uint32_t temp[12]; + uint32_t repl_char = buf->replacement_char; + unsigned int err_mode = buf->error_mode; + + size_t len = mb_illegal_marker(bad_cp, temp, err_mode, repl_char); + + /* Avoid infinite loop if `fn` is not able to handle `repl_char` */ + if (err_mode == MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR && repl_char != '?') { + buf->replacement_char = '?'; + } else { + buf->error_mode = MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE; + } + + fn(temp, len, buf, false); + + buf->replacement_char = repl_char; + buf->error_mode = err_mode; +} diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_convert.h b/ext/mbstring/libmbfl/mbfl/mbfl_convert.h index 563cdda1cfa6f..12c12589b0a57 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_convert.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_convert.h @@ -81,4 +81,7 @@ MBFLAPI extern int mbfl_filt_conv_common_flush(mbfl_convert_filter *filter); MBFLAPI extern void mbfl_convert_filter_devcat(mbfl_convert_filter *filter, mbfl_memory_device *src); MBFLAPI extern int mbfl_convert_filter_strcat(mbfl_convert_filter *filter, const unsigned char *p); +MBFLAPI extern zend_string* mb_fast_convert(zend_string *str, const mbfl_encoding *from, const mbfl_encoding *to, uint32_t replacement_char, unsigned int error_mode, unsigned int *num_errors); +MBFLAPI extern void mb_illegal_output(uint32_t bad_cp, mb_from_wchar_fn fn, mb_convert_buf* buf); + #endif /* MBFL_CONVERT_H */ diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h index daeace934c93b..9f6b1e4bf99f2 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h @@ -32,6 +32,7 @@ #define MBFL_ENCODING_H #include "mbfl_defs.h" +#include "zend.h" enum mbfl_no_encoding { mbfl_no_encoding_invalid = -1, @@ -129,10 +130,92 @@ struct mbfl_convert_vtbl { void (*filter_copy)(struct _mbfl_convert_filter *src, struct _mbfl_convert_filter *dest); }; -/* - * encoding - */ -typedef struct _mbfl_encoding { +typedef struct { + unsigned char *out; + unsigned char *limit; + uint32_t state; + uint32_t errors; + uint32_t replacement_char; + unsigned int error_mode; + zend_string *str; +} mb_convert_buf; + +typedef size_t (*mb_to_wchar_fn)(unsigned char **in, size_t *in_len, uint32_t *out, size_t out_len, unsigned int *state); +typedef void (*mb_from_wchar_fn)(uint32_t *in, size_t in_len, mb_convert_buf *out, bool end); + +static inline void mb_convert_buf_init(mb_convert_buf *buf, size_t initsize, uint32_t repl_char, unsigned int err_mode) +{ + buf->state = buf->errors = 0; + buf->str = emalloc(_ZSTR_STRUCT_SIZE(initsize)); + buf->out = (unsigned char*)ZSTR_VAL(buf->str); + buf->limit = buf->out + initsize; + buf->replacement_char = repl_char; + buf->error_mode = err_mode; +} + +#define MB_CONVERT_BUF_ENSURE(buf, out, limit, needed) \ + if ((limit - out) < (needed)) { \ + size_t oldsize = limit - (unsigned char*)ZSTR_VAL(buf->str); \ + size_t newsize = oldsize + MAX(oldsize >> 1, needed); \ + zend_string *newstr = erealloc(buf->str, _ZSTR_STRUCT_SIZE(newsize)); \ + out = (unsigned char*)ZSTR_VAL(newstr) + (out - (unsigned char*)ZSTR_VAL(buf->str)); \ + limit = (unsigned char*)ZSTR_VAL(newstr) + newsize; \ + buf->str = newstr; \ + } + +#define MB_CONVERT_BUF_STORE(buf, _out, _limit) buf->out = _out; buf->limit = _limit + +#define MB_CONVERT_BUF_LOAD(buf, _out, _limit) _out = buf->out; _limit = buf->limit + +#define MB_CONVERT_ERROR(buf, out, limit, bad_cp, conv_fn) \ + MB_CONVERT_BUF_STORE(buf, out, limit); \ + mb_illegal_output(bad_cp, conv_fn, buf); \ + MB_CONVERT_BUF_LOAD(buf, out, limit) + +static inline unsigned char* mb_convert_buf_add(unsigned char *out, char c) +{ + *out++ = c; + return out; +} + +static inline unsigned char* mb_convert_buf_add2(unsigned char *out, char c1, char c2) +{ + *out++ = c1; + *out++ = c2; + return out; +} + +static inline unsigned char* mb_convert_buf_add3(unsigned char *out, char c1, char c2, char c3) +{ + *out++ = c1; + *out++ = c2; + *out++ = c3; + return out; +} + +static inline unsigned char* mb_convert_buf_add4(unsigned char *out, char c1, char c2, char c3, char c4) +{ + *out++ = c1; + *out++ = c2; + *out++ = c3; + *out++ = c4; + return out; +} + +static inline zend_string* mb_convert_buf_result(mb_convert_buf *buf) +{ + ZEND_ASSERT(buf->out <= buf->limit); + zend_string *ret = buf->str; + /* See `zend_string_alloc` in zend_string.h */ + GC_SET_REFCOUNT(ret, 1); + GC_TYPE_INFO(ret) = GC_STRING; + ZSTR_H(ret) = 0; + ZSTR_LEN(ret) = buf->out - (unsigned char*)ZSTR_VAL(ret); + *(buf->out) = '\0'; + return ret; +} + +typedef struct { enum mbfl_no_encoding no_encoding; const char *name; const char *mime_name; @@ -141,6 +224,8 @@ typedef struct _mbfl_encoding { unsigned int flag; const struct mbfl_convert_vtbl *input_filter; const struct mbfl_convert_vtbl *output_filter; + mb_to_wchar_fn to_wchar; + mb_from_wchar_fn from_wchar; } mbfl_encoding; MBFLAPI extern const mbfl_encoding *mbfl_name2encoding(const char *name); diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 91b59617ce4ef..bcf2ee51933db 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2569,7 +2569,16 @@ PHP_FUNCTION(mb_convert_encoding) } if (input_str) { - /* new encoding */ + if (num_from_encodings == 1) { + const mbfl_encoding *from_encoding = from_encodings[0]; + if (from_encoding->to_wchar && to_encoding->from_wchar) { + unsigned int num_errors = 0; + RETVAL_STR(mb_fast_convert(input_str, from_encoding, to_encoding, MBSTRG(current_filter_illegal_substchar), MBSTRG(current_filter_illegal_mode), &num_errors)); + MBSTRG(illegalchars) += num_errors; + goto out; + } + } + size_t size; char *ret = php_mb_convert_encoding(ZSTR_VAL(input_str), ZSTR_LEN(input_str), to_encoding, from_encodings, num_from_encodings, &size); @@ -2587,6 +2596,7 @@ PHP_FUNCTION(mb_convert_encoding) RETVAL_ARR(tmp); } +out: if (free_from_encodings) { efree(ZEND_VOIDP(from_encodings)); } diff --git a/ext/mbstring/tests/armscii8_encoding.phpt b/ext/mbstring/tests/armscii8_encoding.phpt index 37af3820e9206..97006e09a6510 100644 --- a/ext/mbstring/tests/armscii8_encoding.phpt +++ b/ext/mbstring/tests/armscii8_encoding.phpt @@ -33,6 +33,10 @@ mb_substitute_character("long"); convertInvalidString("\xA1", "%", "ARMSCII-8", "UTF-8"); convertInvalidString("\xFF", "%", "ARMSCII-8", "UTF-8"); +// Test replacement character which cannot be encoded in ARMSCII-8 +mb_substitute_character(0x1234); +convertInvalidString("\x23\x45", '?', 'UTF-16BE', 'ARMSCII-8'); + echo "Done!\n"; ?> --EXPECT-- diff --git a/ext/mbstring/tests/bug65045.phpt b/ext/mbstring/tests/bug65045.phpt index cf273627c61da..772533b7e13f8 100644 --- a/ext/mbstring/tests/bug65045.phpt +++ b/ext/mbstring/tests/bug65045.phpt @@ -5,25 +5,21 @@ mbstring --FILE-- --EXPECT-- -bool(true) -bool(true) -bool(true) -bool(true) +efbfbdf0a4ada2f0a4ada2 +f0a4ada2f0a4ada2efbfbd +efbfbdf0a4ada2f0a4ada2 +f0a4ada2f0a4ada2efbfbd diff --git a/ext/mbstring/tests/cp1252_encoding.phpt b/ext/mbstring/tests/cp1252_encoding.phpt index 706e02ceee606..0688fe943134e 100644 --- a/ext/mbstring/tests/cp1252_encoding.phpt +++ b/ext/mbstring/tests/cp1252_encoding.phpt @@ -16,6 +16,10 @@ mb_substitute_character("long"); convertInvalidString("\x81", "%", "CP1252", "UTF-8"); convertInvalidString("\x9D", "%", "CP1252", "UTF-8"); +// Test replacement character which cannot be encoded in CP1252 +mb_substitute_character(0x1234); +convertInvalidString("\x23\x45", '?', 'UTF-16BE', 'CP1252'); + echo "Done!\n"; ?> --EXPECT-- diff --git a/ext/mbstring/tests/cp1254_encoding.phpt b/ext/mbstring/tests/cp1254_encoding.phpt index 7a4f7be2b18ce..08d36ca7e9964 100644 --- a/ext/mbstring/tests/cp1254_encoding.phpt +++ b/ext/mbstring/tests/cp1254_encoding.phpt @@ -16,6 +16,10 @@ mb_substitute_character("long"); convertInvalidString("\x81", "%", "CP1254", "UTF-8"); convertInvalidString("\x9E", "%", "CP1254", "UTF-8"); +// Test replacement character which cannot be encoded in CP1254 +mb_substitute_character(0x1234); +convertInvalidString("\x23\x45", '?', 'UTF-16BE', 'CP1254'); + echo "Done!\n"; ?> --EXPECT-- diff --git a/ext/mbstring/tests/cp850_encoding.phpt b/ext/mbstring/tests/cp850_encoding.phpt index 01e78c4a2a0b3..726e12f2a8479 100644 --- a/ext/mbstring/tests/cp850_encoding.phpt +++ b/ext/mbstring/tests/cp850_encoding.phpt @@ -9,7 +9,11 @@ if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); --FILE-- +testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP850.txt', 'CP850'); +/* Try replacement character which cannot be encoded in CP850; ? will be used instead */ +mb_substitute_character(0x1234); +convertInvalidString("\x23\x45", '?', 'UTF-16BE', 'CP850'); +?> --EXPECT-- Tested CP850 -> UTF-16BE Tested UTF-16BE -> CP850 diff --git a/ext/mbstring/tests/cp866_encoding.phpt b/ext/mbstring/tests/cp866_encoding.phpt index e6454805883e9..67e47ba543595 100644 --- a/ext/mbstring/tests/cp866_encoding.phpt +++ b/ext/mbstring/tests/cp866_encoding.phpt @@ -10,6 +10,9 @@ if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); --EXPECT-- Tested CP866 -> UTF-16BE diff --git a/ext/mbstring/tests/encoding_tests.inc b/ext/mbstring/tests/encoding_tests.inc index f6fab024ca3d9..cbf5071456df2 100644 --- a/ext/mbstring/tests/encoding_tests.inc +++ b/ext/mbstring/tests/encoding_tests.inc @@ -102,6 +102,14 @@ function testInvalidString($fromString, $toString, $fromEncoding, $toEncoding) { function testAllValidChars($charMap, $fromEncoding, $toEncoding, $bothWays = true) { $goodChars = array_keys($charMap); shuffle($goodChars); + // Try a long string + $fromString = $toString = ''; + foreach ($goodChars as $goodChar) { + $fromString .= $goodChar; + $toString .= $charMap[$goodChar]; + } + testValidString($fromString, $toString, $fromEncoding, $toEncoding, $bothWays); + // Try various shorter ones while (!empty($goodChars)) { $length = min(rand(5,10), count($goodChars)); $fromString = $toString = ''; diff --git a/ext/mbstring/tests/illformed_utf_sequences.phpt b/ext/mbstring/tests/illformed_utf_sequences.phpt index a9c97cce118f8..b29827be44d6f 100644 --- a/ext/mbstring/tests/illformed_utf_sequences.phpt +++ b/ext/mbstring/tests/illformed_utf_sequences.phpt @@ -16,7 +16,6 @@ function chk_enc($str, $n, $enc = "UTF-8") { mb_substitute_character(0xfffd); - echo "UTF-8 redundancy\n"; var_dump(chk_enc("\x31\x32\x33", 0)); var_dump(chk_enc("\x41\x42\x43", 0)); diff --git a/ext/mbstring/tests/iso2022jp_encoding.phpt b/ext/mbstring/tests/iso2022jp_encoding.phpt index 4858f45e41e5b..ea515cb436f85 100644 --- a/ext/mbstring/tests/iso2022jp_encoding.phpt +++ b/ext/mbstring/tests/iso2022jp_encoding.phpt @@ -204,6 +204,7 @@ foreach (['JIS', 'ISO-2022-JP'] as $encoding) { testValidString("\x00\xA5", "\x1B(J\x5C\x1B(B", 'UTF-16BE', $encoding, false); } +testValidString("\x20\x3E", "\x1B\$B!1\x1B(B", 'UTF-16BE', 'ISO-2022-JP', false); echo "Other mappings from Unicode -> ISO-2022-JP are OK\n"; diff --git a/ext/mbstring/tests/iso8859_encodings.phpt b/ext/mbstring/tests/iso8859_encodings.phpt index fac7ce8c0eac9..7aae113c85717 100644 --- a/ext/mbstring/tests/iso8859_encodings.phpt +++ b/ext/mbstring/tests/iso8859_encodings.phpt @@ -21,6 +21,10 @@ mb_substitute_character("long"); convertInvalidString("\xAE", "%", "ISO8859-7", "UTF-8"); convertInvalidString("\xFF", "%", "ISO8859-8", "UTF-8"); +// Test illegal character marker which can't be represented in target encoding +mb_substitute_character(0x1234); +convertInvalidString("\x23\x45", '?', 'UTF-16BE', 'ISO8859-7'); + echo "Done!\n"; ?> --EXPECT-- diff --git a/ext/mbstring/tests/koi8r_encoding.phpt b/ext/mbstring/tests/koi8r_encoding.phpt index ab5430150cdb1..5c4f1657ee923 100644 --- a/ext/mbstring/tests/koi8r_encoding.phpt +++ b/ext/mbstring/tests/koi8r_encoding.phpt @@ -10,6 +10,9 @@ if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); --EXPECT-- Tested KOI8-R -> UTF-16BE diff --git a/ext/mbstring/tests/koi8u_encoding.phpt b/ext/mbstring/tests/koi8u_encoding.phpt index 4bf64ad781750..c28a640c1551e 100644 --- a/ext/mbstring/tests/koi8u_encoding.phpt +++ b/ext/mbstring/tests/koi8u_encoding.phpt @@ -10,6 +10,9 @@ if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); --EXPECT-- Tested KOI8-U -> UTF-16BE diff --git a/ext/mbstring/tests/mb_substitute_character_variation2.phpt b/ext/mbstring/tests/mb_substitute_character_variation2.phpt index 02d7a37e567e4..c4e0665992b51 100644 --- a/ext/mbstring/tests/mb_substitute_character_variation2.phpt +++ b/ext/mbstring/tests/mb_substitute_character_variation2.phpt @@ -5,7 +5,7 @@ mbstring --FILE-- 0xDFFF) // surrogates; included in UnicodeData.txt + if (($cp < 0xD800 || $cp > 0xDFFF) && $cp !== 0xFEFF) $validCodepoints[pack('N', $cp)] = true; } } @@ -858,7 +858,20 @@ testInvalidCodepoints($invalid, 'UTF-16LE'); testInvalidString("\x00", "\x00\x00\x00%", 'UTF-16LE', 'UTF-32BE'); testInvalidString("A\x00\x01", "\x00\x00\x00A\x00\x00\x00%", 'UTF-16LE', 'UTF-32BE'); -// TODO: test handling of UTF-16 BOM +// Test treatment of BOM +testValidString("\xFE\xFF\x12\x34", "\x00\x00\x12\x34", 'UTF-16', 'UTF-32BE', false); +testValidString("\xFF\xFE\x12\x34", "\x00\x00\x34\x12", 'UTF-16', 'UTF-32BE', false); + +// Test treatment of (illegal) codepoints between U+D800 and U+DFFF +testValidString("\xD8\x00", "\xD8\x00", 'UCS-2BE', 'UTF-16BE', false); +testValidString("\xDB\xFF", "\xDB\xFF", 'UCS-2BE', 'UTF-16BE', false); +testValidString("\xDC\x00", "\xDC\x00", 'UCS-2BE', 'UTF-16BE', false); +testValidString("\xD8\x00", "\x00\xD8", 'UCS-2BE', 'UTF-16LE', false); +testValidString("\xDC\x00", "\x00\xDC", 'UCS-2BE', 'UTF-16LE', false); + +// Try codepoint over U+10FFFF +convertInvalidString("\x00\x11\x56\x78", "\x00%", 'UCS-4BE', 'UTF-16BE'); +convertInvalidString("\x00\x11\x56\x78", "%\x00", 'UCS-4BE', 'UTF-16LE'); echo "== UTF-32 ==\n"; @@ -914,7 +927,16 @@ testInvalidString("\x00\x01\x01", "\x00\x00\x00%", 'UTF-32LE', 'UTF-32BE'); testInvalidString("\x00\x01", "\x00\x00\x00%", 'UTF-32LE', 'UTF-32BE'); testInvalidString("\x00", "\x00\x00\x00%", 'UTF-32LE', 'UTF-32BE'); -// TODO: test handling of UTF-32 BOM +// Test treatment of BOM +testValidString("\x00\x00\xFE\xFF\x00\x00\x12\x34", "\x00\x00\x12\x34", 'UTF-32', 'UTF-32BE', false); +testValidString("\xFF\xFE\x00\x00\x12\x34\x00\x00", "\x00\x00\x34\x12", 'UTF-32', 'UTF-32BE', false); + +// Test treatment of (illegal) codepoints between U+D800 and U+DFFF +testValidString("\xD8\x00", "\x00\x00\xD8\x00", 'UCS-2BE', 'UTF-32BE', false); +testValidString("\xDB\xFF", "\x00\x00\xDB\xFF", 'UCS-2BE', 'UTF-32BE', false); +testValidString("\xDC\x00", "\x00\x00\xDC\x00", 'UCS-2BE', 'UTF-32BE', false); +testValidString("\xD8\x00", "\x00\xD8\x00\x00", 'UCS-2BE', 'UTF-32LE', false); +testValidString("\xDC\x00", "\x00\xDC\x00\x00", 'UCS-2BE', 'UTF-32LE', false); echo "== UTF-7 ==\n"; @@ -1031,6 +1053,7 @@ testInvalidString('+' . rawEncode("\xD8\x01"), "\x00\x00\x00%", 'UTF-7', 'UTF-32 // Truncated string testInvalidString('+' . rawEncode("\x01") . '-', "\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +testInvalidString('+l', "\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); // And then, messed up Base64 encoding @@ -1042,6 +1065,15 @@ testInvalidString('+' . $corrupted . '-', "\x00\x00\x12\x34\x00\x00\x00%", 'UTF- // Characters which are not Base64 (and not even ASCII) appearing in Base64 section testInvalidString("+\x80", "\x00\x00\x00%", 'UTF-7', 'UTF-32BE'); +// Try codepoint over U+10FFFF; '+ACU-' is the error marker '%' +convertInvalidString("\x12\x34\x56\x78", "+ACU-", 'UCS-4BE', 'UTF-7'); +convertInvalidString("\x00\x11\x56\x78", "+ACU-", 'UCS-4BE', 'UTF-7'); + +// If error marker character needs to be ASCII-encoded but is able to serve as an +// ending character for a Base64 section, no need to add an additional dash +mb_substitute_character(0x3F); // ? +convertInvalidString("\x1E\xBE", '+AB4?', 'UTF-7', 'UTF-7'); + echo "Done!\n"; ?> From 5d6bc25063e571da936010b1fae822f5d610deca Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 22 Dec 2021 12:54:32 +0300 Subject: [PATCH 0297/1346] Reset Bucket->key of deleted HastTable elemets to NULL. This allows elimination of some Z_ISUNDEF(Bucket->val) checks. --- Zend/zend_hash.c | 43 +++--- Zend/zend_object_handlers.c | 18 +-- Zend/zend_vm_def.h | 27 ++-- Zend/zend_vm_execute.h | 225 +++++++++++++---------------- ext/opcache/jit/zend_jit_helpers.c | 29 ++-- ext/standard/array.c | 1 - 6 files changed, 152 insertions(+), 191 deletions(-) diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index a52a7fc96912c..680263b5cb07b 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -1404,9 +1404,6 @@ static zend_always_inline void _zend_hash_del_el_ex(HashTable *ht, uint32_t idx, } while (ht->nNumUsed > 0 && (UNEXPECTED(Z_TYPE(ht->arData[ht->nNumUsed-1].val) == IS_UNDEF))); ht->nInternalPointer = MIN(ht->nInternalPointer, ht->nNumUsed); } - if (p->key) { - zend_string_release(p->key); - } if (ht->pDestructor) { zval tmp; ZVAL_COPY_VALUE(&tmp, &p->val); @@ -1435,6 +1432,10 @@ static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bu } _zend_hash_del_el_ex(ht, idx, p, prev); + if (p->key) { + zend_string_release(p->key); + p->key = NULL; + } } ZEND_API void ZEND_FASTCALL zend_hash_packed_del_val(HashTable *ht, zval *zv) @@ -1476,6 +1477,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key p->key && zend_string_equal_content(p->key, key))) { _zend_hash_del_el_ex(ht, idx, p, prev); + zend_string_release(p->key); + p->key = NULL; return SUCCESS; } prev = p; @@ -1523,6 +1526,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string } } else { _zend_hash_del_el_ex(ht, idx, p, prev); + zend_string_release(p->key); + p->key = NULL; } return SUCCESS; } @@ -1567,6 +1572,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const ch } } else { _zend_hash_del_el_ex(ht, idx, p, prev); + zend_string_release(p->key); + p->key = NULL; } return SUCCESS; } @@ -1598,6 +1605,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char * && (ZSTR_LEN(p->key) == len) && !memcmp(ZSTR_VAL(p->key), str, len)) { _zend_hash_del_el_ex(ht, idx, p, prev); + zend_string_release(p->key); + p->key = NULL; return SUCCESS; } prev = p; @@ -1698,7 +1707,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { ht->pDestructor(&p->val); if (EXPECTED(p->key)) { - zend_string_release(p->key); + zend_string_release(p->key); } } } while (++p != end); @@ -1708,10 +1717,8 @@ ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht) } else { if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { - if (EXPECTED(p->key)) { - zend_string_release(p->key); - } + if (EXPECTED(p->key)) { + zend_string_release(p->key); } } while (++p != end); } @@ -1846,21 +1853,11 @@ ZEND_API void ZEND_FASTCALL zend_hash_clean(HashTable *ht) } } else { if (!HT_HAS_STATIC_KEYS_ONLY(ht)) { - if (HT_IS_WITHOUT_HOLES(ht)) { - do { - if (EXPECTED(p->key)) { - zend_string_release(p->key); - } - } while (++p != end); - } else { - do { - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF)) { - if (EXPECTED(p->key)) { - zend_string_release(p->key); - } - } - } while (++p != end); - } + do { + if (EXPECTED(p->key)) { + zend_string_release(p->key); + } + } while (++p != end); } } HT_HASH_RESET(ht); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 529893b1de882..e75ff8318cb48 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -619,11 +619,10 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; goto exit; } @@ -1754,11 +1753,10 @@ ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { value = &p->val; goto found; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 4c691fe22b399..d175cb95cfd4d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2083,11 +2083,10 @@ ZEND_VM_C_LABEL(fetch_obj_r_fast_copy): if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) { ZEND_VM_C_GOTO(fetch_obj_r_copy); @@ -2248,11 +2247,10 @@ ZEND_VM_C_LABEL(fetch_obj_is_fast_copy): if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (!ZEND_VM_SPEC || (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) != 0) { ZEND_VM_C_GOTO(fetch_obj_is_copy); @@ -8370,11 +8368,10 @@ ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST, CACHE_SLOT) if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == varname) || - (EXPECTED(p->h == ZSTR_H(varname)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, varname))))) { + if (EXPECTED(p->key == varname) || + (EXPECTED(p->h == ZSTR_H(varname)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, varname)))) { value = (zval*)p; /* value = &p->val; */ ZEND_VM_C_GOTO(check_indirect); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 349974a92e525..90b97cfc680a2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -6302,11 +6302,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -6429,11 +6428,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -8634,11 +8632,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -8761,11 +8758,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -11001,11 +10997,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -11128,11 +11123,10 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CONST & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -15445,11 +15439,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_ if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -15572,11 +15565,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -16883,11 +16875,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -17010,11 +17001,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -18210,11 +18200,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -18337,11 +18326,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || ((IS_TMP_VAR|IS_VAR) & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -31988,11 +31976,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -32158,11 +32145,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -33855,11 +33841,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -34020,11 +34005,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -36334,11 +36318,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -36499,11 +36482,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_UNUSED & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -40497,11 +40479,10 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -40667,11 +40648,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -42959,11 +42939,10 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == varname) || - (EXPECTED(p->h == ZSTR_H(varname)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, varname))))) { + if (EXPECTED(p->key == varname) || + (EXPECTED(p->h == ZSTR_H(varname)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, varname)))) { value = (zval*)p; /* value = &p->val; */ goto check_indirect; @@ -44245,11 +44224,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -44410,11 +44388,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; @@ -49482,11 +49459,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_r_copy; @@ -49647,11 +49623,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, name))))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { retval = &p->val; if (0 || (IS_CV & (IS_TMP_VAR|IS_VAR)) != 0) { goto fetch_obj_is_copy; diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 3dcc15f2ee75e..cd0743df514d2 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -1552,11 +1552,10 @@ static zend_reference* ZEND_FASTCALL zend_jit_fetch_global_helper(zend_string *v if (EXPECTED(idx < EG(symbol_table).nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)EG(symbol_table).arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == varname) || - (EXPECTED(p->h == ZSTR_H(varname)) && - EXPECTED(p->key != NULL) && - EXPECTED(zend_string_equal_content(p->key, varname))))) { + if (EXPECTED(p->key == varname) || + (EXPECTED(p->h == ZSTR_H(varname)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, varname)))) { value = (zval*)p; /* value = &p->val; */ goto check_indirect; @@ -1649,12 +1648,10 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_r_dynamic(zend_object *zobj, intptr if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == ZSTR_LEN(name)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { ZVAL_COPY_DEREF(result, &p->val); return; } @@ -1707,12 +1704,10 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_is_dynamic(zend_object *zobj, intpt if (EXPECTED(idx < zobj->properties->nNumUsed * sizeof(Bucket))) { Bucket *p = (Bucket*)((char*)zobj->properties->arData + idx); - if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) && - (EXPECTED(p->key == name) || - (EXPECTED(p->h == ZSTR_H(name)) && - EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == ZSTR_LEN(name)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)))) { + if (EXPECTED(p->key == name) || + (EXPECTED(p->h == ZSTR_H(name)) && + EXPECTED(p->key != NULL) && + EXPECTED(zend_string_equal_content(p->key, name)))) { ZVAL_COPY_DEREF(result, &p->val); return; } diff --git a/ext/standard/array.c b/ext/standard/array.c index c3d4c3d7a78a3..aa89e3755b123 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2915,7 +2915,6 @@ static void php_array_data_shuffle(zval *array) /* {{{ */ uint32_t i = hash->nNumUsed; for (; i > 0; p++, i--) { - if (Z_ISUNDEF(p->val)) continue; if (p->key) { zend_string_release(p->key); p->key = NULL; From e72b2f32d4d7a5e073cd84ccec5f0e740feb2e10 Mon Sep 17 00:00:00 2001 From: hassan Date: Thu, 23 Dec 2021 15:26:52 +0200 Subject: [PATCH 0298/1346] Azure CI: remove duplicates and add required libs Closes GH-7727. --- azure/apt.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/azure/apt.yml b/azure/apt.yml index c3b33050d6482..e30aa1d9d918c 100644 --- a/azure/apt.yml +++ b/azure/apt.yml @@ -11,7 +11,6 @@ steps: openssl \ slapd \ language-pack-de \ - re2c \ libgmp-dev \ libicu-dev \ libtidy-dev \ @@ -44,7 +43,6 @@ steps: unixodbc-dev \ llvm \ libc-client-dev \ - libkrb5-dev \ dovecot-core \ dovecot-pop3d \ dovecot-imapd \ @@ -54,6 +52,9 @@ steps: libtokyocabinet-dev \ libdb-dev \ libqdbm-dev \ + libjpeg-dev \ + libpng-dev \ + libfreetype6-dev \ ${{ parameters.packages }} displayName: 'APT' - script: | From eebe91085d1b7fafee9781e1f4da259a1be94eb7 Mon Sep 17 00:00:00 2001 From: "C. Scott Ananian" Date: Thu, 23 Dec 2021 10:02:22 -0500 Subject: [PATCH 0299/1346] Don't test hidden files that happen to end in .phpt This is a tiny improvement to run-tests.php which helps keep it from tripping over hidden files, including autosave files from various editors, metadata on certain platforms, etc. Closes GH-7783. --- run-tests.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/run-tests.php b/run-tests.php index baf3ddb91cbe6..36ed068d0eac9 100755 --- a/run-tests.php +++ b/run-tests.php @@ -1091,7 +1091,9 @@ function find_files(string $dir, bool $is_ext_dir = false, bool $ignore = false) } // Otherwise we're only interested in *.phpt files. - if (substr($name, -5) == '.phpt') { + // (but not those starting with a dot, which are hidden on + // many platforms) + if (substr($name, -5) == '.phpt' && substr($name, 0, 1) !== '.') { if ($ignore) { $ignored_by_ext++; } else { From aab52968a370028e674a1188bd8dfa250003953b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 23 Dec 2021 18:31:45 +0300 Subject: [PATCH 0300/1346] micro-optimization --- Zend/zend_execute.c | 3 +++ Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 20 ++++++++++---------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c332201a8fe78..5f7c8d10e59c1 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2978,6 +2978,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } return; } + flags &= ZEND_FETCH_OBJ_FLAGS; if (flags) { zend_handle_fetch_obj_flags(result, ptr, NULL, prop_info, flags); } @@ -3023,6 +3024,7 @@ 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; @@ -3220,6 +3222,7 @@ static zend_always_inline zend_result zend_fetch_static_property_address(zval ** } } + 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); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d175cb95cfd4d..f0ad4037eb145 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1837,7 +1837,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, ANY, ANY, int type) SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)) { ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS)); prop = &EG(uninitialized_zval); } @@ -2165,7 +2165,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 90b97cfc680a2..78dab76a303fb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -846,7 +846,7 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + 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)) { ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS)); prop = &EG(uninitialized_zval); } @@ -22842,7 +22842,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); @@ -25496,7 +25496,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 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); @@ -29616,7 +29616,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); @@ -32063,7 +32063,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); @@ -33923,7 +33923,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 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); @@ -36400,7 +36400,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); @@ -40566,7 +40566,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); @@ -44306,7 +44306,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 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); @@ -49541,7 +49541,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 & ZEND_FETCH_OBJ_FLAGS, 1 OPLINE_CC EXECUTE_DATA_CC); + BP_VAR_W, opline->extended_value, 1 OPLINE_CC EXECUTE_DATA_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var); From eee3b1d917591e5106aef9fd4fe93393e95fc13d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 24 Dec 2021 15:36:52 +0300 Subject: [PATCH 0301/1346] Bucket->key must be removed before destructor call, because destructor may update the same HashTable. Fixes oss-fuzz #42894 --- Zend/zend_hash.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 680263b5cb07b..6e809c873417a 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -1431,11 +1431,11 @@ static zend_always_inline void _zend_hash_del_el(HashTable *ht, uint32_t idx, Bu } } - _zend_hash_del_el_ex(ht, idx, p, prev); if (p->key) { zend_string_release(p->key); p->key = NULL; } + _zend_hash_del_el_ex(ht, idx, p, prev); } ZEND_API void ZEND_FASTCALL zend_hash_packed_del_val(HashTable *ht, zval *zv) @@ -1476,9 +1476,9 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key (p->h == h && p->key && zend_string_equal_content(p->key, key))) { - _zend_hash_del_el_ex(ht, idx, p, prev); zend_string_release(p->key); p->key = NULL; + _zend_hash_del_el_ex(ht, idx, p, prev); return SUCCESS; } prev = p; @@ -1525,9 +1525,9 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; } } else { - _zend_hash_del_el_ex(ht, idx, p, prev); zend_string_release(p->key); p->key = NULL; + _zend_hash_del_el_ex(ht, idx, p, prev); } return SUCCESS; } @@ -1571,9 +1571,9 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const ch HT_FLAGS(ht) |= HASH_FLAG_HAS_EMPTY_IND; } } else { - _zend_hash_del_el_ex(ht, idx, p, prev); zend_string_release(p->key); p->key = NULL; + _zend_hash_del_el_ex(ht, idx, p, prev); } return SUCCESS; } @@ -1604,9 +1604,9 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char * && p->key && (ZSTR_LEN(p->key) == len) && !memcmp(ZSTR_VAL(p->key), str, len)) { - _zend_hash_del_el_ex(ht, idx, p, prev); zend_string_release(p->key); p->key = NULL; + _zend_hash_del_el_ex(ht, idx, p, prev); return SUCCESS; } prev = p; From 46d1e503dd8c9d4a73805f5c291f1954b17288e8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 12:17:29 +0100 Subject: [PATCH 0302/1346] Remove redundant code in zend_optimizer_replace_by_const() zend_optimizer_update_op1_const() already handles these cases. --- Zend/Optimizer/zend_optimizer.c | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index ebc76017c6024..603e9e8d399c9 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -210,6 +210,9 @@ bool zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_RETURN_BY_REF: case ZEND_INSTANCEOF: case ZEND_MAKE_REF: + case ZEND_SEPARATE: + case ZEND_SEND_VAR_NO_REF: + case ZEND_SEND_VAR_NO_REF_EX: return 0; case ZEND_CATCH: REQUIRES_STRING(val); @@ -289,10 +292,6 @@ bool zend_optimizer_update_op1_const(zend_op_array *op_array, opline->opcode = ZEND_IS_IDENTICAL; opline->op1.constant = zend_optimizer_add_literal(op_array, val); break; - case ZEND_SEPARATE: - case ZEND_SEND_VAR_NO_REF: - case ZEND_SEND_VAR_NO_REF_EX: - return 0; case ZEND_VERIFY_RETURN_TYPE: /* This would require a non-local change. * zend_optimizer_replace_by_const() supports this. */ @@ -540,26 +539,11 @@ bool zend_optimizer_replace_by_const(zend_op_array *op_array, if (opline->op1_type == type && opline->op1.var == var) { switch (opline->opcode) { - case ZEND_FETCH_DIM_W: - case ZEND_FETCH_DIM_RW: - case ZEND_FETCH_DIM_FUNC_ARG: - case ZEND_FETCH_DIM_UNSET: - case ZEND_FETCH_LIST_W: - case ZEND_ASSIGN_DIM: - case ZEND_SEPARATE: - case ZEND_RETURN_BY_REF: - return 0; - case ZEND_SEND_VAR: - opline->extended_value = 0; - opline->opcode = ZEND_SEND_VAL; - break; case ZEND_SEND_VAR_EX: case ZEND_SEND_FUNC_ARG: opline->extended_value = 0; opline->opcode = ZEND_SEND_VAL_EX; break; - case ZEND_SEND_VAR_NO_REF: - return 0; case ZEND_SEND_VAR_NO_REF_EX: opline->opcode = ZEND_SEND_VAL; break; From 4ad9dbbac9398a73cd9b7851a4106a1d39ea10d2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 12:34:02 +0100 Subject: [PATCH 0303/1346] Don't replace SEND opcodes with different by-ref behavior update_op1_const() implements the right logic here -- these cannot be replaced by different opcodes, as the by-ref passing behavior is not the same. --- Zend/Optimizer/zend_optimizer.c | 11 ----------- Zend/tests/by_ref_optimization.phpt | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 Zend/tests/by_ref_optimization.phpt diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 603e9e8d399c9..0f1453cfdb4f7 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -539,17 +539,6 @@ bool zend_optimizer_replace_by_const(zend_op_array *op_array, if (opline->op1_type == type && opline->op1.var == var) { switch (opline->opcode) { - case ZEND_SEND_VAR_EX: - case ZEND_SEND_FUNC_ARG: - opline->extended_value = 0; - opline->opcode = ZEND_SEND_VAL_EX; - break; - case ZEND_SEND_VAR_NO_REF_EX: - opline->opcode = ZEND_SEND_VAL; - break; - case ZEND_SEND_USER: - opline->opcode = ZEND_SEND_VAL_EX; - break; /* In most cases IS_TMP_VAR operand may be used only once. * The operands are usually destroyed by the opcode handler. * However, there are some exception which keep the operand alive. In that case diff --git a/Zend/tests/by_ref_optimization.phpt b/Zend/tests/by_ref_optimization.phpt new file mode 100644 index 0000000000000..02431b6cbea4e --- /dev/null +++ b/Zend/tests/by_ref_optimization.phpt @@ -0,0 +1,19 @@ +--TEST-- +Don't optimize send opcodes that differ in by-ref behavior +--FILE-- + +--EXPECTF-- +Warning: ref(): Argument #1 ($x) must be passed by reference, value given in %s on line %d +bool(true) + +Notice: Only variables should be passed by reference in %s on line %d +bool(true) From 36dafade51080d4b42a01eda430e511797d472fd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 12:39:52 +0100 Subject: [PATCH 0304/1346] Remove unnecessary try_replace_op1() special cases update_op1_const() can handle these nowadays. --- Zend/Optimizer/sccp.c | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 4876a198cb3a7..582b64879392e 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -297,23 +297,6 @@ static bool try_replace_op1( } else { // TODO: check the following special cases ??? switch (opline->opcode) { - case ZEND_CASE: - opline->opcode = ZEND_IS_EQUAL; - goto replace_op1_simple; - case ZEND_CASE_STRICT: - opline->opcode = ZEND_IS_IDENTICAL; - goto replace_op1_simple; - case ZEND_FETCH_LIST_R: - case ZEND_SWITCH_STRING: - case ZEND_SWITCH_LONG: - case ZEND_MATCH: -replace_op1_simple: - if (Z_TYPE(zv) == IS_STRING) { - zend_string_hash_val(Z_STR(zv)); - } - opline->op1.constant = zend_optimizer_add_literal(ctx->scdf.op_array, &zv); - opline->op1_type = IS_CONST; - return 1; case ZEND_INSTANCEOF: zval_ptr_dtor_nogc(&zv); ZVAL_FALSE(&zv); From 98dfde2c14e81e03cfe810c5b89a62f43f800aa8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 13:02:10 +0100 Subject: [PATCH 0305/1346] Remove unnecessary INSTANCEOF special case in sccp While we can't replace the instanceof operand, we will evaluate the instanceof to false and replace its result anyway. Even in cases where the instanceof user cannot be replaced, we already have generic code to convert the opcode to QM_ASSIGN in that case. --- Zend/Optimizer/sccp.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 582b64879392e..256915eeb2c2e 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -294,28 +294,8 @@ static bool try_replace_op1( ZVAL_COPY(&zv, value); if (zend_optimizer_update_op1_const(ctx->scdf.op_array, opline, &zv)) { return 1; - } else { - // TODO: check the following special cases ??? - switch (opline->opcode) { - case ZEND_INSTANCEOF: - zval_ptr_dtor_nogc(&zv); - ZVAL_FALSE(&zv); - opline->opcode = ZEND_QM_ASSIGN; - opline->op1_type = IS_CONST; - opline->op1.constant = zend_optimizer_add_literal(ctx->scdf.op_array, &zv); - opline->op2_type = IS_UNUSED; - if (ssa_op->op2_use >= 0) { - ZEND_ASSERT(ssa_op->op2_def == -1); - zend_ssa_unlink_use_chain(ctx->scdf.ssa, ssa_op - ctx->scdf.ssa->ops, ssa_op->op2_use); - ssa_op->op2_use = -1; - ssa_op->op2_use_chain = -1; - } - return 1; - default: - break; - } - zval_ptr_dtor_nogc(&zv); } + zval_ptr_dtor_nogc(&zv); } return 0; } From 92e7cf596208d62bde3b2c5c49667afd33bfab83 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 16:32:02 +0100 Subject: [PATCH 0306/1346] Move FETCH_CLASS+INSTANCEOF special case out of update_op1_const() The generic code was rejecting this to go into a special code path in SCCP. We should directly do that in SCCP instead, to still allow the generic (and valid) replacement. --- Zend/Optimizer/sccp.c | 35 ++++++++++++++------------------- Zend/Optimizer/zend_optimizer.c | 5 ----- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 256915eeb2c2e..6ecb8518dca88 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -305,29 +305,24 @@ static bool try_replace_op2( if (ssa_op->op2_use == var && can_replace_op2(ctx->scdf.op_array, opline, ssa_op)) { zval zv; ZVAL_COPY(&zv, value); + + if (opline->opcode == ZEND_FETCH_CLASS && (opline + 1)->opcode == ZEND_INSTANCEOF && + ssa_op->result_def == (ssa_op + 1)->op2_use && Z_TYPE(zv) == IS_STRING) { + if (zend_optimizer_update_op2_const(ctx->scdf.op_array, opline + 1, &zv)) { + zend_ssa_op *next_op = ssa_op + 1; + zend_ssa_unlink_use_chain(ctx->scdf.ssa, next_op - ctx->scdf.ssa->ops, next_op->op2_use); + next_op->op2_use = -1; + next_op->op2_use_chain = -1; + zend_ssa_remove_result_def(ctx->scdf.ssa, ssa_op); + MAKE_NOP(opline); + return 1; + } + } + if (zend_optimizer_update_op2_const(ctx->scdf.op_array, opline, &zv)) { return 1; - } else { - switch (opline->opcode) { - case ZEND_FETCH_CLASS: - if (Z_TYPE(zv) == IS_STRING) { - ZEND_ASSERT((opline + 1)->opcode == ZEND_INSTANCEOF); - ZEND_ASSERT(ssa_op->result_def == (ssa_op + 1)->op2_use); - if (zend_optimizer_update_op2_const(ctx->scdf.op_array, opline + 1, &zv)) { - zend_ssa_op *next_op = ssa_op + 1; - zend_ssa_unlink_use_chain(ctx->scdf.ssa, next_op - ctx->scdf.ssa->ops, next_op->op2_use); - next_op->op2_use = -1; - next_op->op2_use_chain = -1; - zend_ssa_remove_result_def(ctx->scdf.ssa, ssa_op); - MAKE_NOP(opline); - return 1; - } - } - default: - break; - } - zval_ptr_dtor_nogc(&zv); } + zval_ptr_dtor_nogc(&zv); } return 0; } diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 0f1453cfdb4f7..7fb6162c28714 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -351,11 +351,6 @@ bool zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FAST_CALL: return 0; case ZEND_FETCH_CLASS: - if ((opline + 1)->opcode == ZEND_INSTANCEOF && - (opline + 1)->op2.var == opline->result.var) { - return 0; - } - ZEND_FALLTHROUGH; case ZEND_INSTANCEOF: REQUIRES_STRING(val); drop_leading_backslash(val); From 7eae7e5e54915d9ba9c770ffb6a5860ab487a3b7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 16:45:38 +0100 Subject: [PATCH 0307/1346] Remove FETCH_CLASS+INSTANCEOF special case Instead propagate the FETCH_CLASS return value, so it can be directly replaced if possible, which will also eliminate the FETCH_CLASS subsequently. --- Zend/Optimizer/sccp.c | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 6ecb8518dca88..5f3b7639ccdc7 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -305,20 +305,6 @@ static bool try_replace_op2( if (ssa_op->op2_use == var && can_replace_op2(ctx->scdf.op_array, opline, ssa_op)) { zval zv; ZVAL_COPY(&zv, value); - - if (opline->opcode == ZEND_FETCH_CLASS && (opline + 1)->opcode == ZEND_INSTANCEOF && - ssa_op->result_def == (ssa_op + 1)->op2_use && Z_TYPE(zv) == IS_STRING) { - if (zend_optimizer_update_op2_const(ctx->scdf.op_array, opline + 1, &zv)) { - zend_ssa_op *next_op = ssa_op + 1; - zend_ssa_unlink_use_chain(ctx->scdf.ssa, next_op - ctx->scdf.ssa->ops, next_op->op2_use); - next_op->op2_use = -1; - next_op->op2_use_chain = -1; - zend_ssa_remove_result_def(ctx->scdf.ssa, ssa_op); - MAKE_NOP(opline); - return 1; - } - } - if (zend_optimizer_update_op2_const(ctx->scdf.op_array, opline, &zv)) { return 1; } @@ -1624,15 +1610,9 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o } SET_RESULT(result, &zv); break; -#if 0 case ZEND_FETCH_CLASS: - if (!op1) { - SET_RESULT_BOT(result); - break; - } - SET_RESULT(result, op1); + SET_RESULT(result, op2); break; -#endif case ZEND_ISSET_ISEMPTY_CV: SKIP_IF_TOP(op1); if (ct_eval_isset_isempty(&zv, opline->extended_value, op1) == SUCCESS) { @@ -2138,6 +2118,7 @@ static int try_remove_definition(sccp_ctx *ctx, int var_num, zend_ssa_var *var, if (value && (opline->result_type & (IS_VAR|IS_TMP_VAR)) && opline->opcode != ZEND_QM_ASSIGN + && opline->opcode != ZEND_FETCH_CLASS && opline->opcode != ZEND_ROPE_INIT && opline->opcode != ZEND_ROPE_ADD && opline->opcode != ZEND_INIT_ARRAY From 088404840192ae8ce087678a04f1df0a9d4fab42 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 17:32:18 +0100 Subject: [PATCH 0308/1346] Don't exclude arrays from constant collection These are supported as constants nowadays, so we can drop the string check. Also fix a potential leak, though I believe this doesn't matter in current usage, as it will effectively be suppressed during persist. --- Zend/Optimizer/pass1.c | 6 ++---- Zend/Optimizer/zend_optimizer.c | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 2877d1d30841a..b25001182f591 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -314,9 +314,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) /* define("name", scalar); */ if (zend_string_equals_literal_ci(Z_STR(ZEND_OP2_LITERAL(init_opline)), "define")) { - if (Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING && - send2_opline && - Z_TYPE(ZEND_OP1_LITERAL(send2_opline)) <= IS_STRING) { + if (Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING && send2_opline) { if (collect_constants) { zend_optimizer_collect_constant(ctx, &ZEND_OP1_LITERAL(send1_opline), &ZEND_OP1_LITERAL(send2_opline)); @@ -502,7 +500,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) case ZEND_DECLARE_CONST: if (collect_constants && Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING && - Z_TYPE(ZEND_OP2_LITERAL(opline)) <= IS_STRING) { + Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_CONSTANT_AST) { zend_optimizer_collect_constant(ctx, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)); } break; diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 7fb6162c28714..0ba6bffaf0a60 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -47,14 +47,14 @@ static void zend_optimizer_zval_dtor_wrapper(zval *zvalue) void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value) { - zval val; - if (!ctx->constants) { ctx->constants = zend_arena_alloc(&ctx->arena, sizeof(HashTable)); zend_hash_init(ctx->constants, 16, NULL, zend_optimizer_zval_dtor_wrapper, 0); } - ZVAL_COPY(&val, value); - zend_hash_add(ctx->constants, Z_STR_P(name), &val); + + if (zend_hash_add(ctx->constants, Z_STR_P(name), value)) { + Z_TRY_ADDREF_P(value); + } } zend_result zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval *op1, zval *op2) /* {{{ */ From 52676f2b7e8b6d740f2490bb0779df4dccb3f60d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 17:39:05 +0100 Subject: [PATCH 0309/1346] Remove unnecessary wrapper function This seems to date back to a time where zval_ptr_dtor was a macro implicitly passing additional parameters. --- Zend/Optimizer/zend_optimizer.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 0ba6bffaf0a60..9de7a944da1a5 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -40,16 +40,11 @@ struct { int last; } zend_optimizer_registered_passes = {{NULL}, 0}; -static void zend_optimizer_zval_dtor_wrapper(zval *zvalue) -{ - zval_ptr_dtor_nogc(zvalue); -} - void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value) { if (!ctx->constants) { ctx->constants = zend_arena_alloc(&ctx->arena, sizeof(HashTable)); - zend_hash_init(ctx->constants, 16, NULL, zend_optimizer_zval_dtor_wrapper, 0); + zend_hash_init(ctx->constants, 16, NULL, zval_ptr_dtor_nogc, 0); } if (zend_hash_add(ctx->constants, Z_STR_P(name), value)) { From 28287572a1fb13d8641140855101731f70528209 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 25 Dec 2021 19:00:09 +0100 Subject: [PATCH 0310/1346] hash: Upgrade xxHash to 0.8.1 Signed-off-by: Anatol Belski --- ext/hash/xxhash/xxhash.h | 2230 ++++++++++++++++++++++++++------------ 1 file changed, 1522 insertions(+), 708 deletions(-) diff --git a/ext/hash/xxhash/xxhash.h b/ext/hash/xxhash/xxhash.h index 2d56d23c5d0be..08ab79457233e 100644 --- a/ext/hash/xxhash/xxhash.h +++ b/ext/hash/xxhash/xxhash.h @@ -32,7 +32,12 @@ * - xxHash homepage: https://www.xxhash.com * - xxHash source repository: https://github.com/Cyan4973/xxHash */ - +/*! + * @mainpage xxHash + * + * @file xxhash.h + * xxHash prototypes and implementation + */ /* TODO: update */ /* Notice extracted from xxHash homepage: @@ -44,7 +49,7 @@ Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo Name Speed Q.Score Author xxHash 5.4 GB/s 10 CrapWow 3.2 GB/s 2 Andrew -MumurHash 3a 2.7 GB/s 10 Austin Appleby +MurmurHash 3a 2.7 GB/s 10 Austin Appleby SpookyHash 2.0 GB/s 10 Bob Jenkins SBox 1.4 GB/s 9 Bret Mulvey Lookup3 1.2 GB/s 9 Bob Jenkins @@ -116,29 +121,80 @@ extern "C" { /* * This part deals with the special case where a unit wants to inline xxHash, - * but "xxhash.h" has previously been included without XXH_INLINE_ALL, such - * as part of some previously included *.h header file. + * but "xxhash.h" has previously been included without XXH_INLINE_ALL, + * such as part of some previously included *.h header file. * Without further action, the new include would just be ignored, * and functions would effectively _not_ be inlined (silent failure). * The following macros solve this situation by prefixing all inlined names, * avoiding naming collision with previous inclusions. */ -# ifdef XXH_NAMESPACE -# error "XXH_INLINE_ALL with XXH_NAMESPACE is not supported" - /* - * Note: Alternative: #undef all symbols (it's a pretty large list). - * Without #error: it compiles, but functions are actually not inlined. - */ -# endif + /* Before that, we unconditionally #undef all symbols, + * in case they were already defined with XXH_NAMESPACE. + * They will then be redefined for XXH_INLINE_ALL + */ +# undef XXH_versionNumber + /* XXH32 */ +# undef XXH32 +# undef XXH32_createState +# undef XXH32_freeState +# undef XXH32_reset +# undef XXH32_update +# undef XXH32_digest +# undef XXH32_copyState +# undef XXH32_canonicalFromHash +# undef XXH32_hashFromCanonical + /* XXH64 */ +# undef XXH64 +# undef XXH64_createState +# undef XXH64_freeState +# undef XXH64_reset +# undef XXH64_update +# undef XXH64_digest +# undef XXH64_copyState +# undef XXH64_canonicalFromHash +# undef XXH64_hashFromCanonical + /* XXH3_64bits */ +# undef XXH3_64bits +# undef XXH3_64bits_withSecret +# undef XXH3_64bits_withSeed +# undef XXH3_64bits_withSecretandSeed +# undef XXH3_createState +# undef XXH3_freeState +# undef XXH3_copyState +# undef XXH3_64bits_reset +# undef XXH3_64bits_reset_withSeed +# undef XXH3_64bits_reset_withSecret +# undef XXH3_64bits_update +# undef XXH3_64bits_digest +# undef XXH3_generateSecret + /* XXH3_128bits */ +# undef XXH128 +# undef XXH3_128bits +# undef XXH3_128bits_withSeed +# undef XXH3_128bits_withSecret +# undef XXH3_128bits_reset +# undef XXH3_128bits_reset_withSeed +# undef XXH3_128bits_reset_withSecret +# undef XXH3_128bits_reset_withSecretandSeed +# undef XXH3_128bits_update +# undef XXH3_128bits_digest +# undef XXH128_isEqual +# undef XXH128_cmp +# undef XXH128_canonicalFromHash +# undef XXH128_hashFromCanonical + /* Finally, free the namespace itself */ +# undef XXH_NAMESPACE + + /* employ the namespace for XXH_INLINE_ALL */ # define XXH_NAMESPACE XXH_INLINE_ /* - * Some identifiers (enums, type names) are not symbols, but they must - * still be renamed to avoid redeclaration. + * Some identifiers (enums, type names) are not symbols, + * but they must nonetheless be renamed to avoid redeclaration. * Alternative solution: do not redeclare them. - * However, this requires some #ifdefs, and is a more dispersed action. - * Meanwhile, renaming can be achieved in a single block + * However, this requires some #ifdefs, and has a more dispersed impact. + * Meanwhile, renaming can be achieved in a single place. */ -# define XXH_IPREF(Id) XXH_INLINE_ ## Id +# define XXH_IPREF(Id) XXH_NAMESPACE ## Id # define XXH_OK XXH_IPREF(XXH_OK) # define XXH_ERROR XXH_IPREF(XXH_ERROR) # define XXH_errorcode XXH_IPREF(XXH_errorcode) @@ -165,6 +221,12 @@ extern "C" { #ifndef XXHASH_H_5627135585666179 #define XXHASH_H_5627135585666179 1 + +/*! + * @defgroup public Public API + * Contains details on the public xxHash functions. + * @{ + */ /* specific declaration modes for Windows */ #if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API) # if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT)) @@ -178,8 +240,9 @@ extern "C" { # endif #endif +#ifdef XXH_DOXYGEN /*! - * XXH_NAMESPACE, aka Namespace Emulation: + * @brief Emulate a namespace by transparently prefixing all symbols. * * If you want to include _and expose_ xxHash functions from within your own * library, but also want to avoid symbol collisions with other libraries which @@ -191,6 +254,10 @@ extern "C" { * includes `xxhash.h`: Regular symbol names will be automatically translated * by this header. */ +# define XXH_NAMESPACE /* YOUR NAME HERE */ +# undef XXH_NAMESPACE +#endif + #ifdef XXH_NAMESPACE # define XXH_CAT(A,B) A##B # define XXH_NAME2(A,B) XXH_CAT(A,B) @@ -219,23 +286,28 @@ extern "C" { # define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits) # define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret) # define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed) +# define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed) # define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState) # define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState) # define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState) # define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset) # define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed) # define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret) +# define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed) # define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update) # define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest) # define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret) +# define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed) /* XXH3_128bits */ # define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128) # define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits) # define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed) # define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret) +# define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed) # define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset) # define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed) # define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret) +# define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed) # define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update) # define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest) # define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual) @@ -250,13 +322,22 @@ extern "C" { ***************************************/ #define XXH_VERSION_MAJOR 0 #define XXH_VERSION_MINOR 8 -#define XXH_VERSION_RELEASE 0 +#define XXH_VERSION_RELEASE 1 #define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE) + +/*! + * @brief Obtains the xxHash version. + * + * This is mostly useful when xxHash is compiled as a shared library, + * since the returned value comes from the library, as opposed to header file. + * + * @return `XXH_VERSION_NUMBER` of the invoked library. + */ XXH_PUBLIC_API unsigned XXH_versionNumber (void); /* **************************** -* Definitions +* Common basic types ******************************/ #include /* size_t */ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; @@ -265,11 +346,20 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; /*-********************************************************************** * 32-bit hash ************************************************************************/ -#if !defined (__VMS) \ +#if defined(XXH_DOXYGEN) /* Don't show include */ +/*! + * @brief An unsigned 32-bit integer. + * + * Not necessarily defined to `uint32_t` but functionally equivalent. + */ +typedef uint32_t XXH32_hash_t; + +#elif !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) # include typedef uint32_t XXH32_hash_t; + #else # include # if UINT_MAX == 0xFFFFFFFFUL @@ -284,22 +374,48 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode; #endif /*! - * XXH32(): - * Calculate the 32-bit hash of sequence "length" bytes stored at memory address "input". - * The memory between input & input+length must be valid (allocated and read-accessible). - * "seed" can be used to alter the result predictably. - * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * @} + * + * @defgroup xxh32_family XXH32 family + * @ingroup public + * Contains functions used in the classic 32-bit xxHash algorithm. * - * Note: XXH3 provides competitive speed for both 32-bit and 64-bit systems, - * and offers true 64/128 bit hash results. It provides a superior level of - * dispersion, and greatly reduces the risks of collisions. + * @note + * XXH32 is useful for older platforms, with no or poor 64-bit performance. + * Note that @ref xxh3_family provides competitive speed + * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results. + * + * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families + * @see @ref xxh32_impl for implementation details + * @{ */ -XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); -/******* Streaming *******/ +/*! + * @brief Calculates the 32-bit hash of @p input using xxHash32. + * + * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s + * + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 32-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 32-bit hash value. + * + * @see + * XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version. + */ +XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed); -/* - * Streaming functions generate the xxHash value from an incrememtal input. +/*! + * Streaming functions generate the xxHash value from an incremental input. * This method is slower than single-call functions, due to state management. * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized. * @@ -319,15 +435,117 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_ * digest, and generate new hash values later on by invoking `XXH*_digest()`. * * When done, release the state using `XXH*_freeState()`. + * + * Example code for incrementally hashing a file: + * @code{.c} + * #include + * #include + * #define BUFFER_SIZE 256 + * + * // Note: XXH64 and XXH3 use the same interface. + * XXH32_hash_t + * hashFile(FILE* stream) + * { + * XXH32_state_t* state; + * unsigned char buf[BUFFER_SIZE]; + * size_t amt; + * XXH32_hash_t hash; + * + * state = XXH32_createState(); // Create a state + * assert(state != NULL); // Error check here + * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed + * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) { + * XXH32_update(state, buf, amt); // Hash the file in chunks + * } + * hash = XXH32_digest(state); // Finalize the hash + * XXH32_freeState(state); // Clean up + * return hash; + * } + * @endcode + */ + +/*! + * @typedef struct XXH32_state_s XXH32_state_t + * @brief The opaque state struct for the XXH32 streaming API. + * + * @see XXH32_state_s for details. */ +typedef struct XXH32_state_s XXH32_state_t; -typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */ +/*! + * @brief Allocates an @ref XXH32_state_t. + * + * Must be freed with XXH32_freeState(). + * @return An allocated XXH32_state_t on success, `NULL` on failure. + */ XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void); +/*! + * @brief Frees an @ref XXH32_state_t. + * + * Must be allocated with XXH32_createState(). + * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState(). + * @return XXH_OK. + */ XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr); +/*! + * @brief Copies one @ref XXH32_state_t to another. + * + * @param dst_state The state to copy to. + * @param src_state The state to copy from. + * @pre + * @p dst_state and @p src_state must not be `NULL` and must not overlap. + */ XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state); +/*! + * @brief Resets an @ref XXH32_state_t to begin a new hash. + * + * This function resets and seeds a state. Call it before @ref XXH32_update(). + * + * @param statePtr The state struct to reset. + * @param seed The 32-bit seed to alter the hash result predictably. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ XXH_PUBLIC_API XXH_errorcode XXH32_reset (XXH32_state_t* statePtr, XXH32_hash_t seed); + +/*! + * @brief Consumes a block of @p input to an @ref XXH32_state_t. + * + * Call this to incrementally consume blocks of data. + * + * @param statePtr The state struct to update. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * + * @pre + * @p statePtr must not be `NULL`. + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return @ref XXH_OK on success, @ref XXH_ERROR on failure. + */ XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length); + +/*! + * @brief Returns the calculated hash value from an @ref XXH32_state_t. + * + * @note + * Calling XXH32_digest() will not affect @p statePtr, so you can update, + * digest, and update again. + * + * @param statePtr The state struct to calculate the hash from. + * + * @pre + * @p statePtr must not be `NULL`. + * + * @return The calculated xxHash32 value from that state. + */ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); /******* Canonical representation *******/ @@ -351,41 +569,151 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr); * canonical format. */ -typedef struct { unsigned char digest[4]; } XXH32_canonical_t; +/*! + * @brief Canonical (big endian) representation of @ref XXH32_hash_t. + */ +typedef struct { + unsigned char digest[4]; /*!< Hash bytes, big endian */ +} XXH32_canonical_t; + +/*! + * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t. + * + * @param dst The @ref XXH32_canonical_t pointer to be stored to. + * @param hash The @ref XXH32_hash_t to be converted. + * + * @pre + * @p dst must not be `NULL`. + */ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash); + +/*! + * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t. + * + * @param src The @ref XXH32_canonical_t to convert. + * + * @pre + * @p src must not be `NULL`. + * + * @return The converted hash. + */ XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src); +#ifdef __has_attribute +# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define XXH_HAS_ATTRIBUTE(x) 0 +#endif + +/* C-language Attributes are added in C23. */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute) +# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x) +#else +# define XXH_HAS_C_ATTRIBUTE(x) 0 +#endif + +#if defined(__cplusplus) && defined(__has_cpp_attribute) +# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define XXH_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +/* +Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute +introduced in CPP17 and C23. +CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough +C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough +*/ +#if XXH_HAS_C_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_CPP_ATTRIBUTE(x) +# define XXH_FALLTHROUGH [[fallthrough]] +#elif XXH_HAS_ATTRIBUTE(__fallthrough__) +# define XXH_FALLTHROUGH __attribute__ ((fallthrough)) +#else +# define XXH_FALLTHROUGH +#endif + +/*! + * @} + * @ingroup public + * @{ + */ + #ifndef XXH_NO_LONG_LONG /*-********************************************************************** * 64-bit hash ************************************************************************/ -#if !defined (__VMS) \ +#if defined(XXH_DOXYGEN) /* don't include */ +/*! + * @brief An unsigned 64-bit integer. + * + * Not necessarily defined to `uint64_t` but functionally equivalent. + */ +typedef uint64_t XXH64_hash_t; +#elif !defined (__VMS) \ && (defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) -# include - typedef uint64_t XXH64_hash_t; +# include + typedef uint64_t XXH64_hash_t; #else - /* the following type must have a width of 64-bit */ - typedef unsigned long long XXH64_hash_t; +# include +# if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL + /* LP64 ABI says uint64_t is unsigned long */ + typedef unsigned long XXH64_hash_t; +# else + /* the following type must have a width of 64-bit */ + typedef unsigned long long XXH64_hash_t; +# endif #endif /*! - * XXH64(): - * Returns the 64-bit hash of sequence of length @length stored at memory - * address @input. - * @seed can be used to alter the result predictably. + * @} + * + * @defgroup xxh64_family XXH64 family + * @ingroup public + * @{ + * Contains functions used in the classic 64-bit xxHash algorithm. + * + * @note + * XXH3 provides competitive speed for both 32-bit and 64-bit systems, + * and offers true 64/128 bit hash results. + * It provides better speed for systems with vector processing capabilities. + */ + + +/*! + * @brief Calculates the 64-bit hash of @p input using xxHash64. * * This function usually runs faster on 64-bit systems, but slower on 32-bit * systems (see benchmark). * - * Note: XXH3 provides competitive speed for both 32-bit and 64-bit systems, - * and offers true 64/128 bit hash results. It provides a superior level of - * dispersion, and greatly reduces the risks of collisions. + * @param input The block of data to be hashed, at least @p length bytes in size. + * @param length The length of @p input, in bytes. + * @param seed The 64-bit seed to alter the hash's output predictably. + * + * @pre + * The memory between @p input and @p input + @p length must be valid, + * readable, contiguous memory. However, if @p length is `0`, @p input may be + * `NULL`. In C++, this also must be *TriviallyCopyable*. + * + * @return The calculated 64-bit hash. + * + * @see + * XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128(): + * Direct equivalents for the other variants of xxHash. + * @see + * XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version. */ -XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t length, XXH64_hash_t seed); +XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed); /******* Streaming *******/ +/*! + * @brief The opaque state struct for the XXH64 streaming API. + * + * @see XXH64_state_s for details. + */ typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */ XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void); XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr); @@ -400,13 +728,14 @@ typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash); XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src); - -/*-********************************************************************** -* XXH3 64-bit variant -************************************************************************/ - -/* ************************************************************************ - * XXH3 is a new hash algorithm featuring: +/*! + * @} + * ************************************************************************ + * @defgroup xxh3_family XXH3 family + * @ingroup public + * @{ + * + * XXH3 is a more recent hash algorithm featuring: * - Improved speed for both small and large inputs * - True 64-bit and 128-bit outputs * - SIMD acceleration @@ -416,46 +745,38 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src * * https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html * - * In general, expect XXH3 to run about ~2x faster on large inputs and >3x - * faster on small ones compared to XXH64, though exact differences depend on - * the platform. - * - * The algorithm is portable: Like XXH32 and XXH64, it generates the same hash - * on all platforms. - * - * It benefits greatly from SIMD and 64-bit arithmetic, but does not require it. + * Compared to XXH64, expect XXH3 to run approximately + * ~2x faster on large inputs and >3x faster on small ones, + * exact differences vary depending on platform. * - * Almost all 32-bit and 64-bit targets that can run XXH32 smoothly can run - * XXH3 at competitive speeds, even if XXH64 runs slowly. Further details are - * explained in the implementation. + * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic, + * but does not require it. + * Any 32-bit and 64-bit targets that can run XXH32 smoothly + * can run XXH3 at competitive speeds, even without vector support. + * Further details are explained in the implementation. * * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8, - * ZVector and scalar targets. This can be controlled with the XXH_VECTOR macro. + * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro. + * + * XXH3 implementation is portable: + * it has a generic C90 formulation that can be compiled on any platform, + * all implementations generage exactly the same hash value on all platforms. + * Starting from v0.8.0, it's also labelled "stable", meaning that + * any future version will also generate the same hash value. * * XXH3 offers 2 variants, _64bits and _128bits. - * When only 64 bits are needed, prefer calling the _64bits variant, as it - * reduces the amount of mixing, resulting in faster speed on small inputs. * + * When only 64 bits are needed, prefer invoking the _64bits variant, as it + * reduces the amount of mixing, resulting in faster speed on small inputs. * It's also generally simpler to manipulate a scalar return type than a struct. * - * The 128-bit version adds additional strength, but it is slightly slower. - * - * The XXH3 algorithm is still in development. - * The results it produces may still change in future versions. - * - * Results produced by v0.7.x are not comparable with results from v0.7.y. - * However, the API is completely stable, and it can safely be used for - * ephemeral data (local sessions). - * - * Avoid storing values in long-term storage until the algorithm is finalized. - * XXH3's return values will be officially finalized upon reaching v0.8.0. - * - * After which, return values of XXH3 and XXH128 will no longer change in - * future versions. - * * The API supports one-shot hashing, streaming mode, and custom secrets. */ +/*-********************************************************************** +* XXH3 64-bit variant +************************************************************************/ + /* XXH3_64bits(): * default 64-bit variant, using default secret and default seed of 0. * It's the fastest variant. */ @@ -470,20 +791,32 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len); */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed); +/*! + * The bare minimum size for a custom secret. + * + * @see + * XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(), + * XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret(). + */ +#define XXH3_SECRET_SIZE_MIN 136 + /* * XXH3_64bits_withSecret(): * It's possible to provide any blob of bytes as a "secret" to generate the hash. * This makes it more difficult for an external actor to prepare an intentional collision. * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN). - * However, the quality of produced hash values depends on secret's entropy. - * Technically, the secret must look like a bunch of random bytes. + * However, the quality of the secret impacts the dispersion of the hash algorithm. + * Therefore, the secret _must_ look like a bunch of random bytes. * Avoid "trivial" or structured data such as repeated sequences or a text document. - * Whenever unsure about the "randomness" of the blob of bytes, - * consider relabelling it as a "custom seed" instead, - * and employ "XXH3_generateSecret()" (see below) - * to generate a high entropy secret derived from the custom seed. + * Whenever in doubt about the "randomness" of the blob of bytes, + * consider employing "XXH3_generateSecret()" instead (see below). + * It will generate a proper high entropy secret derived from the blob of bytes. + * Another advantage of using XXH3_generateSecret() is that + * it guarantees that all bits within the initial blob of bytes + * will impact every bit of the output. + * This is not necessarily the case when using the blob of bytes directly + * because, when hashing _small_ inputs, only a portion of the secret is employed. */ -#define XXH3_SECRET_SIZE_MIN 136 XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize); @@ -494,6 +827,12 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, * As a consequence, streaming is slower than one-shot hashing. * For better performance, prefer one-shot functions whenever applicable. */ + +/*! + * @brief The state struct for the XXH3 streaming API. + * + * @see XXH3_state_s for details. + */ typedef struct XXH3_state_s XXH3_state_t; XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void); XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr); @@ -533,9 +872,15 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr); * XXH3 128-bit variant ************************************************************************/ +/*! + * @brief The return value from 128-bit hashes. + * + * Stored in little endian order, although the fields themselves are in native + * endianness. + */ typedef struct { - XXH64_hash_t low64; - XXH64_hash_t high64; + XXH64_hash_t low64; /*!< `value & 0xFFFFFFFFFFFFFFFF` */ + XXH64_hash_t high64; /*!< `value >> 64` */ } XXH128_hash_t; XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len); @@ -592,6 +937,9 @@ XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* #endif /* XXH_NO_LONG_LONG */ +/*! + * @} + */ #endif /* XXHASH_H_5627135585666179 */ @@ -612,36 +960,57 @@ XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* * Never **ever** access their members directly. */ +/*! + * @internal + * @brief Structure for XXH32 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH32_state_t. + * Do not access the members of this struct directly. + * @see XXH64_state_s, XXH3_state_s + */ struct XXH32_state_s { - XXH32_hash_t total_len_32; - XXH32_hash_t large_len; - XXH32_hash_t v1; - XXH32_hash_t v2; - XXH32_hash_t v3; - XXH32_hash_t v4; - XXH32_hash_t mem32[4]; - XXH32_hash_t memsize; - XXH32_hash_t reserved; /* never read nor write, might be removed in a future version */ + XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */ + XXH32_hash_t large_len; /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */ + XXH32_hash_t v[4]; /*!< Accumulator lanes */ + XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */ + XXH32_hash_t reserved; /*!< Reserved field. Do not read or write to it, it may be removed. */ }; /* typedef'd to XXH32_state_t */ #ifndef XXH_NO_LONG_LONG /* defined when there is no 64-bit support */ +/*! + * @internal + * @brief Structure for XXH64 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is + * an opaque type. This allows fields to safely be changed. + * + * Typedef'd to @ref XXH64_state_t. + * Do not access the members of this struct directly. + * @see XXH32_state_s, XXH3_state_s + */ struct XXH64_state_s { - XXH64_hash_t total_len; - XXH64_hash_t v1; - XXH64_hash_t v2; - XXH64_hash_t v3; - XXH64_hash_t v4; - XXH64_hash_t mem64[4]; - XXH32_hash_t memsize; - XXH32_hash_t reserved32; /* required for padding anyway */ - XXH64_hash_t reserved64; /* never read nor write, might be removed in a future version */ + XXH64_hash_t total_len; /*!< Total length hashed. This is always 64-bit. */ + XXH64_hash_t v[4]; /*!< Accumulator lanes */ + XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */ + XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */ + XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/ + XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it, it may be removed. */ }; /* typedef'd to XXH64_state_t */ -#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11+ */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */ # include # define XXH_ALIGN(n) alignas(n) +#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */ +/* In C++ alignas() is a keyword */ +# define XXH_ALIGN(n) alignas(n) #elif defined(__GNUC__) # define XXH_ALIGN(n) __attribute__ ((aligned(n))) #elif defined(_MSC_VER) @@ -652,35 +1021,88 @@ struct XXH64_state_s { /* Old GCC versions only accept the attribute after the type in structures. */ #if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) /* C11+ */ \ + && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \ && defined(__GNUC__) # define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align) #else # define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type #endif +/*! + * @brief The size of the internal XXH3 buffer. + * + * This is the optimal update size for incremental hashing. + * + * @see XXH3_64b_update(), XXH3_128b_update(). + */ #define XXH3_INTERNALBUFFER_SIZE 256 + +/*! + * @brief Default size of the secret buffer (and @ref XXH3_kSecret). + * + * This is the size used in @ref XXH3_kSecret and the seeded functions. + * + * Not to be confused with @ref XXH3_SECRET_SIZE_MIN. + */ #define XXH3_SECRET_DEFAULT_SIZE 192 + +/*! + * @internal + * @brief Structure for XXH3 streaming API. + * + * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY, + * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. + * Otherwise it is an opaque type. + * Never use this definition in combination with dynamic library. + * This allows fields to safely be changed in the future. + * + * @note ** This structure has a strict alignment requirement of 64 bytes!! ** + * Do not allocate this with `malloc()` or `new`, + * it will not be sufficiently aligned. + * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation. + * + * Typedef'd to @ref XXH3_state_t. + * Do never access the members of this struct directly. + * + * @see XXH3_INITSTATE() for stack initialization. + * @see XXH3_createState(), XXH3_freeState(). + * @see XXH32_state_s, XXH64_state_s + */ struct XXH3_state_s { XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]); - /* used to store a custom secret generated from a seed */ + /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */ XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]); + /*!< Used to store a custom secret generated from a seed. */ XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]); + /*!< The internal buffer. @see XXH32_state_s::mem32 */ XXH32_hash_t bufferedSize; - XXH32_hash_t reserved32; + /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */ + XXH32_hash_t useSeed; + /*!< Reserved field. Needed for padding on 64-bit. */ size_t nbStripesSoFar; + /*!< Number or stripes processed. */ XXH64_hash_t totalLen; + /*!< Total length hashed. 64-bit even on 32-bit targets. */ size_t nbStripesPerBlock; + /*!< Number of stripes per block. */ size_t secretLimit; + /*!< Size of @ref customSecret or @ref extSecret */ XXH64_hash_t seed; + /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */ XXH64_hash_t reserved64; - const unsigned char* extSecret; /* reference to external secret; - * if == NULL, use .customSecret instead */ + /*!< Reserved field. */ + const unsigned char* extSecret; + /*!< Reference to an external secret for the _withSecret variants, NULL + * for other variants. */ /* note: there may be some padding at the end due to alignment on 64 bytes */ }; /* typedef'd to XXH3_state_t */ #undef XXH_ALIGN_MEMBER -/* When the XXH3_state_t structure is merely emplaced on stack, +/*! + * @brief Initializes a stack-allocated `XXH3_state_s`. + * + * When the @ref XXH3_state_t structure is merely emplaced on stack, * it should be initialized with XXH3_INITSTATE() or a memset() * in case its first reset uses XXH3_NNbits_reset_withSeed(). * This init can be omitted if the first reset uses default or _withSecret mode. @@ -691,6 +1113,12 @@ struct XXH3_state_s { #define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; } +/* XXH128() : + * simple alias to pre-selected XXH3_128bits variant + */ +XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); + + /* === Experimental API === */ /* Symbols defined below must be considered tied to a specific library version. */ @@ -703,36 +1131,92 @@ struct XXH3_state_s { * as it becomes much more difficult for an external actor to guess how to impact the calculation logic. * * The function accepts as input a custom seed of any length and any content, - * and derives from it a high-entropy secret of length XXH3_SECRET_DEFAULT_SIZE - * into an already allocated buffer secretBuffer. - * The generated secret is _always_ XXH_SECRET_DEFAULT_SIZE bytes long. + * and derives from it a high-entropy secret of length @secretSize + * into an already allocated buffer @secretBuffer. + * @secretSize must be >= XXH3_SECRET_SIZE_MIN * * The generated secret can then be used with any `*_withSecret()` variant. * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`, * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()` * are part of this list. They all accept a `secret` parameter - * which must be very long for implementation reasons (>= XXH3_SECRET_SIZE_MIN) + * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN) * _and_ feature very high entropy (consist of random-looking bytes). * These conditions can be a high bar to meet, so - * this function can be used to generate a secret of proper quality. + * XXH3_generateSecret() can be employed to ensure proper quality. * * customSeed can be anything. It can have any size, even small ones, - * and its content can be anything, even stupidly "low entropy" source such as a bunch of zeroes. - * The resulting `secret` will nonetheless provide all expected qualities. + * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes. + * The resulting `secret` will nonetheless provide all required qualities. * - * Supplying NULL as the customSeed copies the default secret into `secretBuffer`. * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior. */ -XXH_PUBLIC_API void XXH3_generateSecret(void* secretBuffer, const void* customSeed, size_t customSeedSize); +XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize); -/* simple short-cut to pre-selected XXH3_128bits variant */ -XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed); +/* + * XXH3_generateSecret_fromSeed(): + * + * Generate the same secret as the _withSeed() variants. + * + * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily). + * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes. + * + * The generated secret can be used in combination with + *`*_withSecret()` and `_withSecretandSeed()` variants. + * This generator is notably useful in combination with `_withSecretandSeed()`, + * as a way to emulate a faster `_withSeed()` variant. + */ +XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed); +/* + * *_withSecretandSeed() : + * These variants generate hash values using either + * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes) + * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX). + * + * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`. + * `_withSeed()` has to generate the secret on the fly for "large" keys. + * It's fast, but can be perceptible for "not so large" keys (< 1 KB). + * `_withSecret()` has to generate the masks on the fly for "small" keys, + * which requires more instructions than _withSeed() variants. + * Therefore, _withSecretandSeed variant combines the best of both worlds. + * + * When @secret has been generated by XXH3_generateSecret_fromSeed(), + * this variant produces *exactly* the same results as `_withSeed()` variant, + * hence offering only a pure speed benefit on "large" input, + * by skipping the need to regenerate the secret for every large input. + * + * Another usage scenario is to hash the secret to a 64-bit hash value, + * for example with XXH3_64bits(), which then becomes the seed, + * and then employ both the seed and the secret in _withSecretandSeed(). + * On top of speed, an added benefit is that each bit in the secret + * has a 50% chance to swap each bit in the output, + * via its impact to the seed. + * This is not guaranteed when using the secret directly in "small data" scenarios, + * because only portions of the secret are employed for small data. + */ +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed); -#endif /* XXH_NO_LONG_LONG */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* data, size_t len, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); + +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, + const void* secret, size_t secretSize, + XXH64_hash_t seed64); +#endif /* XXH_NO_LONG_LONG */ #if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) # define XXH_IMPLEMENTATION #endif @@ -774,8 +1258,24 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s /* ************************************* * Tuning parameters ***************************************/ + +/*! + * @defgroup tuning Tuning parameters + * @{ + * + * Various macros to control xxHash's behavior. + */ +#ifdef XXH_DOXYGEN /*! - * XXH_FORCE_MEMORY_ACCESS: + * @brief Define this to disable 64-bit code. + * + * Useful if only using the @ref xxh32_family and you have a strict C90 compiler. + */ +# define XXH_NO_LONG_LONG +# undef XXH_NO_LONG_LONG /* don't actually */ +/*! + * @brief Controls how unaligned memory is accessed. + * * By default, access to unaligned memory is controlled by `memcpy()`, which is * safe and portable. * @@ -784,58 +1284,65 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s * * The below switch allow selection of a different access method * in the search for improved performance. - * Method 0 (default): - * Use `memcpy()`. Safe and portable. Default. - * Method 1: - * `__attribute__((packed))` statement. It depends on compiler extensions - * and is therefore not portable. - * This method is safe if your compiler supports it, and *generally* as - * fast or faster than `memcpy`. - * Method 2: - * Direct access via cast. This method doesn't depend on the compiler but - * violates the C standard. - * It can generate buggy code on targets which do not support unaligned - * memory accesses. - * But in some circumstances, it's the only known way to get the most - * performance (example: GCC + ARMv6) - * Method 3: - * Byteshift. This can generate the best code on old compilers which don't + * + * @par Possible options: + * + * - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy` + * @par + * Use `memcpy()`. Safe and portable. Note that most modern compilers will + * eliminate the function call and treat it as an unaligned access. + * + * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))` + * @par + * Depends on compiler extensions and is therefore not portable. + * This method is safe _if_ your compiler supports it, + * and *generally* as fast or faster than `memcpy`. + * + * - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast + * @par + * Casts directly and dereferences. This method doesn't depend on the + * compiler, but it violates the C standard as it directly dereferences an + * unaligned pointer. It can generate buggy code on targets which do not + * support unaligned memory accesses, but in some circumstances, it's the + * only known way to get the most performance. + * + * - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift + * @par + * Also portable. This can generate the best code on old compilers which don't * inline small `memcpy()` calls, and it might also be faster on big-endian - * systems which lack a native byteswap instruction. - * See https://stackoverflow.com/a/32095106/646947 for details. - * Prefer these methods in priority order (0 > 1 > 2 > 3) + * systems which lack a native byteswap instruction. However, some compilers + * will emit literal byteshifts even if the target supports unaligned access. + * . + * + * @warning + * Methods 1 and 2 rely on implementation-defined behavior. Use these with + * care, as what works on one compiler/platform/optimization level may cause + * another to read garbage data or even crash. + * + * See http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details. + * + * Prefer these methods in priority order (0 > 3 > 1 > 2) */ -#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ -# if !defined(__clang__) && defined(__GNUC__) && defined(__ARM_FEATURE_UNALIGNED) && defined(__ARM_ARCH) && (__ARM_ARCH == 6) -# define XXH_FORCE_MEMORY_ACCESS 2 -# elif !defined(__clang__) && ((defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ - (defined(__GNUC__) && (defined(__ARM_ARCH) && __ARM_ARCH >= 7))) -# define XXH_FORCE_MEMORY_ACCESS 1 -# endif -#endif - -/*! - * XXH_ACCEPT_NULL_INPUT_POINTER: - * If the input pointer is NULL, xxHash's default behavior is to dereference it, - * triggering a segfault. - * When this macro is enabled, xxHash actively checks the input for a null pointer. - * If it is, the result for null input pointers is the same as a zero-length input. - */ -#ifndef XXH_ACCEPT_NULL_INPUT_POINTER /* can be defined externally */ -# define XXH_ACCEPT_NULL_INPUT_POINTER 0 -#endif +# define XXH_FORCE_MEMORY_ACCESS 0 /*! - * XXH_FORCE_ALIGN_CHECK: - * This is an important performance trick - * for architectures without decent unaligned memory access performance. - * It checks for input alignment, and when conditions are met, - * uses a "fast path" employing direct 32-bit/64-bit read, - * resulting in _dramatically faster_ read speed. + * @def XXH_FORCE_ALIGN_CHECK + * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32() + * and XXH64() only). * - * The check costs one initial branch per hash, which is generally negligible, but not zero. - * Moreover, it's not useful to generate binary for an additional code path - * if memory access uses same instruction for both aligned and unaligned adresses. + * This is an important performance trick for architectures without decent + * unaligned memory access performance. + * + * It checks for input alignment, and when conditions are met, uses a "fast + * path" employing direct 32-bit/64-bit reads, resulting in _dramatically + * faster_ read speed. + * + * The check costs one initial branch per hash, which is generally negligible, + * but not zero. + * + * Moreover, it's not useful to generate an additional code path if memory + * access uses the same instruction for both aligned and unaligned + * addresses (e.g. x86 and aarch64). * * In these cases, the alignment check can be removed by setting this macro to 0. * Then the code will always use unaligned memory access. @@ -844,17 +1351,11 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s * * This option does not affect XXH3 (only XXH32 and XXH64). */ -#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ -# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ - || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ -# define XXH_FORCE_ALIGN_CHECK 0 -# else -# define XXH_FORCE_ALIGN_CHECK 1 -# endif -#endif +# define XXH_FORCE_ALIGN_CHECK 0 /*! - * XXH_NO_INLINE_HINTS: + * @def XXH_NO_INLINE_HINTS + * @brief When non-zero, sets all functions to `static`. * * By default, xxHash tries to force the compiler to inline almost all internal * functions. @@ -872,6 +1373,63 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using * -fno-inline with GCC or Clang, this will automatically be defined. */ +# define XXH_NO_INLINE_HINTS 0 + +/*! + * @def XXH32_ENDJMP + * @brief Whether to use a jump for `XXH32_finalize`. + * + * For performance, `XXH32_finalize` uses multiple branches in the finalizer. + * This is generally preferable for performance, + * but depending on exact architecture, a jmp may be preferable. + * + * This setting is only possibly making a difference for very small inputs. + */ +# define XXH32_ENDJMP 0 + +/*! + * @internal + * @brief Redefines old internal names. + * + * For compatibility with code that uses xxHash's internals before the names + * were changed to improve namespacing. There is no other reason to use this. + */ +# define XXH_OLD_NAMES +# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */ +#endif /* XXH_DOXYGEN */ +/*! + * @} + */ + +#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */ + /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */ +# if !defined(__clang__) && \ +( \ + (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \ + ( \ + defined(__GNUC__) && ( \ + (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \ + ( \ + defined(__mips__) && \ + (__mips <= 5 || __mips_isa_rev < 6) && \ + (!defined(__mips16) || defined(__mips_mips16e2)) \ + ) \ + ) \ + ) \ +) +# define XXH_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */ +# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \ + || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */ +# define XXH_FORCE_ALIGN_CHECK 0 +# else +# define XXH_FORCE_ALIGN_CHECK 1 +# endif +#endif + #ifndef XXH_NO_INLINE_HINTS # if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \ || defined(__NO_INLINE__) /* -O0, -fno-inline */ @@ -881,36 +1439,44 @@ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t s # endif #endif +#ifndef XXH32_ENDJMP +/* generally preferable for performance */ +# define XXH32_ENDJMP 0 +#endif + /*! - * XXH_REROLL: - * Whether to reroll XXH32_finalize, and XXH64_finalize, - * instead of using an unrolled jump table/if statement loop. - * - * This is automatically defined on -Os/-Oz on GCC and Clang. + * @defgroup impl Implementation + * @{ */ -#ifndef XXH_REROLL -# if defined(__OPTIMIZE_SIZE__) -# define XXH_REROLL 1 -# else -# define XXH_REROLL 0 -# endif -#endif /* ************************************* * Includes & Memory related functions ***************************************/ -/*! +/* * Modify the local functions below should you wish to use * different memory routines for malloc() and free() */ #include +/*! + * @internal + * @brief Modify this function to use a different routine than malloc(). + */ static void* XXH_malloc(size_t s) { return malloc(s); } + +/*! + * @internal + * @brief Modify this function to use a different routine than free(). + */ static void XXH_free(void* p) { free(p); } -/*! and for memcpy() */ #include + +/*! + * @internal + * @brief Modify this function to use a different routine than memcpy(). + */ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcpy(dest,src,size); @@ -927,19 +1493,19 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) #endif #if XXH_NO_INLINE_HINTS /* disable inlining hints */ -# if defined(__GNUC__) +# if defined(__GNUC__) || defined(__clang__) # define XXH_FORCE_INLINE static __attribute__((unused)) # else # define XXH_FORCE_INLINE static # endif # define XXH_NO_INLINE static /* enable inlining hints */ +#elif defined(__GNUC__) || defined(__clang__) +# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) +# define XXH_NO_INLINE static __attribute__((noinline)) #elif defined(_MSC_VER) /* Visual Studio */ # define XXH_FORCE_INLINE static __forceinline # define XXH_NO_INLINE static __declspec(noinline) -#elif defined(__GNUC__) -# define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused)) -# define XXH_NO_INLINE static __attribute__((noinline)) #elif defined (__cplusplus) \ || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* C99 */ # define XXH_FORCE_INLINE static inline @@ -954,7 +1520,11 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) /* ************************************* * Debug ***************************************/ -/* +/*! + * @ingroup tuning + * @def XXH_DEBUGLEVEL + * @brief Sets the debugging level. + * * XXH_DEBUGLEVEL is expected to be defined externally, typically via the * compiler's command line options. The value must be a number. */ @@ -974,8 +1544,39 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) #endif /* note: use after variable declarations */ -#define XXH_STATIC_ASSERT(c) do { enum { XXH_sa = 1/(int)(!!(c)) }; } while (0) +#ifndef XXH_STATIC_ASSERT +# if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ +# include +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# elif defined(__cplusplus) && (__cplusplus >= 201103L) /* C++11 */ +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0) +# else +# define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0) +# endif +# define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c) +#endif +/*! + * @internal + * @def XXH_COMPILER_GUARD(var) + * @brief Used to prevent unwanted optimizations for @p var. + * + * It uses an empty GCC inline assembly statement with a register constraint + * which forces @p var into a general purpose register (eg eax, ebx, ecx + * on x86) and marks it as modified. + * + * This is used in a few places to avoid unwanted autovectorization (e.g. + * XXH32_round()). All vectorization we want is explicit via intrinsics, + * and _usually_ isn't wanted elsewhere. + * + * We also use it to prevent unwanted constant folding for AArch64 in + * XXH3_initCustomSecret_scalar(). + */ +#if defined(__GNUC__) || defined(__clang__) +# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var)) +#else +# define XXH_COMPILER_GUARD(var) ((void)0) +#endif /* ************************************* * Basic Types @@ -998,6 +1599,56 @@ typedef XXH32_hash_t xxh_u32; /* *** Memory access *** */ +/*! + * @internal + * @fn xxh_u32 XXH_read32(const void* ptr) + * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit native endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32(const void* ptr) + * @brief Reads an unaligned 32-bit little endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readBE32(const void* ptr) + * @brief Reads an unaligned 32-bit big endian integer from @p ptr. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * + * @param ptr The pointer to read from. + * @return The 32-bit big endian integer from the bytes at @p ptr. + */ + +/*! + * @internal + * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align) + * @brief Like @ref XXH_readLE32(), but has an option for aligned reads. + * + * Affected by @ref XXH_FORCE_MEMORY_ACCESS. + * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is + * always @ref XXH_alignment::XXH_unaligned. + * + * @param ptr The pointer to read from. + * @param align Whether @p ptr is aligned. + * @pre + * If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte + * aligned. + * @return The 32-bit little endian integer from the bytes at @p ptr. + */ + #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) /* * Manual byteshift. Best for old compilers which don't inline memcpy. @@ -1032,28 +1683,35 @@ static xxh_u32 XXH_read32(const void* ptr) /* * Portable and safe solution. Generally efficient. - * see: https://stackoverflow.com/a/32095106/646947 + * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html */ static xxh_u32 XXH_read32(const void* memPtr) { xxh_u32 val; - memcpy(&val, memPtr, sizeof(val)); + XXH_memcpy(&val, memPtr, sizeof(val)); return val; } #endif /* XXH_FORCE_DIRECT_MEMORY_ACCESS */ -/* *** Endianess *** */ -typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; +/* *** Endianness *** */ /*! - * XXH_CPU_LITTLE_ENDIAN: + * @ingroup tuning + * @def XXH_CPU_LITTLE_ENDIAN + * @brief Whether the target is little endian. + * * Defined to 1 if the target is little endian, or 0 if it is big endian. * It can be defined externally, for example on the compiler command line. * - * If it is not defined, a runtime check (which is usually constant folded) - * is used instead. + * If it is not defined, + * a runtime check (which is usually constant folded) is used instead. + * + * @note + * This is not necessarily defined to an integer constant. + * + * @see XXH_isLittleEndian() for the runtime check. */ #ifndef XXH_CPU_LITTLE_ENDIAN /* @@ -1068,8 +1726,11 @@ typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess; || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) # define XXH_CPU_LITTLE_ENDIAN 0 # else -/* - * runtime test, presumed to simplify to a constant by compiler +/*! + * @internal + * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN. + * + * Most compilers will constant fold this. */ static int XXH_isLittleEndian(void) { @@ -1098,6 +1759,19 @@ static int XXH_isLittleEndian(void) # define XXH_HAS_BUILTIN(x) 0 #endif +/*! + * @internal + * @def XXH_rotl32(x,r) + * @brief 32-bit rotate left. + * + * @param x The 32-bit integer to be rotated. + * @param r The number of bits to rotate. + * @pre + * @p r > 0 && @p r < 32 + * @note + * @p x and @p r may be evaluated multiple times. + * @return The rotated result. + */ #if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \ && XXH_HAS_BUILTIN(__builtin_rotateleft64) # define XXH_rotl32 __builtin_rotateleft32 @@ -1111,6 +1785,14 @@ static int XXH_isLittleEndian(void) # define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r)))) #endif +/*! + * @internal + * @fn xxh_u32 XXH_swap32(xxh_u32 x) + * @brief A 32-bit byteswap. + * + * @param x The 32-bit integer to byteswap. + * @return @p x, byteswapped. + */ #if defined(_MSC_VER) /* Visual Studio */ # define XXH_swap32 _byteswap_ulong #elif XXH_GCC_VERSION >= 403 @@ -1129,7 +1811,15 @@ static xxh_u32 XXH_swap32 (xxh_u32 x) /* *************************** * Memory reads *****************************/ -typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment; + +/*! + * @internal + * @brief Enum to indicate whether a pointer is aligned. + */ +typedef enum { + XXH_aligned, /*!< Aligned */ + XXH_unaligned /*!< Possibly unaligned */ +} XXH_alignment; /* * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. @@ -1182,17 +1872,25 @@ XXH_readLE32_align(const void* ptr, XXH_alignment align) /* ************************************* * Misc ***************************************/ +/*! @ingroup public */ XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; } /* ******************************************************************* * 32-bit hash functions *********************************************************************/ -static const xxh_u32 XXH_PRIME32_1 = 0x9E3779B1U; /* 0b10011110001101110111100110110001 */ -static const xxh_u32 XXH_PRIME32_2 = 0x85EBCA77U; /* 0b10000101111010111100101001110111 */ -static const xxh_u32 XXH_PRIME32_3 = 0xC2B2AE3DU; /* 0b11000010101100101010111000111101 */ -static const xxh_u32 XXH_PRIME32_4 = 0x27D4EB2FU; /* 0b00100111110101001110101100101111 */ -static const xxh_u32 XXH_PRIME32_5 = 0x165667B1U; /* 0b00010110010101100110011110110001 */ +/*! + * @} + * @defgroup xxh32_impl XXH32 implementation + * @ingroup impl + * @{ + */ + /* #define instead of static const, to be used as initializers */ +#define XXH_PRIME32_1 0x9E3779B1U /*!< 0b10011110001101110111100110110001 */ +#define XXH_PRIME32_2 0x85EBCA77U /*!< 0b10000101111010111100101001110111 */ +#define XXH_PRIME32_3 0xC2B2AE3DU /*!< 0b11000010101100101010111000111101 */ +#define XXH_PRIME32_4 0x27D4EB2FU /*!< 0b00100111110101001110101100101111 */ +#define XXH_PRIME32_5 0x165667B1U /*!< 0b00010110010101100110011110110001 */ #ifdef XXH_OLD_NAMES # define PRIME32_1 XXH_PRIME32_1 @@ -1202,18 +1900,28 @@ static const xxh_u32 XXH_PRIME32_5 = 0x165667B1U; /* 0b00010110010101100110011 # define PRIME32_5 XXH_PRIME32_5 #endif +/*! + * @internal + * @brief Normal stripe processing routine. + * + * This shuffles the bits so that any bit from @p input impacts several bits in + * @p acc. + * + * @param acc The accumulator lane. + * @param input The stripe of input to mix. + * @return The mixed accumulator lane. + */ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) { acc += input * XXH_PRIME32_2; acc = XXH_rotl32(acc, 13); acc *= XXH_PRIME32_1; -#if defined(__GNUC__) && defined(__SSE4_1__) && !defined(XXH_ENABLE_AUTOVECTORIZE) +#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE) /* * UGLY HACK: - * This inline assembly hack forces acc into a normal register. This is the - * only thing that prevents GCC and Clang from autovectorizing the XXH32 - * loop (pragmas and attributes don't work for some resason) without globally - * disabling SSE4.1. + * A compiler fence is the only thing that prevents GCC and Clang from + * autovectorizing the XXH32 loop (pragmas and attributes don't work for some + * reason) without globally disabling SSE4.1. * * The reason we want to avoid vectorization is because despite working on * 4 integers at a time, there are multiple factors slowing XXH32 down on @@ -1238,27 +1946,25 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input) * can load data, while v3 can multiply. SSE forces them to operate * together. * - * How this hack works: - * __asm__("" // Declare an assembly block but don't declare any instructions - * : // However, as an Input/Output Operand, - * "+r" // constrain a read/write operand (+) as a general purpose register (r). - * (acc) // and set acc as the operand - * ); - * - * Because of the 'r', the compiler has promised that seed will be in a - * general purpose register and the '+' says that it will be 'read/write', - * so it has to assume it has changed. It is like volatile without all the - * loads and stores. - * - * Since the argument has to be in a normal register (not an SSE register), - * each time XXH32_round is called, it is impossible to vectorize. + * This is also enabled on AArch64, as Clang autovectorizes it incorrectly + * and it is pointless writing a NEON implementation that is basically the + * same speed as scalar for XXH32. */ - __asm__("" : "+r" (acc)); + XXH_COMPILER_GUARD(acc); #endif return acc; } -/* mix all bits */ +/*! + * @internal + * @brief Mixes all bits to finalize the hash. + * + * The final mix ensures that all input bits have a chance to impact any bit in + * the output digest, resulting in an unbiased distribution. + * + * @param h32 The hash to avalanche. + * @return The avalanched hash. + */ static xxh_u32 XXH32_avalanche(xxh_u32 h32) { h32 ^= h32 >> 15; @@ -1271,6 +1977,20 @@ static xxh_u32 XXH32_avalanche(xxh_u32 h32) #define XXH_get32bits(p) XXH_readLE32_align(p, align) +/*! + * @internal + * @brief Processes the last 0-15 bytes of @p ptr. + * + * There may be up to 15 bytes remaining to consume from the input. + * This final stage will digest them to ensure that all input bytes are present + * in the final mix. + * + * @param h32 The hash to finalize. + * @param ptr The pointer to the remaining input. + * @param len The remaining length, modulo 16. + * @param align Whether @p ptr is aligned. + * @return The finalized hash. + */ static xxh_u32 XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) { @@ -1285,8 +2005,10 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \ } while (0) - /* Compact rerolled version */ - if (XXH_REROLL) { + if (ptr==NULL) XXH_ASSERT(len == 0); + + /* Compact rerolled version; generally faster */ + if (!XXH32_ENDJMP) { len &= 15; while (len >= 4) { XXH_PROCESS4; @@ -1300,41 +2022,41 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) } else { switch(len&15) /* or switch(bEnd - p) */ { case 12: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 8: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 4: XXH_PROCESS4; return XXH32_avalanche(h32); case 13: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 9: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 5: XXH_PROCESS4; XXH_PROCESS1; return XXH32_avalanche(h32); case 14: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 10: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 6: XXH_PROCESS4; XXH_PROCESS1; XXH_PROCESS1; return XXH32_avalanche(h32); case 15: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 11: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 7: XXH_PROCESS4; - /* fallthrough */ + XXH_FALLTHROUGH; case 3: XXH_PROCESS1; - /* fallthrough */ + XXH_FALLTHROUGH; case 2: XXH_PROCESS1; - /* fallthrough */ + XXH_FALLTHROUGH; case 1: XXH_PROCESS1; - /* fallthrough */ + XXH_FALLTHROUGH; case 0: return XXH32_avalanche(h32); } XXH_ASSERT(0); @@ -1350,20 +2072,23 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align) # undef XXH_PROCESS4 #endif +/*! + * @internal + * @brief The implementation for @ref XXH32(). + * + * @param input , len , seed Directly passed from @ref XXH32(). + * @param align Whether @p input is aligned. + * @return The calculated hash. + */ XXH_FORCE_INLINE xxh_u32 XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align) { - const xxh_u8* bEnd = input + len; xxh_u32 h32; -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - if (input==NULL) { - len=0; - bEnd=input=(const xxh_u8*)(size_t)16; - } -#endif + if (input==NULL) XXH_ASSERT(len == 0); if (len>=16) { + const xxh_u8* const bEnd = input + len; const xxh_u8* const limit = bEnd - 15; xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; xxh_u32 v2 = seed + XXH_PRIME32_2; @@ -1388,7 +2113,7 @@ XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment return XXH32_finalize(h32, input, len&15, align); } - +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed) { #if 0 @@ -1397,9 +2122,7 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t s XXH32_reset(&state, seed); XXH32_update(&state, (const xxh_u8*)input, len); return XXH32_digest(&state); - #else - if (XXH_FORCE_ALIGN_CHECK) { if ((((size_t)input) & 3) == 0) { /* Input is 4-bytes aligned, leverage the speed benefit */ return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned); @@ -1412,45 +2135,49 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t s /******* Hash streaming *******/ - +/*! + * @ingroup xxh32_family + */ XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void) { return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t)); } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr) { XXH_free(statePtr); return XXH_OK; } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState) { - memcpy(dstState, srcState, sizeof(*dstState)); + XXH_memcpy(dstState, srcState, sizeof(*dstState)); } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed) { XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */ memset(&state, 0, sizeof(state)); - state.v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2; - state.v2 = seed + XXH_PRIME32_2; - state.v3 = seed + 0; - state.v4 = seed - XXH_PRIME32_1; + state.v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2; + state.v[1] = seed + XXH_PRIME32_2; + state.v[2] = seed + 0; + state.v[3] = seed - XXH_PRIME32_1; /* do not write into reserved, planned to be removed in a future version */ - memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); + XXH_memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved)); return XXH_OK; } +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH_errorcode XXH32_update(XXH32_state_t* state, const void* input, size_t len) { - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) + if (input==NULL) { + XXH_ASSERT(len == 0); return XXH_OK; -#else - return XXH_ERROR; -#endif + } { const xxh_u8* p = (const xxh_u8*)input; const xxh_u8* const bEnd = p + len; @@ -1467,10 +2194,10 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len) if (state->memsize) { /* some data left from previous update */ XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize); { const xxh_u32* p32 = state->mem32; - state->v1 = XXH32_round(state->v1, XXH_readLE32(p32)); p32++; - state->v2 = XXH32_round(state->v2, XXH_readLE32(p32)); p32++; - state->v3 = XXH32_round(state->v3, XXH_readLE32(p32)); p32++; - state->v4 = XXH32_round(state->v4, XXH_readLE32(p32)); + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32)); } p += 16-state->memsize; state->memsize = 0; @@ -1478,22 +2205,14 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len) if (p <= bEnd-16) { const xxh_u8* const limit = bEnd - 16; - xxh_u32 v1 = state->v1; - xxh_u32 v2 = state->v2; - xxh_u32 v3 = state->v3; - xxh_u32 v4 = state->v4; do { - v1 = XXH32_round(v1, XXH_readLE32(p)); p+=4; - v2 = XXH32_round(v2, XXH_readLE32(p)); p+=4; - v3 = XXH32_round(v3, XXH_readLE32(p)); p+=4; - v4 = XXH32_round(v4, XXH_readLE32(p)); p+=4; + state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4; + state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4; + state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4; + state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4; } while (p<=limit); - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; } if (p < bEnd) { @@ -1506,17 +2225,18 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len) } -XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* state) +/*! @ingroup xxh32_family */ +XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state) { xxh_u32 h32; if (state->large_len) { - h32 = XXH_rotl32(state->v1, 1) - + XXH_rotl32(state->v2, 7) - + XXH_rotl32(state->v3, 12) - + XXH_rotl32(state->v4, 18); + h32 = XXH_rotl32(state->v[0], 1) + + XXH_rotl32(state->v[1], 7) + + XXH_rotl32(state->v[2], 12) + + XXH_rotl32(state->v[3], 18); } else { - h32 = state->v3 /* == seed */ + XXH_PRIME32_5; + h32 = state->v[2] /* == seed */ + XXH_PRIME32_5; } h32 += state->total_len_32; @@ -1527,7 +2247,8 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* state) /******* Canonical representation *******/ -/* +/*! + * @ingroup xxh32_family * The default return values from XXH functions are unsigned 32 and 64 bit * integers. * @@ -1544,9 +2265,9 @@ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t { XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash); - memcpy(dst, &hash, sizeof(*dst)); + XXH_memcpy(dst, &hash, sizeof(*dst)); } - +/*! @ingroup xxh32_family */ XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src) { return XXH_readBE32(src); @@ -1558,7 +2279,11 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src /* ******************************************************************* * 64-bit hash functions *********************************************************************/ - +/*! + * @} + * @ingroup impl + * @{ + */ /******* Memory access *******/ typedef XXH64_hash_t xxh_u64; @@ -1567,35 +2292,6 @@ typedef XXH64_hash_t xxh_u64; # define U64 xxh_u64 #endif -/*! - * XXH_REROLL_XXH64: - * Whether to reroll the XXH64_finalize() loop. - * - * Just like XXH32, we can unroll the XXH64_finalize() loop. This can be a - * performance gain on 64-bit hosts, as only one jump is required. - * - * However, on 32-bit hosts, because arithmetic needs to be done with two 32-bit - * registers, and 64-bit arithmetic needs to be simulated, it isn't beneficial - * to unroll. The code becomes ridiculously large (the largest function in the - * binary on i386!), and rerolling it saves anywhere from 3kB to 20kB. It is - * also slightly faster because it fits into cache better and is more likely - * to be inlined by the compiler. - * - * If XXH_REROLL is defined, this is ignored and the loop is always rerolled. - */ -#ifndef XXH_REROLL_XXH64 -# if (defined(__ILP32__) || defined(_ILP32)) /* ILP32 is often defined on 32-bit GCC family */ \ - || !(defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) /* x86-64 */ \ - || defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64__) /* aarch64 */ \ - || defined(__PPC64__) || defined(__PPC64LE__) || defined(__ppc64__) || defined(__powerpc64__) /* ppc64 */ \ - || defined(__mips64__) || defined(__mips64)) /* mips64 */ \ - || (!defined(SIZE_MAX) || SIZE_MAX < ULLONG_MAX) /* check limits */ -# define XXH_REROLL_XXH64 1 -# else -# define XXH_REROLL_XXH64 0 -# endif -#endif /* !defined(XXH_REROLL_XXH64) */ - #if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3)) /* * Manual byteshift. Best for old compilers which don't inline memcpy. @@ -1604,7 +2300,10 @@ typedef XXH64_hash_t xxh_u64; #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2)) /* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */ -static xxh_u64 XXH_read64(const void* memPtr) { return *(const xxh_u64*) memPtr; } +static xxh_u64 XXH_read64(const void* memPtr) +{ + return *(const xxh_u64*) memPtr; +} #elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1)) @@ -1627,12 +2326,12 @@ static xxh_u64 XXH_read64(const void* ptr) /* * Portable and safe solution. Generally efficient. - * see: https://stackoverflow.com/a/32095106/646947 + * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html */ static xxh_u64 XXH_read64(const void* memPtr) { xxh_u64 val; - memcpy(&val, memPtr, sizeof(val)); + XXH_memcpy(&val, memPtr, sizeof(val)); return val; } @@ -1643,7 +2342,7 @@ static xxh_u64 XXH_read64(const void* memPtr) #elif XXH_GCC_VERSION >= 403 # define XXH_swap64 __builtin_bswap64 #else -static xxh_u64 XXH_swap64 (xxh_u64 x) +static xxh_u64 XXH_swap64(xxh_u64 x) { return ((x << 56) & 0xff00000000000000ULL) | ((x << 40) & 0x00ff000000000000ULL) | @@ -1709,12 +2408,18 @@ XXH_readLE64_align(const void* ptr, XXH_alignment align) /******* xxh64 *******/ - -static const xxh_u64 XXH_PRIME64_1 = 0x9E3779B185EBCA87ULL; /* 0b1001111000110111011110011011000110000101111010111100101010000111 */ -static const xxh_u64 XXH_PRIME64_2 = 0xC2B2AE3D27D4EB4FULL; /* 0b1100001010110010101011100011110100100111110101001110101101001111 */ -static const xxh_u64 XXH_PRIME64_3 = 0x165667B19E3779F9ULL; /* 0b0001011001010110011001111011000110011110001101110111100111111001 */ -static const xxh_u64 XXH_PRIME64_4 = 0x85EBCA77C2B2AE63ULL; /* 0b1000010111101011110010100111011111000010101100101010111001100011 */ -static const xxh_u64 XXH_PRIME64_5 = 0x27D4EB2F165667C5ULL; /* 0b0010011111010100111010110010111100010110010101100110011111000101 */ +/*! + * @} + * @defgroup xxh64_impl XXH64 implementation + * @ingroup impl + * @{ + */ +/* #define rather that static const, to be used as initializers */ +#define XXH_PRIME64_1 0x9E3779B185EBCA87ULL /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */ +#define XXH_PRIME64_2 0xC2B2AE3D27D4EB4FULL /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */ +#define XXH_PRIME64_3 0x165667B19E3779F9ULL /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */ +#define XXH_PRIME64_4 0x85EBCA77C2B2AE63ULL /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */ +#define XXH_PRIME64_5 0x27D4EB2F165667C5ULL /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */ #ifdef XXH_OLD_NAMES # define PRIME64_1 XXH_PRIME64_1 @@ -1756,126 +2461,27 @@ static xxh_u64 XXH64_avalanche(xxh_u64 h64) static xxh_u64 XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) { -#define XXH_PROCESS1_64 do { \ - h64 ^= (*ptr++) * XXH_PRIME64_5; \ - h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; \ -} while (0) - -#define XXH_PROCESS4_64 do { \ - h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; \ - ptr += 4; \ - h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; \ -} while (0) - -#define XXH_PROCESS8_64 do { \ - xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); \ - ptr += 8; \ - h64 ^= k1; \ - h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; \ -} while (0) - - /* Rerolled version for 32-bit targets is faster and much smaller. */ - if (XXH_REROLL || XXH_REROLL_XXH64) { - len &= 31; - while (len >= 8) { - XXH_PROCESS8_64; - len -= 8; - } - if (len >= 4) { - XXH_PROCESS4_64; - len -= 4; - } - while (len > 0) { - XXH_PROCESS1_64; - --len; - } - return XXH64_avalanche(h64); - } else { - switch(len & 31) { - case 24: XXH_PROCESS8_64; - /* fallthrough */ - case 16: XXH_PROCESS8_64; - /* fallthrough */ - case 8: XXH_PROCESS8_64; - return XXH64_avalanche(h64); - - case 28: XXH_PROCESS8_64; - /* fallthrough */ - case 20: XXH_PROCESS8_64; - /* fallthrough */ - case 12: XXH_PROCESS8_64; - /* fallthrough */ - case 4: XXH_PROCESS4_64; - return XXH64_avalanche(h64); - - case 25: XXH_PROCESS8_64; - /* fallthrough */ - case 17: XXH_PROCESS8_64; - /* fallthrough */ - case 9: XXH_PROCESS8_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 29: XXH_PROCESS8_64; - /* fallthrough */ - case 21: XXH_PROCESS8_64; - /* fallthrough */ - case 13: XXH_PROCESS8_64; - /* fallthrough */ - case 5: XXH_PROCESS4_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 26: XXH_PROCESS8_64; - /* fallthrough */ - case 18: XXH_PROCESS8_64; - /* fallthrough */ - case 10: XXH_PROCESS8_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 30: XXH_PROCESS8_64; - /* fallthrough */ - case 22: XXH_PROCESS8_64; - /* fallthrough */ - case 14: XXH_PROCESS8_64; - /* fallthrough */ - case 6: XXH_PROCESS4_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 27: XXH_PROCESS8_64; - /* fallthrough */ - case 19: XXH_PROCESS8_64; - /* fallthrough */ - case 11: XXH_PROCESS8_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - XXH_PROCESS1_64; - return XXH64_avalanche(h64); - - case 31: XXH_PROCESS8_64; - /* fallthrough */ - case 23: XXH_PROCESS8_64; - /* fallthrough */ - case 15: XXH_PROCESS8_64; - /* fallthrough */ - case 7: XXH_PROCESS4_64; - /* fallthrough */ - case 3: XXH_PROCESS1_64; - /* fallthrough */ - case 2: XXH_PROCESS1_64; - /* fallthrough */ - case 1: XXH_PROCESS1_64; - /* fallthrough */ - case 0: return XXH64_avalanche(h64); - } + if (ptr==NULL) XXH_ASSERT(len == 0); + len &= 31; + while (len >= 8) { + xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr)); + ptr += 8; + h64 ^= k1; + h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4; + len -= 8; + } + if (len >= 4) { + h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1; + ptr += 4; + h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3; + len -= 4; + } + while (len > 0) { + h64 ^= (*ptr++) * XXH_PRIME64_5; + h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1; + --len; } - /* impossible to reach */ - XXH_ASSERT(0); - return 0; /* unreachable, but some compilers complain without it */ + return XXH64_avalanche(h64); } #ifdef XXH_OLD_NAMES @@ -1891,18 +2497,12 @@ XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align) XXH_FORCE_INLINE xxh_u64 XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align) { - const xxh_u8* bEnd = input + len; xxh_u64 h64; - -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) - if (input==NULL) { - len=0; - bEnd=input=(const xxh_u8*)(size_t)32; - } -#endif + if (input==NULL) XXH_ASSERT(len == 0); if (len>=32) { - const xxh_u8* const limit = bEnd - 32; + const xxh_u8* const bEnd = input + len; + const xxh_u8* const limit = bEnd - 31; xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2; xxh_u64 v2 = seed + XXH_PRIME64_2; xxh_u64 v3 = seed + 0; @@ -1913,7 +2513,7 @@ XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8; v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8; v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8; - } while (input<=limit); + } while (input=1) + if (input==NULL) { + XXH_ASSERT(len == 0); return XXH_OK; -#else - return XXH_ERROR; -#endif + } { const xxh_u8* p = (const xxh_u8*)input; const xxh_u8* const bEnd = p + len; @@ -2005,32 +2607,24 @@ XXH64_update (XXH64_state_t* state, const void* input, size_t len) if (state->memsize) { /* tmp buffer is full */ XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize); - state->v1 = XXH64_round(state->v1, XXH_readLE64(state->mem64+0)); - state->v2 = XXH64_round(state->v2, XXH_readLE64(state->mem64+1)); - state->v3 = XXH64_round(state->v3, XXH_readLE64(state->mem64+2)); - state->v4 = XXH64_round(state->v4, XXH_readLE64(state->mem64+3)); - p += 32-state->memsize; + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0)); + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1)); + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2)); + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3)); + p += 32 - state->memsize; state->memsize = 0; } if (p+32 <= bEnd) { const xxh_u8* const limit = bEnd - 32; - xxh_u64 v1 = state->v1; - xxh_u64 v2 = state->v2; - xxh_u64 v3 = state->v3; - xxh_u64 v4 = state->v4; do { - v1 = XXH64_round(v1, XXH_readLE64(p)); p+=8; - v2 = XXH64_round(v2, XXH_readLE64(p)); p+=8; - v3 = XXH64_round(v3, XXH_readLE64(p)); p+=8; - v4 = XXH64_round(v4, XXH_readLE64(p)); p+=8; + state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8; + state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8; + state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8; + state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8; } while (p<=limit); - state->v1 = v1; - state->v2 = v2; - state->v3 = v3; - state->v4 = v4; } if (p < bEnd) { @@ -2043,23 +2637,19 @@ XXH64_update (XXH64_state_t* state, const void* input, size_t len) } -XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* state) +/*! @ingroup xxh64_family */ +XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state) { xxh_u64 h64; if (state->total_len >= 32) { - xxh_u64 const v1 = state->v1; - xxh_u64 const v2 = state->v2; - xxh_u64 const v3 = state->v3; - xxh_u64 const v4 = state->v4; - - h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18); - h64 = XXH64_mergeRound(h64, v1); - h64 = XXH64_mergeRound(h64, v2); - h64 = XXH64_mergeRound(h64, v3); - h64 = XXH64_mergeRound(h64, v4); + h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18); + h64 = XXH64_mergeRound(h64, state->v[0]); + h64 = XXH64_mergeRound(h64, state->v[1]); + h64 = XXH64_mergeRound(h64, state->v[2]); + h64 = XXH64_mergeRound(h64, state->v[3]); } else { - h64 = state->v3 /*seed*/ + XXH_PRIME64_5; + h64 = state->v[2] /*seed*/ + XXH_PRIME64_5; } h64 += (xxh_u64) state->total_len; @@ -2070,28 +2660,38 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* state) /******* Canonical representation *******/ +/*! @ingroup xxh64_family */ XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash) { XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t)); if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash); - memcpy(dst, &hash, sizeof(*dst)); + XXH_memcpy(dst, &hash, sizeof(*dst)); } +/*! @ingroup xxh64_family */ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src) { return XXH_readBE64(src); } - +#ifndef XXH_NO_XXH3 /* ********************************************************************* * XXH3 * New generation hash designed for speed on small keys and vectorization ************************************************************************ */ +/*! + * @} + * @defgroup xxh3_impl XXH3 implementation + * @ingroup impl + * @{ + */ /* === Compiler specifics === */ -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ +#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */ +# define XXH_RESTRICT /* disable */ +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */ # define XXH_RESTRICT restrict #else /* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */ @@ -2198,12 +2798,62 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src /* ========================================== * Vectorization detection * ========================================== */ -#define XXH_SCALAR 0 /* Portable scalar version */ -#define XXH_SSE2 1 /* SSE2 for Pentium 4 and all x86_64 */ -#define XXH_AVX2 2 /* AVX2 for Haswell and Bulldozer */ -#define XXH_AVX512 3 /* AVX512 for Skylake and Icelake */ -#define XXH_NEON 4 /* NEON for most ARMv7-A and all AArch64 */ -#define XXH_VSX 5 /* VSX and ZVector for POWER8/z13 */ + +#ifdef XXH_DOXYGEN +/*! + * @ingroup tuning + * @brief Overrides the vectorization implementation chosen for XXH3. + * + * Can be defined to 0 to disable SIMD or any of the values mentioned in + * @ref XXH_VECTOR_TYPE. + * + * If this is not defined, it uses predefined macros to determine the best + * implementation. + */ +# define XXH_VECTOR XXH_SCALAR +/*! + * @ingroup tuning + * @brief Possible values for @ref XXH_VECTOR. + * + * Note that these are actually implemented as macros. + * + * If this is not defined, it is detected automatically. + * @ref XXH_X86DISPATCH overrides this. + */ +enum XXH_VECTOR_TYPE /* fake enum */ { + XXH_SCALAR = 0, /*!< Portable scalar version */ + XXH_SSE2 = 1, /*!< + * SSE2 for Pentium 4, Opteron, all x86_64. + * + * @note SSE2 is also guaranteed on Windows 10, macOS, and + * Android x86. + */ + XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */ + XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */ + XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */ + XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */ +}; +/*! + * @ingroup tuning + * @brief Selects the minimum alignment for XXH3's accumulators. + * + * When using SIMD, this should match the alignment reqired for said vector + * type, so, for example, 32 for AVX2. + * + * Default: Auto detected. + */ +# define XXH_ACC_ALIGN 8 +#endif + +/* Actual definition */ +#ifndef XXH_DOXYGEN +# define XXH_SCALAR 0 +# define XXH_SSE2 1 +# define XXH_AVX2 2 +# define XXH_AVX512 3 +# define XXH_NEON 4 +# define XXH_VSX 5 +#endif #ifndef XXH_VECTOR /* can be defined on command line */ # if defined(__AVX512F__) @@ -2212,10 +2862,13 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src # define XXH_VECTOR XXH_AVX2 # elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2)) # define XXH_VECTOR XXH_SSE2 -# elif defined(__GNUC__) /* msvc support maybe later */ \ - && (defined(__ARM_NEON__) || defined(__ARM_NEON)) \ - && (defined(__LITTLE_ENDIAN__) /* We only support little endian NEON */ \ - || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) +# elif ( \ + defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \ + || defined(_M_ARM64) || defined(_M_ARM_ARMV7VE) /* msvc */ \ + ) && ( \ + defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \ + || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \ + ) # define XXH_VECTOR XXH_NEON # elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \ || (defined(__s390x__) && defined(__VEC__)) \ @@ -2356,7 +3009,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src * This is available on ARMv7-A, but is less efficient than a single VZIP.32. */ -/* +/*! * Function-like macro: * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi) * { @@ -2367,7 +3020,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src */ # if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \ && defined(__GNUC__) \ - && !defined(__aarch64__) && !defined(__arm64__) + && !defined(__aarch64__) && !defined(__arm64__) && !defined(_M_ARM64) # define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \ do { \ /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \ @@ -2429,10 +3082,12 @@ typedef __vector unsigned xxh_u32x4; # endif /* !defined(XXH_VSX_BE) */ # if XXH_VSX_BE -/* A wrapper for POWER9's vec_revb. */ # if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__)) # define XXH_vec_revb vec_revb # else +/*! + * A polyfill for POWER9's vec_revb(). + */ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) { xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, @@ -2442,13 +3097,13 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val) # endif # endif /* XXH_VSX_BE */ -/* - * Performs an unaligned load and byte swaps it on big endian. +/*! + * Performs an unaligned vector load and byte swaps it on big endian. */ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr) { xxh_u64x2 ret; - memcpy(&ret, ptr, sizeof(xxh_u64x2)); + XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2)); # if XXH_VSX_BE ret = XXH_vec_revb(ret); # endif @@ -2493,7 +3148,7 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) #if defined(XXH_NO_PREFETCH) # define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */ #else -# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */ +# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */ # include /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */ # define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0) # elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) ) @@ -2514,7 +3169,7 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b) # error "default keyset is not large enough" #endif -/* Pseudorandom secret taken directly from FARSH */ +/*! Pseudorandom secret taken directly from FARSH. */ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { 0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c, 0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f, @@ -2535,23 +3190,29 @@ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { # define kSecret XXH3_kSecret #endif -/* - * Calculates a 32-bit to 64-bit long multiply. +#ifdef XXH_DOXYGEN +/*! + * @brief Calculates a 32-bit to 64-bit long multiply. * - * Wraps __emulu on MSVC x86 because it tends to call __allmul when it doesn't + * Implemented as a macro. + * + * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't * need to (but it shouldn't need to anyways, it is about 7 instructions to do - * a 64x64 multiply...). Since we know that this will _always_ emit MULL, we + * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we * use that instead of the normal method. * * If you are compiling for platforms like Thumb-1 and don't have a better option, * you may also want to write your own long multiply routine here. * - * XXH_FORCE_INLINE xxh_u64 XXH_mult32to64(xxh_u64 x, xxh_u64 y) - * { - * return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); - * } + * @param x, y Numbers to be multiplied + * @return 64-bit product of the low 32 bits of @p x and @p y. */ -#if defined(_MSC_VER) && defined(_M_IX86) +XXH_FORCE_INLINE xxh_u64 +XXH_mult32to64(xxh_u64 x, xxh_u64 y) +{ + return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF); +} +#elif defined(_MSC_VER) && defined(_M_IX86) # include # define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y)) #else @@ -2565,10 +3226,14 @@ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = { # define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y)) #endif -/* - * Calculates a 64->128-bit long multiply. +/*! + * @brief Calculates a 64->128-bit long multiply. * - * Uses __uint128_t and _umul128 if available, otherwise uses a scalar version. + * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar + * version. + * + * @param lhs , rhs The 64-bit integers to be multiplied + * @return The 128-bit result represented in an @ref XXH128_hash_t. */ static XXH128_hash_t XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) @@ -2617,6 +3282,21 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) r128.high64 = product_high; return r128; + /* + * MSVC for ARM64's __umulh method. + * + * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method. + */ +#elif defined(_M_ARM64) + +#ifndef _MSC_VER +# pragma intrinsic(__umulh) +#endif + XXH128_hash_t r128; + r128.low64 = lhs * rhs; + r128.high64 = __umulh(lhs, rhs); + return r128; + #else /* * Portable scalar method. Optimized for 32-bit and 64-bit ALUs. @@ -2679,11 +3359,15 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs) #endif } -/* - * Does a 64-bit to 128-bit multiply, then XOR folds it. +/*! + * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it. * * The reason for the separate function is to prevent passing too many structs * around by value. This will hopefully inline the multiply, but we don't force it. + * + * @param lhs , rhs The 64-bit integers to multiply + * @return The low 64 bits of the product XOR'd by the high 64 bits. + * @see XXH_mult64to128() */ static xxh_u64 XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) @@ -2692,7 +3376,7 @@ XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs) return product.low64 ^ product.high64; } -/* Seems to produce slightly better code on GCC for some reason. */ +/*! Seems to produce slightly better code on GCC for some reason. */ XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift) { XXH_ASSERT(0 <= shift && shift < 64); @@ -2787,7 +3471,7 @@ XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_h { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); - XXH_ASSERT(4 <= len && len < 8); + XXH_ASSERT(4 <= len && len <= 8); seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32; { xxh_u32 const input1 = XXH_readLE32(input); xxh_u32 const input2 = XXH_readLE32(input + len - 4); @@ -2803,7 +3487,7 @@ XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_ { XXH_ASSERT(input != NULL); XXH_ASSERT(secret != NULL); - XXH_ASSERT(8 <= len && len <= 16); + XXH_ASSERT(9 <= len && len <= 16); { xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed; xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed; xxh_u64 const input_lo = XXH_readLE64(input) ^ bitflip1; @@ -2873,7 +3557,7 @@ XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input, * GCC generates much better scalar code than Clang for the rest of XXH3, * which is why finding a more optimal codepath is an interest. */ - __asm__ ("" : "+r" (seed64)); + XXH_COMPILER_GUARD(seed64); #endif { xxh_u64 const input_lo = XXH_readLE64(input); xxh_u64 const input_hi = XXH_readLE64(input+8); @@ -2983,7 +3667,7 @@ XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len, XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) { if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64); - memcpy(dst, &v64, sizeof(v64)); + XXH_memcpy(dst, &v64, sizeof(v64)); } /* Several intrinsic functions below are supposed to accept __int64 as argument, @@ -3023,7 +3707,8 @@ XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64) * Both XXH3_64bits and XXH3_128bits use this subroutine. */ -#if (XXH_VECTOR == XXH_AVX512) || defined(XXH_X86DISPATCH) +#if (XXH_VECTOR == XXH_AVX512) \ + || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0) #ifndef XXH_TARGET_AVX512 # define XXH_TARGET_AVX512 /* disable attribute target */ @@ -3034,7 +3719,7 @@ XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret) { - XXH_ALIGN(64) __m512i* const xacc = (__m512i *) acc; + __m512i* const xacc = (__m512i *) acc; XXH_ASSERT((((size_t)acc) & 63) == 0); XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); @@ -3083,7 +3768,7 @@ XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 63) == 0); XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i)); - { XXH_ALIGN(64) __m512i* const xacc = (__m512i*) acc; + { __m512i* const xacc = (__m512i*) acc; const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1); /* xacc[0] ^= (xacc[0] >> 47) */ @@ -3110,17 +3795,19 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) XXH_ASSERT(((size_t)customSecret & 63) == 0); (void)(&XXH_writeLE64); { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i); - __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, -(xxh_i64)seed64); + __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64)); - XXH_ALIGN(64) const __m512i* const src = (const __m512i*) XXH3_kSecret; - XXH_ALIGN(64) __m512i* const dest = ( __m512i*) customSecret; + const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret); + __m512i* const dest = ( __m512i*) customSecret; int i; + XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 63) == 0); for (i=0; i < nbRounds; ++i) { /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*', - * this will warn "discards ‘const’ qualifier". */ + * this will warn "discards 'const' qualifier". */ union { - XXH_ALIGN(64) const __m512i* cp; - XXH_ALIGN(64) void* p; + const __m512i* cp; + void* p; } remote_const_void; remote_const_void.cp = src + i; dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed); @@ -3129,7 +3816,8 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64) #endif -#if (XXH_VECTOR == XXH_AVX2) || defined(XXH_X86DISPATCH) +#if (XXH_VECTOR == XXH_AVX2) \ + || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0) #ifndef XXH_TARGET_AVX2 # define XXH_TARGET_AVX2 /* disable attribute target */ @@ -3141,7 +3829,7 @@ XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 31) == 0); - { XXH_ALIGN(32) __m256i* const xacc = (__m256i *) acc; + { __m256i* const xacc = (__m256i *) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ const __m256i* const xinput = (const __m256i *) input; @@ -3173,7 +3861,7 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 31) == 0); - { XXH_ALIGN(32) __m256i* const xacc = (__m256i*) acc; + { __m256i* const xacc = (__m256i*) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */ const __m256i* const xsecret = (const __m256i *) secret; @@ -3205,23 +3893,21 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64); (void)(&XXH_writeLE64); XXH_PREFETCH(customSecret); - { __m256i const seed = _mm256_set_epi64x(-(xxh_i64)seed64, (xxh_i64)seed64, -(xxh_i64)seed64, (xxh_i64)seed64); + { __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64); - XXH_ALIGN(64) const __m256i* const src = (const __m256i*) XXH3_kSecret; - XXH_ALIGN(64) __m256i* dest = ( __m256i*) customSecret; + const __m256i* const src = (const __m256i*) ((const void*) XXH3_kSecret); + __m256i* dest = ( __m256i*) customSecret; # if defined(__GNUC__) || defined(__clang__) /* * On GCC & Clang, marking 'dest' as modified will cause the compiler: * - do not extract the secret from sse registers in the internal loop * - use less common registers, and avoid pushing these reg into stack - * The asm hack causes Clang to assume that XXH3_kSecretPtr aliases with - * customSecret, and on aarch64, this prevented LDP from merging two - * loads together for free. Putting the loads together before the stores - * properly generates LDP. */ - __asm__("" : "+r" (dest)); + XXH_COMPILER_GUARD(dest); # endif + XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dest & 31) == 0); /* GCC -O2 need unroll loop manually */ dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed); @@ -3235,6 +3921,7 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR #endif +/* x86dispatch always generates SSE2 */ #if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH) #ifndef XXH_TARGET_SSE2 @@ -3248,7 +3935,7 @@ XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc, { /* SSE2 is just a half-scale version of the AVX2 version. */ XXH_ASSERT((((size_t)acc) & 15) == 0); - { XXH_ALIGN(16) __m128i* const xacc = (__m128i *) acc; + { __m128i* const xacc = (__m128i *) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ const __m128i* const xinput = (const __m128i *) input; @@ -3280,7 +3967,7 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { XXH_ASSERT((((size_t)acc) & 15) == 0); - { XXH_ALIGN(16) __m128i* const xacc = (__m128i*) acc; + { __m128i* const xacc = (__m128i*) acc; /* Unaligned. This is mainly for pointer arithmetic, and because * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */ const __m128i* const xsecret = (const __m128i *) secret; @@ -3312,27 +3999,29 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTR { int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i); # if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900 - // MSVC 32bit mode does not support _mm_set_epi64x before 2015 - XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, -(xxh_i64)seed64 }; + /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */ + XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) }; __m128i const seed = _mm_load_si128((__m128i const*)seed64x2); # else - __m128i const seed = _mm_set_epi64x(-(xxh_i64)seed64, (xxh_i64)seed64); + __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64); # endif int i; - XXH_ALIGN(64) const float* const src = (float const*) XXH3_kSecret; - XXH_ALIGN(XXH_SEC_ALIGN) __m128i* dest = (__m128i*) customSecret; + const void* const src16 = XXH3_kSecret; + __m128i* dst16 = (__m128i*) customSecret; # if defined(__GNUC__) || defined(__clang__) /* * On GCC & Clang, marking 'dest' as modified will cause the compiler: * - do not extract the secret from sse registers in the internal loop * - use less common registers, and avoid pushing these reg into stack */ - __asm__("" : "+r" (dest)); + XXH_COMPILER_GUARD(dst16); # endif + XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */ + XXH_ASSERT(((size_t)dst16 & 15) == 0); for (i=0; i < nbRounds; ++i) { - dest[i] = _mm_add_epi64(_mm_castps_si128(_mm_load_ps(src+i*4)), seed); + dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed); } } } @@ -3347,7 +4036,7 @@ XXH3_accumulate_512_neon( void* XXH_RESTRICT acc, { XXH_ASSERT((((size_t)acc) & 15) == 0); { - XXH_ALIGN(16) uint64x2_t* const xacc = (uint64x2_t *) acc; + uint64x2_t* const xacc = (uint64x2_t *) acc; /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */ uint8_t const* const xinput = (const uint8_t *) input; uint8_t const* const xsecret = (const uint8_t *) secret; @@ -3394,8 +4083,8 @@ XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) uint64x2_t data_vec = veorq_u64 (acc_vec, shifted); /* xacc[i] ^= xsecret[i]; */ - uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16)); - uint64x2_t data_key = veorq_u64(data_vec, vreinterpretq_u64_u8(key_vec)); + uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16)); + uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec)); /* xacc[i] *= XXH_PRIME32_1 */ uint32x2_t data_key_lo, data_key_hi; @@ -3439,7 +4128,8 @@ XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret) { - xxh_u64x2* const xacc = (xxh_u64x2*) acc; /* presumed aligned */ + /* presumed aligned */ + unsigned long long* const xacc = (unsigned long long*) acc; xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */ xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */ xxh_u64x2 const v32 = { 32, 32 }; @@ -3454,14 +4144,18 @@ XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc, xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32); /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */ xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled); - xacc[i] += product; + /* acc_vec = xacc[i]; */ + xxh_u64x2 acc_vec = vec_xl(0, xacc + 2 * i); + acc_vec += product; /* swap high and low halves */ #ifdef __s390x__ - xacc[i] += vec_permi(data_vec, data_vec, 2); + acc_vec += vec_permi(data_vec, data_vec, 2); #else - xacc[i] += vec_xxpermdi(data_vec, data_vec, 2); + acc_vec += vec_xxpermdi(data_vec, data_vec, 2); #endif + /* xacc[i] = acc_vec; */ + vec_xst(acc_vec, 0, xacc + 2 * i); } } @@ -3504,7 +4198,7 @@ XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT input, const void* XXH_RESTRICT secret) { - XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ const xxh_u8* const xinput = (const xxh_u8*) input; /* no alignment restriction */ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ size_t i; @@ -3520,7 +4214,7 @@ XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc, XXH_FORCE_INLINE void XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret) { - XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ + xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */ const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */ size_t i; XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0); @@ -3574,7 +4268,7 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64) * without hack: 2654.4 MB/s * with hack: 3202.9 MB/s */ - __asm__("" : "+r" (kSecretPtr)); + XXH_COMPILER_GUARD(kSecretPtr); #endif /* * Note: in debug mode, this overrides the asm optimization @@ -3739,7 +4433,7 @@ XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secre * without hack: 2063.7 MB/s * with hack: 2560.7 MB/s */ - __asm__("" : "+r" (result64)); + XXH_COMPILER_GUARD(result64); #endif } @@ -3768,9 +4462,11 @@ XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len, } /* - * It's important for performance that XXH3_hashLong is not inlined. + * It's important for performance to transmit secret's size (when it's static) + * so that the compiler can properly optimize the vectorized loop. + * This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set. */ -XXH_NO_INLINE XXH64_hash_t +XXH_FORCE_INLINE XXH64_hash_t XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen) { @@ -3779,11 +4475,10 @@ XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len, } /* - * It's important for performance that XXH3_hashLong is not inlined. - * Since the function is not inlined, the compiler may not be able to understand that, - * in some scenarios, its `secret` argument is actually a compile time constant. - * This variant enforces that the compiler can detect that, - * and uses this opportunity to streamline the generated code for better performance. + * It's preferable for performance that XXH3_hashLong is not inlined, + * as it results in a smaller function for small data, easier to the instruction cache. + * Note that inside this no_inline function, we do inline the internal loop, + * and provide a statically defined secret size to allow optimization of vector loop. */ XXH_NO_INLINE XXH64_hash_t XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len, @@ -3863,23 +4558,34 @@ XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len, /* === Public entry point === */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len) { return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) { return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) { return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed); } +XXH_PUBLIC_API XXH64_hash_t +XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize); +} + /* === XXH3 streaming === */ @@ -3948,6 +4654,7 @@ static void XXH_alignedFree(void* p) XXH_free(base); } } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) { XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64); @@ -3956,22 +4663,24 @@ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void) return state; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr) { XXH_alignedFree(statePtr); return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state) { - memcpy(dst_state, src_state, sizeof(*dst_state)); + XXH_memcpy(dst_state, src_state, sizeof(*dst_state)); } static void -XXH3_64bits_reset_internal(XXH3_state_t* statePtr, - XXH64_hash_t seed, - const void* secret, size_t secretSize) +XXH3_reset_internal(XXH3_state_t* statePtr, + XXH64_hash_t seed, + const void* secret, size_t secretSize) { size_t const initStart = offsetof(XXH3_state_t, bufferedSize); size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart; @@ -3988,37 +4697,54 @@ XXH3_64bits_reset_internal(XXH3_state_t* statePtr, statePtr->acc[6] = XXH_PRIME64_5; statePtr->acc[7] = XXH_PRIME32_1; statePtr->seed = seed; + statePtr->useSeed = (seed != 0); statePtr->extSecret = (const unsigned char*)secret; XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); statePtr->secretLimit = secretSize - XXH_STRIPE_LEN; statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr) { if (statePtr == NULL) return XXH_ERROR; - XXH3_64bits_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); + XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) { if (statePtr == NULL) return XXH_ERROR; - XXH3_64bits_reset_internal(statePtr, 0, secret, secretSize); + XXH3_reset_internal(statePtr, 0, secret, secretSize); if (secret == NULL) return XXH_ERROR; if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) { if (statePtr == NULL) return XXH_ERROR; if (seed==0) return XXH3_64bits_reset(statePtr); - if (seed != statePtr->seed) XXH3_initCustomSecret(statePtr->customSecret, seed); - XXH3_64bits_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + if ((seed != statePtr->seed) || (statePtr->extSecret != NULL)) + XXH3_initCustomSecret(statePtr->customSecret, seed); + XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); + return XXH_OK; +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64) +{ + if (statePtr == NULL) return XXH_ERROR; + if (secret == NULL) return XXH_ERROR; + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + XXH3_reset_internal(statePtr, seed64, secret, secretSize); + statePtr->useSeed = 1; /* always, even if seed64==0 */ return XXH_OK; } @@ -4049,34 +4775,48 @@ XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, } } +#ifndef XXH3_STREAM_USE_STACK +# ifndef __clang__ /* clang doesn't need additional stack space */ +# define XXH3_STREAM_USE_STACK 1 +# endif +#endif /* * Both XXH3_64bits_update and XXH3_128bits_update use this routine. */ XXH_FORCE_INLINE XXH_errorcode -XXH3_update(XXH3_state_t* state, - const xxh_u8* input, size_t len, +XXH3_update(XXH3_state_t* XXH_RESTRICT const state, + const xxh_u8* XXH_RESTRICT input, size_t len, XXH3_f_accumulate_512 f_acc512, XXH3_f_scrambleAcc f_scramble) { - if (input==NULL) -#if defined(XXH_ACCEPT_NULL_INPUT_POINTER) && (XXH_ACCEPT_NULL_INPUT_POINTER>=1) + if (input==NULL) { + XXH_ASSERT(len == 0); return XXH_OK; -#else - return XXH_ERROR; -#endif + } + XXH_ASSERT(state != NULL); { const xxh_u8* const bEnd = input + len; const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; - +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* For some reason, gcc and MSVC seem to suffer greatly + * when operating accumulators directly into state. + * Operating into stack space seems to enable proper optimization. + * clang, on the other hand, doesn't seem to need this trick */ + XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc)); +#else + xxh_u64* XXH_RESTRICT const acc = state->acc; +#endif state->totalLen += len; + XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE); - if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { /* fill in tmp buffer */ + /* small input : just fill in tmp buffer */ + if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) { XXH_memcpy(state->buffer + state->bufferedSize, input, len); state->bufferedSize += (XXH32_hash_t)len; return XXH_OK; } - /* total input is now > XXH3_INTERNALBUFFER_SIZE */ + /* total input is now > XXH3_INTERNALBUFFER_SIZE */ #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN) XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0); /* clean multiple */ @@ -4088,7 +4828,7 @@ XXH3_update(XXH3_state_t* state, size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize; XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize); input += loadSize; - XXH3_consumeStripes(state->acc, + XXH3_consumeStripes(acc, &state->nbStripesSoFar, state->nbStripesPerBlock, state->buffer, XXH3_INTERNALBUFFER_STRIPES, secret, state->secretLimit, @@ -4097,30 +4837,68 @@ XXH3_update(XXH3_state_t* state, } XXH_ASSERT(input < bEnd); - /* Consume input by a multiple of internal buffer size */ - if (input+XXH3_INTERNALBUFFER_SIZE < bEnd) { - const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; - do { - XXH3_consumeStripes(state->acc, - &state->nbStripesSoFar, state->nbStripesPerBlock, - input, XXH3_INTERNALBUFFER_STRIPES, - secret, state->secretLimit, - f_acc512, f_scramble); - input += XXH3_INTERNALBUFFER_SIZE; - } while (inputbuffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + /* large input to consume : ingest per full block */ + if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) { + size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN; + XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar); + /* join to current block's end */ + { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar; + XXH_ASSERT(nbStripes <= nbStripes); + XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512); + f_scramble(acc, secret + state->secretLimit); + state->nbStripesSoFar = 0; + input += nbStripesToEnd * XXH_STRIPE_LEN; + nbStripes -= nbStripesToEnd; + } + /* consume per entire blocks */ + while(nbStripes >= state->nbStripesPerBlock) { + XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512); + f_scramble(acc, secret + state->secretLimit); + input += state->nbStripesPerBlock * XXH_STRIPE_LEN; + nbStripes -= state->nbStripesPerBlock; + } + /* consume last partial block */ + XXH3_accumulate(acc, input, secret, nbStripes, f_acc512); + input += nbStripes * XXH_STRIPE_LEN; + XXH_ASSERT(input < bEnd); /* at least some bytes left */ + state->nbStripesSoFar = nbStripes; + /* buffer predecessor of last partial stripe */ + XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN); + } else { + /* content to consume <= block size */ + /* Consume input by a multiple of internal buffer size */ + if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) { + const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE; + do { + XXH3_consumeStripes(acc, + &state->nbStripesSoFar, state->nbStripesPerBlock, + input, XXH3_INTERNALBUFFER_STRIPES, + secret, state->secretLimit, + f_acc512, f_scramble); + input += XXH3_INTERNALBUFFER_SIZE; + } while (inputbuffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN); + } } - XXH_ASSERT(input < bEnd); /* Some remaining input (always) : buffer it */ + XXH_ASSERT(input < bEnd); + XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE); + XXH_ASSERT(state->bufferedSize == 0); XXH_memcpy(state->buffer, input, (size_t)(bEnd-input)); state->bufferedSize = (XXH32_hash_t)(bEnd-input); +#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1 + /* save stack accumulators into state */ + memcpy(state->acc, acc, sizeof(acc)); +#endif } return XXH_OK; } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len) { @@ -4138,7 +4916,7 @@ XXH3_digest_long (XXH64_hash_t* acc, * Digest on a local copy. This way, the state remains unaltered, and it can * continue ingesting more input afterwards. */ - memcpy(acc, state->acc, sizeof(state->acc)); + XXH_memcpy(acc, state->acc, sizeof(state->acc)); if (state->bufferedSize >= XXH_STRIPE_LEN) { size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN; size_t nbStripesSoFar = state->nbStripesSoFar; @@ -4155,14 +4933,15 @@ XXH3_digest_long (XXH64_hash_t* acc, xxh_u8 lastStripe[XXH_STRIPE_LEN]; size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize; XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */ - memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); - memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); + XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize); + XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize); XXH3_accumulate_512(acc, lastStripe, secret + state->secretLimit - XXH_SECRET_LASTACC_START); } } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) { const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; @@ -4174,57 +4953,13 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state) (xxh_u64)state->totalLen * XXH_PRIME64_1); } /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */ - if (state->seed) + if (state->useSeed) return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed); return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen), secret, state->secretLimit + XXH_STRIPE_LEN); } -#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) - -XXH_PUBLIC_API void -XXH3_generateSecret(void* secretBuffer, const void* customSeed, size_t customSeedSize) -{ - XXH_ASSERT(secretBuffer != NULL); - if (customSeedSize == 0) { - memcpy(secretBuffer, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); - return; - } - XXH_ASSERT(customSeed != NULL); - - { size_t const segmentSize = sizeof(XXH128_hash_t); - size_t const nbSegments = XXH_SECRET_DEFAULT_SIZE / segmentSize; - XXH128_canonical_t scrambler; - XXH64_hash_t seeds[12]; - size_t segnb; - XXH_ASSERT(nbSegments == 12); - XXH_ASSERT(segmentSize * nbSegments == XXH_SECRET_DEFAULT_SIZE); /* exact multiple */ - XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); - - /* - * Copy customSeed to seeds[], truncating or repeating as necessary. - */ - { size_t toFill = XXH_MIN(customSeedSize, sizeof(seeds)); - size_t filled = toFill; - memcpy(seeds, customSeed, toFill); - while (filled < sizeof(seeds)) { - toFill = XXH_MIN(filled, sizeof(seeds) - filled); - memcpy((char*)seeds + filled, seeds, toFill); - filled += toFill; - } } - - /* generate secret */ - memcpy(secretBuffer, &scrambler, sizeof(scrambler)); - for (segnb=1; segnb < nbSegments; segnb++) { - size_t const segmentStart = segnb * segmentSize; - XXH128_canonical_t segment; - XXH128_canonicalFromHash(&segment, - XXH128(&scrambler, sizeof(scrambler), XXH_readLE64(seeds + segnb) + segnb) ); - memcpy((char*)secretBuffer + segmentStart, &segment, sizeof(segment)); - } } -} - /* ========================================== * XXH3 128 bits (a.k.a XXH128) @@ -4526,9 +5261,10 @@ XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len, } /* - * It's important for performance that XXH3_hashLong is not inlined. + * It's important for performance to pass @secretLen (when it's static) + * to the compiler, so that it can properly optimize the vectorized loop. */ -XXH_NO_INLINE XXH128_hash_t +XXH_FORCE_INLINE XXH128_hash_t XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len, XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen) @@ -4595,6 +5331,7 @@ XXH3_128bits_internal(const void* input, size_t len, /* === Public XXH128 API === */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) { return XXH3_128bits_internal(input, len, 0, @@ -4602,6 +5339,7 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len) XXH3_hashLong_128b_default); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize) { @@ -4610,6 +5348,7 @@ XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_ XXH3_hashLong_128b_withSecret); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) { @@ -4618,6 +5357,16 @@ XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed) XXH3_hashLong_128b_withSeed); } +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH128_hash_t +XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + if (len <= XXH3_MIDSIZE_MAX) + return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL); + return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize); +} + +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH128(const void* input, size_t len, XXH64_hash_t seed) { @@ -4628,46 +5377,39 @@ XXH128(const void* input, size_t len, XXH64_hash_t seed) /* === XXH3 128-bit streaming === */ /* - * All the functions are actually the same as for 64-bit streaming variant. - * The only difference is the finalizatiom routine. + * All initialization and update functions are identical to 64-bit streaming variant. + * The only difference is the finalization routine. */ -static void -XXH3_128bits_reset_internal(XXH3_state_t* statePtr, - XXH64_hash_t seed, - const void* secret, size_t secretSize) -{ - XXH3_64bits_reset_internal(statePtr, seed, secret, secretSize); -} - +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr) { - if (statePtr == NULL) return XXH_ERROR; - XXH3_128bits_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE); - return XXH_OK; + return XXH3_64bits_reset(statePtr); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize) { - if (statePtr == NULL) return XXH_ERROR; - XXH3_128bits_reset_internal(statePtr, 0, secret, secretSize); - if (secret == NULL) return XXH_ERROR; - if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; - return XXH_OK; + return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed) { - if (statePtr == NULL) return XXH_ERROR; - if (seed==0) return XXH3_128bits_reset(statePtr); - if (seed != statePtr->seed) XXH3_initCustomSecret(statePtr->customSecret, seed); - XXH3_128bits_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE); - return XXH_OK; + return XXH3_64bits_reset_withSeed(statePtr, seed); } +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed) +{ + return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed); +} + +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) { @@ -4675,6 +5417,7 @@ XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len) XXH3_accumulate_512, XXH3_scrambleAcc); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) { const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret; @@ -4705,6 +5448,7 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state) #include /* memcmp, memcpy */ /* return : 1 is equal, 0 if different */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) { /* note : XXH128_hash_t is compact, it has no padding byte */ @@ -4715,6 +5459,7 @@ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2) * return : >0 if *h128_1 > *h128_2 * <0 if *h128_1 < *h128_2 * =0 if *h128_1 == *h128_2 */ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) { XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1; @@ -4727,6 +5472,7 @@ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2) /*====== Canonical representation ======*/ +/*! @ingroup xxh3_family */ XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) { @@ -4735,10 +5481,11 @@ XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash) hash.high64 = XXH_swap64(hash.high64); hash.low64 = XXH_swap64(hash.low64); } - memcpy(dst, &hash.high64, sizeof(hash.high64)); - memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); + XXH_memcpy(dst, &hash.high64, sizeof(hash.high64)); + XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64)); } +/*! @ingroup xxh3_family */ XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src) { @@ -4748,6 +5495,69 @@ XXH128_hashFromCanonical(const XXH128_canonical_t* src) return h; } + + +/* ========================================== + * Secret generators + * ========================================== + */ +#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x)) + +static void XXH3_combine16(void* dst, XXH128_hash_t h128) +{ + XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 ); + XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 ); +} + +/*! @ingroup xxh3_family */ +XXH_PUBLIC_API XXH_errorcode +XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize) +{ + XXH_ASSERT(secretBuffer != NULL); + if (secretBuffer == NULL) return XXH_ERROR; + XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); + if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR; + if (customSeedSize == 0) { + customSeed = XXH3_kSecret; + customSeedSize = XXH_SECRET_DEFAULT_SIZE; + } + XXH_ASSERT(customSeed != NULL); + if (customSeed == NULL) return XXH_ERROR; + + /* Fill secretBuffer with a copy of customSeed - repeat as needed */ + { size_t pos = 0; + while (pos < secretSize) { + size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize); + memcpy((char*)secretBuffer + pos, customSeed, toCopy); + pos += toCopy; + } } + + { size_t const nbSeg16 = secretSize / 16; + size_t n; + XXH128_canonical_t scrambler; + XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0)); + for (n=0; n Date: Sat, 25 Dec 2021 20:55:22 +0100 Subject: [PATCH 0311/1346] Extract common replacement login in pass1 The replace const or replace with QM_ASSIGN pattern is common to all constant folding, extract it into a function. --- Zend/Optimizer/pass1.c | 131 +++++++++-------------------------------- 1 file changed, 28 insertions(+), 103 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index b25001182f591..b49b52b5e1465 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -35,6 +35,17 @@ #include "zend_execute.h" #include "zend_vm.h" +static void replace_by_const_or_qm_assign(zend_op_array *op_array, zend_op *opline, zval *result) { + if (zend_optimizer_replace_by_const(op_array, opline + 1, opline->result_type, opline->result.var, result)) { + MAKE_NOP(opline); + } else { + opline->opcode = ZEND_QM_ASSIGN; + opline->extended_value = 0; + SET_UNUSED(opline->op2); + zend_optimizer_update_op1_const(op_array, opline, result); + } +} + void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) { zend_op *opline = op_array->opcodes; @@ -46,21 +57,13 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) switch (opline->opcode) { case ZEND_CONCAT: case ZEND_FAST_CONCAT: - if (opline->op1_type == IS_CONST) { - if (Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) { - convert_to_string(&ZEND_OP1_LITERAL(opline)); - } + if (opline->op1_type == IS_CONST && Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) { + convert_to_string(&ZEND_OP1_LITERAL(opline)); } - if (opline->op2_type == IS_CONST) { - if (Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) { - convert_to_string(&ZEND_OP2_LITERAL(opline)); - } - if (opline->op1_type == IS_CONST) { - goto constant_binary_op; - } + if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) { + convert_to_string(&ZEND_OP2_LITERAL(opline)); } - break; - + ZEND_FALLTHROUGH; case ZEND_ADD: case ZEND_SUB: case ZEND_MUL: @@ -87,17 +90,10 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) /* binary operation with constant operands */ zval result; -constant_binary_op: if (zend_optimizer_eval_binary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); literal_dtor(&ZEND_OP2_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &result)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &result); - } + replace_by_const_or_qm_assign(op_array, opline, &result); } } break; @@ -116,13 +112,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline + 1, opline->result_type, opline->result.var, &result)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - zend_optimizer_update_op1_const(op_array, opline, &result); - } + replace_by_const_or_qm_assign(op_array, opline, &result); break; } } @@ -136,12 +126,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &result)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - zend_optimizer_update_op1_const(op_array, opline, &result); - } + replace_by_const_or_qm_assign(op_array, opline, &result); } } break; @@ -161,14 +146,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if ((offset = zend_get_constant_str("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1)) != NULL) { literal_dtor(&ZEND_OP2_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, offset)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, offset); - } + replace_by_const_or_qm_assign(op_array, opline, offset); } EG(current_execute_data) = orig_execute_data; break; @@ -188,14 +166,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) break; } literal_dtor(&ZEND_OP2_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &c)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &c); - } + replace_by_const_or_qm_assign(op_array, opline, &c); } break; @@ -258,15 +229,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) MAKE_NOP((opline - 1)); } literal_dtor(&ZEND_OP2_LITERAL(opline)); - - if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &t)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &t); - } + replace_by_const_or_qm_assign(op_array, opline, &t); } } } @@ -367,14 +330,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &t); - } + replace_by_const_or_qm_assign(op_array, opline, &t); } zend_string_release_ex(lc_name, 0); break; @@ -408,14 +364,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &t); - } + replace_by_const_or_qm_assign(op_array, opline, &t); break; } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "constant")) { zval t; @@ -425,14 +374,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &t); - } + replace_by_const_or_qm_assign(op_array, opline, &t); } break; /* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */ @@ -448,14 +390,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - opline->extended_value = 0; - SET_UNUSED(opline->op2); - zend_optimizer_update_op1_const(op_array, opline, &t); - } + replace_by_const_or_qm_assign(op_array, opline, &t); } else { zend_string_release_ex(dirname, 0); } @@ -472,12 +407,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (zend_optimizer_eval_strlen(&t, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &t)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - zend_optimizer_update_op1_const(op_array, opline, &t); - } + replace_by_const_or_qm_assign(op_array, opline, &t); } } break; @@ -489,12 +419,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) } ZVAL_TRUE(&c); literal_dtor(&ZEND_OP1_LITERAL(opline)); - if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &c)) { - MAKE_NOP(opline); - } else { - opline->opcode = ZEND_QM_ASSIGN; - zend_optimizer_update_op1_const(op_array, opline, &c); - } + replace_by_const_or_qm_assign(op_array, opline, &c); } break; case ZEND_DECLARE_CONST: From 046096f2652fbd2c1256a6f725aca1b1e47d7915 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 21:00:07 +0100 Subject: [PATCH 0312/1346] Remove outdated FETCH_CLASS handling in FETCH_CLASS_CONSTANT optimization Nowadays self::X is represented using an UNUSED operand with FETCH_CLASS_SELF flag rather than a separate FETCH_CLASS instruction. The code already handles the new pattern. --- Zend/Optimizer/pass1.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index b49b52b5e1465..b330ca24b4daf 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -194,14 +194,6 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) { /* for self::B */ ce = op_array->scope; - } else if (op_array->scope && - opline->op1_type == IS_VAR && - (opline - 1)->opcode == ZEND_FETCH_CLASS && - ((opline - 1)->op2_type == IS_UNUSED && - ((opline - 1)->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) && - (opline - 1)->result.var == opline->op1.var) { - /* for self::B */ - ce = op_array->scope; } if (ce) { @@ -225,8 +217,6 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (opline->op1_type == IS_CONST) { literal_dtor(&ZEND_OP1_LITERAL(opline)); - } else if (opline->op1_type == IS_VAR) { - MAKE_NOP((opline - 1)); } literal_dtor(&ZEND_OP2_LITERAL(opline)); replace_by_const_or_qm_assign(op_array, opline, &t); From 2cf93032ee0f9a8defa3df289258fa2a0a12da8d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 21:51:29 +0100 Subject: [PATCH 0313/1346] Sink op_array scope case into get_class_entry() This handles references to the current class through its name rather than self (and for cases where is is not linked yet and thus not covered by the context lookup). Rather than handling this only for FETCH_CLASS_CONSTANT optimization, integrate this into the generic get_class_entry() utility. --- Zend/Optimizer/dfa_pass.c | 2 +- Zend/Optimizer/escape_analysis.c | 4 ++-- Zend/Optimizer/pass1.c | 13 ++++--------- Zend/Optimizer/zend_inference.c | 9 +++++---- Zend/Optimizer/zend_optimizer.c | 9 +++++++-- Zend/Optimizer/zend_optimizer_internal.h | 3 ++- Zend/Optimizer/zend_ssa.c | 2 +- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 1f846959bc009..0218a77d3f950 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -293,7 +293,7 @@ static inline bool can_elide_return_type_check( ZEND_TYPE_FOREACH(arg_info->type, single_type) { if (ZEND_TYPE_HAS_NAME(*single_type)) { zend_string *lcname = zend_string_tolower(ZEND_TYPE_NAME(*single_type)); - zend_class_entry *ce = zend_optimizer_get_class_entry(script, lcname); + zend_class_entry *ce = zend_optimizer_get_class_entry(script, op_array, lcname); zend_string_release(lcname); bool result = ce && safe_instanceof(use_info->ce, ce); if (result == !is_intersection) { diff --git a/Zend/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c index e13015ceb7cd8..e66fc4f9e712c 100644 --- a/Zend/Optimizer/escape_analysis.c +++ b/Zend/Optimizer/escape_analysis.c @@ -160,7 +160,7 @@ static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, i /* objects with destructors should escape */ if (opline->op1_type == IS_CONST) { zend_class_entry *ce = zend_optimizer_get_class_entry( - script, Z_STR_P(CRT_CONSTANT(opline->op1)+1)); + script, op_array, Z_STR_P(CRT_CONSTANT(opline->op1)+1)); uint32_t forbidden_flags = /* These flags will always cause an exception */ ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS @@ -228,7 +228,7 @@ static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int va /* objects with destructors should escape */ if (opline->op1_type == IS_CONST) { zend_class_entry *ce = zend_optimizer_get_class_entry( - script, Z_STR_P(CRT_CONSTANT(opline->op1)+1)); + script, op_array, Z_STR_P(CRT_CONSTANT(opline->op1)+1)); if (ce && !ce->create_object && !ce->constructor && !ce->destructor && !ce->__get && !ce->__set && !ce->parent) { return 1; diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index b330ca24b4daf..1aad01cb2f1a9 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -179,15 +179,10 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (opline->op1_type == IS_CONST && Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING) { /* for A::B */ - if (op_array->scope && - zend_string_equals_ci(Z_STR(ZEND_OP1_LITERAL(opline)), op_array->scope->name)) { - ce = op_array->scope; - } else { - ce = zend_optimizer_get_class_entry( - ctx->script, Z_STR(op_array->literals[opline->op1.constant + 1])); - if (!ce) { - break; - } + ce = zend_optimizer_get_class_entry( + ctx->script, op_array, Z_STR(op_array->literals[opline->op1.constant + 1])); + if (!ce) { + break; } } else if (op_array->scope && opline->op1_type == IS_UNUSED && diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 52d093db116f7..c7df495c0ae09 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2143,7 +2143,8 @@ static uint32_t zend_convert_type(const zend_script *script, zend_type type, zen * we use a plain object type for class unions. */ if (ZEND_TYPE_HAS_NAME(type)) { zend_string *lcname = zend_string_tolower(ZEND_TYPE_NAME(type)); - *pce = zend_optimizer_get_class_entry(script, lcname); + // TODO: Pass through op_array. + *pce = zend_optimizer_get_class_entry(script, NULL, lcname); zend_string_release_ex(lcname, 0); } } @@ -2231,7 +2232,7 @@ static zend_property_info *zend_fetch_static_prop_info(const zend_script *script } } else if (opline->op2_type == IS_CONST) { zval *zv = CRT_CONSTANT(opline->op2); - ce = zend_optimizer_get_class_entry(script, Z_STR_P(zv + 1)); + ce = zend_optimizer_get_class_entry(script, op_array, Z_STR_P(zv + 1)); } if (ce) { @@ -3015,7 +3016,7 @@ static zend_always_inline zend_result _zend_update_type_info( } else if (opline->op2_type == IS_CONST) { zval *zv = CRT_CONSTANT(opline->op2); if (Z_TYPE_P(zv) == IS_STRING) { - ce = zend_optimizer_get_class_entry(script, Z_STR_P(zv+1)); + ce = zend_optimizer_get_class_entry(script, op_array, Z_STR_P(zv+1)); UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_op->result_def); } else { UPDATE_SSA_OBJ_TYPE(NULL, 0, ssa_op->result_def); @@ -3027,7 +3028,7 @@ static zend_always_inline zend_result _zend_update_type_info( case ZEND_NEW: tmp = MAY_BE_RC1|MAY_BE_RCN|MAY_BE_OBJECT; if (opline->op1_type == IS_CONST && - (ce = zend_optimizer_get_class_entry(script, Z_STR_P(CRT_CONSTANT(opline->op1)+1))) != NULL) { + (ce = zend_optimizer_get_class_entry(script, op_array, Z_STR_P(CRT_CONSTANT(opline->op1)+1))) != NULL) { UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_op->result_def); } else if ((t1 & MAY_BE_CLASS) && ssa_op->op1_use >= 0 && ssa_var_info[ssa_op->op1_use].ce) { UPDATE_SSA_OBJ_TYPE(ssa_var_info[ssa_op->op1_use].ce, ssa_var_info[ssa_op->op1_use].is_instanceof, ssa_op->result_def); diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 9de7a944da1a5..1abeeefeacaaf 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -694,7 +694,8 @@ void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_ } } -zend_class_entry *zend_optimizer_get_class_entry(const zend_script *script, zend_string *lcname) { +zend_class_entry *zend_optimizer_get_class_entry( + const zend_script *script, const zend_op_array *op_array, zend_string *lcname) { zend_class_entry *ce = script ? zend_hash_find_ptr(&script->class_table, lcname) : NULL; if (ce) { return ce; @@ -705,6 +706,10 @@ zend_class_entry *zend_optimizer_get_class_entry(const zend_script *script, zend return ce; } + if (op_array && op_array->scope && zend_string_equals_ci(op_array->scope->name, lcname)) { + return op_array->scope; + } + return NULL; } @@ -713,7 +718,7 @@ static zend_class_entry *get_class_entry_from_op1( if (opline->op1_type == IS_CONST) { zval *op1 = CRT_CONSTANT(opline->op1); if (Z_TYPE_P(op1) == IS_STRING) { - return zend_optimizer_get_class_entry(script, Z_STR_P(op1 + 1)); + return zend_optimizer_get_class_entry(script, op_array, Z_STR_P(op1 + 1)); } } else if (opline->op1_type == IS_UNUSED && op_array->scope && !(op_array->scope->ce_flags & ZEND_ACC_TRAIT) diff --git a/Zend/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h index bd4367eaf276b..550b911052a6b 100644 --- a/Zend/Optimizer/zend_optimizer_internal.h +++ b/Zend/Optimizer/zend_optimizer_internal.h @@ -96,7 +96,8 @@ bool zend_optimizer_replace_by_const(zend_op_array *op_array, uint32_t var, zval *val); zend_op *zend_optimizer_get_loop_var_def(const zend_op_array *op_array, zend_op *free_opline); -zend_class_entry *zend_optimizer_get_class_entry(const zend_script *script, zend_string *lcname); +zend_class_entry *zend_optimizer_get_class_entry( + const zend_script *script, const zend_op_array *op_array, zend_string *lcname); void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx); void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx); diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 9ca2e11a6f7ee..98f60468a0e69 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -527,7 +527,7 @@ static void place_essa_pis( (opline-1)->op2_type == IS_CONST) { int var = EX_VAR_TO_NUM((opline-1)->op1.var); zend_string *lcname = Z_STR_P(CRT_CONSTANT_EX(op_array, (opline-1), (opline-1)->op2) + 1); - zend_class_entry *ce = zend_optimizer_get_class_entry(script, lcname); + zend_class_entry *ce = zend_optimizer_get_class_entry(script, op_array, lcname); if (!ce) { continue; } From 206d80e11abd4d4483c40a2add0ac55a42087c81 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 25 Dec 2021 22:18:50 +0100 Subject: [PATCH 0314/1346] Reuse get_class_entry_from_op1() helper Export and reuse this helper in places that fetch a class entry from op1. --- Zend/Optimizer/escape_analysis.c | 42 +++++++++++------------- Zend/Optimizer/pass1.c | 19 ++--------- Zend/Optimizer/zend_inference.c | 4 +-- Zend/Optimizer/zend_optimizer.c | 8 ++--- Zend/Optimizer/zend_optimizer_internal.h | 2 ++ 5 files changed, 30 insertions(+), 45 deletions(-) diff --git a/Zend/Optimizer/escape_analysis.c b/Zend/Optimizer/escape_analysis.c index e66fc4f9e712c..b7c0a5ec4466a 100644 --- a/Zend/Optimizer/escape_analysis.c +++ b/Zend/Optimizer/escape_analysis.c @@ -156,23 +156,22 @@ static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, i switch (opline->opcode) { case ZEND_INIT_ARRAY: return 1; - case ZEND_NEW: + case ZEND_NEW: { /* objects with destructors should escape */ - if (opline->op1_type == IS_CONST) { - zend_class_entry *ce = zend_optimizer_get_class_entry( - script, op_array, Z_STR_P(CRT_CONSTANT(opline->op1)+1)); - uint32_t forbidden_flags = - /* These flags will always cause an exception */ - ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS - | ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT; - if (ce && !ce->parent && !ce->create_object && !ce->constructor && - !ce->destructor && !ce->__get && !ce->__set && - !(ce->ce_flags & forbidden_flags) && - (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) { - return 1; - } + zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1( + script, op_array, opline); + uint32_t forbidden_flags = + /* These flags will always cause an exception */ + ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS + | ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT; + if (ce && !ce->parent && !ce->create_object && !ce->constructor && + !ce->destructor && !ce->__get && !ce->__set && + !(ce->ce_flags & forbidden_flags) && + (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) { + return 1; } break; + } case ZEND_QM_ASSIGN: if (opline->op1_type == IS_CONST && Z_TYPE_P(CRT_CONSTANT(opline->op1)) == IS_ARRAY) { @@ -224,17 +223,16 @@ static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int va case ZEND_QM_ASSIGN: case ZEND_ASSIGN: return 1; - case ZEND_NEW: + case ZEND_NEW: { /* objects with destructors should escape */ - if (opline->op1_type == IS_CONST) { - zend_class_entry *ce = zend_optimizer_get_class_entry( - script, op_array, Z_STR_P(CRT_CONSTANT(opline->op1)+1)); - if (ce && !ce->create_object && !ce->constructor && - !ce->destructor && !ce->__get && !ce->__set && !ce->parent) { - return 1; - } + zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1( + script, op_array, opline); + if (ce && !ce->create_object && !ce->constructor && + !ce->destructor && !ce->__get && !ce->__set && !ce->parent) { + return 1; } break; + } } } else if (op->op1_def == var) { switch (opline->opcode) { diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 1aad01cb2f1a9..7cc7ae912a795 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -174,23 +174,8 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING) { - zend_class_entry *ce = NULL; - - if (opline->op1_type == IS_CONST && - Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING) { - /* for A::B */ - ce = zend_optimizer_get_class_entry( - ctx->script, op_array, Z_STR(op_array->literals[opline->op1.constant + 1])); - if (!ce) { - break; - } - } else if (op_array->scope && - opline->op1_type == IS_UNUSED && - (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) { - /* for self::B */ - ce = op_array->scope; - } - + zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1( + ctx->script, op_array, opline); if (ce) { zend_class_constant *cc; zval *c, t; diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index c7df495c0ae09..80b01a6db26ac 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3027,8 +3027,8 @@ static zend_always_inline zend_result _zend_update_type_info( break; case ZEND_NEW: tmp = MAY_BE_RC1|MAY_BE_RCN|MAY_BE_OBJECT; - if (opline->op1_type == IS_CONST && - (ce = zend_optimizer_get_class_entry(script, op_array, Z_STR_P(CRT_CONSTANT(opline->op1)+1))) != NULL) { + ce = zend_optimizer_get_class_entry_from_op1(script, op_array, opline); + if (ce) { UPDATE_SSA_OBJ_TYPE(ce, 0, ssa_op->result_def); } else if ((t1 & MAY_BE_CLASS) && ssa_op->op1_use >= 0 && ssa_var_info[ssa_op->op1_use].ce) { UPDATE_SSA_OBJ_TYPE(ssa_var_info[ssa_op->op1_use].ce, ssa_var_info[ssa_op->op1_use].is_instanceof, ssa_op->result_def); diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 1abeeefeacaaf..f8aee5148cbeb 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -713,8 +713,8 @@ zend_class_entry *zend_optimizer_get_class_entry( return NULL; } -static zend_class_entry *get_class_entry_from_op1( - zend_script *script, zend_op_array *op_array, zend_op *opline) { +zend_class_entry *zend_optimizer_get_class_entry_from_op1( + const zend_script *script, const zend_op_array *op_array, const zend_op *opline) { if (opline->op1_type == IS_CONST) { zval *op1 = CRT_CONSTANT(opline->op1); if (Z_TYPE_P(op1) == IS_STRING) { @@ -770,7 +770,7 @@ zend_function *zend_optimizer_get_called_func( break; case ZEND_INIT_STATIC_METHOD_CALL: if (opline->op2_type == IS_CONST && Z_TYPE_P(CRT_CONSTANT(opline->op2)) == IS_STRING) { - zend_class_entry *ce = get_class_entry_from_op1( + zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1( script, op_array, opline); if (ce) { zend_string *func_name = Z_STR_P(CRT_CONSTANT(opline->op2) + 1); @@ -812,7 +812,7 @@ zend_function *zend_optimizer_get_called_func( break; case ZEND_NEW: { - zend_class_entry *ce = get_class_entry_from_op1( + zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1( script, op_array, opline); if (ce && ce->type == ZEND_USER_CLASS) { return ce->constructor; diff --git a/Zend/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h index 550b911052a6b..0116e1506000d 100644 --- a/Zend/Optimizer/zend_optimizer_internal.h +++ b/Zend/Optimizer/zend_optimizer_internal.h @@ -98,6 +98,8 @@ bool zend_optimizer_replace_by_const(zend_op_array *op_array, zend_op *zend_optimizer_get_loop_var_def(const zend_op_array *op_array, zend_op *free_opline); zend_class_entry *zend_optimizer_get_class_entry( const zend_script *script, const zend_op_array *op_array, zend_string *lcname); +zend_class_entry *zend_optimizer_get_class_entry_from_op1( + const zend_script *script, const zend_op_array *op_array, const zend_op *opline); void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx); void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx); From 924e875651ca77d6d3a07f32ed26fc9b70df0b01 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 26 Dec 2021 09:48:06 +0100 Subject: [PATCH 0315/1346] Minor code cleanup in pass1 Move literal destruction into helper and use a common result variable to make code more compact. --- Zend/Optimizer/pass1.c | 124 +++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 79 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 7cc7ae912a795..4477a0270a393 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -36,6 +36,12 @@ #include "zend_vm.h" 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)); + } + if (opline->op2_type == IS_CONST) { + literal_dtor(&ZEND_OP2_LITERAL(opline)); + } if (zend_optimizer_replace_by_const(op_array, opline + 1, opline->result_type, opline->result.var, result)) { MAKE_NOP(opline); } else { @@ -52,6 +58,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) zend_op *end = opline + op_array->last; bool collect_constants = (ZEND_OPTIMIZER_PASS_15 & ctx->optimization_level)? (op_array == &ctx->script->main_op_array) : 0; + zval result; while (opline < end) { switch (opline->opcode) { @@ -85,16 +92,9 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) case ZEND_SPACESHIP: case ZEND_CASE: case ZEND_CASE_STRICT: - if (opline->op1_type == IS_CONST && - opline->op2_type == IS_CONST) { - /* binary operation with constant operands */ - zval result; - - if (zend_optimizer_eval_binary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - literal_dtor(&ZEND_OP2_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &result); - } + if (opline->op1_type == IS_CONST && opline->op2_type == IS_CONST && + zend_optimizer_eval_binary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) { + replace_by_const_or_qm_assign(op_array, opline, &result); } break; @@ -106,28 +106,17 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) break; case ZEND_CAST: - if (opline->op1_type == IS_CONST) { - /* cast of constant operand */ - zval result; - - if (zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &result); - break; - } + if (opline->op1_type == IS_CONST && + zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { + replace_by_const_or_qm_assign(op_array, opline, &result); } break; case ZEND_BW_NOT: case ZEND_BOOL_NOT: - if (opline->op1_type == IS_CONST) { - /* unary operation on constant operand */ - zval result; - - if (zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &result); - } + if (opline->op1_type == IS_CONST && + zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { + replace_by_const_or_qm_assign(op_array, opline, &result); } break; @@ -155,18 +144,15 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING) { /* substitute persistent constants */ - zval c; - - if (!zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP2_LITERAL(opline)), &c, 1)) { - if (!ctx->constants || !zend_optimizer_get_collected_constant(ctx->constants, &ZEND_OP2_LITERAL(opline), &c)) { + if (!zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP2_LITERAL(opline)), &result, 1)) { + if (!ctx->constants || !zend_optimizer_get_collected_constant(ctx->constants, &ZEND_OP2_LITERAL(opline), &result)) { break; } } - if (Z_TYPE(c) == IS_CONSTANT_AST) { + if (Z_TYPE(result) == IS_CONSTANT_AST) { break; } - literal_dtor(&ZEND_OP2_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &c); + replace_by_const_or_qm_assign(op_array, opline, &result); } break; @@ -177,29 +163,22 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1( ctx->script, op_array, opline); if (ce) { - zend_class_constant *cc; - zval *c, t; - - if ((cc = zend_hash_find_ptr(&ce->constants_table, - Z_STR(ZEND_OP2_LITERAL(opline)))) != NULL && - (ZEND_CLASS_CONST_FLAGS(cc) & ZEND_ACC_PPP_MASK) == ZEND_ACC_PUBLIC) { - c = &cc->value; + zend_class_constant *cc = zend_hash_find_ptr( + &ce->constants_table, Z_STR(ZEND_OP2_LITERAL(opline))); + if (cc && (ZEND_CLASS_CONST_FLAGS(cc) & ZEND_ACC_PPP_MASK) == ZEND_ACC_PUBLIC) { + zval *c = &cc->value; if (Z_TYPE_P(c) == IS_CONSTANT_AST) { zend_ast *ast = Z_ASTVAL_P(c); if (ast->kind != ZEND_AST_CONSTANT - || !zend_optimizer_get_persistent_constant(zend_ast_get_constant_name(ast), &t, 1) - || Z_TYPE(t) == IS_CONSTANT_AST) { + || !zend_optimizer_get_persistent_constant(zend_ast_get_constant_name(ast), &result, 1) + || Z_TYPE(result) == IS_CONSTANT_AST) { break; } } else { - ZVAL_COPY_OR_DUP(&t, c); + ZVAL_COPY_OR_DUP(&result, c); } - if (opline->op1_type == IS_CONST) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - } - literal_dtor(&ZEND_OP2_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &t); + replace_by_const_or_qm_assign(op_array, opline, &result); } } } @@ -294,18 +273,16 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) && func->module->handle == NULL #endif ) { - zval t; - ZVAL_TRUE(&t); + ZVAL_TRUE(&result); literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &t); + replace_by_const_or_qm_assign(op_array, opline, &result); } zend_string_release_ex(lc_name, 0); break; } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "extension_loaded")) { - zval t; zend_string *lc_name = zend_string_tolower( Z_STR(ZEND_OP1_LITERAL(send1_opline))); zend_module_entry *m = zend_hash_find_ptr(&module_registry, @@ -316,7 +293,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (PG(enable_dl)) { break; } else { - ZVAL_FALSE(&t); + ZVAL_FALSE(&result); } } else { if (m->type == MODULE_PERSISTENT @@ -324,7 +301,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) && m->handle == NULL #endif ) { - ZVAL_TRUE(&t); + ZVAL_TRUE(&result); } else { break; } @@ -334,17 +311,15 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &t); + replace_by_const_or_qm_assign(op_array, opline, &result); break; } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "constant")) { - zval t; - - if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &t, 1)) { + if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &result, 1)) { literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &t); + replace_by_const_or_qm_assign(op_array, opline, &result); } break; /* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */ @@ -353,14 +328,12 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) zend_string *dirname = zend_string_init(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)), 0); ZSTR_LEN(dirname) = zend_dirname(ZSTR_VAL(dirname), ZSTR_LEN(dirname)); if (IS_ABSOLUTE_PATH(ZSTR_VAL(dirname), ZSTR_LEN(dirname))) { - zval t; - - ZVAL_STR(&t, dirname); + ZVAL_STR(&result, dirname); literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &t); + replace_by_const_or_qm_assign(op_array, opline, &result); } else { zend_string_release_ex(dirname, 0); } @@ -372,25 +345,18 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) break; } case ZEND_STRLEN: - if (opline->op1_type == IS_CONST) { - zval t; - - if (zend_optimizer_eval_strlen(&t, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &t); - } + if (opline->op1_type == IS_CONST && + zend_optimizer_eval_strlen(&result, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { + replace_by_const_or_qm_assign(op_array, opline, &result); } break; case ZEND_DEFINED: - { - zval c; - if (!zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(opline)), &c, 0)) { - break; - } - ZVAL_TRUE(&c); - literal_dtor(&ZEND_OP1_LITERAL(opline)); - replace_by_const_or_qm_assign(op_array, opline, &c); + if (!zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(opline)), &result, 0)) { + break; } + ZVAL_TRUE(&result); + literal_dtor(&ZEND_OP1_LITERAL(opline)); + replace_by_const_or_qm_assign(op_array, opline, &result); break; case ZEND_DECLARE_CONST: if (collect_constants && From c4334fc616e65962bf2f4253d4a6c14ccaa48981 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 26 Dec 2021 09:54:25 +0100 Subject: [PATCH 0316/1346] Remove special chr/count handling in sccp function evaluation These can be handled by the generic code. Worth noting that count will usually go through ZEND_COUNT, and chr on constants is evaluated in the compiler, so these are not particularly compile-time sensitive either. --- Zend/Optimizer/sccp.c | 18 +----------------- ext/standard/basic_functions.stub.php | 1 + ext/standard/basic_functions_arginfo.h | 4 ++-- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 5f3b7639ccdc7..df323b9000075 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -787,23 +787,7 @@ static inline zend_result ct_eval_func_call( if (num_args == 1) { /* Handle a few functions for which we manually implement evaluation here. */ - if (zend_string_equals_literal(name, "chr")) { - zend_long c; - if (Z_TYPE_P(args[0]) != IS_LONG) { - return FAILURE; - } - - c = Z_LVAL_P(args[0]) & 0xff; - ZVAL_CHAR(result, c); - return SUCCESS; - } else if (zend_string_equals_literal(name, "count")) { - if (Z_TYPE_P(args[0]) != IS_ARRAY) { - return FAILURE; - } - - ZVAL_LONG(result, zend_hash_num_elements(Z_ARRVAL_P(args[0]))); - return SUCCESS; - } else if (zend_string_equals_literal(name, "ini_get")) { + if (zend_string_equals_literal(name, "ini_get")) { zend_ini_entry *ini_entry; if (Z_TYPE_P(args[0]) != IS_STRING) { diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index e5483cf23b644..5a6e611e8778a 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -82,6 +82,7 @@ function krsort(array &$array, int $flags = SORT_REGULAR): bool {} /** @return true */ function ksort(array &$array, int $flags = SORT_REGULAR): bool {} +/** @compile-time-eval */ function count(Countable|array $value, int $mode = COUNT_NORMAL): int {} /** @alias count */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 1f37885813c09..850c3f7a3051a 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: cbba5dd593bba640750378c7d668b9e4ea6c979d */ + * Stub hash: ed5328c35c17c591847feba6cb00f5badb2b446c */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2870,7 +2870,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(array_push, arginfo_array_push) ZEND_FE(krsort, arginfo_krsort) ZEND_FE(ksort, arginfo_ksort) - ZEND_FE(count, arginfo_count) + ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(count, arginfo_count) ZEND_FALIAS(sizeof, count, arginfo_sizeof) ZEND_FE(natsort, arginfo_natsort) ZEND_FE(natcasesort, arginfo_natcasesort) From 1050edaef8e4c24bd194aa1cbfb14f2edca9162b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 26 Dec 2021 10:11:59 +0100 Subject: [PATCH 0317/1346] Extract special function evaluation from pass1 Pass1 handles a number of special functions that can be evaluated under some circumstances. Move the core logic into a separate helper, as I believe that SCCP should reuse this. --- Zend/Optimizer/pass1.c | 97 +++--------------------- Zend/Optimizer/zend_optimizer.c | 63 +++++++++++++++ Zend/Optimizer/zend_optimizer_internal.h | 2 + 3 files changed, 74 insertions(+), 88 deletions(-) diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 4477a0270a393..4a8f4d4f8ecf9 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -27,7 +27,6 @@ * - pre-evaluate constant function calls */ -#include "php.h" #include "Optimizer/zend_optimizer.h" #include "Optimizer/zend_optimizer_internal.h" #include "zend_API.h" @@ -252,94 +251,16 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) } } - /* pre-evaluate constant functions: - constant(x) - function_exists(x) - is_callable(x) - extension_loaded(x) - */ - if (!send2_opline && - Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING) { - if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "function_exists") || - zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "is_callable")) { - zend_internal_function *func; - zend_string *lc_name = zend_string_tolower( - Z_STR(ZEND_OP1_LITERAL(send1_opline))); - - if ((func = zend_hash_find_ptr(EG(function_table), lc_name)) != NULL - && func->type == ZEND_INTERNAL_FUNCTION - && func->module->type == MODULE_PERSISTENT -#ifdef ZEND_WIN32 - && func->module->handle == NULL -#endif - ) { - ZVAL_TRUE(&result); - literal_dtor(&ZEND_OP2_LITERAL(init_opline)); - MAKE_NOP(init_opline); - literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); - MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &result); - } - zend_string_release_ex(lc_name, 0); - break; - } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "extension_loaded")) { - zend_string *lc_name = zend_string_tolower( - Z_STR(ZEND_OP1_LITERAL(send1_opline))); - zend_module_entry *m = zend_hash_find_ptr(&module_registry, - lc_name); - - zend_string_release_ex(lc_name, 0); - if (!m) { - if (PG(enable_dl)) { - break; - } else { - ZVAL_FALSE(&result); - } - } else { - if (m->type == MODULE_PERSISTENT -#ifdef ZEND_WIN32 - && m->handle == NULL -#endif - ) { - ZVAL_TRUE(&result); - } else { - break; - } - } - - literal_dtor(&ZEND_OP2_LITERAL(init_opline)); - MAKE_NOP(init_opline); - literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); - MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &result); - break; - } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "constant")) { - if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &result, 1)) { - literal_dtor(&ZEND_OP2_LITERAL(init_opline)); - MAKE_NOP(init_opline); - literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); - MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &result); - } - break; - /* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */ - } else if (zend_string_equals_literal(Z_STR(ZEND_OP2_LITERAL(init_opline)), "dirname") && - IS_ABSOLUTE_PATH(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)))) { - zend_string *dirname = zend_string_init(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)), 0); - ZSTR_LEN(dirname) = zend_dirname(ZSTR_VAL(dirname), ZSTR_LEN(dirname)); - if (IS_ABSOLUTE_PATH(ZSTR_VAL(dirname), ZSTR_LEN(dirname))) { - ZVAL_STR(&result, dirname); - literal_dtor(&ZEND_OP2_LITERAL(init_opline)); - MAKE_NOP(init_opline); - literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); - MAKE_NOP(send1_opline); - replace_by_const_or_qm_assign(op_array, opline, &result); - } else { - zend_string_release_ex(dirname, 0); - } - break; - } + if (!send2_opline && Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING && + zend_optimizer_eval_special_func_call(&result, Z_STR(ZEND_OP2_LITERAL(init_opline)), Z_STR(ZEND_OP1_LITERAL(send1_opline))) == SUCCESS) { + literal_dtor(&ZEND_OP2_LITERAL(init_opline)); + MAKE_NOP(init_opline); + literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); + MAKE_NOP(send1_opline); + replace_by_const_or_qm_assign(op_array, opline, &result); + break; } + /* don't collect constants after any other function call */ collect_constants = 0; break; diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index f8aee5148cbeb..fd04a8bffb13c 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -30,6 +30,7 @@ #include "zend_call_graph.h" #include "zend_inference.h" #include "zend_dump.h" +#include "php.h" #ifndef ZEND_OPTIMIZER_MAX_REGISTERED_PASSES # define ZEND_OPTIMIZER_MAX_REGISTERED_PASSES 32 @@ -121,6 +122,68 @@ zend_result zend_optimizer_eval_strlen(zval *result, zval *op1) /* {{{ */ } /* }}} */ +zend_result zend_optimizer_eval_special_func_call( + zval *result, zend_string *name, zend_string *arg) { + if (zend_string_equals_literal(name, "function_exists") || + zend_string_equals_literal(name, "is_callable")) { + zend_string *lc_name = zend_string_tolower(arg); + zend_internal_function *func = zend_hash_find_ptr(EG(function_table), lc_name); + zend_string_release_ex(lc_name, 0); + + if (func && func->type == ZEND_INTERNAL_FUNCTION + && func->module->type == MODULE_PERSISTENT +#ifdef ZEND_WIN32 + && func->module->handle == NULL +#endif + ) { + ZVAL_TRUE(result); + return SUCCESS; + } + return FAILURE; + } + if (zend_string_equals_literal(name, "extension_loaded")) { + zend_string *lc_name = zend_string_tolower(arg); + zend_module_entry *m = zend_hash_find_ptr(&module_registry, lc_name); + zend_string_release_ex(lc_name, 0); + + if (!m) { + if (PG(enable_dl)) { + return FAILURE; + } + ZVAL_FALSE(result); + return SUCCESS; + } + + if (m->type == MODULE_PERSISTENT +#ifdef ZEND_WIN32 + && m->handle == NULL +#endif + ) { + ZVAL_TRUE(result); + return SUCCESS; + } + return FAILURE; + } + if (zend_string_equals_literal(name, "constant")) { + return zend_optimizer_get_persistent_constant(arg, result, 1) ? SUCCESS : FAILURE; + } + if (zend_string_equals_literal(name, "dirname")) { + if (!IS_ABSOLUTE_PATH(ZSTR_VAL(arg), ZSTR_LEN(arg))) { + return FAILURE; + } + + zend_string *dirname = zend_string_init(ZSTR_VAL(arg), ZSTR_LEN(arg), 0); + ZSTR_LEN(dirname) = zend_dirname(ZSTR_VAL(dirname), ZSTR_LEN(dirname)); + if (IS_ABSOLUTE_PATH(ZSTR_VAL(dirname), ZSTR_LEN(dirname))) { + ZVAL_STR(result, dirname); + return SUCCESS; + } + zend_string_release_ex(dirname, 0); + return FAILURE; + } + return FAILURE; +} + bool zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zval* value) { zval *val; diff --git a/Zend/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h index 0116e1506000d..25d021fa98ce9 100644 --- a/Zend/Optimizer/zend_optimizer_internal.h +++ b/Zend/Optimizer/zend_optimizer_internal.h @@ -84,6 +84,8 @@ zend_result zend_optimizer_eval_binary_op(zval *result, zend_uchar opcode, zval zend_result zend_optimizer_eval_unary_op(zval *result, zend_uchar opcode, zval *op1); zend_result zend_optimizer_eval_cast(zval *result, uint32_t type, zval *op1); zend_result zend_optimizer_eval_strlen(zval *result, zval *op1); +zend_result zend_optimizer_eval_special_func_call( + zval *result, zend_string *name, zend_string *arg); bool zend_optimizer_update_op1_const(zend_op_array *op_array, zend_op *opline, zval *val); From e45653c08993ff55a46e9d0cee0ddc7da8f722e4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 26 Dec 2021 10:36:29 +0100 Subject: [PATCH 0318/1346] Make sure SCCP can evaluate all functions pass1 can Move evaluation of ini_get() into eval_special_func_call() and use this helper both in pass1 and sccp. --- Zend/Optimizer/sccp.c | 24 +++--------------------- Zend/Optimizer/zend_optimizer.c | 13 +++++++++++++ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index df323b9000075..56c4d24d9bfe8 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -785,27 +785,9 @@ static inline zend_result ct_eval_func_call( return FAILURE; } - if (num_args == 1) { - /* Handle a few functions for which we manually implement evaluation here. */ - if (zend_string_equals_literal(name, "ini_get")) { - zend_ini_entry *ini_entry; - - if (Z_TYPE_P(args[0]) != IS_STRING) { - return FAILURE; - } - - ini_entry = zend_hash_find_ptr(EG(ini_directives), Z_STR_P(args[0])); - if (!ini_entry) { - ZVAL_FALSE(result); - } else if (ini_entry->modifiable != ZEND_INI_SYSTEM) { - return FAILURE; - } else if (ini_entry->value) { - ZVAL_STR_COPY(result, ini_entry->value); - } else { - ZVAL_EMPTY_STRING(result); - } - return SUCCESS; - } + if (num_args == 1 && Z_TYPE_P(args[0]) == IS_STRING && + zend_optimizer_eval_special_func_call(result, name, Z_STR_P(args[0])) == SUCCESS) { + return SUCCESS; } if (!can_ct_eval_func_call(func, name, num_args, args)) { diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index fd04a8bffb13c..9048f0c045109 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -181,6 +181,19 @@ zend_result zend_optimizer_eval_special_func_call( zend_string_release_ex(dirname, 0); return FAILURE; } + if (zend_string_equals_literal(name, "ini_get")) { + zend_ini_entry *ini_entry = zend_hash_find_ptr(EG(ini_directives), arg); + if (!ini_entry) { + ZVAL_FALSE(result); + } else if (ini_entry->modifiable != ZEND_INI_SYSTEM) { + return FAILURE; + } else if (ini_entry->value) { + ZVAL_STR_COPY(result, ini_entry->value); + } else { + ZVAL_EMPTY_STRING(result); + } + return SUCCESS; + } return FAILURE; } From eac50a360f1e50ab68f68776010697a61398d1bc Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 5 Dec 2021 19:58:12 +0200 Subject: [PATCH 0319/1346] Implement fast text conversion interface for Big5 --- ext/mbstring/libmbfl/filters/mbfilter_big5.c | 80 +++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c index 2ba32ee04563d..826c979d4136b 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c @@ -33,6 +33,8 @@ #include "unicode_table_big5.h" static int mbfl_filt_conv_big5_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_big5_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_big5(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_big5[] = { /* 0x81-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -64,8 +66,8 @@ const mbfl_encoding mbfl_encoding_big5 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_big5_wchar, &vtbl_wchar_big5, - NULL, - NULL + mb_big5_to_wchar, + mb_wchar_to_big5 }; const mbfl_encoding mbfl_encoding_cp950 = { @@ -380,3 +382,77 @@ int mbfl_filt_conv_wchar_big5(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_big5_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c <= 0x7F) { + *out++ = c; + } else if (c > 0xA0 && c <= 0xF9 && c != 0xC8 && p < e) { + unsigned char c2 = *p++; + + if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE)) { + unsigned int w = ((c - 0xA1)*157) + c2 - ((c2 <= 0x7E) ? 0x40 : 0xA1 - 0x3F); + w = (w < big5_ucs_table_size) ? big5_ucs_table[w] : 0; + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_big5(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_big5_table_min && w < ucs_a1_big5_table_max) { + s = ucs_a1_big5_table[w - ucs_a1_big5_table_min]; + } else if (w >= ucs_a2_big5_table_min && w < ucs_a2_big5_table_max) { + s = ucs_a2_big5_table[w - ucs_a2_big5_table_min]; + } else if (w >= ucs_a3_big5_table_min && w < ucs_a3_big5_table_max) { + s = ucs_a3_big5_table[w - ucs_a3_big5_table_min]; + } else if (w >= ucs_i_big5_table_min && w < ucs_i_big5_table_max) { + s = ucs_i_big5_table[w - ucs_i_big5_table_min]; + } else if (w >= ucs_r1_big5_table_min && w < ucs_r1_big5_table_max) { + s = ucs_r1_big5_table[w - ucs_r1_big5_table_min]; + } else if (w >= ucs_r2_big5_table_min && w < ucs_r2_big5_table_max) { + s = ucs_r2_big5_table[w - ucs_r2_big5_table_min]; + } + + if (!s) { + if (w == 0) { + out = mb_convert_buf_add(out, 0); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_big5); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } else if (s <= 0x80) { + out = mb_convert_buf_add(out, s); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From da58d42d94ca85269e4f05bd944782f2b0a541b4 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Mon, 6 Dec 2021 10:38:07 +0200 Subject: [PATCH 0320/1346] Implement fast text conversion interface for CP950 --- ext/mbstring/libmbfl/filters/mbfilter_big5.c | 188 ++++++++++++++++++- 1 file changed, 186 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c index 826c979d4136b..7d389efc79e91 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c @@ -35,6 +35,8 @@ static int mbfl_filt_conv_big5_wchar_flush(mbfl_convert_filter *filter); static size_t mb_big5_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); static void mb_wchar_to_big5(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static size_t mb_cp950_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_cp950(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_big5[] = { /* 0x81-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -79,8 +81,8 @@ const mbfl_encoding mbfl_encoding_cp950 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp950_wchar, &vtbl_wchar_cp950, - NULL, - NULL + mb_cp950_to_wchar, + mb_wchar_to_cp950 }; const struct mbfl_convert_vtbl vtbl_big5_wchar = { @@ -456,3 +458,185 @@ static void mb_wchar_to_big5(uint32_t *in, size_t len, mb_convert_buf *buf, bool MB_CONVERT_BUF_STORE(buf, out, limit); } + +static size_t mb_cp950_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c <= 0x7F) { + *out++ = c; + } else if (c > 0x80 && c <= 0xFE && p < e) { + unsigned char c2 = *p++; + + if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0xA1 && c2 <= 0xFE)) { + unsigned int w = ((c - 0xA1)*157) + c2 - ((c2 <= 0x7E) ? 0x40 : 0xA1 - 0x3F); + w = (w < big5_ucs_table_size) ? big5_ucs_table[w] : 0; + + /* PUA for CP950 */ + if (is_in_cp950_pua(c, c2)) { + unsigned int s = (c << 8) | c2; + + int k; + for (k = 0; k < sizeof(cp950_pua_tbl) / (sizeof(unsigned short)*4); k++) { + if (s >= cp950_pua_tbl[k][2] && s <= cp950_pua_tbl[k][3]) { + break; + } + } + + if ((cp950_pua_tbl[k][2] & 0xFF) == 0x40) { + w = 157*(c - (cp950_pua_tbl[k][2] >> 8)) + c2 - (c2 >= 0xA1 ? 0x62 : 0x40) + cp950_pua_tbl[k][0]; + } else { + w = s - cp950_pua_tbl[k][2] + cp950_pua_tbl[k][0]; + } + } else if (c == 0xA1) { + if (c2 == 0x45) { + w = 0x2027; + } else if (c2 == 0x4E) { + w = 0xFE51; + } else if (c2 == 0x5A) { + w = 0x2574; + } else if (c2 == 0xC2) { + w = 0x00AF; + } else if (c2 == 0xC3) { + w = 0xFFE3; + } else if (c2 == 0xC5) { + w = 0x02CD; + } else if (c2 == 0xE3) { + w = 0xFF5E; + } else if (c2 == 0xF2) { + w = 0x2295; + } else if (c2 == 0xF3) { + w = 0x2299; + } else if (c2 == 0xFE) { + w = 0xFF0F; + } + } else if (c == 0xA2) { + if (c2 == 0x40) { + w = 0xFF3C; + } else if (c2 == 0x41) { + w = 0x2215; + } else if (c2 == 0x42) { + w = 0xFE68; + } else if (c2 == 0x46) { + w = 0xFFE0; + } else if (c2 == 0x47) { + w = 0xFFE1; + } else if (c2 == 0xCC) { + w = 0x5341; + } else if (c2 == 0xCE) { + w = 0x5345; + } + } + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_cp950(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_big5_table_min && w < ucs_a1_big5_table_max) { + s = ucs_a1_big5_table[w - ucs_a1_big5_table_min]; + } else if (w >= ucs_a2_big5_table_min && w < ucs_a2_big5_table_max) { + s = ucs_a2_big5_table[w - ucs_a2_big5_table_min]; + } else if (w >= ucs_a3_big5_table_min && w < ucs_a3_big5_table_max) { + s = ucs_a3_big5_table[w - ucs_a3_big5_table_min]; + } else if (w >= ucs_i_big5_table_min && w < ucs_i_big5_table_max) { + s = ucs_i_big5_table[w - ucs_i_big5_table_min]; + } else if (w >= ucs_r1_big5_table_min && w < ucs_r1_big5_table_max) { + s = ucs_r1_big5_table[w - ucs_r1_big5_table_min]; + } else if (w >= ucs_r2_big5_table_min && w < ucs_r2_big5_table_max) { + s = ucs_r2_big5_table[w - ucs_r2_big5_table_min]; + } + + if (w >= 0xE000 && w <= 0xF848) { + int k; + for (k = 0; k < sizeof(cp950_pua_tbl) / (sizeof(unsigned short)*4); k++) { + if (w <= cp950_pua_tbl[k][1]) { + break; + } + } + + int c1 = w - cp950_pua_tbl[k][0]; + if ((cp950_pua_tbl[k][2] & 0xFF) == 0x40) { + int c2 = cp950_pua_tbl[k][2] >> 8; + s = ((c1 / 157) + c2) << 8; + c1 %= 157; + s |= c1 + (c1 >= 0x3F ? 0x62 : 0x40); + } else { + s = c1 + cp950_pua_tbl[k][2]; + } + } else if (w == 0xA2 || w == 0xA3 || w == 0x401 || (w >= 0x414 && w <= 0x41C) || (w >= 0x423 && w <= 0x44F) || w == 0x451 || w == 0x2022 || w == 0x203E || w == 0x223C || (w >= 0x2460 && w <= 0x247D) || w == 0x2609 || w == 0x2641 || w == 0x3005 || (w >= 0x302A && w <= 0x30FF) || w == 0xFF64) { + s = 0; + } else if (w == 0xAF) { + s = 0xA1C2; + } else if (w == 0x2CD) { + s = 0xA1C5; + } else if (w == 0x2027) { + s = 0xA145; + } else if (w == 0x2215) { + s = 0xA241; + } else if (w == 0x2295) { + s = 0xA1F2; + } else if (w == 0x2299) { + s = 0xA1F3; + } else if (w == 0x2574) { + s = 0xA15A; + } else if (w == 0xFE51) { + s = 0xA14E; + } else if (w == 0xFE68) { + s = 0xA242; + } else if (w == 0xFF3C) { + s = 0xA240; + } else if (w == 0xFF5E) { + s = 0xA1E3; + } else if (w == 0xFFE0) { + s = 0xA246; + } else if (w == 0xFFE1) { + s = 0xA247; + } else if (w == 0xFFE3) { + s = 0xA1C3; + } else if (w == 0xFF0F) { + s = 0xA1FE; + } + + if (!s) { + if (w == 0) { + out = mb_convert_buf_add(out, 0); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_big5); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } else if (s <= 0x80) { + out = mb_convert_buf_add(out, s); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 40809cb19f060320b5ac7275e69e10e007c8c5d4 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Mon, 6 Dec 2021 15:28:07 +0200 Subject: [PATCH 0321/1346] Implement fast text conversion interface for HZ --- ext/mbstring/libmbfl/filters/mbfilter_hz.c | 156 ++++++++++++++++++++- ext/mbstring/tests/hz_encoding.phpt | 12 ++ 2 files changed, 166 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_hz.c b/ext/mbstring/libmbfl/filters/mbfilter_hz.c index 3370cd93ef88b..e10109bc33d8f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_hz.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_hz.c @@ -34,6 +34,8 @@ #include "unicode_table_gb2312.h" static int mbfl_filt_conv_hz_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_hz_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_hz(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); const mbfl_encoding mbfl_encoding_hz = { mbfl_no_encoding_hz, @@ -44,8 +46,8 @@ const mbfl_encoding mbfl_encoding_hz = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_hz_wchar, &vtbl_wchar_hz, - NULL, - NULL + mb_hz_to_wchar, + mb_wchar_to_hz }; const struct mbfl_convert_vtbl vtbl_hz_wchar = { @@ -250,3 +252,153 @@ int mbfl_filt_conv_any_hz_flush(mbfl_convert_filter *filter) filter->status = 0; return 0; } + +#define ASCII 0 +#define GB2312 1 + +static size_t mb_hz_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c == '~') { + if (p == e) { + break; + } + unsigned char c2 = *p++; + + if (c2 == '}' && *state == GB2312) { + *state = ASCII; + } else if (c2 == '{' && *state == ASCII) { + *state = GB2312; + } else if (c2 == '~' && *state == ASCII) { + *out++ = '~'; + } else if (c2 == '\n') { + /* "~\n" is a line continuation; no output is needed, nor should we shift modes */ + } else { + /* Invalid character after ~ */ + *out++ = MBFL_BAD_INPUT; + } + } else if (((c > 0x20 && c <= 0x29) || (c >= 0x30 && c <= 0x77)) && p < e && *state == GB2312) { + unsigned char c2 = *p++; + + if (c > 0x20 && c < 0x7F && c2 > 0x20 && c2 < 0x7F) { + unsigned int s = (c - 1)*192 + c2 + 0x40; + ZEND_ASSERT(s < cp936_ucs_table_size); + + if (s == 0x1864) { + s = 0x30FB; + } else if (s == 0x186A) { + s = 0x2015; + } else if (s == 0x186C) { + s = 0x2225; + } else if ((s >= 0x1920 && s <= 0x192A) || s == 0x1963 || (s >= 0x1C60 && s <= 0x1C7F) || (s >= 0x1DBB && s <= 0x1DC4)) { + s = 0; + } else { + s = cp936_ucs_table[s]; + } + if (!s) + s = MBFL_BAD_INPUT; + *out++ = s; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c < 0x80 && *state == ASCII) { + *out++ = c; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_hz(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_cp936_table_min && w < ucs_a1_cp936_table_max) { + if (w == 0xB7 || w == 0x144 || w == 0x148 || w == 0x251 || w == 0x261 || w == 0x2CA || w == 0x2CB || w == 0x2D9) { + s = 0; + } else { + s = ucs_a1_cp936_table[w - ucs_a1_cp936_table_min]; + } + } else if (w >= ucs_a2_cp936_table_min && w < ucs_a2_cp936_table_max) { + if (w == 0x2015) { + s = 0xA1AA; + } else if (w == 0x2010 || w == 0x2013 || w == 0x2014 || w == 0x2016 || w == 0x2025 || w == 0x2035 || w == 0x2105 || w == 0x2109 || w == 0x2121 || (w >= 0x2170 && w <= 0x2179) || (w >= 0x2196 && w <= 0x2199) || w == 0x2215 || w == 0x221F || w == 0x2223 || w == 0x2252 || w == 0x2266 || w == 0x2267 || w == 0x2295 || (w >= 0x2550 && w <= 0x2573) || w == 0x22BF || w == 0x2609 || (w >= 0x2581 && w <= 0x258F) || (w >= 0x2593 && w <= 0x2595) || w == 0x25BC || w == 0x25BD || (w >= 0x25E2 && w <= 0x25E5)) { + s = 0; + } else { + s = ucs_a2_cp936_table[w - ucs_a2_cp936_table_min]; + } + } else if (w >= ucs_a3_cp936_table_min && w < ucs_a3_cp936_table_max) { + if (w == 0x30FB) { + s = 0xA1A4; + } else if (w == 0x3006 || w == 0x3007 || w == 0x3012 || w == 0x3231 || w == 0x32A3 || w >= 0x3300 || (w >= 0x3018 && w <= 0x3040) || (w >= 0x309B && w <= 0x309E) || (w >= 0x30FC && w <= 0x30FE)) { + s = 0; + } else { + s = ucs_a3_cp936_table[w - ucs_a3_cp936_table_min]; + } + } else if (w >= ucs_i_gb2312_table_min && w < ucs_i_gb2312_table_max) { + s = ucs_i_gb2312_table[w - ucs_i_gb2312_table_min]; + } else if (w >= ucs_hff_cp936_table_min && w < ucs_hff_cp936_table_max) { + if (w == 0xFF04) { + s = 0xA1E7; + } else if (w == 0xFF5E) { + s = 0xA1AB; + } else if (w >= 0xFF01 && w <= 0xFF5D) { + s = w - 0xFF01 + 0xA3A1; + } else if (w == 0xFFE0 || w == 0xFFE1 || w == 0xFFE3 || w == 0xFFE5) { + s = ucs_hff_s_cp936_table[w - 0xFFE0]; + } + } + + s &= ~0x8080; + + if ((!s && w) || (s >= 0x80 && s < 0x2121)) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_hz); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } else if (s < 0x80) { + /* ASCII */ + if (buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, '~', '}'); + buf->state = ASCII; + } + if (s == '~') { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, '~', '~'); + } else { + out = mb_convert_buf_add(out, s); + } + } else { + /* GB 2312-80 */ + if (buf->state != GB2312) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, '~', '{'); + buf->state = GB2312; + } + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, (s >> 8) & 0x7F, s & 0x7F); + } + } + + if (end && buf->state != ASCII) { + /* If not in ASCII state, need to emit closing control chars */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, 2); + out = mb_convert_buf_add2(out, '~', '}'); + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/tests/hz_encoding.phpt b/ext/mbstring/tests/hz_encoding.phpt index 665980c9c7f16..a763fe828563f 100644 --- a/ext/mbstring/tests/hz_encoding.phpt +++ b/ext/mbstring/tests/hz_encoding.phpt @@ -118,6 +118,18 @@ while (!empty($badChars)) { echo "Tested UTF-16BE -> HZ (for all GB2312 characters)\n"; +// Regression tests +if (mb_convert_encoding("\x7A\xFA\x00\x00", 'HZ', 'UTF-16BE') !== "~{\x73\x43~}\x00") + die("Bad"); +if (mb_convert_encoding("~", 'UTF-16BE', 'HZ') !== "") + die("Bad"); +// There had once been a bug whereby the output buffer would be overrun by one byte. +// It was found by fuzzing. Reproducing it required a string which was long enough +// and had a GB2312 character at the end. +$str = "\xD9\x96C\xA7\x1B\xF6\xD8\x86\x94\xB0\xA0\xE1\x9D\x8C\xF8G\xBBMk\xD2Y\tt\xF1\x96d\x17JA\xF9\xF8\xCF\xDC\xFE\x8E\x0E\xC1\x84\xDA\xDBM\xC1\x87\x1AZ\xD5\xA6)\xFF%2\\\xCC\x02\x16]Y\xF0\x00\xEA\xE8{)\x81\xD5VQZ\x12\xB5\xBC\x9A\x91\xA0x\x02\xBA\xF6c\xACo\x9BH\xB7qx\xF5\x0F\t\x15\xDByx\xBA[\xC9\xE8r\xCD*:\xBF\x10P\xF1>Q\x07\xEE\xE5\x80\xAD\xB9\xA2\x9B\xF6\xE1,\x82\xC6q\x94E\xD4\x0B\xC6\xBCQe=\xC3\xE0\xC8\xE0R\x97\x14q\x0C\x1A\x7F\xE1\xC4\xB8U\x8A\x86\x93\xB6/\x84\x95\x06\x91W\xB2\xB6\x1F!\t X\x1A\xD5\xD6\xDA<\x81ib\x9A\x1B3\xD3\xB7:\xE2QS\xD0\x91\x99[K\xF2E\xBBjoh_5\x15 \xA4\xCC\xB0\x7F\x06\xB3,\xB3\xA7u\xB9\x82\x00\xE2f$\x1C\x84NsP\xFAiPB{\x8D\xBA\xB3[\x88\xA9\xB1\xA2r\x86\xFF<\xFD\xFB\xF8\xD6\xABq\x00z\xFA\x87\x8C_\xD9N\xF2\xFA\xEA\xEA\xAA\xD7\xFA\xA2\xD4\x85/\xFC\xE1}\xF7\x9C\x86\xDD\x12@\xC3\xDA\nC\x1Di\xA9\xB0\xC3\xB3\x04\xB2\x1A\x07BA\x02\xED\x11\xA4\xDAz\x96\xB5\xD0!p\xE2\xAD\xEDI\xEF\xF7\\\x05d.p\x07\xC4\x8B\x952\xCDz\x90\x8C\xA6U\xDB\xC7\xF4\x94\xE9\x16X\xF1\xCC\xB13\x07a9\x86]\xF9k\xA9\x87E\xCB\x89\x9Fd\x0E\x81m\xC6c\xDA\x9C\xE9\xAF\x80.\xFAq\xD9\xAAd\x1DB\x1F\x854\xE8\x82v)A\xF3\xB4\x1D\xE5\xF0\xFFu\x0E\x0C\xC4q\xF0\xE7\xB4p\x86\xE6]9\xD9\xA5O\xBAw\x1B\x8D&]\x9D\xE2\x0F\xD2\xD5\x13AY#\x81\x90\xB2\xE8\xDA\xD2\xFC>\xA0\x9A\xBD\x0B\xCC\x08>\x1E\xD1\xFEgr1'$\xEE\xA2!\x8A\xBB>\x11j#Pz_!?\xA8\x15\xCF\xCB\x84\x86\xC1\xF78:\xDA\xBCE\xA7\x02SO\x8B\x81>\x96\xBD\xFD2\x84\xC5\xFC\x19\xE5\xF4\xEFp\xF08K\xBB\xAE-[}\xE1\xDB\x8A%6\xC7\xC9"; +if (substr(mb_convert_encoding($str, 'HZ', 'CP51932'), -4) !== "\x45\x49~}") + die("Bad"); + // Test "long" illegal character markers mb_substitute_character("long"); convertInvalidString("~A", "%", "HZ", "UTF-8"); From c0936d48b08406ebde35e4b53bc0c10c54acd6df Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 7 Dec 2021 08:59:26 +0200 Subject: [PATCH 0322/1346] Implement fast text conversion interface for UHC --- ext/mbstring/libmbfl/filters/mbfilter_uhc.c | 94 ++++++++++++++++++++- ext/mbstring/tests/uhc_encoding.phpt | 3 + 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c index e465fbe2b4d4e..bec134aabd2aa 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_uhc.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_uhc.c @@ -37,6 +37,8 @@ #include "unicode_table_uhc.h" static int mbfl_filt_conv_uhc_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_uhc_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_uhc(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_uhc[] = { /* 0x81-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -68,8 +70,8 @@ const mbfl_encoding mbfl_encoding_uhc = { 0, &vtbl_uhc_wchar, &vtbl_wchar_uhc, - NULL, - NULL + mb_uhc_to_wchar, + mb_wchar_to_uhc }; const struct mbfl_convert_vtbl vtbl_uhc_wchar = { @@ -192,3 +194,91 @@ int mbfl_filt_conv_wchar_uhc(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_uhc_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c > 0x80 && c < 0xFE && c != 0xC9 && p < e) { + unsigned char c2 = *p++; + unsigned int w = 0; + + if (c >= 0x81 && c <= 0xA0 && c2 >= 0x41 && c2 <= 0xFE) { + w = (c - 0x81)*190 + (c2 - 0x41); + if (w < uhc1_ucs_table_size) { + w = uhc1_ucs_table[w]; + } + } else if (c >= 0xA1 && c <= 0xC6 && c2 >= 0x41 && c2 <= 0xFE) { + w = (c - 0xA1)*190 + (c2 - 0x41); + if (w < uhc2_ucs_table_size) { + w = uhc2_ucs_table[w]; + } + } else if (c >= 0xC7 && c < 0xFE && c2 >= 0xA1 && c2 <= 0xFE) { + w = (c - 0xC7)*94 + (c2 - 0xA1); + if (w < uhc3_ucs_table_size) { + w = uhc3_ucs_table[w]; + } + } + if (!w) { + w = MBFL_BAD_INPUT; + } + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_uhc(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_uhc_table_min && w < ucs_a1_uhc_table_max) { + s = ucs_a1_uhc_table[w - ucs_a1_uhc_table_min]; + } else if (w >= ucs_a2_uhc_table_min && w < ucs_a2_uhc_table_max) { + s = ucs_a2_uhc_table[w - ucs_a2_uhc_table_min]; + } else if (w >= ucs_a3_uhc_table_min && w < ucs_a3_uhc_table_max) { + s = ucs_a3_uhc_table[w - ucs_a3_uhc_table_min]; + } else if (w >= ucs_i_uhc_table_min && w < ucs_i_uhc_table_max) { + s = ucs_i_uhc_table[w - ucs_i_uhc_table_min]; + } else if (w >= ucs_s_uhc_table_min && w < ucs_s_uhc_table_max) { + s = ucs_s_uhc_table[w - ucs_s_uhc_table_min]; + } else if (w >= ucs_r1_uhc_table_min && w < ucs_r1_uhc_table_max) { + s = ucs_r1_uhc_table[w - ucs_r1_uhc_table_min]; + } else if (w >= ucs_r2_uhc_table_min && w < ucs_r2_uhc_table_max) { + s = ucs_r2_uhc_table[w - ucs_r2_uhc_table_min]; + } + + if (!s) { + if (w == 0) { + out = mb_convert_buf_add(out, 0); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_uhc); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } else if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/tests/uhc_encoding.phpt b/ext/mbstring/tests/uhc_encoding.phpt index cc4d72f9f11ea..622569c68c699 100644 --- a/ext/mbstring/tests/uhc_encoding.phpt +++ b/ext/mbstring/tests/uhc_encoding.phpt @@ -11,6 +11,9 @@ if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); include('encoding_tests.inc'); testEncodingFromUTF16ConversionTable(__DIR__ . '/data/CP949.txt', 'UHC'); +// Regression test +convertInvalidString("\xE4\xA4\xB4<", "\x75\x1A\x00%", "UHC", "UTF-16BE"); + // Test "long" illegal character markers mb_substitute_character("long"); convertInvalidString("\x80", "%", "UHC", "UTF-8"); From 43bb97c539a787a335755b4f92fdde84a9a7ff8d Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Tue, 7 Dec 2021 10:47:31 +0200 Subject: [PATCH 0323/1346] Implement fast text conversion interface for EUC-KR --- .../libmbfl/filters/mbfilter_euc_kr.c | 95 ++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c index 70c4e3f9d5949..fd7bb3b9f7c1e 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c @@ -32,6 +32,8 @@ #include "unicode_table_uhc.h" static int mbfl_filt_conv_euckr_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_euckr_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_euckr(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_euckr[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -63,8 +65,8 @@ const mbfl_encoding mbfl_encoding_euc_kr = { 0, &vtbl_euckr_wchar, &vtbl_wchar_euckr, - NULL, - NULL + mb_euckr_to_wchar, + mb_wchar_to_euckr }; const struct mbfl_convert_vtbl vtbl_euckr_wchar = { @@ -200,3 +202,92 @@ static int mbfl_filt_conv_euckr_wchar_flush(mbfl_convert_filter *filter) return 0; } + +static size_t mb_euckr_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (((c >= 0xA1 && c <= 0xAC) || (c >= 0xB0 && c <= 0xFD)) && c != 0xC9 && p < e) { + unsigned char c2 = *p++; + + if (c >= 0xA1 && c <= 0xC6 && c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int w = (c - 0xA1)*190 + c2 - 0x41; + ZEND_ASSERT(w < uhc2_ucs_table_size); + w = uhc2_ucs_table[w]; + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else if (c >= 0xC7 && c <= 0xFE && c != 0xC9 && c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int w = (c - 0xC7)*94 + c2 - 0xA1; + ZEND_ASSERT(w < uhc3_ucs_table_size); + w = uhc3_ucs_table[w]; + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_euckr(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_uhc_table_min && w < ucs_a1_uhc_table_max) { + s = ucs_a1_uhc_table[w - ucs_a1_uhc_table_min]; + } else if (w >= ucs_a2_uhc_table_min && w < ucs_a2_uhc_table_max) { + s = ucs_a2_uhc_table[w - ucs_a2_uhc_table_min]; + } else if (w >= ucs_a3_uhc_table_min && w < ucs_a3_uhc_table_max) { + s = ucs_a3_uhc_table[w - ucs_a3_uhc_table_min]; + } else if (w >= ucs_i_uhc_table_min && w < ucs_i_uhc_table_max) { + s = ucs_i_uhc_table[w - ucs_i_uhc_table_min]; + } else if (w >= ucs_s_uhc_table_min && w < ucs_s_uhc_table_max) { + s = ucs_s_uhc_table[w - ucs_s_uhc_table_min]; + } else if (w >= ucs_r1_uhc_table_min && w < ucs_r1_uhc_table_max) { + s = ucs_r1_uhc_table[w - ucs_r1_uhc_table_min]; + } else if (w >= ucs_r2_uhc_table_min && w < ucs_r2_uhc_table_max) { + s = ucs_r2_uhc_table[w - ucs_r2_uhc_table_min]; + } + + /* Exclude UHC extension area (although we are using the UHC conversion tables) */ + if (((s >> 8) & 0xFF) < 0xA1 || (s & 0xFF) < 0xA1) { + s = 0; + } + + if (!s) { + if (w < 0x80) { + out = mb_convert_buf_add(out, w); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_euckr); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } + } else if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 20555371d5733e97023919d4911ac5f52b005a1d Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Thu, 9 Dec 2021 16:51:11 +0200 Subject: [PATCH 0324/1346] Implement fast text conversion interface for CP932 --- ext/mbstring/libmbfl/filters/mbfilter_cp932.c | 154 +++++++++++++++++- 1 file changed, 152 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c index 06ac6b22b26f2..ef7c47e967415 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp932.c @@ -34,6 +34,8 @@ #include "unicode_table_jis.h" static int mbfl_filt_conv_cp932_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_cp932_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_cp932(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -65,8 +67,8 @@ const mbfl_encoding mbfl_encoding_cp932 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp932_wchar, &vtbl_wchar_cp932, - NULL, - NULL + mb_cp932_to_wchar, + mb_wchar_to_cp932 }; const struct mbfl_convert_vtbl vtbl_cp932_wchar = { @@ -310,3 +312,151 @@ mbfl_filt_conv_wchar_cp932(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_cp932_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c > 0xA0 && c < 0xE0) { + /* Kana */ + *out++ = 0xFEC0 + c; + } else if (c > 0x80 && c < 0xFD && c != 0xA0 && p < e) { + unsigned char c2 = *p++; + + if (c2 >= 0x40 && c2 <= 0xFC && c2 != 0x7F) { + unsigned int s1, s2, w = 0; + SJIS_DECODE(c, c2, s1, s2); + unsigned int s = (s1 - 0x21)*94 + s2 - 0x21; + + if (s <= 137) { + if (s == 31) { + w = 0xFF3C; /* FULLWIDTH REVERSE SOLIDUS */ + } else if (s == 32) { + w = 0xFF5E; /* FULLWIDTH TILDE */ + } else if (s == 33) { + w = 0x2225; /* PARALLEL TO */ + } else if (s == 60) { + w = 0xFF0D; /* FULLWIDTH HYPHEN-MINUS */ + } else if (s == 80) { + w = 0xFFE0; /* FULLWIDTH CENT SIGN */ + } else if (s == 81) { + w = 0xFFE1; /* FULLWIDTH POUND SIGN */ + } else if (s == 137) { + w = 0xFFE2; /* FULLWIDTH NOT SIGN */ + } + } + + if (w == 0) { + if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { + w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; + } else if (s < jisx0208_ucs_table_size) { + w = jisx0208_ucs_table[s]; + } else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { + w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min]; + } else if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { + w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min]; + } else if (s >= (94*94) && s < (114*94)) { + w = s - (94*94) + 0xE000; + } + } + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_cp932(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s1 = 0, s2 = 0, c1, c2; + + if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s1 = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s1 = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s1 = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s1 = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } else if (w >= 0xE000 && w < (0xE000 + 20*94)) { + s1 = w - 0xE000; + c1 = s1/94 + 0x7f; + c2 = s1%94 + 0x21; + s1 = (c1 << 8) | c2; + s2 = 1; + } + + if (w == 0xA5) { /* YEN SIGN */ + s1 = 0x216F; /* FULLWIDTH YEN SIGN */ + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s1 = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s1 = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s1 = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s1 = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s1 = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s1 = 0x224C; + } else if (w == 0) { + out = mb_convert_buf_add(out, 0); + continue; + } + + if (!s1 || (s1 >= 0x8080 && !s2)) { /* not found or X 0212 */ + for (unsigned int i = 0; i < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; i++) { + if (cp932ext1_ucs_table[i] == w) { + s1 = ((i/94 + 0x2D) << 8) + (i%94 + 0x21); + goto emit_output; + } + } + + for (unsigned int i = 0; i < cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; i++) { + if (cp932ext3_ucs_table[i] == w) { + s1 = ((i/94 + 0x93) << 8) + (i%94 + 0x21); + goto emit_output; + } + } + + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp932); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + +emit_output: + if (s1 < 0x100) { + out = mb_convert_buf_add(out, s1); + } else { + c1 = (s1 >> 8) & 0xFF; + c2 = s1 & 0xFF; + SJIS_ENCODE(c1, c2, s1, s2); + out = mb_convert_buf_add2(out, s1, s2); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 661a10160b8fece3117e518f7e5250303c17fdbc Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Thu, 9 Dec 2021 20:44:39 +0200 Subject: [PATCH 0325/1346] Implement fast text conversion interface for CP936 --- ext/mbstring/libmbfl/filters/mbfilter_cp936.c | 164 +++++++++++++++++- 1 file changed, 162 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c index f12523dedca2a..5591608afa87d 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp936.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp936.c @@ -33,6 +33,9 @@ #include "unicode_table_cp936.h" static int mbfl_filt_conv_cp936_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_cp936_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_cp936(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); + static const unsigned char mblen_table_cp936[] = { /* 0x81-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -64,8 +67,8 @@ const mbfl_encoding mbfl_encoding_cp936 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp936_wchar, &vtbl_wchar_cp936, - NULL, - NULL + mb_cp936_to_wchar, + mb_wchar_to_cp936 }; const struct mbfl_convert_vtbl vtbl_cp936_wchar = { @@ -267,3 +270,160 @@ int mbfl_filt_conv_wchar_cp936(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_cp936_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c == 0x80) { + *out++ = 0x20AC; /* Euro sign */ + } else if (c < 0xFF) { + if (p >= e) { + *out++ = MBFL_BAD_INPUT; + continue; + } + + unsigned char c2 = *p++; + + if (((c >= 0xAA && c <= 0xAF) || (c >= 0xF8 && c <= 0xFE)) && (c2 >= 0xA1 && c2 <= 0xFE)) { + /* UDA part 1, 2: U+E000-U+E4C5 */ + *out++ = 94*(c >= 0xF8 ? c - 0xF2 : c - 0xAA) + (c2 - 0xA1) + 0xE000; + } else if (c >= 0xA1 && c <= 0xA7 && c2 >= 0x40 && c2 < 0xA1 && c2 != 0x7F) { + /* UDA part 3: U+E4C6-U+E765*/ + *out++ = 96*(c - 0xA1) + c2 - (c2 >= 0x80 ? 0x41 : 0x40) + 0xE4C6; + } else { + unsigned int w = (c << 8) | c2; + + if ((w >= 0xA2AB && w <= 0xA9FE) || (w >= 0xD7FA && w <= 0xD7FE) || (w >= 0xFE50 && w <= 0xFEA0)) { + for (int k = 0; k < mbfl_cp936_pua_tbl_max; k++) { + if (w >= mbfl_cp936_pua_tbl[k][2] && w <= mbfl_cp936_pua_tbl[k][2] + mbfl_cp936_pua_tbl[k][1] - mbfl_cp936_pua_tbl[k][0]) { + *out++ = w - mbfl_cp936_pua_tbl[k][2] + mbfl_cp936_pua_tbl[k][0]; + goto next_iteration; + } + } + } + + if (c < 0xFF && c > 0x80 && c2 >= 0x40 && c2 < 0xFF && c2 != 0x7F) { + w = (c - 0x81)*192 + c2 - 0x40; + ZEND_ASSERT(w < cp936_ucs_table_size); + *out++ = cp936_ucs_table[w]; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + } else { + *out++ = 0xF8F5; + } +next_iteration: ; + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_cp936(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_cp936_table_min && w < ucs_a1_cp936_table_max) { + /* U+0000-U+0451 */ + s = ucs_a1_cp936_table[w - ucs_a1_cp936_table_min]; + } else if (w >= ucs_a2_cp936_table_min && w < ucs_a2_cp936_table_max) { + /* U+2000-U+26FF */ + if (w == 0x203E) { + s = 0xA3FE; + } else if (w == 0x2218) { + s = 0xA1E3; + } else if (w == 0x223C) { + s = 0xA1AB; + } else { + s = ucs_a2_cp936_table[w - ucs_a2_cp936_table_min]; + } + } else if (w >= ucs_a3_cp936_table_min && w < ucs_a3_cp936_table_max) { + /* U+2F00-U+33FF */ + s = ucs_a3_cp936_table[w - ucs_a3_cp936_table_min]; + } else if (w >= ucs_i_cp936_table_min && w < ucs_i_cp936_table_max) { + /* U+4D00-9FFF CJK Unified Ideographs (+ Extension A) */ + s = ucs_i_cp936_table[w - ucs_i_cp936_table_min]; + } else if (w >= 0xE000 && w <= 0xE864) { + /* PUA */ + if (w < 0xe766) { + if (w < 0xe4c6) { + unsigned int c1 = w - 0xE000; + s = (c1 % 94) + 0xA1; + c1 /= 94; + s |= (c1 < 0x6 ? c1 + 0xAA : c1 + 0xF2) << 8; + } else { + unsigned int c1 = w - 0xE4C6; + s = ((c1 / 96) + 0xA1) << 8; + c1 %= 96; + s |= c1 + (c1 >= 0x3F ? 0x41 : 0x40); + } + } else { + /* U+E766-U+E864 */ + unsigned int k1 = 0; + unsigned int k2 = mbfl_cp936_pua_tbl_max; + while (k1 < k2) { + int k = (k1 + k2) >> 1; + if (w < mbfl_cp936_pua_tbl[k][0]) { + k2 = k; + } else if (w > mbfl_cp936_pua_tbl[k][1]) { + k1 = k + 1; + } else { + s = w - mbfl_cp936_pua_tbl[k][0] + mbfl_cp936_pua_tbl[k][2]; + break; + } + } + } + } else if (w == 0xF8F5) { + s = 0xFF; + } else if (w >= ucs_ci_cp936_table_min && w < ucs_ci_cp936_table_max) { + /* U+F900-U+FA2F CJK Compatibility Ideographs */ + s = ucs_ci_cp936_table[w - ucs_ci_cp936_table_min]; + } else if (w >= ucs_cf_cp936_table_min && w < ucs_cf_cp936_table_max) { + s = ucs_cf_cp936_table[w - ucs_cf_cp936_table_min]; + } else if (w >= ucs_sfv_cp936_table_min && w < ucs_sfv_cp936_table_max) { + /* U+FE50-U+FE6F Small Form Variants */ + s = ucs_sfv_cp936_table[w - ucs_sfv_cp936_table_min]; + } else if (w >= ucs_hff_cp936_table_min && w < ucs_hff_cp936_table_max) { + /* U+FF00-U+FFFF HW/FW Forms */ + if (w == 0xFF04) { + s = 0xA1E7; + } else if (w == 0xFF5E) { + s = 0xA1AB; + } else if (w >= 0xFF01 && w <= 0xFF5D) { + s = w - 0xFF01 + 0xA3A1; + } else if (w >= 0xFFE0 && w <= 0xFFE5) { + s = ucs_hff_s_cp936_table[w - 0xFFE0]; + } + } + + if (!s) { + if (w == 0) { + out = mb_convert_buf_add(out, 0); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp936); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } else if (s <= 0x80 || s == 0xFF) { + out = mb_convert_buf_add(out, s); + } else { + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 9bd08a97d98161396d9f07d32d6da366b01174d0 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 10 Dec 2021 11:34:44 +0200 Subject: [PATCH 0326/1346] Implement fast text conversion interface for EUC-TW --- .../libmbfl/filters/mbfilter_euc_tw.c | 123 +++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c index f505ca17a3923..571b711bdf6c7 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c @@ -33,6 +33,8 @@ #include "unicode_table_cns11643.h" static int mbfl_filt_conv_euctw_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_euctw_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_euctw(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_euctw[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -65,8 +67,8 @@ const mbfl_encoding mbfl_encoding_euc_tw = { 0, &vtbl_euctw_wchar, &vtbl_wchar_euctw, - NULL, - NULL + mb_euctw_to_wchar, + mb_wchar_to_euctw }; const struct mbfl_convert_vtbl vtbl_euctw_wchar = { @@ -252,3 +254,120 @@ static int mbfl_filt_conv_euctw_wchar_flush(mbfl_convert_filter *filter) return 0; } + +static size_t mb_euctw_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (((c >= 0xA1 && c <= 0xA6) || (c >= 0xC2 && c <= 0xFD)) && c != 0xC3 && p < e) { + unsigned char c2 = *p++; + + if (c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int w = (c - 0xA1)*94 + (c2 - 0xA1); + if (w < cns11643_1_ucs_table_size) { + w = cns11643_1_ucs_table[w]; + } else { + w = 0; + } + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c == 0x8E && p < e) { + unsigned char c2 = *p++; + + if ((c2 == 0xA1 || c2 == 0xA2 || c2 == 0xAE) && p < e) { + unsigned int plane = c2 - 0xA1; /* This is actually the CNS-11643 plane minus one */ + unsigned char c3 = *p++; + + if (c3 >= 0xA1 && ((plane == 0 && ((c3 >= 0xA1 && c3 <= 0xA6) || (c3 >= 0xC2 && c3 <= 0xFD)) && c3 != 0xC3) || (plane == 1 && c3 <= 0xF2) || (plane == 13 && c3 <= 0xE7)) && p < e) { + unsigned char c4 = *p++; + + if (c2 <= 0xAE && c4 > 0xA0 && c4 < 0xFF) { + unsigned int s = (c3 - 0xA1)*94 + c4 - 0xA1, w = 0; + + /* A later version of CNS-11643 moved all the characters in "plane 14" to "plane 3", + * and added tens of thousands more characters in planes 4, 5, 6, and 7 + * We only support the older version of CNS-11643 + * This is the same as iconv from glibc 2.2 */ + if (plane == 0 && s < cns11643_1_ucs_table_size) { + w = cns11643_1_ucs_table[s]; + } else if (plane == 1 && s < cns11643_2_ucs_table_size) { + w = cns11643_2_ucs_table[s]; + } else if (plane == 13 && s < cns11643_14_ucs_table_size) { + w = cns11643_14_ucs_table[s]; + } + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + continue; + } + } + } + + *out++ = MBFL_BAD_INPUT; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_euctw(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_cns11643_table_min && w < ucs_a1_cns11643_table_max) { + s = ucs_a1_cns11643_table[w - ucs_a1_cns11643_table_min]; + } else if (w >= ucs_a2_cns11643_table_min && w < ucs_a2_cns11643_table_max) { + s = ucs_a2_cns11643_table[w - ucs_a2_cns11643_table_min]; + } else if (w >= ucs_a3_cns11643_table_min && w < ucs_a3_cns11643_table_max) { + s = ucs_a3_cns11643_table[w - ucs_a3_cns11643_table_min]; + } else if (w >= ucs_i_cns11643_table_min && w < ucs_i_cns11643_table_max) { + s = ucs_i_cns11643_table[w - ucs_i_cns11643_table_min]; + } else if (w >= ucs_r_cns11643_table_min && w < ucs_r_cns11643_table_max) { + s = ucs_r_cns11643_table[w - ucs_r_cns11643_table_min]; + } + + if (!s) { + if (w == 0) { + out = mb_convert_buf_add(out, 0); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_euctw); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } else { + unsigned int plane = s >> 16; + if (plane <= 1) { + if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else { + out = mb_convert_buf_add2(out, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add4(out, 0x8E, 0xA0 + plane, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 6ef1b35223f46c0a41be025462fcbe9ea8e9324e Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 10 Dec 2021 13:41:17 +0200 Subject: [PATCH 0327/1346] Implement fast text conversion interface for EUC-CN --- .../libmbfl/filters/mbfilter_euc_cn.c | 110 +++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c index 0465a814ff3d8..f179d602505a2 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c @@ -33,6 +33,8 @@ #include "unicode_table_cp936.h" static int mbfl_filt_conv_euccn_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_euccn_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_euccn(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_euccn[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -64,8 +66,8 @@ const mbfl_encoding mbfl_encoding_euc_cn = { 0, &vtbl_euccn_wchar, &vtbl_wchar_euccn, - NULL, - NULL + mb_euccn_to_wchar, + mb_wchar_to_euccn }; const struct mbfl_convert_vtbl vtbl_euccn_wchar = { @@ -216,3 +218,107 @@ static int mbfl_filt_conv_euccn_wchar_flush(mbfl_convert_filter *filter) return 0; } + +static size_t mb_euccn_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (((c >= 0xA1 && c <= 0xA9) || (c >= 0xB0 && c <= 0xF7)) && p < e) { + unsigned char c2 = *p++; + + if (c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int w = (c - 0x81)*192 + c2 - 0x40; + ZEND_ASSERT(w < cp936_ucs_table_size); + if (w == 0x1864) { + w = 0x30FB; + } else if (w == 0x186A) { + w = 0x2015; + } else if ((w >= 0x1921 && w <= 0x192A) || w == 0x1963 || (w >= 0x1C59 && w <= 0x1C7E) || (w >= 0x1DBB && w <= 0x1DC4)) { + w = 0; + } else { + w = cp936_ucs_table[w]; + } + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_euccn(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_cp936_table_min && w < ucs_a1_cp936_table_max) { + if (w != 0xB7 && w != 0x144 && w != 0x148 && w != 0x251 && w != 0x261) { + s = ucs_a1_cp936_table[w - ucs_a1_cp936_table_min]; + } + } else if (w >= ucs_a2_cp936_table_min && w < ucs_a2_cp936_table_max) { + if (w == 0x2015) { + s = 0xA1AA; + } else if (w != 0x2014 && (w < 0x2170 || w > 0x2179)) { + s = ucs_a2_cp936_table[w - ucs_a2_cp936_table_min]; + } + } else if (w >= ucs_a3_cp936_table_min && w < ucs_a3_cp936_table_max) { + if (w == 0x30FB) { + s = 0xA1A4; + } else { + s = ucs_a3_cp936_table[w - ucs_a3_cp936_table_min]; + } + } else if (w >= ucs_i_cp936_table_min && w < ucs_i_cp936_table_max) { + s = ucs_i_cp936_table[w - ucs_i_cp936_table_min]; + } else if (w >= ucs_hff_cp936_table_min && w < ucs_hff_cp936_table_max) { + if (w == 0xFF04) { + s = 0xA1E7; + } else if (w == 0xFF5E) { + s = 0xA1AB; + } else if (w >= 0xFF01 && w <= 0xFF5D) { + s = w - 0xFF01 + 0xA3A1; + } else if (w >= 0xFFE0 && w <= 0xFFE5) { + s = ucs_hff_s_cp936_table[w - 0xFFE0]; + } + } + + /* Exclude CP936 extensions */ + if (((s >> 8) & 0xFF) < 0xA1 || (s & 0xFF) < 0xA1) { + s = 0; + } + + if (!s) { + if (w < 0x80) { + out = mb_convert_buf_add(out, w); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_euccn); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } + } else if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else { + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From e5af94b74fbd8fa1c0bc3aad19114549f1ce1d31 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Fri, 10 Dec 2021 15:54:53 +0200 Subject: [PATCH 0328/1346] Implement fast text conversion interface for CP51932 --- .../libmbfl/filters/mbfilter_cp51932.c | 145 +++++++++++++++++- 1 file changed, 143 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c index 2f7193462e025..7d1a739f3369e 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp51932.c @@ -35,6 +35,8 @@ #include "cp932_table.h" static int mbfl_filt_conv_cp51932_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_cp51932_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_cp51932(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -66,8 +68,8 @@ const mbfl_encoding mbfl_encoding_cp51932 = { 0, &vtbl_cp51932_wchar, &vtbl_wchar_cp51932, - NULL, - NULL + mb_cp51932_to_wchar, + mb_wchar_to_cp51932 }; const struct mbfl_convert_vtbl vtbl_cp51932_wchar = { @@ -267,3 +269,142 @@ mbfl_filt_conv_wchar_cp51932(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_cp51932_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c >= 0xA1 && c <= 0xFE && p < e) { + unsigned char c2 = *p++; + if (c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int s = (c - 0xA1)*94 + c2 - 0xA1, w = 0; + + if (s <= 137) { + if (s == 31) { + w = 0xFF3C; /* FULLWIDTH REVERSE SOLIDUS */ + } else if (s == 32) { + w = 0xFF5E; /* FULLWIDTH TILDE */ + } else if (s == 33) { + w = 0x2225; /* PARALLEL TO */ + } else if (s == 60) { + w = 0xFF0D; /* FULLWIDTH HYPHEN-MINUS */ + } else if (s == 80) { + w = 0xFFE0; /* FULLWIDTH CENT SIGN */ + } else if (s == 81) { + w = 0xFFE1; /* FULLWIDTH POUND SIGN */ + } else if (s == 137) { + w = 0xFFE2; /* FULLWIDTH NOT SIGN */ + } + } + + if (w == 0) { + if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { + w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; + } else if (s < jisx0208_ucs_table_size) { + w = jisx0208_ucs_table[s]; + } else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { + w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min]; + } + } + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c == 0x8E && p < e) { + unsigned char c2 = *p++; + if (c2 >= 0xA1 && c2 <= 0xDF) { + *out++ = 0xFEC0 + c2; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_cp51932(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w == 0) { + out = mb_convert_buf_add(out, 0); + continue; + } else if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } + + if (s >= 0x8080) s = 0; /* We don't support JIS X0213 */ + + if (s == 0) { + if (w == 0xA5) { /* YEN SIGN */ + s = 0x216F; /* FULLWIDTH YEN SIGN */ + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else { + for (int i = 0; i < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; i++) { + if (cp932ext1_ucs_table[i] == w) { + s = ((i/94 + 0x2D) << 8) + (i%94) + 0x21; + goto found_it; + } + } + + for (int i = 0; i < cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; i++) { + if (cp932ext2_ucs_table[i] == w) { + s = ((i/94 + 0x79) << 8) + (i%94) + 0x21; + goto found_it; + } + } + } +found_it: ; + } + + if (!s || s >= 0x8080) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp51932); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } else if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else if (s < 0x100) { + out = mb_convert_buf_add2(out, 0x8E, s); + } else { + out = mb_convert_buf_add2(out, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 3e8088dc80f85355b4a336cc3ef7ebb662d2d073 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sat, 11 Dec 2021 23:19:10 +0200 Subject: [PATCH 0329/1346] Implement fast text conversion interface for EUC-JP-MS --- .../libmbfl/filters/mbfilter_euc_jp_win.c | 199 +++++++++++++++++- 1 file changed, 197 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c index 49e7f9dccd279..4845abda5c280 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c @@ -35,6 +35,8 @@ #include "cp932_table.h" static int mbfl_filt_conv_eucjpwin_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_eucjpwin_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_eucjpwin(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const unsigned char mblen_table_eucjp[] = { /* 0xA1-0xFE */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -66,8 +68,8 @@ const mbfl_encoding mbfl_encoding_eucjp_win = { 0, &vtbl_eucjpwin_wchar, &vtbl_wchar_eucjpwin, - NULL, - NULL + mb_eucjpwin_to_wchar, + mb_wchar_to_eucjpwin }; const struct mbfl_convert_vtbl vtbl_eucjpwin_wchar = { @@ -337,3 +339,196 @@ int mbfl_filt_conv_wchar_eucjpwin(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_eucjpwin_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c >= 0xA1 && c <= 0xFE && p < e) { + unsigned char c2 = *p++; + + if (c2 >= 0xA1 && c2 <= 0xFE) { + unsigned int s = (c - 0xA1)*94 + c2 - 0xA1, w = 0; + + if (s <= 137) { + if (s == 31) { + w = 0xFF3C; /* FULLWIDTH REVERSE SOLIDUS */ + } else if (s == 32) { + w = 0xFF5E; /* FULLWIDTH TILDE */ + } else if (s == 33) { + w = 0x2225; /* PARALLEL TO */ + } else if (s == 60) { + w = 0xFF0D; /* FULLWIDTH HYPHEN-MINUS */ + } else if (s == 80) { + w = 0xFFE0; /* FULLWIDTH CENT SIGN */ + } else if (s == 81) { + w = 0xFFE1; /* FULLWIDTH POUND SIGN */ + } else if (s == 137) { + w = 0xFFE2; /* FULLWIDTH NOT SIGN */ + } + } + + if (w == 0) { + if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { + w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; + } else if (s < jisx0208_ucs_table_size) { + w = jisx0208_ucs_table[s]; + } else if (s >= (84 * 94)) { + w = s - (84 * 94) + 0xE000; + } + } + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c == 0x8E && p < e) { + unsigned char c2 = *p++; + if (c2 >= 0xA1 && c2 <= 0xDF) { + *out++ = 0xFEC0 + c2; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c == 0x8F && p < e) { + unsigned char c2 = *p++; + if (p == e) { + *out++ = MBFL_BAD_INPUT; + continue; + } + unsigned char c3 = *p++; + + if (c2 >= 0xA1 && c2 <= 0xFE && c3 >= 0xA1 && c3 <= 0xFE) { + unsigned int s = (c2 - 0xA1)*94 + c3 - 0xA1, w = 0; + + if (s < jisx0212_ucs_table_size) { + w = jisx0212_ucs_table[s]; + if (w == 0x7E) + w = 0xFF5E; /* FULLWIDTH TILDE */ + } else if (s >= (82*94) && s < (84*94)) { + s = (c2 << 8) | c3; + for (int i = 0; i < cp932ext3_eucjp_table_size; i++) { + if (cp932ext3_eucjp_table[i] == s) { + w = cp932ext3_ucs_table[i]; + break; + } + } + } else if (s >= (84*94)) { + w = s - (84*94) + 0xE000 + (94*10); + } + + if (w == 0xA6) + w = 0xFFE4; /* FULLWIDTH BROKEN BAR */ + + if (!w) + w = MBFL_BAD_INPUT; + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_eucjpwin(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w == 0) { + out = mb_convert_buf_add(out, 0); + continue; + } else if (w == 0xAF) { /* U+00AF is MACRON */ + s = 0xA2B4; /* Use JIS X 0212 overline */ + } else if (w == 0x203E) { + s = 0x7E; + } else if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } else if (w >= 0xE000 && w < (0xE000 + 10*94)) { + s = w - 0xE000; + s = ((s/94 + 0x75) << 8) + (s%94) + 0x21; + } else if (w >= (0xE000 + 10*94) && w < (0xE000 + 20*94)) { + s = w - (0xE000 + 10*94); + s = ((s/94 + 0xF5) << 8) + (s%94) + 0xA1; + } + + if (s == 0xA2F1) + s = 0x2D62; /* NUMERO SIGN */ + + if (s == 0) { + if (w == 0xA5) { /* YEN SIGN */ + s = 0x5C; + } else if (w == 0x2014) { /* EM DASH */ + s = 0x213D; + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else { + for (int i = 0; i < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; i++) { + if (cp932ext1_ucs_table[i] == w) { + s = (((i/94) + (cp932ext1_ucs_table_min/94) + 0x21) << 8) + (i%94) + 0x21; + break; + } + } + + if (!s) { + for (int i = 0; i < cp932ext3_ucs_table_max - cp932ext3_ucs_table_min; i++) { + if (cp932ext3_ucs_table[i] == w) { + s = cp932ext3_eucjp_table[i]; + break; + } + } + } + } + } + + if (!s) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_eucjpwin); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + } else if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else if (s < 0x100) { + out = mb_convert_buf_add2(out, 0x8E, s); + } else if (s < 0x8080) { + out = mb_convert_buf_add2(out, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 3); + out = mb_convert_buf_add3(out, 0x8F, ((s >> 8) & 0xFF) | 0x80, (s & 0xFF) | 0x80); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From cb4626c5b212e80c3fa5e3a55b7673285458df41 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Sun, 12 Dec 2021 15:56:57 +0200 Subject: [PATCH 0330/1346] Implement fast text conversion interface for GB18030 --- .../libmbfl/filters/mbfilter_gb18030.c | 232 +++++++++++++++++- 1 file changed, 230 insertions(+), 2 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c index 00494daf358f0..b86b8315a560f 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_gb18030.c @@ -34,6 +34,8 @@ #include "unicode_table_gb18030.h" static int mbfl_filt_conv_gb18030_wchar_flush(mbfl_convert_filter *filter); +static size_t mb_gb18030_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_gb18030(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); static const char *mbfl_encoding_gb18030_aliases[] = {"gb-18030", "gb-18030-2000", NULL}; @@ -46,8 +48,8 @@ const mbfl_encoding mbfl_encoding_gb18030 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_gb18030_wchar, &vtbl_wchar_gb18030, - NULL, - NULL + mb_gb18030_to_wchar, + mb_wchar_to_gb18030 }; const struct mbfl_convert_vtbl vtbl_gb18030_wchar = { @@ -382,3 +384,229 @@ int mbfl_filt_conv_wchar_gb18030(int c, mbfl_convert_filter *filter) return 0; } + +static size_t mb_gb18030_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c < 0x80) { + *out++ = c; + } else if (c > 0x80 && c < 0xFF && p < e) { + unsigned char c2 = *p++; + unsigned int s = (c << 8) | c2; + + if (((c >= 0x81 && c <= 0x84) || (c >= 0x90 && c <= 0xE3)) && c2 >= 0x30 && c2 <= 0x39) { + if (p >= e) { + *out++ = MBFL_BAD_INPUT; + break; + } + unsigned char c3 = *p++; + + if (c3 >= 0x81 && c3 <= 0xFE && p < e) { + unsigned char c4 = *p++; + + if (c4 >= 0x30 && c4 <= 0x39) { + if (c >= 0x90 && c <= 0xE3) { + unsigned int w = ((((c - 0x90)*10 + (c2 - 0x30))*126 + (c3 - 0x81)))*10 + (c4 - 0x30) + 0x10000; + *out++ = (w > 0x10FFFF) ? MBFL_BAD_INPUT : w; + } else { + /* Unicode BMP */ + unsigned int w = (((c - 0x81)*10 + (c2 - 0x30))*126 + (c3 - 0x81))*10 + (c4 - 0x30); + if (w <= 39419) { + *out++ = w + mbfl_gb_uni_ofst[mbfl_bisec_srch(w, mbfl_gb2uni_tbl, mbfl_gb_uni_max)]; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (((c >= 0xAA && c <= 0xAF) || (c >= 0xF8 && c <= 0xFE)) && (c2 >= 0xA1 && c2 <= 0xFE)) { + /* UDA part 1, 2: U+E000-U+E4C5 */ + *out++ = 94*(c >= 0xF8 ? c - 0xF2 : c - 0xAA) + (c2 - 0xA1) + 0xE000; + } else if (c >= 0xA1 && c <= 0xA7 && c2 >= 0x40 && c2 < 0xA1 && c2 != 0x7F) { + /* UDA part 3: U+E4C6-U+E765 */ + *out++ = 96*(c - 0xA1) + c2 - (c2 >= 0x80 ? 0x41 : 0x40) + 0xE4C6; + } else { + if ((s >= 0xA2AB && s <= 0xA9FE) || (s >= 0xD7FA && s <= 0xD7FE) || (s >= 0xFE50 && s <= 0xFEA0)) { + for (int i = 0; i < mbfl_gb18030_pua_tbl_max; i++) { + if (s >= mbfl_gb18030_pua_tbl[i][2] && s <= mbfl_gb18030_pua_tbl[i][2] + mbfl_gb18030_pua_tbl[i][1] - mbfl_gb18030_pua_tbl[i][0]) { + *out++ = s - mbfl_gb18030_pua_tbl[i][2] + mbfl_gb18030_pua_tbl[i][0]; + goto next_iteration; + } + } + } + + if ((c >= 0xA1 && c <= 0xA9 && c2 >= 0xA1 && c2 <= 0xFE) || + (c >= 0xB0 && c <= 0xf7 && c2 >= 0xa1 && c2 <= 0xfe) || + (c >= 0x81 && c <= 0xa0 && c2 >= 0x40 && c2 <= 0xfe && c2 != 0x7f) || + (c >= 0xAA && c <= 0xfe && c2 >= 0x40 && c2 <= 0xa0 && c2 != 0x7f) || + (c >= 0xA8 && c <= 0xa9 && c2 >= 0x40 && c2 <= 0xa0 && c2 != 0x7F)) { + unsigned int w = (c - 0x81)*192 + c2 - 0x40; + ZEND_ASSERT(w < cp936_ucs_table_size); + *out++ = cp936_ucs_table[w]; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + } else { + *out++ = MBFL_BAD_INPUT; + } +next_iteration: ; + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static void mb_wchar_to_gb18030(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w == 0) { + out = mb_convert_buf_add(out, 0); + continue; + } else if (w >= ucs_a1_cp936_table_min && w < ucs_a1_cp936_table_max) { + if (w == 0x1F9) { + s = 0xA8Bf; + } else { + s = ucs_a1_cp936_table[w - ucs_a1_cp936_table_min]; + } + } else if (w >= ucs_a2_cp936_table_min && w < ucs_a2_cp936_table_max) { + if (w == 0x20AC) { /* Euro sign */ + s = 0xA2E3; + } else { + s = ucs_a2_cp936_table[w - ucs_a2_cp936_table_min]; + } + } else if (w >= ucs_a3_cp936_table_min && w < ucs_a3_cp936_table_max) { + s = ucs_a3_cp936_table[w - ucs_a3_cp936_table_min]; + } else if (w >= ucs_i_cp936_table_min && w < ucs_i_cp936_table_max) { + s = ucs_i_cp936_table[w - ucs_i_cp936_table_min]; + } else if (w >= ucs_ci_cp936_table_min && w < ucs_ci_cp936_table_max) { + /* U+F900-U+FA2F CJK Compatibility Ideographs */ + if (w == 0xF92C) { + s = 0xFD9C; + } else if (w == 0xF979) { + s = 0xFD9D; + } else if (w == 0xF995) { + s = 0xFD9E; + } else if (w == 0xF9E7) { + s = 0xFD9F; + } else if (w == 0xF9F1) { + s = 0xFDA0; + } else if (w >= 0xFA0C && w <= 0xFA29) { + s = ucs_ci_s_cp936_table[w - 0xFA0C]; + } + } else if (w >= ucs_cf_cp936_table_min && w < ucs_cf_cp936_table_max) { + /* CJK Compatibility Forms */ + s = ucs_cf_cp936_table[w - ucs_cf_cp936_table_min]; + } else if (w >= ucs_sfv_cp936_table_min && w < ucs_sfv_cp936_table_max) { + /* U+FE50-U+FE6F Small Form Variants */ + s = ucs_sfv_cp936_table[w - ucs_sfv_cp936_table_min]; + } else if (w >= ucs_hff_cp936_table_min && w < ucs_hff_cp936_table_max) { + /* U+FF00-U+FFFF HW/FW Forms */ + if (w == 0xFF04) { + s = 0xA1E7; + } else if (w == 0xFF5E) { + s = 0xA1AB; + } else if (w >= 0xFF01 && w <= 0xFF5D) { + s = w - 0xFF01 + 0xA3A1; + } else if (w >= 0xFFE0 && w <= 0xFFE5) { + s = ucs_hff_s_cp936_table[w - 0xFFE0]; + } + } else if (w >= 0xE000 && w <= 0xE864) { + /* PUA */ + if (w < 0xE766) { + if (w < 0xE4C6) { + unsigned int c1 = w - 0xE000; + s = (c1 % 94) + 0xA1; + c1 /= 94; + s |= (c1 + (c1 < 0x06 ? 0xAA : 0xF2)) << 8; + } else { + unsigned int c1 = w - 0xE4C6; + s = ((c1 / 96) + 0xA1) << 8; + c1 %= 96; + s |= c1 + (c1 >= 0x3F ? 0x41 : 0x40); + } + } else { + /* U+E766-U+E864 */ + unsigned int k1 = 0, k2 = mbfl_gb18030_pua_tbl_max; + while (k1 < k2) { + unsigned int k = (k1 + k2) >> 1; + if (w < mbfl_gb18030_pua_tbl[k][0]) { + k2 = k; + } else if (w > mbfl_gb18030_pua_tbl[k][1]) { + k1 = k + 1; + } else { + s = w - mbfl_gb18030_pua_tbl[k][0] + mbfl_gb18030_pua_tbl[k][2]; + break; + } + } + } + } + + /* While GB18030 and CP936 are very similar, some mappings are different between these encodings; + * do a binary search in a table of differing codepoints to see if we have one */ + if (!s && w >= mbfl_gb18030_c_tbl_key[0] && w <= mbfl_gb18030_c_tbl_key[mbfl_gb18030_c_tbl_max-1]) { + int i = mbfl_bisec_srch2(w, mbfl_gb18030_c_tbl_key, mbfl_gb18030_c_tbl_max); + if (i >= 0) { + s = mbfl_gb18030_c_tbl_val[i]; + } + } + + /* If we have not yet found a suitable mapping for this codepoint, it requires a 4-byte code */ + if (!s && w >= 0x80 && w <= 0xFFFF) { + /* BMP */ + int i = mbfl_bisec_srch(w, mbfl_uni2gb_tbl, mbfl_gb_uni_max); + if (i >= 0) { + unsigned int c1 = w - mbfl_gb_uni_ofst[i]; + s = (c1 % 10) + 0x30; + c1 /= 10; + s |= ((c1 % 126) + 0x81) << 8; + c1 /= 126; + s |= ((c1 % 10) + 0x30) << 16; + c1 /= 10; + s |= (c1 + 0x81) << 24; + } + } else if (w >= 0x10000 && w <= 0x10FFFF) { + /* Code set 3: Unicode U+10000-U+10FFFF */ + unsigned int c1 = w - 0x10000; + s = (c1 % 10) + 0x30; + c1 /= 10; + s |= ((c1 % 126) + 0x81) << 8; + c1 /= 126; + s |= ((c1 % 10) + 0x30) << 16; + c1 /= 10; + s |= (c1 + 0x90) << 24; + } + + if (!s) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_gb18030); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + } else if (s < 0x80) { + out = mb_convert_buf_add(out, s); + } else if (s > 0xFFFFFF) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + out = mb_convert_buf_add4(out, (s >> 24) & 0xFF, (s >> 16) & 0xFF, (s >> 8) & 0xFF, s & 0xFF); + } else { + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 01afd9f14169b66bc936bae3761b568fad109204 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Mon, 13 Dec 2021 15:41:25 +0200 Subject: [PATCH 0331/1346] Implement fast text conversion interface for JIS --- ext/mbstring/libmbfl/filters/mbfilter_jis.c | 86 ++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_jis.c b/ext/mbstring/libmbfl/filters/mbfilter_jis.c index b175743a4afbe..3b7f1f8586fa0 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_jis.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_jis.c @@ -36,6 +36,7 @@ static int mbfl_filt_conv_jis_wchar_flush(mbfl_convert_filter *filter); static size_t mb_iso2022jp_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); static void mb_wchar_to_iso2022jp(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static void mb_wchar_to_jis(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); const mbfl_encoding mbfl_encoding_jis = { mbfl_no_encoding_jis, @@ -47,7 +48,7 @@ const mbfl_encoding mbfl_encoding_jis = { &vtbl_jis_wchar, &vtbl_wchar_jis, mb_iso2022jp_to_wchar, - NULL + mb_wchar_to_jis, }; const mbfl_encoding mbfl_encoding_2022jp = { @@ -667,3 +668,86 @@ static void mb_wchar_to_iso2022jp(uint32_t *in, size_t len, mb_convert_buf *buf, MB_CONVERT_BUF_STORE(buf, out, limit); } + +static void mb_wchar_to_jis(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + + while (len--) { + uint32_t w = *in++; + unsigned int s = 0; + + if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w == 0x203E) { /* OVERLINE */ + s = 0x1007E; /* Convert to JISX 0201 OVERLINE */ + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } + + if (s == 0) { + if (w == 0xA5) { /* YEN SIGN */ + s = 0x1005C; + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else if (w != 0) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_iso2022jp); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len * 2); + continue; + } + } + + if (s < 0x80) { /* ASCII */ + if (buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + buf->state = ASCII; + } + out = mb_convert_buf_add(out, s); + } else if (s < 0x8080) { /* JIS X 0208 */ + if (buf->state != JISX_0208) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 5); + out = mb_convert_buf_add3(out, 0x1B, '$', 'B'); + buf->state = JISX_0208; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0x7F, s & 0x7F); + } else if (s < 0x10000) { /* JIS X 0212 */ + if (buf->state != JISX_0212) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 6); + out = mb_convert_buf_add4(out, 0x1B, '$', '(', 'D'); + buf->state = JISX_0212; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0x7F, s & 0x7F); + } else { /* X 0201 Latin */ + if (buf->state != JISX_0201_LATIN) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, (len * 2) + 4); + out = mb_convert_buf_add3(out, 0x1B, '(', 'J'); + buf->state = JISX_0201_LATIN; + } + out = mb_convert_buf_add(out, s & 0x7F); + } + } + + if (end && buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 3); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} From 53ffba967cc517315e2b102f601c35998db7d615 Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Mon, 20 Dec 2021 22:03:02 +0200 Subject: [PATCH 0332/1346] Implement fast text conversion interface for CP5022{0,1,2} --- .../libmbfl/filters/mbfilter_cp5022x.c | 413 +++++++++++++++++- ext/mbstring/tests/cp5022x_encoding.phpt | 5 + 2 files changed, 412 insertions(+), 6 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c index a67b538bb4311..18686e8bf1ed1 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c @@ -35,6 +35,10 @@ static int mbfl_filt_conv_cp5022x_wchar_flush(mbfl_convert_filter *filter); static int mbfl_filt_conv_wchar_cp50220_flush(mbfl_convert_filter *filter); static int mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter); static int mbfl_filt_conv_wchar_cp50220(int c, mbfl_convert_filter *filter); +static size_t mb_cp5022x_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state); +static void mb_wchar_to_cp50220(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static void mb_wchar_to_cp50221(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); +static void mb_wchar_to_cp50222(uint32_t *in, size_t len, mb_convert_buf *buf, bool end); /* Previously, a dubious 'encoding' called 'cp50220raw' was supported * This was just CP50220, but the implementation was less strict regarding @@ -56,8 +60,8 @@ const mbfl_encoding mbfl_encoding_cp50220 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50220_wchar, &vtbl_wchar_cp50220, - NULL, - NULL + mb_cp5022x_to_wchar, + mb_wchar_to_cp50220 }; const mbfl_encoding mbfl_encoding_cp50221 = { @@ -69,8 +73,8 @@ const mbfl_encoding mbfl_encoding_cp50221 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50221_wchar, &vtbl_wchar_cp50221, - NULL, - NULL + mb_cp5022x_to_wchar, + mb_wchar_to_cp50221 }; const mbfl_encoding mbfl_encoding_cp50222 = { @@ -82,8 +86,8 @@ const mbfl_encoding mbfl_encoding_cp50222 = { MBFL_ENCTYPE_GL_UNSAFE, &vtbl_cp50222_wchar, &vtbl_wchar_cp50222, - NULL, - NULL + mb_cp5022x_to_wchar, + mb_wchar_to_cp50222 }; const struct mbfl_convert_vtbl vtbl_cp50220_wchar = { @@ -627,3 +631,400 @@ static int mbfl_filt_conv_wchar_cp50222_flush(mbfl_convert_filter *filter) return 0; } + +#define ASCII 0 +#define JISX_0201_LATIN 1 +#define JISX_0201_KANA 2 +#define JISX_0208 3 +#define JISX_0212 4 + +static size_t mb_cp5022x_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf, size_t bufsize, unsigned int *state) +{ + unsigned char *p = *in, *e = p + *in_len; + uint32_t *out = buf, *limit = buf + bufsize; + + while (p < e && out < limit) { + unsigned char c = *p++; + + if (c == 0x1B) { + /* Escape sequence */ + if ((e - p) < 2) { + *out++ = MBFL_BAD_INPUT; + /* Duplicate error-handling behavior of legacy code */ + if (p < e && (*p == '(' || *p == '$')) + p++; + continue; + } + unsigned char c2 = *p++; + if (c2 == '$') { + unsigned char c3 = *p++; + if (c3 == '@' || c3 == 'B') { + *state = JISX_0208; + } else if (c3 == '(') { + if (p == e) { + *out++ = MBFL_BAD_INPUT; + break; + } + unsigned char c4 = *p++; + if (c4 == '@' || c4 == 'B') { + *state = JISX_0208; + } else if (c4 == 'D') { + *state = JISX_0212; + } else { + if ((limit - out) < 3) { + p -= 4; + break; + } + *out++ = MBFL_BAD_INPUT; + *out++ = '$'; + *out++ = '('; + p--; + } + } else { + if ((limit - out) < 2) { + p -= 3; + break; + } + *out++ = MBFL_BAD_INPUT; + *out++ = '$'; + p--; + } + } else if (c2 == '(') { + unsigned char c3 = *p++; + if (c3 == 'B' || c3 == 'H') { + *state = ASCII; + } else if (c3 == 'J') { + *state = JISX_0201_LATIN; + } else if (c3 == 'I') { + *state = JISX_0201_KANA; + } else { + if ((limit - out) < 2) { + p -= 3; + break; + } + *out++ = MBFL_BAD_INPUT; + *out++ = '('; + p--; + } + } else { + *out++ = MBFL_BAD_INPUT; + p--; + } + } else if (c == 0xE) { + *state = JISX_0201_KANA; + } else if (c == 0xF) { + *state = ASCII; + } else if (*state == JISX_0201_LATIN && c == 0x5C) { /* YEN SIGN */ + *out++ = 0xA5; + } else if (*state == JISX_0201_LATIN && c == 0x7E) { /* OVER LINE */ + *out++ = 0x203E; + } else if (*state == JISX_0201_KANA && c > 0x20 && c < 0x60) { + *out++ = 0xFF40 + c; + } else if (*state >= JISX_0208 && c > 0x20 && c <= 0x97) { + if (p == e) { + *out++ = MBFL_BAD_INPUT; + break; + } + unsigned char c2 = *p++; + if (c2 > 0x20 && c2 < 0x7F) { + unsigned int s = (c - 0x21)*94 + c2 - 0x21; + uint32_t w = 0; + if (*state == JISX_0208) { + if (s >= cp932ext1_ucs_table_min && s < cp932ext1_ucs_table_max) { + w = cp932ext1_ucs_table[s - cp932ext1_ucs_table_min]; + } else if (s < jisx0208_ucs_table_size) { + w = jisx0208_ucs_table[s]; + } else if (s >= cp932ext2_ucs_table_min && s < cp932ext2_ucs_table_max) { + w = cp932ext2_ucs_table[s - cp932ext2_ucs_table_min]; + } else if (s >= cp932ext3_ucs_table_min && s < cp932ext3_ucs_table_max) { + w = cp932ext3_ucs_table[s - cp932ext3_ucs_table_min]; + } else if (s >= 94*94 && s < 114*94) { + /* MicroSoft extension */ + w = s - 94*94 + 0xE000; + } + if (!w) + w = MBFL_BAD_INPUT; + } else { + if (s < jisx0212_ucs_table_size) { + w = jisx0212_ucs_table[s]; + } + if (!w) + w = MBFL_BAD_INPUT; + } + *out++ = w; + } else { + *out++ = MBFL_BAD_INPUT; + } + } else if (c < 0x80) { + *out++ = c; + } else if (c >= 0xA1 && c <= 0xDF) { + *out++ = 0xFEC0 + c; + } else { + *out++ = MBFL_BAD_INPUT; + } + } + + *in_len = e - p; + *in = p; + return out - buf; +} + +static unsigned int lookup_wchar(uint32_t w) +{ + unsigned int s = 0; + + if (w >= ucs_a1_jis_table_min && w < ucs_a1_jis_table_max) { + s = ucs_a1_jis_table[w - ucs_a1_jis_table_min]; + } else if (w == 0x203E) { /* OVERLINE */ + s = 0x1007E; /* Convert to JISX 0201 OVERLINE */ + } else if (w >= ucs_a2_jis_table_min && w < ucs_a2_jis_table_max) { + s = ucs_a2_jis_table[w - ucs_a2_jis_table_min]; + } else if (w >= ucs_i_jis_table_min && w < ucs_i_jis_table_max) { + s = ucs_i_jis_table[w - ucs_i_jis_table_min]; + } else if (w >= ucs_r_jis_table_min && w < ucs_r_jis_table_max) { + s = ucs_r_jis_table[w - ucs_r_jis_table_min]; + } else if (w >= 0xE000 && w <= 0xE757) { + /* Private Use Area codepoints */ + s = w - 0xE000; + s = ((s / 94) + 0x7F) << 8 | ((s % 94) + 0x21); + } + + if (!s) { + if (w == 0xA5) { /* YEN SIGN */ + s = 0x1005C; + } else if (w == 0xFF3C) { /* FULLWIDTH REVERSE SOLIDUS */ + s = 0x2140; + } else if (w == 0x2225) { /* PARALLEL TO */ + s = 0x2142; + } else if (w == 0xFF0D) { /* FULLWIDTH HYPHEN-MINUS */ + s = 0x215D; + } else if (w == 0xFFE0) { /* FULLWIDTH CENT SIGN */ + s = 0x2171; + } else if (w == 0xFFE1) { /* FULLWIDTH POUND SIGN */ + s = 0x2172; + } else if (w == 0xFFE2) { /* FULLWIDTH NOT SIGN */ + s = 0x224C; + } else if (w == 0) { + return 0; + } + } + + /* Above, we do a series of lookups in `ucs_*_jis_table` to find a + * corresponding kuten code for this Unicode codepoint + * If we get zero, that means the codepoint is not in JIS X 0208 + * On the other hand, if we get a result with the high bits set on both + * upper and lower bytes, that is not a code in JIS X 0208 but rather + * in JIS X 0213 + * In either case, check if this codepoint is one of the extensions added + * to JIS X 0208 by MicroSoft (to make CP932) */ + if (!s || s >= 0x8080) { + for (int i = 0; i < cp932ext1_ucs_table_max - cp932ext1_ucs_table_min; i++) { + if (w == cp932ext1_ucs_table[i]) { + return (((i / 94) + (cp932ext1_ucs_table_min / 94) + 0x21) << 8) + (i % 94) + 0x21; + } + } + + for (int i = 0; i < cp932ext2_ucs_table_max - cp932ext2_ucs_table_min; i++) { + if (w == cp932ext2_ucs_table[i]) { + return (((i / 94) + (cp932ext2_ucs_table_min / 94) + 0x21) << 8) + (i % 94) + 0x21; + } + } + } + + return s; +} + +static void mb_wchar_to_cp50220(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + bool consumed = false; + + while (len--) { + uint32_t w = *in++; + + w = mbfl_convert_kana(w, len ? *in : 0, &consumed, NULL, MBFL_HAN2ZEN_KATAKANA | MBFL_HAN2ZEN_GLUE); + + if (consumed) { + /* Two successive codepoints were converted into one */ + in++; len--; consumed = false; + } + + unsigned int s = lookup_wchar(w); + + if (!s && w) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp50221); + } else if (s < 0x80) { + /* ASCII */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state != ASCII) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + buf->state = ASCII; + } + out = mb_convert_buf_add(out, s); + } else if (s >= 0xA0 && s < 0xE0) { + /* JISX 0201 Kana */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state != JISX_0201_KANA) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'I'); + buf->state = JISX_0201_KANA; + } + out = mb_convert_buf_add(out, s - 0x80); + } else if (s <= 0x927E) { + /* JISX 0208 Kanji */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 5); + if (buf->state != JISX_0208) { + out = mb_convert_buf_add3(out, 0x1B, '$', 'B'); + buf->state = JISX_0208; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } else if (s >= 0x10000) { + /* JISX 0201 Latin; we 'tag' these by adding 0x10000 */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state != JISX_0201_LATIN) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'J'); + buf->state = JISX_0201_LATIN; + } + out = mb_convert_buf_add(out, s & 0x7F); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp50221); + } + } + + if (end && buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 3); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + +static void mb_wchar_to_cp50221(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = lookup_wchar(w); + + if (!s && w) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp50221); + } else if (s < 0x80) { + /* ASCII */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state != ASCII) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + buf->state = ASCII; + } + out = mb_convert_buf_add(out, s); + } else if (s >= 0xA0 && s < 0xE0) { + /* JISX 0201 Kana */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state != JISX_0201_KANA) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'I'); + buf->state = JISX_0201_KANA; + } + out = mb_convert_buf_add(out, s - 0x80); + } else if (s <= 0x927E) { + /* JISX 0208 Kanji */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 5); + if (buf->state != JISX_0208) { + out = mb_convert_buf_add3(out, 0x1B, '$', 'B'); + buf->state = JISX_0208; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } else if (s >= 0x10000) { + /* JISX 0201 Latin; we 'tag' these by adding 0x10000 */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state != JISX_0201_LATIN) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'J'); + buf->state = JISX_0201_LATIN; + } + out = mb_convert_buf_add(out, s & 0x7F); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp50221); + } + } + + if (end && buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 3); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} + +static void mb_wchar_to_cp50222(uint32_t *in, size_t len, mb_convert_buf *buf, bool end) +{ + unsigned char *out, *limit; + MB_CONVERT_BUF_LOAD(buf, out, limit); + MB_CONVERT_BUF_ENSURE(buf, out, limit, len); + + while (len--) { + uint32_t w = *in++; + unsigned int s = lookup_wchar(w); + + if (!s && w) { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp50222); + } else if (s < 0x80) { + /* ASCII */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state == JISX_0201_KANA) { + out = mb_convert_buf_add(out, 0xF); + buf->state = ASCII; + } else if (buf->state != ASCII) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + buf->state = ASCII; + } + out = mb_convert_buf_add(out, s); + } else if (s >= 0xA0 && s < 0xE0) { + /* JISX 0201 Kana */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 2); + if (buf->state != JISX_0201_KANA) { + out = mb_convert_buf_add(out, 0xE); + buf->state = JISX_0201_KANA; + } + out = mb_convert_buf_add(out, s - 0x80); + } else if (s <= 0x927E) { + /* JISX 0208 Kanji */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 5); + if (buf->state == JISX_0201_KANA) { + out = mb_convert_buf_add(out, 0xF); + } + if (buf->state != JISX_0208) { + out = mb_convert_buf_add3(out, 0x1B, '$', 'B'); + buf->state = JISX_0208; + } + out = mb_convert_buf_add2(out, (s >> 8) & 0xFF, s & 0xFF); + } else if (s >= 0x10000) { + /* JISX 0201 Latin; we 'tag' these by adding 0x10000 */ + MB_CONVERT_BUF_ENSURE(buf, out, limit, len + 4); + if (buf->state == JISX_0201_KANA) { + out = mb_convert_buf_add(out, 0xF); + } + if (buf->state != JISX_0201_LATIN) { + out = mb_convert_buf_add3(out, 0x1B, '(', 'J'); + buf->state = JISX_0201_LATIN; + } + out = mb_convert_buf_add(out, s & 0x7F); + } else { + MB_CONVERT_ERROR(buf, out, limit, w, mb_wchar_to_cp50222); + } + } + + if (end) { + if (buf->state == JISX_0201_KANA) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 1); + out = mb_convert_buf_add(out, 0xF); + } else if (buf->state != ASCII) { + MB_CONVERT_BUF_ENSURE(buf, out, limit, 3); + out = mb_convert_buf_add3(out, 0x1B, '(', 'B'); + } + } + + MB_CONVERT_BUF_STORE(buf, out, limit); +} diff --git a/ext/mbstring/tests/cp5022x_encoding.phpt b/ext/mbstring/tests/cp5022x_encoding.phpt index 11a4855462a84..cde33e85cc670 100644 --- a/ext/mbstring/tests/cp5022x_encoding.phpt +++ b/ext/mbstring/tests/cp5022x_encoding.phpt @@ -365,6 +365,11 @@ foreach (['CP50220', 'CP50221', 'CP50222'] as $encoding) { } echo "Invalid escape sequences OK\n"; + +// Regression test +if (mb_convert_encoding("\x1BC\xF5", 'UTF-16BE', 'CP50221') !== "\x00%\x00C\x00%") + die("Bad") + ?> --EXPECT-- ASCII support OK From 2759e6bc699f1a0fee132e70adc64fbd9295ec03 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 27 Dec 2021 12:02:13 +0300 Subject: [PATCH 0333/1346] Fixed assertion when check "instanceof" on unlinked class --- Zend/Optimizer/zend_inference.c | 13 ++++++++++++- ext/opcache/tests/opt/inference_003.phpt | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/opt/inference_003.phpt diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 80b01a6db26ac..bf70a2f66cc6a 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3630,6 +3630,17 @@ static zend_class_entry *join_class_entries( return ce1; } +static bool safe_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) { + if (ce1 == ce2) { + return 1; + } + if (!(ce1->ce_flags & ZEND_ACC_LINKED)) { + /* This case could be generalized, similarly to unlinked_instanceof */ + return 0; + } + return instanceof_function(ce1, ce2); +} + static zend_result zend_infer_types_ex(const zend_op_array *op_array, const zend_script *script, zend_ssa *ssa, zend_bitset worklist, zend_long optimization_level) { zend_basic_block *blocks = ssa->cfg.blocks; @@ -3661,7 +3672,7 @@ static zend_result zend_infer_types_ex(const zend_op_array *op_array, const zend if (!ce) { ce = constraint->ce; is_instanceof = 1; - } else if (is_instanceof && instanceof_function(constraint->ce, ce)) { + } else if (is_instanceof && safe_instanceof(constraint->ce, ce)) { ce = constraint->ce; } else { /* Ignore the constraint (either ce instanceof constraint->ce or diff --git a/ext/opcache/tests/opt/inference_003.phpt b/ext/opcache/tests/opt/inference_003.phpt new file mode 100644 index 0000000000000..046396f212532 --- /dev/null +++ b/ext/opcache/tests/opt/inference_003.phpt @@ -0,0 +1,20 @@ +--TEST-- +Type inference 003: instanceof with unlinked class +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- +getMessage()); + } +} +?> +--EXPECTF-- +Fatal error: Uncaught Error: Interface "I" not found in %sinference_003.php:2 +Stack trace: +#0 {main} + thrown in %sinference_003.php on line 2 + From a066b809de7a18c8b35cbe798747f70d63c50ea8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 27 Dec 2021 15:28:46 +0300 Subject: [PATCH 0334/1346] Skip abstract methods --- Zend/Optimizer/zend_optimizer.c | 1 + ext/opcache/zend_persist.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 9048f0c045109..0a4111fa4fd33 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -1415,6 +1415,7 @@ void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->scope == ce && op_array->type == ZEND_USER_FUNCTION + && !(op_array->fn_flags & ZEND_ACC_ABSTRACT) && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { zend_foreach_op_array_helper(op_array, func, context); } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index a572f5e3be87e..2ccfff3d04321 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -1262,6 +1262,7 @@ static void zend_accel_persist_class_table(HashTable *class_table) ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { if (op_array->type == ZEND_USER_FUNCTION) { if (op_array->scope == ce + && !(op_array->fn_flags & ZEND_ACC_ABSTRACT) && !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { zend_jit_op_array(op_array, ZCG(current_persistent_script) ? &ZCG(current_persistent_script)->script : NULL); for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) { @@ -1276,7 +1277,8 @@ static void zend_accel_persist_class_table(HashTable *class_table) if (EXPECTED(Z_TYPE(p->val) != IS_ALIAS_PTR)) { ce = Z_PTR(p->val); ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) { - if (op_array->type == ZEND_USER_FUNCTION) { + if (op_array->type == ZEND_USER_FUNCTION + && !(op_array->fn_flags & ZEND_ACC_ABSTRACT)) { if ((op_array->scope != ce || (op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) && (JIT_G(trigger) == ZEND_JIT_ON_FIRST_EXEC From 71b55d7dd8aae6d5c75dfe19abfae29a4746d334 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 27 Dec 2021 15:17:16 +0100 Subject: [PATCH 0335/1346] [ci skip] supportedOs Id for Windows 10 and 11 are the same Cf. . --- win32/build/default.manifest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win32/build/default.manifest b/win32/build/default.manifest index aa5da5c4d08c4..a73c2fb53d3ab 100644 --- a/win32/build/default.manifest +++ b/win32/build/default.manifest @@ -15,7 +15,7 @@ - + From eb43f8a4f81ddd94f9e30f1274f71c5c74869646 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 27 Dec 2021 23:40:21 +0300 Subject: [PATCH 0336/1346] Eliminate more VERIFY_RETURN_TYPE instructions --- Zend/Optimizer/dfa_pass.c | 54 +++++++++++++++++++++++++++------------ Zend/Optimizer/zend_ssa.c | 40 +++++++++++++++++++++++++++++ Zend/Optimizer/zend_ssa.h | 1 + 3 files changed, 79 insertions(+), 16 deletions(-) diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 0218a77d3f950..114a1b8ce243a 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -1293,30 +1293,52 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx } else if (opline->opcode == ZEND_VERIFY_RETURN_TYPE && opline->op1_type != IS_CONST && ssa->ops[op_1].op1_def == v - && ssa->ops[op_1].op1_use >= 0 - && ssa->ops[op_1].op1_use_chain == -1 - && can_elide_return_type_check(ctx->script, op_array, ssa, &ssa->ops[op_1])) { + && ssa->ops[op_1].op1_use >= 0) { + int orig_var = ssa->ops[op_1].op1_use; + int ret = ssa->vars[v].use_chain; + + if (ssa->ops[op_1].op1_use_chain == -1 + && can_elide_return_type_check(ctx->script, op_array, ssa, &ssa->ops[op_1])) { // op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP - int orig_var = ssa->ops[op_1].op1_use; - zend_ssa_unlink_use_chain(ssa, op_1, orig_var); + zend_ssa_unlink_use_chain(ssa, op_1, orig_var); + + if (ret >= 0) { + ssa->ops[ret].op1_use = orig_var; + ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; + ssa->vars[orig_var].use_chain = ret; + } + + ssa->vars[v].definition = -1; + ssa->vars[v].use_chain = -1; + + ssa->ops[op_1].op1_def = -1; + ssa->ops[op_1].op1_use = -1; + + MAKE_NOP(opline); + remove_nops = 1; + } else if (ret >= 0 + && ssa->ops[ret].op1_use == v + && ssa->ops[ret].op1_use_chain == -1 + && can_elide_return_type_check(ctx->script, op_array, ssa, &ssa->ops[op_1])) { + +// op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP + + zend_ssa_replace_use_chain(ssa, op_1, ret, orig_var); - int ret = ssa->vars[v].use_chain; - if (ret >= 0) { ssa->ops[ret].op1_use = orig_var; - ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain; - ssa->vars[orig_var].use_chain = ret; - } + ssa->ops[ret].op1_use_chain = ssa->ops[op_1].op1_use_chain; - ssa->vars[v].definition = -1; - ssa->vars[v].use_chain = -1; + ssa->vars[v].definition = -1; + ssa->vars[v].use_chain = -1; - ssa->ops[op_1].op1_def = -1; - ssa->ops[op_1].op1_use = -1; + ssa->ops[op_1].op1_def = -1; + ssa->ops[op_1].op1_use = -1; - MAKE_NOP(opline); - remove_nops = 1; + MAKE_NOP(opline); + remove_nops = 1; + } } } diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 98f60468a0e69..2cd1d4276e7fa 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -1209,6 +1209,46 @@ void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var) /* {{{ */ } /* }}} */ +void zend_ssa_replace_use_chain(zend_ssa *ssa, int op, int new_op, int var) /* {{{ */ +{ + if (ssa->vars[var].use_chain == op) { + ssa->vars[var].use_chain = new_op; + return; + } else { + int use = ssa->vars[var].use_chain; + + while (use >= 0) { + if (ssa->ops[use].result_use == var) { + if (ssa->ops[use].res_use_chain == op) { + ssa->ops[use].res_use_chain = new_op; + return; + } else { + use = ssa->ops[use].res_use_chain; + } + } else if (ssa->ops[use].op1_use == var) { + if (ssa->ops[use].op1_use_chain == op) { + ssa->ops[use].op1_use_chain = new_op; + return; + } else { + use = ssa->ops[use].op1_use_chain; + } + } else if (ssa->ops[use].op2_use == var) { + if (ssa->ops[use].op2_use_chain == op) { + ssa->ops[use].op2_use_chain = new_op; + return; + } else { + use = ssa->ops[use].op2_use_chain; + } + } else { + break; + } + } + } + /* something wrong */ + ZEND_UNREACHABLE(); +} +/* }}} */ + void zend_ssa_remove_instr(zend_ssa *ssa, zend_op *opline, zend_ssa_op *ssa_op) /* {{{ */ { if (ssa_op->result_use >= 0) { diff --git a/Zend/Optimizer/zend_ssa.h b/Zend/Optimizer/zend_ssa.h index 93fa6e673f2e8..9fde352c79cc1 100644 --- a/Zend/Optimizer/zend_ssa.h +++ b/Zend/Optimizer/zend_ssa.h @@ -149,6 +149,7 @@ ZEND_API zend_result zend_build_ssa(zend_arena **arena, const zend_script *scrip ZEND_API void zend_ssa_compute_use_def_chains(zend_arena **arena, const zend_op_array *op_array, zend_ssa *ssa); ZEND_API int zend_ssa_rename_op(const zend_op_array *op_array, const zend_op *opline, uint32_t k, uint32_t build_flags, int ssa_vars_count, zend_ssa_op *ssa_ops, int *var); void zend_ssa_unlink_use_chain(zend_ssa *ssa, int op, int var); +void zend_ssa_replace_use_chain(zend_ssa *ssa, int op, int new_op, int var); void zend_ssa_remove_predecessor(zend_ssa *ssa, int from, int to); void zend_ssa_remove_defs_of_instr(zend_ssa *ssa, zend_ssa_op *ssa_op); From 85af420f791b5c727ec055a9c3dd7a4231072e61 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Tue, 28 Dec 2021 11:35:45 -0500 Subject: [PATCH 0337/1346] [skip ci] Update documentation of supported php versions (#7822) https://www.php.net/supported-versions.php Co-authored-by: Christoph M. Becker --- CONTRIBUTING.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bd1ed6f4792cb..a77eec1e01fb9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,7 +35,7 @@ If you are fixing a bug, then please submit your PR against the lowest actively supported branch of PHP that the bug affects (only green branches on [the supported version page](https://www.php.net/supported-versions.php) are supported). For example, at the time of writing, the lowest supported version is -PHP 7.3, which corresponds to the `PHP-7.3` branch in Git. Please also make sure +PHP 8.0, which corresponds to the `PHP-8.0` branch in Git. Please also make sure you add a link to the PR in the bug on [the bug tracker](https://bugs.php.net/). Pull requests implementing RFCs should be submitted against `master`. @@ -332,9 +332,9 @@ Currently we have the following branches in use: | master | Active development branch for PHP 8.2, which is open for backwards incompatible changes and major internal API changes. | | PHP-8.1 | Is used to release the PHP 8.1.x series. This is a current stable version and is open for bugfixes only. | | PHP-8.0 | Is used to release the PHP 8.0.x series. This is a current stable version and is open for bugfixes only. | -| PHP-7.4 | Is used to release the PHP 7.4.x series. This is a current stable version and is open for bugfixes only. | -| PHP-7.3 | Is used to release the PHP 7.3.x series. This is a current stable version and is open for bugfixes only. | -| PHP-7.2 | Is used to release the PHP 7.2.x series. This is an old stable version and is open for security fixes only. | +| PHP-7.4 | Is used to release the PHP 7.4.x series. This is an old stable version and is open for security fixes only. | +| PHP-7.3 | This branch is closed. | +| PHP-7.2 | This branch is closed. | | PHP-7.1 | This branch is closed. | | PHP-7.0 | This branch is closed. | | PHP-5.6 | This branch is closed. | @@ -349,8 +349,8 @@ Currently we have the following branches in use: The next few rules are more of a technical nature: 1. All non-security bugfix changes should first go to the lowest bugfix branch - (i.e. 7.3) and then get merged up to all other branches. All security fixes - should go to the lowest security fixes branch (i.e 7.2). If a change is not + (i.e. 8.0) and then get merged up to all other branches. All security fixes + should go to the lowest security fixes branch (i.e 7.4). If a change is not needed for later branches (i.e. fixes for features which were dropped from later branches) an empty merge should be done. From 7d2f2a100582ba95d4da082bcbd629ef48549084 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 30 Dec 2021 12:03:42 +0100 Subject: [PATCH 0338/1346] Remove an incorrect JMPZNZ optimization This is already skipped for TMP/VAR, but also needs to be skipped for CV, because we need to insert CHECK_VAR in that case, if we're being pedantic. That leaves us with CONST as the only case we can handle, which is already covered by constant folding. This optimization never actually triggers in our tests, so it's not a big loss. --- Zend/Optimizer/pass3.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Zend/Optimizer/pass3.c b/Zend/Optimizer/pass3.c index 2b0fa7aa52ebc..f96e071311f61 100644 --- a/Zend/Optimizer/pass3.c +++ b/Zend/Optimizer/pass3.c @@ -340,15 +340,6 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, target); } - if (ZEND_OP2_JMP_ADDR(opline) == target && - !(opline->op1_type & (IS_VAR|IS_TMP_VAR))) { - /* JMPZNZ(?,L,L) -> JMP(L) */ - opline->opcode = ZEND_JMP; - ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target); - SET_UNUSED(opline->op1); - SET_UNUSED(opline->op2); - opline->extended_value = 0; - } /* Don't convert JMPZNZ back to JMPZ/JMPNZ, because the following JMP is not removed yet. */ break; From 0698bf794f502b59840bb422908ae47573112034 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 30 Dec 2021 12:44:57 +0100 Subject: [PATCH 0339/1346] Add helper for convertion to CHECK_VAR/FREE/NOP This is a recurring pattern whenever an instruction with an operand is deleted. --- Zend/Optimizer/block_pass.c | 33 ++++-------------------- Zend/Optimizer/optimize_func_calls.c | 16 +++--------- Zend/Optimizer/pass3.c | 20 ++------------ Zend/Optimizer/zend_optimizer.c | 19 ++++++++++++++ Zend/Optimizer/zend_optimizer_internal.h | 1 + 5 files changed, 30 insertions(+), 59 deletions(-) diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index eac6d6b37aa73..4a88c58abc13a 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -1327,14 +1327,8 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr follow_block = get_follow_block(cfg, block, 1, opt_count); if (target_block == follow_block) { /* L: JMP[N]Z(X, L+1) -> NOP or FREE(X) */ - if (last_op->op1_type == IS_CV) { - last_op->opcode = ZEND_CHECK_VAR; - last_op->op2.num = 0; - } else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) { - last_op->opcode = ZEND_FREE; - last_op->op2.num = 0; - } else { - MAKE_NOP(last_op); + zend_optimizer_convert_to_free_op1(op_array, last_op); + if (last_op->opcode == ZEND_NOP) { block->len--; } block->successors_count = 1; @@ -1344,14 +1338,8 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr if (target->opcode == ZEND_JMP) { if (block->successors[0] == follow_block->successors[0]) { /* JMPZ(X,L1), JMP(L1) -> NOP, JMP(L1) */ - if (last_op->op1_type == IS_CV) { - last_op->opcode = ZEND_CHECK_VAR; - last_op->op2.num = 0; - } else if (last_op->op1_type & (IS_VAR|IS_TMP_VAR)) { - last_op->opcode = ZEND_FREE; - last_op->op2.num = 0; - } else { - MAKE_NOP(last_op); + zend_optimizer_convert_to_free_op1(op_array, last_op); + if (last_op->opcode == ZEND_NOP) { block->len--; } block->successors[0] = follow_block - cfg->blocks; @@ -1704,18 +1692,7 @@ static void zend_t_usage(zend_cfg *cfg, zend_op_array *op_array, zend_bitset use case ZEND_QM_ASSIGN: case ZEND_BOOL: case ZEND_BOOL_NOT: - if (opline->op1_type == IS_CV) { - opline->opcode = ZEND_CHECK_VAR; - SET_UNUSED(opline->result); - } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { - opline->opcode = ZEND_FREE; - SET_UNUSED(opline->result); - } else { - if (opline->op1_type == IS_CONST) { - literal_dtor(&ZEND_OP1_LITERAL(opline)); - } - MAKE_NOP(opline); - } + zend_optimizer_convert_to_free_op1(op_array, opline); break; case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: diff --git a/Zend/Optimizer/optimize_func_calls.c b/Zend/Optimizer/optimize_func_calls.c index e2e16f90b8654..c1f69f5748a7a 100644 --- a/Zend/Optimizer/optimize_func_calls.c +++ b/Zend/Optimizer/optimize_func_calls.c @@ -43,7 +43,7 @@ typedef struct _optimizer_call_info { uint32_t func_arg_num; } optimizer_call_info; -static void zend_delete_call_instructions(zend_op *opline) +static void zend_delete_call_instructions(zend_op_array *op_array, zend_op *opline) { int call = 0; @@ -73,17 +73,7 @@ static void zend_delete_call_instructions(zend_op *opline) case ZEND_SEND_VAL: case ZEND_SEND_VAR: if (call == 0) { - if (opline->op1_type == IS_CONST) { - MAKE_NOP(opline); - } else if (opline->op1_type == IS_CV) { - opline->opcode = ZEND_CHECK_VAR; - opline->extended_value = 0; - opline->result.var = 0; - } else { - opline->opcode = ZEND_FREE; - opline->extended_value = 0; - opline->result.var = 0; - } + zend_optimizer_convert_to_free_op1(op_array, opline); } break; } @@ -144,7 +134,7 @@ static void zend_try_inline_call(zend_op_array *op_array, zend_op *fcall, zend_o MAKE_NOP(opline); } - zend_delete_call_instructions(opline-1); + zend_delete_call_instructions(op_array, opline-1); } } } diff --git a/Zend/Optimizer/pass3.c b/Zend/Optimizer/pass3.c index f96e071311f61..39e1d65c20806 100644 --- a/Zend/Optimizer/pass3.c +++ b/Zend/Optimizer/pass3.c @@ -116,15 +116,7 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) (opline-1)->opcode == ZEND_JMPNZ)) { if (ZEND_OP2_JMP_ADDR(opline-1) == target) { /* JMPZ(X,L1), JMP(L1) -> NOP, JMP(L1) */ - if ((opline-1)->op1_type == IS_CV) { - (opline-1)->opcode = ZEND_CHECK_VAR; - (opline-1)->op2.num = 0; - } else if ((opline-1)->op1_type & (IS_TMP_VAR|IS_VAR)) { - (opline-1)->opcode = ZEND_FREE; - (opline-1)->op2.num = 0; - } else { - MAKE_NOP(opline-1); - } + zend_optimizer_convert_to_free_op1(op_array, opline - 1); } else { /* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */ if ((opline-1)->opcode == ZEND_JMPZ) { @@ -194,15 +186,7 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) /* convert L: JMPZ L+1 to NOP */ if (target == opline + 1) { - if (opline->op1_type == IS_CV) { - opline->opcode = ZEND_CHECK_VAR; - opline->op2.num = 0; - } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { - opline->opcode = ZEND_FREE; - opline->op2.num = 0; - } else { - MAKE_NOP(opline); - } + zend_optimizer_convert_to_free_op1(op_array, opline); } break; diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 0a4111fa4fd33..58512f751b667 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -208,6 +208,25 @@ bool zend_optimizer_get_collected_constant(HashTable *constants, zval *name, zva return 0; } +void zend_optimizer_convert_to_free_op1(zend_op_array *op_array, zend_op *opline) +{ + if (opline->op1_type == IS_CV) { + opline->opcode = ZEND_CHECK_VAR; + SET_UNUSED(opline->op2); + SET_UNUSED(opline->result); + opline->extended_value = 0; + } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { + opline->opcode = ZEND_FREE; + SET_UNUSED(opline->op2); + SET_UNUSED(opline->result); + opline->extended_value = 0; + } else { + ZEND_ASSERT(opline->op1_type == IS_CONST); + literal_dtor(&ZEND_OP1_LITERAL(opline)); + MAKE_NOP(opline); + } +} + int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv) { int i = op_array->last_literal; diff --git a/Zend/Optimizer/zend_optimizer_internal.h b/Zend/Optimizer/zend_optimizer_internal.h index 25d021fa98ce9..9e295bad73dcb 100644 --- a/Zend/Optimizer/zend_optimizer_internal.h +++ b/Zend/Optimizer/zend_optimizer_internal.h @@ -76,6 +76,7 @@ static inline bool zend_optimizer_is_loop_var_free(const zend_op *opline) { || (opline->opcode == ZEND_FREE && opline->extended_value == ZEND_FREE_SWITCH); } +void zend_optimizer_convert_to_free_op1(zend_op_array *op_array, zend_op *opline); int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv); bool zend_optimizer_get_persistent_constant(zend_string *name, zval *result, int copy); void zend_optimizer_collect_constant(zend_optimizer_ctx *ctx, zval *name, zval* value); From f2b50156bc7f3fbf4e3384cdcf1240bacb4310ef Mon Sep 17 00:00:00 2001 From: "Chun-Sheng, Li" Date: Thu, 30 Dec 2021 20:02:56 +0800 Subject: [PATCH 0340/1346] Add some more test cases for BCMath Closes GH-7851. --- ext/bcmath/tests/bcadd.phpt | 4 ++++ ext/bcmath/tests/bcadd_variation001.phpt | 8 +++++++- ext/bcmath/tests/bccomp_variation002.phpt | 8 +++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ext/bcmath/tests/bcadd.phpt b/ext/bcmath/tests/bcadd.phpt index b24ce8dbd7927..fa4be8acbe1ae 100644 --- a/ext/bcmath/tests/bcadd.phpt +++ b/ext/bcmath/tests/bcadd.phpt @@ -8,9 +8,13 @@ bcmath.scale=0 --EXPECT-- 3 4.0000 +-6.0000 +-4.0000 8728932003911564969352217864684.00 diff --git a/ext/bcmath/tests/bcadd_variation001.phpt b/ext/bcmath/tests/bcadd_variation001.phpt index 447958b4a2f0f..d6bd89b52231d 100644 --- a/ext/bcmath/tests/bcadd_variation001.phpt +++ b/ext/bcmath/tests/bcadd_variation001.phpt @@ -7,10 +7,16 @@ bcmath.scale=5 --FILE-- --EXPECT-- 6.50 +6.50 +-5.1 -5.1 3.03000 +-11.57000 diff --git a/ext/bcmath/tests/bccomp_variation002.phpt b/ext/bcmath/tests/bccomp_variation002.phpt index ae7ba7fafe819..eb9655083ca3f 100644 --- a/ext/bcmath/tests/bccomp_variation002.phpt +++ b/ext/bcmath/tests/bccomp_variation002.phpt @@ -8,9 +8,15 @@ bcmath.scale=0 --EXPECT-- 0 -1 1 +-1 +1 +1 From 50c7512f5213566add86e33fcdf2c8889b61c78e Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Thu, 30 Dec 2021 14:08:12 +0000 Subject: [PATCH 0341/1346] mysqli_result::__construct should throw exceptions (#7855) --- ext/mysqli/mysqli.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 58ee1e7b564da..8769d08ee9823 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -980,8 +980,12 @@ PHP_METHOD(mysqli_result, __construct) } if (!result) { + MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); RETURN_FALSE; } + if (MyG(report_mode) & MYSQLI_REPORT_INDEX) { + php_mysqli_report_index("from previous query", mysqli_server_status(mysql->mysql)); + } mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE)); mysqli_resource->ptr = (void *)result; From 05ed3b779951ca54003c47d68fadea83a6fc6940 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Sun, 2 Jan 2022 22:50:35 +0000 Subject: [PATCH 0342/1346] Remove duplicated SKIP checks from mysqli tests (#7858) --- ext/mysqli/tests/014.phpt | 19 ++++++------ ext/mysqli/tests/015.phpt | 18 +++++------ ext/mysqli/tests/045.phpt | 5 ++-- ext/mysqli/tests/067.phpt | 11 ++++--- ext/mysqli/tests/bug42548.phpt | 9 +++--- ext/mysqli/tests/bug44897.phpt | 12 ++++---- ext/mysqli/tests/bug49442.phpt | 12 ++++---- ext/mysqli/tests/bug51647.phpt | 5 ++-- ext/mysqli/tests/bug53503.phpt | 14 ++++----- ext/mysqli/tests/bug55283.phpt | 3 +- ext/mysqli/tests/bug55582.phpt | 3 +- ext/mysqli/tests/bug63398.phpt | 3 +- ext/mysqli/tests/bug64726.phpt | 3 +- ext/mysqli/tests/bug68077.phpt | 9 +++--- ext/mysqli/tests/bug69899.phpt | 1 - ext/mysqli/tests/bug70384.phpt | 30 ++++++++++--------- ext/mysqli/tests/bug70949.phpt | 7 ++--- ext/mysqli/tests/bug71863.phpt | 7 ++--- ext/mysqli/tests/bug72701.phpt | 5 ++-- ext/mysqli/tests/bug76386.phpt | 12 ++++---- ext/mysqli/tests/bug77956.phpt | 9 +++--- ext/mysqli/tests/clean_table.inc | 2 +- ext/mysqli/tests/gh7746.phpt | 1 - ...file_overrides_local_infile_directory.phpt | 12 ++++---- ext/mysqli/tests/mysqli_autocommit.phpt | 10 +++---- ext/mysqli/tests/mysqli_autocommit_oo.phpt | 13 ++++---- .../tests/mysqli_change_user_insert_id.phpt | 7 ++--- ext/mysqli/tests/mysqli_change_user_new.phpt | 6 ++-- ext/mysqli/tests/mysqli_change_user_oo.phpt | 6 ++-- .../tests/mysqli_change_user_rollback.phpt | 12 ++++---- .../tests/mysqli_change_user_set_names.phpt | 8 ++--- ext/mysqli/tests/mysqli_commit.phpt | 12 ++++---- ext/mysqli/tests/mysqli_commit_oo.phpt | 13 ++++---- ext/mysqli/tests/mysqli_connect_attr.phpt | 8 ++--- .../tests/mysqli_connect_oo_warnings.phpt | 12 ++++---- ext/mysqli/tests/mysqli_debug_ini.phpt | 10 ++++--- .../tests/mysqli_debug_mysqlnd_only.phpt | 8 ++--- ext/mysqli/tests/mysqli_explain_metadata.phpt | 8 ++--- ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt | 15 +++++----- .../mysqli_fetch_assoc_no_alias_utf8.phpt | 13 ++++---- .../tests/mysqli_fetch_field_flags.phpt | 12 ++++---- ext/mysqli/tests/mysqli_fork.phpt | 9 +++--- ext/mysqli/tests/mysqli_get_client_info.phpt | 11 ++----- ext/mysqli/tests/mysqli_get_warnings.phpt | 7 ++--- .../tests/mysqli_insert_packet_overflow.phpt | 6 ++-- ...local_infile_directory_access_allowed.phpt | 16 +++++----- ..._local_infile_directory_access_denied.phpt | 16 +++++----- ...ocal_infile_directory_vs_open_basedir.phpt | 12 ++++---- .../tests/mysqli_mysqlnd_read_timeout.phpt | 5 ++-- .../mysqli_mysqlnd_read_timeout_long.phpt | 6 ++-- .../mysqli_mysqlnd_read_timeout_zero.phpt | 6 ++-- .../mysqli_options_int_and_float_native.phpt | 7 ++--- ext/mysqli/tests/mysqli_pam_sha256.phpt | 12 ++++---- .../mysqli_pam_sha256_public_key_ini.phpt | 12 ++++---- .../mysqli_pam_sha256_public_key_option.phpt | 12 ++++---- ..._pam_sha256_public_key_option_invalid.phpt | 12 ++++---- ext/mysqli/tests/mysqli_pconn_kill.phpt | 8 ++--- ext/mysqli/tests/mysqli_pconn_limits.phpt | 9 ++---- ext/mysqli/tests/mysqli_poll_reference.phpt | 8 ++--- .../tests/mysqli_query_stored_proc.phpt | 12 ++++---- ext/mysqli/tests/mysqli_query_unicode.phpt | 9 ++---- .../tests/mysqli_real_connect_pconn.phpt | 7 ++--- ext/mysqli/tests/mysqli_reconnect.phpt | 11 ++++--- .../tests/mysqli_release_savepoint.phpt | 14 ++++----- ext/mysqli/tests/mysqli_report.phpt | 8 ++--- ext/mysqli/tests/mysqli_report_new.phpt | 13 +++----- ext/mysqli/tests/mysqli_report_wo_ps.phpt | 13 +++----- .../mysqli_result_references_mysqlnd.phpt | 10 ++++--- ext/mysqli/tests/mysqli_rollback.phpt | 16 +++++----- ext/mysqli/tests/mysqli_savepoint.phpt | 12 ++++---- ext/mysqli/tests/mysqli_set_charset.phpt | 14 ++++----- ext/mysqli/tests/mysqli_ssl_set.phpt | 6 ++-- ext/mysqli/tests/mysqli_stmt_execute.phpt | 12 ++++---- .../mysqli_stmt_execute_stored_proc.phpt | 17 ++++++----- ..._stmt_execute_stored_proc_next_result.phpt | 11 ++++--- .../mysqli_stmt_execute_stored_proc_out.phpt | 11 ++++--- ext/mysqli/tests/mysqli_stmt_fetch_bit.phpt | 18 ++++++----- .../tests/mysqli_stmt_get_result_bit.phpt | 27 +++++++++-------- .../tests/mysqli_stmt_get_warnings.phpt | 12 +++----- ext/mysqli/tests/mysqli_stmt_multires.phpt | 6 ++-- ...t_send_long_data_packet_size_libmysql.phpt | 2 +- ...mt_send_long_data_packet_size_mysqlnd.phpt | 2 +- .../tests/mysqli_warning_unclonable.phpt | 7 ++--- ext/mysqli/tests/skipifconnectfailure.inc | 1 - ext/mysqli/tests/table.inc | 2 +- 85 files changed, 381 insertions(+), 451 deletions(-) diff --git a/ext/mysqli/tests/014.phpt b/ext/mysqli/tests/014.phpt index 7da7765de9187..36e61b64e1ec2 100644 --- a/ext/mysqli/tests/014.phpt +++ b/ext/mysqli/tests/014.phpt @@ -4,19 +4,18 @@ mysqli autocommit/commit/rollback mysqli --SKIPIF-- errno, $link->error)); +if (!have_innodb($link)) { + die(sprintf("skip Needs InnoDB support, [%d] %s", $link->errno, $link->error)); +} ?> --FILE-- --CLEAN-- --EXPECT-- Num_of_rows=1 diff --git a/ext/mysqli/tests/015.phpt b/ext/mysqli/tests/015.phpt index f9adb2fe2b0b3..9726afe780230 100644 --- a/ext/mysqli/tests/015.phpt +++ b/ext/mysqli/tests/015.phpt @@ -4,18 +4,18 @@ mysqli autocommit/commit/rollback with innodb mysqli --SKIPIF-- errno, $link->error)); +if (!have_innodb($link)) { + die(sprintf("skip Needs InnoDB support, [%d] %s", $link->errno, $link->error)); +} ?> --FILE-- --CLEAN-- --EXPECT-- array(2) { diff --git a/ext/mysqli/tests/045.phpt b/ext/mysqli/tests/045.phpt index 7db4a2a1bbcf2..213b27137dd07 100644 --- a/ext/mysqli/tests/045.phpt +++ b/ext/mysqli/tests/045.phpt @@ -4,9 +4,8 @@ mysqli_stmt_bind_result (SHOW) mysqli --SKIPIF-- --FILE-- --CLEAN-- --FILE-- real_connect($host, $user, $passwd, $db, $port, $socket); @@ -53,7 +52,7 @@ print "done!"; ?> --CLEAN-- errno, $link->error)); @@ -23,7 +23,7 @@ mysqli.allow_persistent=1 mysqli.max_persistent=1 --FILE-- --CLEAN-- --EXPECT-- array(2) { diff --git a/ext/mysqli/tests/bug51647.phpt b/ext/mysqli/tests/bug51647.phpt index 3e1e15a6e7a1d..38515245e7b0e 100644 --- a/ext/mysqli/tests/bug51647.phpt +++ b/ext/mysqli/tests/bug51647.phpt @@ -4,8 +4,7 @@ Bug #51647 (Certificate file without private key (pk in another file) doesn't wo mysqli --SKIPIF-- close(); ?> --FILE-- errno, $link->error)); mysqli_close($link); - ?> --INI-- mysqli.allow_local_infile=1 --FILE-- --CLEAN-- --FILE-- --FILE-- --FILE-- errno, $link->error)); diff --git a/ext/mysqli/tests/bug69899.phpt b/ext/mysqli/tests/bug69899.phpt index 6585f1048409b..66f997a4d3408 100644 --- a/ext/mysqli/tests/bug69899.phpt +++ b/ext/mysqli/tests/bug69899.phpt @@ -11,7 +11,6 @@ mysqli --SKIPIF-- server_version < 50709) { - die("skip MySQL 5.7.9+ needed. Found [". - intval(substr($link->server_version."", -5, 1)). - ".". - intval(substr($link->server_version."", -4, 2)). - ".". - intval(substr($link->server_version."", -2, 2)). - "]"); - } - } +require_once 'connect.inc'; +if (!$link = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + die(sprintf("skip Can't connect to MySQL Server - [%d] %s", mysqli_connect_errno(), mysqli_connect_error())); +} + +if ($link->server_version < 50709) { + die("skip MySQL 5.7.9+ needed. Found [". + intval(substr($link->server_version."", -5, 1)). + ".". + intval(substr($link->server_version."", -4, 2)). + ".". + intval(substr($link->server_version."", -2, 2)). + "]"); +} ?> --FILE-- --CLEAN-- --EXPECT-- OK diff --git a/ext/mysqli/tests/bug70949.phpt b/ext/mysqli/tests/bug70949.phpt index 567b1131efdd3..995511e1c6624 100644 --- a/ext/mysqli/tests/bug70949.phpt +++ b/ext/mysqli/tests/bug70949.phpt @@ -4,15 +4,14 @@ Bug #70949 (SQL Result Sets With NULL Can Cause Fatal Memory Errors) mysqli --SKIPIF-- --FILE-- query("DROP TABLE IF EXISTS bug70949"); @@ -47,7 +46,7 @@ if ($stmt = $mysql->prepare($sql)) ?> --CLEAN-- --FILE-- --CLEAN-- = 5.6.4. */ if (mysqli_get_server_version($link) < 50604) { @@ -18,7 +18,7 @@ mysqli_close($link); ?> --FILE-- query('DROP TABLE IF EXISTS ts_test;'); @@ -96,7 +96,7 @@ string(13) "11:00:00.4444" string(15) "11:00:00.006054" --CLEAN-- query('DROP TABLE ts_test;'); $link->query('DROP TABLE t_test;'); diff --git a/ext/mysqli/tests/bug77956.phpt b/ext/mysqli/tests/bug77956.phpt index 8a579c0657d12..53c25c09697ce 100644 --- a/ext/mysqli/tests/bug77956.phpt +++ b/ext/mysqli/tests/bug77956.phpt @@ -4,17 +4,18 @@ ensure an error is returned when mysqli.allow_local_infile is off mysqli --SKIPIF-- errno, $link->error)); +mysqli_close($link); ?> --INI-- mysqli.allow_local_infile=0 diff --git a/ext/mysqli/tests/clean_table.inc b/ext/mysqli/tests/clean_table.inc index 229b42f5eddcc..2b03fc6fb2600 100644 --- a/ext/mysqli/tests/clean_table.inc +++ b/ext/mysqli/tests/clean_table.inc @@ -1,5 +1,5 @@ sqlstate is inaccessible mysqli --SKIPIF-- --FILE-- diff --git a/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt b/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt index 963603515400d..627c76ec539c3 100644 --- a/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt +++ b/ext/mysqli/tests/mysqli_allow_local_infile_overrides_local_infile_directory.phpt @@ -4,17 +4,17 @@ mysqli.allow_local_infile overrides mysqli.local_infile_directory mysqli --SKIPIF-- errno, $link->error)); + die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error)); mysqli_close($link); - ?> --INI-- open_basedir={PWD} diff --git a/ext/mysqli/tests/mysqli_autocommit.phpt b/ext/mysqli/tests/mysqli_autocommit.phpt index 0b410f1f05243..0da4e488e641f 100644 --- a/ext/mysqli/tests/mysqli_autocommit.phpt +++ b/ext/mysqli/tests/mysqli_autocommit.phpt @@ -4,10 +4,9 @@ mysqli_autocommit() mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- mysqli object is already closed diff --git a/ext/mysqli/tests/mysqli_autocommit_oo.phpt b/ext/mysqli/tests/mysqli_autocommit_oo.phpt index 6510c62ccbecf..0c0dbee834f34 100644 --- a/ext/mysqli/tests/mysqli_autocommit_oo.phpt +++ b/ext/mysqli/tests/mysqli_autocommit_oo.phpt @@ -4,13 +4,10 @@ mysqli->autocommit() mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- my_mysqli object is already closed diff --git a/ext/mysqli/tests/mysqli_change_user_insert_id.phpt b/ext/mysqli/tests/mysqli_change_user_insert_id.phpt index c82b2c7fa0527..1e75ccc390402 100644 --- a/ext/mysqli/tests/mysqli_change_user_insert_id.phpt +++ b/ext/mysqli/tests/mysqli_change_user_insert_id.phpt @@ -4,8 +4,7 @@ mysqli_change_user() - LAST_INSERT_ID() - http://bugs.mysql.com/bug.php?id=45184 mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_change_user_new.phpt b/ext/mysqli/tests/mysqli_change_user_new.phpt index acf86ab517d33..d6a9a3bd137c4 100644 --- a/ext/mysqli/tests/mysqli_change_user_new.phpt +++ b/ext/mysqli/tests/mysqli_change_user_new.phpt @@ -4,9 +4,9 @@ mysqli_change_user(), MySQL 5.6+ mysqli --SKIPIF-- = 10_00_00) ?> --FILE-- change_user() mysqli --SKIPIF-- 50100)) { die("skip Your MySQL Server version has a known bug that will cause a crash"); } @@ -16,7 +16,7 @@ if (mysqli_get_server_version($link) >= 50600) ?> --FILE-- errno, $link->error)); ?> --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_change_user_set_names.phpt b/ext/mysqli/tests/mysqli_change_user_set_names.phpt index e09c7801b90ea..85c37b8a60157 100644 --- a/ext/mysqli/tests/mysqli_change_user_set_names.phpt +++ b/ext/mysqli/tests/mysqli_change_user_set_names.phpt @@ -4,10 +4,10 @@ mysqli_change_user() - SET NAMES mysqli --SKIPIF-- --FILE-- errno, $link->error)); ?> --FILE-- --CLEAN-- --EXPECT-- mysqli object is already closed diff --git a/ext/mysqli/tests/mysqli_commit_oo.phpt b/ext/mysqli/tests/mysqli_commit_oo.phpt index 56c90b866bfdc..fd4c1bbf008c6 100644 --- a/ext/mysqli/tests/mysqli_commit_oo.phpt +++ b/ext/mysqli/tests/mysqli_commit_oo.phpt @@ -4,18 +4,16 @@ mysqli_commit() mysqli --SKIPIF-- errno, $link->error)); ?> --FILE-- --CLEAN-- --EXPECTF-- mysqli object is not fully initialized diff --git a/ext/mysqli/tests/mysqli_connect_attr.phpt b/ext/mysqli/tests/mysqli_connect_attr.phpt index eadf7b0fa0da7..75de208c4c5a2 100644 --- a/ext/mysqli/tests/mysqli_connect_attr.phpt +++ b/ext/mysqli/tests/mysqli_connect_attr.phpt @@ -4,13 +4,13 @@ mysqli check the session_connect_attrs table for connection attributes mysqli --SKIPIF-- --FILE-- --FILE-- +--CLEAN-- + --EXPECT-- string(32) "t:O,/tmp/mysqli_debug_phpt.trace" done! diff --git a/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt b/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt index c252e645dc9c9..00a460a410e1f 100644 --- a/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt +++ b/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt @@ -4,8 +4,7 @@ mysqli_debug() - mysqlnd only control strings mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_explain_metadata.phpt b/ext/mysqli/tests/mysqli_explain_metadata.phpt index f651e573e3032..e920a7fffb081 100644 --- a/ext/mysqli/tests/mysqli_explain_metadata.phpt +++ b/ext/mysqli/tests/mysqli_explain_metadata.phpt @@ -4,15 +4,13 @@ EXPLAIN - metadata mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt b/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt index cc92737f81ec5..3e2bfea66aee4 100644 --- a/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt +++ b/ext/mysqli/tests/mysqli_fetch_assoc_bit.phpt @@ -4,17 +4,16 @@ mysqli_fetch_assoc() - BIT mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_fetch_assoc_no_alias_utf8.phpt b/ext/mysqli/tests/mysqli_fetch_assoc_no_alias_utf8.phpt index a100057c86988..e2334fa7ece86 100644 --- a/ext/mysqli/tests/mysqli_fetch_assoc_no_alias_utf8.phpt +++ b/ext/mysqli/tests/mysqli_fetch_assoc_no_alias_utf8.phpt @@ -4,11 +4,10 @@ mysqli_fetch_assoc() - utf8 mysqli --SKIPIF-- --FILE-- +--CLEAN-- + --EXPECTF-- [003] array(3) { diff --git a/ext/mysqli/tests/mysqli_fetch_field_flags.phpt b/ext/mysqli/tests/mysqli_fetch_field_flags.phpt index 031e5af6725b9..9874fff49f8ea 100644 --- a/ext/mysqli/tests/mysqli_fetch_field_flags.phpt +++ b/ext/mysqli/tests/mysqli_fetch_field_flags.phpt @@ -4,11 +4,9 @@ mysqli_fetch_field() - flags/field->flags mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_fork.phpt b/ext/mysqli/tests/mysqli_fork.phpt index 599376d0b9c26..52c97306e5052 100644 --- a/ext/mysqli/tests/mysqli_fork.phpt +++ b/ext/mysqli/tests/mysqli_fork.phpt @@ -4,7 +4,6 @@ Forking a child and using the same connection. mysqli --SKIPIF-- errno, $link->error)); ?> --FILE-- --CLEAN-- --FILE-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_get_warnings.phpt b/ext/mysqli/tests/mysqli_get_warnings.phpt index 9cd13d27c7c8c..d8d210eee12cf 100644 --- a/ext/mysqli/tests/mysqli_get_warnings.phpt +++ b/ext/mysqli/tests/mysqli_get_warnings.phpt @@ -4,14 +4,13 @@ mysqli_get_warnings() - TODO mysqli --SKIPIF-- --FILE-- errno, $link->error)); + die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error)); mysqli_close($link); - ?> --INI-- open_basedir={PWD} @@ -22,7 +22,7 @@ mysqli.allow_local_infile=0 mysqli.local_infile_directory={PWD}/foo --FILE-- --CLEAN-- errno, $link->error)); + die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error)); mysqli_close($link); - ?> --INI-- open_basedir={PWD} @@ -22,7 +22,7 @@ mysqli.allow_local_infile=0 mysqli.local_infile_directory={PWD}/foo/bar --FILE-- --CLEAN-- errno, $link->error)); + die(sprintf("skip %s, [%d] %s", $msg, $link->errno, $link->error)); mysqli_close($link); - ?> --INI-- open_basedir={PWD} diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt index be8c3aafa2e8f..472f88f97e860 100644 --- a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt @@ -4,8 +4,7 @@ mysqlnd.net_read_timeout limit check mysqli --SKIPIF-- default_socket_timeout mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_pam_sha256.phpt b/ext/mysqli/tests/mysqli_pam_sha256.phpt index 625e20ad4237e..5dc2ca8230eed 100644 --- a/ext/mysqli/tests/mysqli_pam_sha256.phpt +++ b/ext/mysqli/tests/mysqli_pam_sha256.phpt @@ -4,8 +4,6 @@ PAM: SHA-256 mysqli --SKIPIF-- --FILE-- --CLEAN-- query('DROP USER shatest'); $link->query('DROP USER shatest@localhost'); ?> diff --git a/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt b/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt index 94db7fabe406c..42a9640f1ea99 100644 --- a/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt +++ b/ext/mysqli/tests/mysqli_pam_sha256_public_key_ini.phpt @@ -4,8 +4,6 @@ PAM: SHA-256, mysqlnd.sha256_server_public_key mysqli --SKIPIF-- --CLEAN-- query('DROP USER shatest'); $link->query('DROP USER shatest@localhost'); $file = "test_sha256_ini"; diff --git a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt index 497a7300ca60b..e0abe65e24e44 100644 --- a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt +++ b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option.phpt @@ -4,8 +4,6 @@ PAM: SHA-256, option: MYSQLI_SERVER_PUBLIC_KEY mysqli --SKIPIF-- --FILE-- --CLEAN-- query('DROP USER shatest'); $link->query('DROP USER shatest@localhost'); $file = sprintf("%s%s%s_%s", sys_get_temp_dir(), DIRECTORY_SEPARATOR, "test_sha256_" , @date("Ymd")); diff --git a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt index 3c6b53d43a7a2..5f13fa4f03f07 100644 --- a/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt +++ b/ext/mysqli/tests/mysqli_pam_sha256_public_key_option_invalid.phpt @@ -4,8 +4,6 @@ PAM: SHA-256, option: MYSQLI_SERVER_PUBLIC_KEY (invalid) mysqli --SKIPIF-- --FILE-- --CLEAN-- query('DROP USER shatest'); $link->query('DROP USER shatest@localhost'); $file = sprintf("%s%s%s_%s", sys_get_temp_dir(), DIRECTORY_SEPARATOR, "test_sha256_" , @date("Ymd")); diff --git a/ext/mysqli/tests/mysqli_pconn_kill.phpt b/ext/mysqli/tests/mysqli_pconn_kill.phpt index d53ed44995919..17af4fa42ec93 100644 --- a/ext/mysqli/tests/mysqli_pconn_kill.phpt +++ b/ext/mysqli/tests/mysqli_pconn_kill.phpt @@ -4,16 +4,14 @@ Killing a persistent connection. mysqli --SKIPIF-- --INI-- mysqli.allow_persistent=1 mysqli.max_persistent=2 --FILE-- --CLEAN-- --EXPECT-- mysqli object is already closed diff --git a/ext/mysqli/tests/mysqli_pconn_limits.phpt b/ext/mysqli/tests/mysqli_pconn_limits.phpt index 4dd65c18a1dd2..4d9f8eed01cad 100644 --- a/ext/mysqli/tests/mysqli_pconn_limits.phpt +++ b/ext/mysqli/tests/mysqli_pconn_limits.phpt @@ -4,8 +4,7 @@ Persistent connections - limits (-1, unlimited) mysqli --SKIPIF-- --INI-- mysqli.allow_persistent=1 @@ -13,9 +12,7 @@ mysqli.max_persistent=-1 mysqli.max_links=-1 --FILE-- --CLEAN-- --EXPECT-- Regular connection 1 - 'works..' diff --git a/ext/mysqli/tests/mysqli_poll_reference.phpt b/ext/mysqli/tests/mysqli_poll_reference.phpt index 359c26565f216..836870aeb7fb0 100644 --- a/ext/mysqli/tests/mysqli_poll_reference.phpt +++ b/ext/mysqli/tests/mysqli_poll_reference.phpt @@ -4,13 +4,13 @@ mysqli_poll() & references mysqli --SKIPIF-- --FILE-- --FILE-- --CLEAN-- --FILE-- @@ -15,7 +14,7 @@ mysqli.allow_persistent=1 mysqli.max_persistent=10 --FILE-- --CLEAN-- --EXPECTF-- Warning: mysqli_real_connect(): (%s/%d): Access denied for user '%s'@'%s' (using password: YES) in %s on line %d diff --git a/ext/mysqli/tests/mysqli_reconnect.phpt b/ext/mysqli/tests/mysqli_reconnect.phpt index 6cb13c5e36030..f5f2aca11bf6a 100644 --- a/ext/mysqli/tests/mysqli_reconnect.phpt +++ b/ext/mysqli/tests/mysqli_reconnect.phpt @@ -4,16 +4,15 @@ Trying implicit reconnect after wait_timeout and KILL using mysqli_ping() mysqli --SKIPIF-- --INI-- mysqli.reconnect=1 --FILE-- +--CLEAN-- + --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_release_savepoint.phpt b/ext/mysqli/tests/mysqli_release_savepoint.phpt index 64716524c3684..ec969f15cdad7 100644 --- a/ext/mysqli/tests/mysqli_release_savepoint.phpt +++ b/ext/mysqli/tests/mysqli_release_savepoint.phpt @@ -4,20 +4,16 @@ mysqli_release_savepoint() mysqli --SKIPIF-- errno, $link->error)); ?> --FILE-- --CLEAN-- --EXPECT-- mysqli_release_savepoint(): Argument #2 ($name) cannot be empty diff --git a/ext/mysqli/tests/mysqli_report.phpt b/ext/mysqli/tests/mysqli_report.phpt index cb4010d0a87ec..110d25726cdbd 100644 --- a/ext/mysqli/tests/mysqli_report.phpt +++ b/ext/mysqli/tests/mysqli_report.phpt @@ -4,12 +4,10 @@ mysqli_report() mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECTF-- Warning: mysqli_multi_query(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near 'BAR; FOO' at line 1 in %s on line %d diff --git a/ext/mysqli/tests/mysqli_report_new.phpt b/ext/mysqli/tests/mysqli_report_new.phpt index 9ef80da1d865c..e544bcb3664d6 100644 --- a/ext/mysqli/tests/mysqli_report_new.phpt +++ b/ext/mysqli/tests/mysqli_report_new.phpt @@ -4,9 +4,9 @@ mysqli_report(), change user, MySQL 5.6+ mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECTF-- Warning: mysqli_change_user(): (%d/%d): Access denied for user '%s'@'%s' (using password: %s) in %s on line %d diff --git a/ext/mysqli/tests/mysqli_report_wo_ps.phpt b/ext/mysqli/tests/mysqli_report_wo_ps.phpt index f030051dd5fc1..c757de773db50 100644 --- a/ext/mysqli/tests/mysqli_report_wo_ps.phpt +++ b/ext/mysqli/tests/mysqli_report_wo_ps.phpt @@ -4,9 +4,9 @@ mysqli_report(), MySQL < 5.6 mysqli --SKIPIF-- = 50600) ?> --FILE-- = 50600) if (true !== ($tmp = mysqli_report(MYSQLI_REPORT_OFF))) printf("[008] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); - require('table.inc'); + require 'table.inc'; /* Internal macro MYSQL_REPORT_ERROR @@ -106,7 +101,7 @@ if (mysqli_get_server_version($link) >= 50600) ?> --CLEAN-- --EXPECTF-- Warning: mysqli_multi_query(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your %s server version for the right syntax to use near 'BAR; FOO' at line 1 in %s on line %d diff --git a/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt b/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt index 61a60cb68735b..3a77078c69c58 100644 --- a/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt +++ b/ext/mysqli/tests/mysqli_result_references_mysqlnd.phpt @@ -4,15 +4,13 @@ References to result sets - mysqlnd (no copies but references) mysqli --SKIPIF-- --FILE-- +--CLEAN-- + --EXPECTF-- array(1) refcount(%d){ [0]=> diff --git a/ext/mysqli/tests/mysqli_rollback.phpt b/ext/mysqli/tests/mysqli_rollback.phpt index 0978308e8c3d3..2297a3351acba 100644 --- a/ext/mysqli/tests/mysqli_rollback.phpt +++ b/ext/mysqli/tests/mysqli_rollback.phpt @@ -4,18 +4,16 @@ mysqli_rollback() mysqli --SKIPIF-- errno, $link->error)); +if (!have_innodb($link)) + die(sprintf("skip Needs InnoDB support, [%d] %s", $link->errno, $link->error)); ?> --FILE-- --CLEAN-- --EXPECT-- mysqli object is already closed diff --git a/ext/mysqli/tests/mysqli_savepoint.phpt b/ext/mysqli/tests/mysqli_savepoint.phpt index a34c1aaee1366..71e0b2d21819e 100644 --- a/ext/mysqli/tests/mysqli_savepoint.phpt +++ b/ext/mysqli/tests/mysqli_savepoint.phpt @@ -4,18 +4,16 @@ mysqli_savepoint() mysqli --SKIPIF-- errno, $link->error)); ?> --FILE-- --CLEAN-- --EXPECT-- mysqli_savepoint(): Argument #2 ($name) cannot be empty diff --git a/ext/mysqli/tests/mysqli_set_charset.phpt b/ext/mysqli/tests/mysqli_set_charset.phpt index 075e193959e48..5ddc2f4aa8930 100644 --- a/ext/mysqli/tests/mysqli_set_charset.phpt +++ b/ext/mysqli/tests/mysqli_set_charset.phpt @@ -4,14 +4,12 @@ mysqli_set_charset() mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECTF-- Exception: %s diff --git a/ext/mysqli/tests/mysqli_ssl_set.phpt b/ext/mysqli/tests/mysqli_ssl_set.phpt index 6abc84fb341b5..5ea79b964987c 100644 --- a/ext/mysqli/tests/mysqli_ssl_set.phpt +++ b/ext/mysqli/tests/mysqli_ssl_set.phpt @@ -4,13 +4,15 @@ mysqli_ssl_set() - test is a stub! mysqli --SKIPIF-- --FILE-- --FILE-- --CLEAN-- --EXPECT-- mysqli_stmt object is not fully initialized diff --git a/ext/mysqli/tests/mysqli_stmt_execute_stored_proc.phpt b/ext/mysqli/tests/mysqli_stmt_execute_stored_proc.phpt index c7269e8cb47d6..3af364dfb550a 100644 --- a/ext/mysqli/tests/mysqli_stmt_execute_stored_proc.phpt +++ b/ext/mysqli/tests/mysqli_stmt_execute_stored_proc.phpt @@ -4,10 +4,9 @@ mysqli_stmt_execute() - Stored Procedures mysqli --SKIPIF-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt b/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt index 64a1b86340bf7..c3a68db0797df 100644 --- a/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt +++ b/ext/mysqli/tests/mysqli_stmt_get_result_bit.phpt @@ -4,20 +4,23 @@ Fetching BIT column values using the PS API mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- done! diff --git a/ext/mysqli/tests/mysqli_stmt_get_warnings.phpt b/ext/mysqli/tests/mysqli_stmt_get_warnings.phpt index 0dadb7bb4a1df..e372977844bba 100644 --- a/ext/mysqli/tests/mysqli_stmt_get_warnings.phpt +++ b/ext/mysqli/tests/mysqli_stmt_get_warnings.phpt @@ -4,11 +4,9 @@ mysqli_stmt_get_warnings() - TODO mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECT-- mysqli_stmt object is not fully initialized diff --git a/ext/mysqli/tests/mysqli_stmt_multires.phpt b/ext/mysqli/tests/mysqli_stmt_multires.phpt index 496fca4e4f6c3..7018a8b63e4f0 100644 --- a/ext/mysqli/tests/mysqli_stmt_multires.phpt +++ b/ext/mysqli/tests/mysqli_stmt_multires.phpt @@ -4,16 +4,14 @@ Multiple result set with PS mysqli --SKIPIF-- --FILE-- query('DROP PROCEDURE IF EXISTS p123')) { diff --git a/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_libmysql.phpt b/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_libmysql.phpt index 21b0e4625dd32..57e371f360d9b 100644 --- a/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_libmysql.phpt +++ b/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_libmysql.phpt @@ -6,7 +6,7 @@ mysqli --FILE-- diff --git a/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_mysqlnd.phpt b/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_mysqlnd.phpt index 07c2e144875cb..b11260cb0cac5 100644 --- a/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_mysqlnd.phpt +++ b/ext/mysqli/tests/mysqli_stmt_send_long_data_packet_size_mysqlnd.phpt @@ -6,7 +6,7 @@ mysqli --FILE-- diff --git a/ext/mysqli/tests/mysqli_warning_unclonable.phpt b/ext/mysqli/tests/mysqli_warning_unclonable.phpt index f1aaad606b3bb..460334024b3ed 100644 --- a/ext/mysqli/tests/mysqli_warning_unclonable.phpt +++ b/ext/mysqli/tests/mysqli_warning_unclonable.phpt @@ -4,14 +4,13 @@ Trying to clone mysqli_warning object mysqli --SKIPIF-- --FILE-- --CLEAN-- --EXPECTF-- Fatal error: Trying to clone an uncloneable object of class mysqli_warning in %s on line %d diff --git a/ext/mysqli/tests/skipifconnectfailure.inc b/ext/mysqli/tests/skipifconnectfailure.inc index ebdfae1a94b88..2e770426d4c0b 100644 --- a/ext/mysqli/tests/skipifconnectfailure.inc +++ b/ext/mysqli/tests/skipifconnectfailure.inc @@ -1,7 +1,6 @@ Date: Fri, 7 Jan 2022 14:02:40 +0100 Subject: [PATCH 0343/1346] Silence potential connection failure in SKIPIF section Otherwise the test will be reported as BORKED. --- ext/mysqli/tests/mysqli_fork.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mysqli/tests/mysqli_fork.phpt b/ext/mysqli/tests/mysqli_fork.phpt index 52c97306e5052..411b129387532 100644 --- a/ext/mysqli/tests/mysqli_fork.phpt +++ b/ext/mysqli/tests/mysqli_fork.phpt @@ -12,7 +12,7 @@ if (!function_exists('posix_getpid')) die("skip POSIX functions not available"); require_once 'connect.inc'; -if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) +if (!$link = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) die(sprintf("skip Can't connect to MySQL Server - [%d] %s", mysqli_connect_errno(), mysqli_connect_error())); if (!have_innodb($link)) From 51eec5086f0862d4dfab526b2f7d852d1d87502d Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 7 Jan 2022 19:05:59 +0100 Subject: [PATCH 0344/1346] Run mb_send_mail tests on Windows, too We use the run-tests.php `{MAIL}` abstraction instead of `cat`. Closes GH-7908. --- ext/mbstring/tests/bug52681.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail01.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail02.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail03.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail04.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail05.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail06.phpt | 11 +++++++---- ext/mbstring/tests/mb_send_mail07.phpt | 11 +++++++---- 8 files changed, 56 insertions(+), 32 deletions(-) diff --git a/ext/mbstring/tests/bug52681.phpt b/ext/mbstring/tests/bug52681.phpt index 2086051e9412d..86295d3385dcd 100644 --- a/ext/mbstring/tests/bug52681.phpt +++ b/ext/mbstring/tests/bug52681.phpt @@ -4,15 +4,12 @@ Bug #52681 (mb_send_mail() appends an extra MIME-Version header) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/bug52681.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com diff --git a/ext/mbstring/tests/mb_send_mail01.phpt b/ext/mbstring/tests/mb_send_mail01.phpt index a71e212543624..4387d9f817433 100644 --- a/ext/mbstring/tests/mb_send_mail01.phpt +++ b/ext/mbstring/tests/mb_send_mail01.phpt @@ -4,15 +4,12 @@ mb_send_mail() test 1 (lang=neutral) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail01.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s diff --git a/ext/mbstring/tests/mb_send_mail02.phpt b/ext/mbstring/tests/mb_send_mail02.phpt index 13f9dd0974775..edc4093825af6 100644 --- a/ext/mbstring/tests/mb_send_mail02.phpt +++ b/ext/mbstring/tests/mb_send_mail02.phpt @@ -4,15 +4,12 @@ mb_send_mail() test 2 (lang=Japanese) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail02.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s diff --git a/ext/mbstring/tests/mb_send_mail03.phpt b/ext/mbstring/tests/mb_send_mail03.phpt index 124c94834e6cb..53cbf00a60f19 100644 --- a/ext/mbstring/tests/mb_send_mail03.phpt +++ b/ext/mbstring/tests/mb_send_mail03.phpt @@ -4,15 +4,12 @@ mb_send_mail() test 3 (lang=English) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail03.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s diff --git a/ext/mbstring/tests/mb_send_mail04.phpt b/ext/mbstring/tests/mb_send_mail04.phpt index bf5bfef578bd0..2251771469e16 100644 --- a/ext/mbstring/tests/mb_send_mail04.phpt +++ b/ext/mbstring/tests/mb_send_mail04.phpt @@ -4,15 +4,12 @@ mb_send_mail() test 4 (lang=German) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail04.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s diff --git a/ext/mbstring/tests/mb_send_mail05.phpt b/ext/mbstring/tests/mb_send_mail05.phpt index b03ce8748e61f..251b918bdb85b 100644 --- a/ext/mbstring/tests/mb_send_mail05.phpt +++ b/ext/mbstring/tests/mb_send_mail05.phpt @@ -4,9 +4,6 @@ mb_send_mail() test 5 (lang=Simplified Chinese) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail05.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s diff --git a/ext/mbstring/tests/mb_send_mail06.phpt b/ext/mbstring/tests/mb_send_mail06.phpt index 2a81a4a482115..d2fd7a9bbf3ab 100644 --- a/ext/mbstring/tests/mb_send_mail06.phpt +++ b/ext/mbstring/tests/mb_send_mail06.phpt @@ -4,9 +4,6 @@ mb_send_mail() test 6 (lang=Traditional Chinese) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail06.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s diff --git a/ext/mbstring/tests/mb_send_mail07.phpt b/ext/mbstring/tests/mb_send_mail07.phpt index 56368942cfd13..662426a47d833 100644 --- a/ext/mbstring/tests/mb_send_mail07.phpt +++ b/ext/mbstring/tests/mb_send_mail07.phpt @@ -4,9 +4,6 @@ mb_send_mail() test 7 (lang=Korean) mbstring --SKIPIF-- --INI-- -sendmail_path=/bin/cat +sendmail_path={MAIL:{PWD}/mb_send_mail07.eml} mail.add_x_header=off --FILE-- +--CLEAN-- + --EXPECTF-- To: example@example.com Subject: %s From 9e80947e343b253e078abfc9d1d4f800342c26f8 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sat, 8 Jan 2022 19:57:54 +0100 Subject: [PATCH 0345/1346] VS 17 == MSVC v143 == Visual Studio 2022 == cl 19.3x --- win32/build/confutils.js | 6 ++++-- win32/winutil.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/win32/build/confutils.js b/win32/build/confutils.js index 1b12c4a8ff77f..9bf1bf28141d4 100644 --- a/win32/build/confutils.js +++ b/win32/build/confutils.js @@ -3101,9 +3101,11 @@ function toolset_get_compiler_name(short) version = probe_binary(PHP_CL).substr(0, 5).replace('.', ''); - if (version >= 1930) { + if (version >= 1940) { return name; - } if (version >= 1920) { + } else if (version >= 1930) { + name = short ? "VS17" : "Visual C++ 2022"; + } else if (version >= 1920) { /* NOTE - VS is intentional. Due to changes in recent Visual Studio versioning scheme referring to the exact VC++ version is hardly predictable. From this version on, it refers to diff --git a/win32/winutil.c b/win32/winutil.c index 3d41873310f6a..e09944d131b9b 100644 --- a/win32/winutil.c +++ b/win32/winutil.c @@ -448,7 +448,7 @@ static zend_always_inline BOOL is_compatible(HMODULE handle, BOOL is_smaller, ch DWORD minor = pNTHeader->OptionalHeader.MinorLinkerVersion; #if PHP_LINKER_MAJOR == 14 - /* VS 2015, 2017 and 2019 are binary compatible, but only forward compatible. + /* VS 2015, 2017, 2019 and 2022 are binary compatible, but only forward compatible. It should be fine, if we load a module linked with an older one into the core linked with the newer one, but not the otherway round. Analogously, it should be fine, if a PHP build linked with an older version From 491793ae67982bd87c33abeb3bd0bca13dbbcc45 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 10 Jan 2022 16:37:49 +0300 Subject: [PATCH 0346/1346] Fixed test --- ext/opcache/tests/jit/assign_obj_op_001.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/opcache/tests/jit/assign_obj_op_001.phpt b/ext/opcache/tests/jit/assign_obj_op_001.phpt index 65ed5f7844a11..cb7c9a0b39e8a 100644 --- a/ext/opcache/tests/jit/assign_obj_op_001.phpt +++ b/ext/opcache/tests/jit/assign_obj_op_001.phpt @@ -14,6 +14,8 @@ $test = new Test; (function(){$this->y.=[];})->call($test); ?> --EXPECTF-- +Deprecated: Creation of dynamic property Test::$y is deprecated in %sassign_obj_op_001.php on line 6 + Warning: Undefined property: Test::$y in %sassign_obj_op_001.php on line 6 Warning: Array to string conversion in %sassign_obj_op_001.php on line 6 From 796511f324d7e63a6e12a2783f8cfc0b45932424 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sun, 9 Jan 2022 13:55:26 +0100 Subject: [PATCH 0347/1346] Fix php-cgi name in usage info Cf. . Closes GH-7916. --- sapi/cgi/cgi_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 75511ef3bd701..7d5f444d1c54a 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -1020,7 +1020,7 @@ static void php_cgi_usage(char *argv0) if (prog) { prog++; } else { - prog = "php"; + prog = "php-cgi"; } php_printf( "Usage: %s [-q] [-h] [-s] [-v] [-i] [-f ]\n" From 4543cd32ae3cf0431963e729b22c0ed0c6cadb1f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 30 Dec 2021 16:49:34 +0100 Subject: [PATCH 0348/1346] Remove JMPZNZ opcode While JMPZNZ can avoid execution of a separate JMP opcode in some cases, it also prevents smart branch optimization, so creating JMPZNZ may actually have a negative effect. It also adds additional complexity for optimizations. Drop JMPZNZ in favor of JMPZ+JMP or JMPNZ+JMP. Closes GH-7857. --- Zend/Optimizer/block_pass.c | 163 +- Zend/Optimizer/dce.c | 1 - Zend/Optimizer/dfa_pass.c | 48 - Zend/Optimizer/pass1.c | 17 - Zend/Optimizer/pass3.c | 95 -- Zend/Optimizer/sccp.c | 1 - Zend/Optimizer/zend_cfg.c | 14 +- Zend/Optimizer/zend_cfg.h | 1 - Zend/Optimizer/zend_inference.c | 1 - Zend/Optimizer/zend_optimizer.c | 12 - Zend/Optimizer/zend_ssa.c | 1 - Zend/zend_opcode.c | 4 - Zend/zend_vm_def.h | 35 - Zend/zend_vm_execute.h | 491 ++---- Zend/zend_vm_handlers.h | 2368 +++++++++++++-------------- Zend/zend_vm_opcodes.c | 4 +- Zend/zend_vm_opcodes.h | 1 - ext/opcache/jit/zend_jit.c | 33 +- ext/opcache/jit/zend_jit_arm64.dasc | 132 -- ext/opcache/jit/zend_jit_trace.c | 11 +- ext/opcache/jit/zend_jit_x86.dasc | 133 -- ext/opcache/zend_file_cache.c | 6 - ext/opcache/zend_persist.c | 3 - 23 files changed, 1376 insertions(+), 2199 deletions(-) diff --git a/Zend/Optimizer/block_pass.c b/Zend/Optimizer/block_pass.c index 4a88c58abc13a..a9c73306e14e4 100644 --- a/Zend/Optimizer/block_pass.c +++ b/Zend/Optimizer/block_pass.c @@ -613,53 +613,6 @@ static void zend_optimize_block(zend_basic_block *block, zend_op_array *op_array } break; - case ZEND_JMPZNZ: - while (1) { - if (opline->op1_type == IS_CONST) { - ++(*opt_count); - if (zend_is_true(&ZEND_OP1_LITERAL(opline))) { - zend_op *target_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline); - block->successors[0] = block->successors[1]; - } else { - zend_op *target_opline = ZEND_OP2_JMP_ADDR(opline); - ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline); - } - block->successors_count = 1; - opline->op1_type = IS_UNUSED; - opline->extended_value = 0; - opline->opcode = ZEND_JMP; - break; - } else if (opline->op1_type == IS_TMP_VAR && - !zend_bitset_in(used_ext, VAR_NUM(opline->op1.var))) { - src = VAR_SOURCE(opline->op1); - if (src) { - if (src->opcode == ZEND_BOOL_NOT) { - /* T = BOOL_NOT(X) + JMPZNZ(T,L1,L2) -> NOP, JMPZNZ(X,L2,L1) */ - uint32_t tmp; - - VAR_SOURCE(opline->op1) = NULL; - COPY_NODE(opline->op1, src->op1); - tmp = block->successors[0]; - block->successors[0] = block->successors[1]; - block->successors[1] = tmp; - MAKE_NOP(src); - ++(*opt_count); - continue; - } else if (src->opcode == ZEND_BOOL || - src->opcode == ZEND_QM_ASSIGN) { - VAR_SOURCE(opline->op1) = NULL; - COPY_NODE(opline->op1, src->op1); - MAKE_NOP(src); - ++(*opt_count); - continue; - } - } - } - break; - } - break; - case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: while (1) { @@ -1025,9 +978,6 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array, zend_op case ZEND_JMP: ZEND_SET_OP_JMP_ADDR(opline, opline->op1, new_opcodes + blocks[b->successors[0]].start); break; - case ZEND_JMPZNZ: - opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, new_opcodes + blocks[b->successors[1]].start); - ZEND_FALLTHROUGH; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -1239,20 +1189,7 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr block->len--; } else if (target_block->len == 1) { target = op_array->opcodes + target_block->start; - if (target->opcode == ZEND_JMPZNZ) { - /* JMP L, L: JMPZNZ L1,L2 -> JMPZNZ L1,L2 */ - *last_op = *target; - if (last_op->op1_type == IS_CONST) { - zval zv; - ZVAL_COPY(&zv, &ZEND_OP1_LITERAL(last_op)); - last_op->op1.constant = zend_optimizer_add_literal(op_array, &zv); - } - block->successors_count = 2; - block->successors[0] = target_block->successors[0]; - block->successors[1] = target_block->successors[1]; - ++(*opt_count); - goto optimize_jmpznz; - } else if ((target->opcode == ZEND_RETURN || + if ((target->opcode == ZEND_RETURN || target->opcode == ZEND_RETURN_BY_REF || target->opcode == ZEND_GENERATOR_RETURN || target->opcode == ZEND_EXIT) && @@ -1311,10 +1248,6 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr SAME_VAR(target->op1, last_op->op1)) { /* JMPZ(X, L), L: JMPNZ(X, L2) -> JMPZ(X, L+1) */ next = target_block->successors[1]; - } else if (target->opcode == ZEND_JMPZNZ && - SAME_VAR(target->op1, last_op->op1)) { - /* JMPZ(X, L), L: JMPZNZ(X, L2, L3) -> JMPZ(X, L2) */ - next = target_block->successors[last_op->opcode == ZEND_JMPNZ]; } else { break; } @@ -1366,16 +1299,6 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr break; } } - - /* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */ - if (last_op->opcode == ZEND_JMPZ) { - block->successors[1] = follow_block->successors[0]; - } else { - block->successors[1] = block->successors[0]; - block->successors[0] = follow_block->successors[0]; - } - last_op->opcode = ZEND_JMPZNZ; - ++(*opt_count); } } break; @@ -1402,11 +1325,6 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr SAME_VAR(target->op1, last_op->op1))) { /* T = JMPZ_EX(X, L1), L1: T = JMPZ_EX({X|T}, L2) -> T = JMPZ_EX(X, L2) */ next = target_block->successors[0]; - } else if (target->opcode == ZEND_JMPZNZ && - (SAME_VAR(target->op1, last_op->result) || - SAME_VAR(target->op1, last_op->op1))) { - /* T = JMPZ_EX(X, L), L: JMPZNZ({X|T}, L2, L3) -> T = JMPZ_EX(X, L2) */ - next = target_block->successors[last_op->opcode == ZEND_JMPNZ_EX]; } else if (target->opcode == INV_EX_COND(last_op->opcode) && (SAME_VAR(target->op1, last_op->result) || SAME_VAR(target->op1, last_op->op1))) { @@ -1453,85 +1371,6 @@ static void zend_jmp_optimization(zend_basic_block *block, zend_op_array *op_arr break; } break; - - case ZEND_JMPZNZ: { -optimize_jmpznz: - jmp_hitlist_count = 0; - target_block = get_target_block(cfg, block, 0, opt_count); - while (target_block->len == 1) { - target = op_array->opcodes + target_block->start; - - if (target->opcode == ZEND_JMP) { - /* JMPZNZ(X, L1, L2), L1: JMP(L3) -> JMPZNZ(X, L3, L2) */ - next = target_block->successors[0]; - } else if ((target->opcode == ZEND_JMPZ || target->opcode == ZEND_JMPZNZ) && - SAME_VAR(target->op1, last_op->op1)) { - /* JMPZNZ(X, L1, L2), L1: JMPZ(X, L3) -> JMPZNZ(X, L3, L2) */ - next = target_block->successors[0]; - } else if (target->opcode == ZEND_JMPNZ && - SAME_VAR(target->op1, last_op->op1)) { - /* JMPZNZ(X, L1, L2), L1: X = JMPNZ(X, L3) -> JMPZNZ(X, L1+1, L2) */ - next = target_block->successors[1]; - } else { - break; - } - CHECK_LOOP(next); - block->successors[0] = next; - ++(*opt_count); - target_block = get_target_block(cfg, block, 0, opt_count); - } - - jmp_hitlist_count = 0; - follow_block = get_target_block(cfg, block, 1, opt_count); - while (follow_block->len == 1) { - target = op_array->opcodes + follow_block->start; - - if (target->opcode == ZEND_JMP) { - /* JMPZNZ(X, L1, L2), L2: JMP(L3) -> JMPZNZ(X, L1, L3) */ - next = follow_block->successors[0]; - } else if (target->opcode == ZEND_JMPNZ && - SAME_VAR(target->op1, last_op->op1)) { - /* JMPZNZ(X, L1, L2), L2: X = JMPNZ(X, L3) -> JMPZNZ(X, L1, L3) */ - next = follow_block->successors[0]; - } else if ((target->opcode == ZEND_JMPZ || target->opcode == ZEND_JMPZNZ) && - SAME_VAR(target->op1, last_op->op1)) { - /* JMPZNZ(X, L1, L2), L2: JMPZ(X, L3) -> JMPZNZ(X, L1, L2+1) */ - next = follow_block->successors[1]; - } else { - break; - } - CHECK_LOOP(next); - block->successors[1] = next; - ++(*opt_count); - follow_block = get_target_block(cfg, block, 1, opt_count); - } - - next_block = get_next_block(cfg, block); - if (target_block == follow_block && - !(last_op->op1_type & (IS_VAR|IS_TMP_VAR))) { - /* JMPZNZ(?,L,L) -> JMP(L) */ - last_op->opcode = ZEND_JMP; - SET_UNUSED(last_op->op1); - SET_UNUSED(last_op->op2); - last_op->extended_value = 0; - block->successors_count = 1; - ++(*opt_count); - } else if (target_block == next_block) { - /* jumping to next on Z - can follow to it and jump only on NZ */ - /* JMPZNZ(X,L1,L2) L1: -> JMPNZ(X,L2) */ - int tmp = block->successors[0]; - last_op->opcode = ZEND_JMPNZ; - block->successors[0] = block->successors[1]; - block->successors[1] = tmp; - ++(*opt_count); - } else if (follow_block == next_block) { - /* jumping to next on NZ - can follow to it and jump only on Z */ - /* JMPZNZ(X,L1,L2) L2: -> JMPZ(X,L1) */ - last_op->opcode = ZEND_JMPZ; - ++(*opt_count); - } - break; - } } } diff --git a/Zend/Optimizer/dce.c b/Zend/Optimizer/dce.c index 087add4cbed66..6c7358daff266 100644 --- a/Zend/Optimizer/dce.c +++ b/Zend/Optimizer/dce.c @@ -139,7 +139,6 @@ static inline bool may_have_side_effects( case ZEND_JMP: case ZEND_JMPZ: case ZEND_JMPNZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: case ZEND_JMP_SET: diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c index 114a1b8ce243a..bcd114ecfbb94 100644 --- a/Zend/Optimizer/dfa_pass.c +++ b/Zend/Optimizer/dfa_pass.c @@ -627,11 +627,6 @@ static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa ZEND_ASSERT(ZEND_OP1_JMP_ADDR(opline) == op_array->opcodes + old->start); ZEND_SET_OP_JMP_ADDR(opline, opline->op1, op_array->opcodes + dst->start); break; - case ZEND_JMPZNZ: - if (ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) == old->start) { - opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, dst->start); - } - ZEND_FALLTHROUGH; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -809,49 +804,6 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa) } } break; - case ZEND_JMPZNZ: - if (opline->op1_type == IS_CONST) { - if (zend_is_true(CT_CONSTANT_EX(op_array, opline->op1.constant))) { - zend_op *target_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline); - take_successor_1(ssa, block_num, block); - } else { - zend_op *target_opline = ZEND_OP2_JMP_ADDR(opline); - ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline); - take_successor_0(ssa, block_num, block); - } - opline->op1_type = IS_UNUSED; - opline->extended_value = 0; - opline->opcode = ZEND_JMP; - goto optimize_jmp; - } else if (block->successors_count == 2) { - if (block->successors[0] == block->successors[1]) { - take_successor_0(ssa, block_num, block); - if (block->successors[0] == next_block_num && can_follow) { - if (opline->op1_type == IS_CV && (OP1_INFO() & MAY_BE_UNDEF)) { - opline->opcode = ZEND_CHECK_VAR; - opline->op2.num = 0; - } else if (opline->op1_type == IS_CV || !(OP1_INFO() & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { - zend_ssa_remove_instr(ssa, opline, ssa_op); - removed_ops++; - goto optimize_nop; - } else { - opline->opcode = ZEND_FREE; - opline->op2.num = 0; - } - } else if ((opline->op1_type == IS_CV && !(OP1_INFO() & MAY_BE_UNDEF)) || !(OP1_INFO() & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { - ZEND_ASSERT(ssa_op->op1_use >= 0); - zend_ssa_unlink_use_chain(ssa, op_num, ssa_op->op1_use); - ssa_op->op1_use = -1; - ssa_op->op1_use_chain = -1; - opline->opcode = ZEND_JMP; - opline->op1_type = IS_UNUSED; - opline->op1.num = opline->op2.num; - goto optimize_jmp; - } - } - } - break; case ZEND_JMPZ_EX: if (ssa->vars[ssa_op->result_def].use_chain < 0 && ssa->vars[ssa_op->result_def].phi_use_chain == NULL) { diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c index 4a8f4d4f8ecf9..770f4ce2dc231 100644 --- a/Zend/Optimizer/pass1.c +++ b/Zend/Optimizer/pass1.c @@ -335,23 +335,6 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) collect_constants = 0; break; - case ZEND_JMPZNZ: - if (opline->op1_type == IS_CONST) { - zend_op *target_opline; - - if (zend_is_true(&ZEND_OP1_LITERAL(opline))) { - target_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); /* JMPNZ */ - } else { - target_opline = ZEND_OP2_JMP_ADDR(opline); /* JMPZ */ - } - literal_dtor(&ZEND_OP1_LITERAL(opline)); - ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline); - opline->op1_type = IS_UNUSED; - opline->opcode = ZEND_JMP; - } - collect_constants = 0; - break; - case ZEND_RETURN: case ZEND_RETURN_BY_REF: case ZEND_GENERATOR_RETURN: diff --git a/Zend/Optimizer/pass3.c b/Zend/Optimizer/pass3.c index 39e1d65c20806..93e431fece440 100644 --- a/Zend/Optimizer/pass3.c +++ b/Zend/Optimizer/pass3.c @@ -86,19 +86,6 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (target == opline + 1) { /* convert L: JMP L+1 to NOP */ MAKE_NOP(opline); - } else if (target->opcode == ZEND_JMPZNZ) { - /* JMP L, L: JMPZNZ L1,L2 -> JMPZNZ L1,L2 */ - *opline = *target; - if (opline->op1_type == IS_CONST) { - zval zv; - ZVAL_COPY(&zv, &ZEND_OP1_LITERAL(opline)); - opline->op1.constant = zend_optimizer_add_literal(op_array, &zv); - } - /* Jump addresses may be encoded as offsets, recompute them. */ - ZEND_SET_OP_JMP_ADDR(opline, opline->op2, ZEND_OP2_JMP_ADDR(target)); - opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, - ZEND_OFFSET_TO_OPLINE(target, target->extended_value)); - goto optimize_jmpznz; } else if ((target->opcode == ZEND_RETURN || target->opcode == ZEND_RETURN_BY_REF || target->opcode == ZEND_GENERATOR_RETURN || @@ -117,15 +104,6 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) if (ZEND_OP2_JMP_ADDR(opline-1) == target) { /* JMPZ(X,L1), JMP(L1) -> NOP, JMP(L1) */ zend_optimizer_convert_to_free_op1(op_array, opline - 1); - } else { - /* JMPZ(X,L1), JMP(L2) -> JMPZNZ(X,L1,L2) */ - if ((opline-1)->opcode == ZEND_JMPZ) { - (opline-1)->extended_value = ZEND_OPLINE_TO_OFFSET((opline-1), target); - } else { - (opline-1)->extended_value = ZEND_OPLINE_TO_OFFSET((opline-1), ZEND_OP2_JMP_ADDR(opline-1)); - ZEND_SET_OP_JMP_ADDR((opline-1), (opline-1)->op2, target); - } - (opline-1)->opcode = ZEND_JMPZNZ; } } break; @@ -170,12 +148,6 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) /* convert JMPZ(X,L1), L1: JMPNZ(X,L2) to JMPZ(X,L1+1) */ target = target + 1; - } else if (target->opcode == ZEND_JMPZNZ && - SAME_VAR(opline->op1, target->op1)) { - target = (opline->opcode == ZEND_JMPZ) ? - ZEND_OP2_JMP_ADDR(target) : - ZEND_OFFSET_TO_OPLINE(target, target->extended_value); - CHECK_LOOP(target); } else if (target->opcode == ZEND_NOP) { target = target + 1; } else { @@ -216,14 +188,6 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) JMPZ_EX(X,L2) */ target = ZEND_OP2_JMP_ADDR(target); CHECK_LOOP(target); - } else if (target->opcode == ZEND_JMPZNZ && - (SAME_VAR(target->op1, opline->result) || - SAME_VAR(target->op1, opline->op1))) { - /* Check for JMPZNZ with same cond variable */ - target = (opline->opcode == ZEND_JMPZ_EX) ? - ZEND_OP2_JMP_ADDR(target) : - ZEND_OFFSET_TO_OPLINE(target, target->extended_value); - CHECK_LOOP(target); } else if (target->opcode == INV_EX_COND(opline->opcode) && (SAME_VAR(target->op1, opline->result) || SAME_VAR(target->op1, opline->op1))) { @@ -268,65 +232,6 @@ void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx) opline->op2.num = 0; } break; - - case ZEND_JMPZNZ: -optimize_jmpznz: - jmp_hitlist_count = 0; - target = ZEND_OP2_JMP_ADDR(opline); - while (1) { - if (target->opcode == ZEND_JMP) { - /* JMPZNZ(X,L1,L2), L1: JMP(L3) => JMPZNZ(X,L3,L2), L1: JMP(L3) */ - target = ZEND_OP1_JMP_ADDR(target); - CHECK_LOOP(target); - } else if ((target->opcode == ZEND_JMPZ || target->opcode == ZEND_JMPZNZ) && - SAME_VAR(target->op1, opline->op1)) { - /* JMPZNZ(X, L1, L2), L1: JMPZ(X, L3) -> JMPZNZ(X, L3, L2) */ - target = ZEND_OP2_JMP_ADDR(target); - CHECK_LOOP(target); - } else if (target->opcode == ZEND_JMPNZ && - SAME_VAR(target->op1, opline->op1)) { - /* JMPZNZ(X, L1, L2), L1: X = JMPNZ(X, L3) -> JMPZNZ(X, L1+1, L2) */ - target = target + 1; - } else if (target->opcode == ZEND_NOP) { - target = target + 1; - } else { - break; - } - ZEND_SET_OP_JMP_ADDR(opline, opline->op2, target); - } - - jmp_hitlist_count = 0; - target = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - while (1) { - if (target->opcode == ZEND_JMP) { - /* JMPZNZ(X,L1,L2), L2: JMP(L3) => JMPZNZ(X,L1,L3), L2: JMP(L3) */ - target = ZEND_OP1_JMP_ADDR(target); - CHECK_LOOP(target); - } else if (target->opcode == ZEND_JMPNZ && - SAME_VAR(target->op1, opline->op1)) { - /* JMPZNZ(X, L1, L2), L1: X = JMPNZ(X, L3) -> JMPZNZ(X, L1+1, L2) */ - target = ZEND_OP2_JMP_ADDR(target); - CHECK_LOOP(target); - } else if (target->opcode == ZEND_JMPZ && - SAME_VAR(target->op1, opline->op1)) { - /* JMPZNZ(X, L1, L2), L1: JMPZ(X, L3) -> JMPZNZ(X, L3, L2) */ - target = target + 1; - } else if (target->opcode == ZEND_JMPZNZ && - SAME_VAR(target->op1, opline->op1)) { - /* JMPZNZ(X, L1, L2), L1: JMPZ(X, L3) -> JMPZNZ(X, L3, L2) */ - target = ZEND_OFFSET_TO_OPLINE(target, target->extended_value); - CHECK_LOOP(target); - } else if (target->opcode == ZEND_NOP) { - target = target + 1; - } else { - break; - } - opline->extended_value = ZEND_OPLINE_TO_OFFSET(opline, target); - } - - /* Don't convert JMPZNZ back to JMPZ/JMPNZ, because the - following JMP is not removed yet. */ - break; } opline++; } diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 1e4e55e4f9266..69a7c4ed6a590 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -1786,7 +1786,6 @@ static void sccp_mark_feasible_successors( switch (opline->opcode) { case ZEND_JMPZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: { if (ct_eval_bool_cast(&zv, op1) == FAILURE) { diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index 380286cc0bf56..8b83ccad67726 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -76,7 +76,7 @@ static void zend_mark_reachable(zend_op *opcodes, zend_cfg *cfg, zend_basic_bloc } } else { ZEND_ASSERT(b->successors_count == 2); - if (i == 0 || opcode == ZEND_JMPZNZ) { + if (i == 0) { succ->flags |= ZEND_BB_TARGET; } else { succ->flags |= ZEND_BB_FOLLOW; @@ -361,13 +361,6 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, BB_START(i + 1); } break; - case ZEND_JMPZNZ: - BB_START(OP_JMP_ADDR(opline, opline->op2) - op_array->opcodes); - BB_START(ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)); - if (i + 1 < op_array->last) { - BB_START(i + 1); - } - break; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -519,11 +512,6 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, block->successors_count = 1; block->successors[0] = block_map[OP_JMP_ADDR(opline, opline->op1) - op_array->opcodes]; break; - case ZEND_JMPZNZ: - block->successors_count = 2; - block->successors[0] = block_map[OP_JMP_ADDR(opline, opline->op2) - op_array->opcodes]; - block->successors[1] = block_map[ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)]; - break; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: diff --git a/Zend/Optimizer/zend_cfg.h b/Zend/Optimizer/zend_cfg.h index 152502978dad4..93d455060686e 100644 --- a/Zend/Optimizer/zend_cfg.h +++ b/Zend/Optimizer/zend_cfg.h @@ -62,7 +62,6 @@ typedef struct _zend_basic_block { |JMP |ADR| | |OP1| - | |JMPZ | |ADR| |OP2|FOL| |JMPNZ | |ADR| |OP2|FOL| -|JMPZNZ | |ADR|ADR|OP2|EXT| |JMPZ_EX | |ADR| |OP2|FOL| |JMPNZ_EX | |ADR| |OP2|FOL| |JMP_SET | |ADR| |OP2|FOL| diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 25ce3527cebe3..4193c196e7356 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -4619,7 +4619,6 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op case ZEND_BOOL_NOT: case ZEND_JMPZ: case ZEND_JMPNZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: case ZEND_BOOL: diff --git a/Zend/Optimizer/zend_optimizer.c b/Zend/Optimizer/zend_optimizer.c index 58512f751b667..e7d429ddeff47 100644 --- a/Zend/Optimizer/zend_optimizer.c +++ b/Zend/Optimizer/zend_optimizer.c @@ -704,9 +704,6 @@ void zend_optimizer_migrate_jump(zend_op_array *op_array, zend_op *new_opline, z case ZEND_FAST_CALL: ZEND_SET_OP_JMP_ADDR(new_opline, new_opline->op1, ZEND_OP1_JMP_ADDR(opline)); break; - case ZEND_JMPZNZ: - new_opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, new_opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)); - ZEND_FALLTHROUGH; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -750,9 +747,6 @@ void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_ case ZEND_FAST_CALL: ZEND_SET_OP_JMP_ADDR(opline, opline->op1, ZEND_OP1_JMP_ADDR(opline) - shiftlist[ZEND_OP1_JMP_ADDR(opline) - op_array->opcodes]); break; - case ZEND_JMPZNZ: - opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value) - shiftlist[ZEND_OFFSET_TO_OPLINE_NUM(op_array, opline, opline->extended_value)]); - ZEND_FALLTHROUGH; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -1139,9 +1133,6 @@ static void zend_redo_pass_two(zend_op_array *op_array) case ZEND_FAST_CALL: opline->op1.jmp_addr = &op_array->opcodes[opline->op1.jmp_addr - old_opcodes]; break; - case ZEND_JMPZNZ: - /* relative extended_value don't have to be changed */ - /* break omitted intentionally */ case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -1262,9 +1253,6 @@ static void zend_redo_pass_two_ex(zend_op_array *op_array, zend_ssa *ssa) case ZEND_FAST_CALL: opline->op1.jmp_addr = &op_array->opcodes[opline->op1.jmp_addr - old_opcodes]; break; - case ZEND_JMPZNZ: - /* relative extended_value don't have to be changed */ - /* break omitted intentionally */ case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 2cd1d4276e7fa..11f25b6825fee 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -257,7 +257,6 @@ static void place_essa_pis( */ switch (opline->opcode) { case ZEND_JMPZ: - case ZEND_JMPZNZ: bf = blocks[j].successors[0]; bt = blocks[j].successors[1]; break; diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index b215e5120af5b..830c63aaae0e3 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -1077,10 +1077,6 @@ ZEND_API void pass_two(zend_op_array *op_array) case ZEND_JMP: ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); break; - case ZEND_JMPZNZ: - /* absolute index to relative offset */ - opline->extended_value = ZEND_OPLINE_NUM_TO_OFFSET(op_array, opline, opline->extended_value); - ZEND_FALLTHROUGH; case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f0ad4037eb145..dffd3924be82b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3010,41 +3010,6 @@ ZEND_VM_HOT_NOCONST_HANDLER(44, ZEND_JMPNZ, CONST|TMPVAR|CV, JMP_ADDR) ZEND_VM_JMP(opline); } -ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMPVAR|CV, JMP_ADDR, JMP_ADDR) -{ - USE_OPLINE - zval *val; - zend_uchar op1_type; - - val = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); - - if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); - } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - ZVAL_UNDEFINED_OP1(); - if (UNEXPECTED(EG(exception))) { - HANDLE_EXCEPTION(); - } - } - ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0); - } - - SAVE_OPLINE(); - op1_type = OP1_TYPE; - if (i_zend_is_true(val)) { - opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - } else { - opline = OP_JMP_ADDR(opline, opline->op2); - } - if (op1_type & (IS_TMP_VAR|IS_VAR)) { - zval_ptr_dtor_nogc(val); - } - ZEND_VM_JMP(opline); -} - ZEND_VM_COLD_CONST_HANDLER(46, ZEND_JMPZ_EX, CONST|TMPVAR|CV, JMP_ADDR) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 78dab76a303fb..7e4078a7a2da7 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4086,41 +4086,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_ ZEND_VM_JMP(opline); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zval *val; - zend_uchar op1_type; - - val = RT_CONSTANT(opline, opline->op1); - - if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); - } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - ZVAL_UNDEFINED_OP1(); - if (UNEXPECTED(EG(exception))) { - HANDLE_EXCEPTION(); - } - } - ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0); - } - - SAVE_OPLINE(); - op1_type = IS_CONST; - if (i_zend_is_true(val)) { - opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - } else { - opline = OP_JMP_ADDR(opline, opline->op2); - } - if (op1_type & (IS_TMP_VAR|IS_VAR)) { - zval_ptr_dtor_nogc(val); - } - ZEND_VM_JMP(opline); -} - static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -14241,41 +14206,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMPVAR_ ZEND_VM_JMP(opline); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zval *val; - zend_uchar op1_type; - - val = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC); - - if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); - } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - ZVAL_UNDEFINED_OP1(); - if (UNEXPECTED(EG(exception))) { - HANDLE_EXCEPTION(); - } - } - ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0); - } - - SAVE_OPLINE(); - op1_type = (IS_TMP_VAR|IS_VAR); - if (i_zend_is_true(val)) { - opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - } else { - opline = OP_JMP_ADDR(opline, opline->op2); - } - if (op1_type & (IS_TMP_VAR|IS_VAR)) { - zval_ptr_dtor_nogc(val); - } - ZEND_VM_JMP(opline); -} - static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -38123,41 +38053,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HAND ZEND_VM_JMP(opline); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zval *val; - zend_uchar op1_type; - - val = EX_VAR(opline->op1.var); - - if (EXPECTED(Z_TYPE_INFO_P(val) == IS_TRUE)) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); - ZEND_VM_CONTINUE(); - } else if (EXPECTED(Z_TYPE_INFO_P(val) <= IS_TRUE)) { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(val) == IS_UNDEF)) { - SAVE_OPLINE(); - ZVAL_UNDEFINED_OP1(); - if (UNEXPECTED(EG(exception))) { - HANDLE_EXCEPTION(); - } - } - ZEND_VM_JMP_EX(OP_JMP_ADDR(opline, opline->op2), 0); - } - - SAVE_OPLINE(); - op1_type = IS_CV; - if (i_zend_is_true(val)) { - opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value); - } else { - opline = OP_JMP_ADDR(opline, opline->op2); - } - if (op1_type & (IS_TMP_VAR|IS_VAR)) { - zval_ptr_dtor_nogc(val); - } - ZEND_VM_JMP(opline); -} - static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -53094,11 +52989,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_JMPNZ_SPEC_TMPVAR_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_JMPNZ_SPEC_CV_LABEL, - (void*)&&ZEND_JMPZNZ_SPEC_CONST_LABEL, - (void*)&&ZEND_JMPZNZ_SPEC_TMPVAR_LABEL, - (void*)&&ZEND_JMPZNZ_SPEC_TMPVAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_JMPZNZ_SPEC_CV_LABEL, (void*)&&ZEND_JMPZ_EX_SPEC_CONST_LABEL, (void*)&&ZEND_JMPZ_EX_SPEC_TMPVAR_LABEL, (void*)&&ZEND_JMPZ_EX_SPEC_TMPVAR_LABEL, @@ -55718,10 +55608,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_JMPNZ_SPEC_CONST) ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_JMPZNZ_SPEC_CONST): - VM_TRACE(ZEND_JMPZNZ_SPEC_CONST) - ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); HYBRID_CASE(ZEND_JMPZ_EX_SPEC_CONST): VM_TRACE(ZEND_JMPZ_EX_SPEC_CONST) ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -56997,10 +56883,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_JMPNZ_SPEC_TMPVAR) ZEND_JMPNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_JMPZNZ_SPEC_TMPVAR): - VM_TRACE(ZEND_JMPZNZ_SPEC_TMPVAR) - ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); HYBRID_CASE(ZEND_JMPZ_EX_SPEC_TMPVAR): VM_TRACE(ZEND_JMPZ_EX_SPEC_TMPVAR) ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -58763,10 +58645,6 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_JMPNZ_SPEC_CV) ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_JMPZNZ_SPEC_CV): - VM_TRACE(ZEND_JMPZNZ_SPEC_CV) - ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); HYBRID_CASE(ZEND_JMPZ_EX_SPEC_CV): VM_TRACE(ZEND_JMPZ_EX_SPEC_CV) ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -61154,11 +61032,6 @@ void zend_vm_init(void) ZEND_JMPNZ_SPEC_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_JMPNZ_SPEC_CV_HANDLER, - ZEND_JMPZNZ_SPEC_CONST_HANDLER, - ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER, - ZEND_JMPZNZ_SPEC_TMPVAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_JMPZNZ_SPEC_CV_HANDLER, ZEND_JMPZ_EX_SPEC_CONST_HANDLER, ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER, ZEND_JMPZ_EX_SPEC_TMPVAR_HANDLER, @@ -63389,165 +63262,165 @@ void zend_vm_init(void) 1255, 1256 | SPEC_RULE_OP1, 1261 | SPEC_RULE_OP1, + 3448, 1266 | SPEC_RULE_OP1, 1271 | SPEC_RULE_OP1, - 1276 | SPEC_RULE_OP1, - 1281 | SPEC_RULE_OP2, - 1286, - 1287 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, + 1276 | SPEC_RULE_OP2, + 1281, + 1282 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, + 1292 | SPEC_RULE_OP1, 1297 | SPEC_RULE_OP1, - 1302 | SPEC_RULE_OP1, - 1307 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1302 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1327 | SPEC_RULE_OP2, 1332 | SPEC_RULE_OP2, 1337 | SPEC_RULE_OP2, - 1342 | SPEC_RULE_OP2, - 1347, - 1348, + 1342, + 1343, + 1344, + 1345 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER, 1349, - 1350 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER, - 1354, - 1355 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, - 1365, - 1366, - 1367 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1392 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, - 1442 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1467 | SPEC_RULE_OP1, - 1472, - 1473, - 1474 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1499 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1524 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, - 1534 | SPEC_RULE_OP1, - 1539 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1564 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1589 | SPEC_RULE_OP1, - 1594, - 1595, - 1596 | SPEC_RULE_OP1, - 1601 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1626 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1651 | SPEC_RULE_OP1, - 1656 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1681 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1706 | SPEC_RULE_OP1, - 1711 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1736 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1761 | SPEC_RULE_OP1, - 1766 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1791 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1816 | SPEC_RULE_OP1, - 1821 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1846 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1871 | SPEC_RULE_OP1, - 1876 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1901 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1926 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1951, - 1952 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, - 1962, - 1963, - 1964, - 1965, - 1966, - 1967 | SPEC_RULE_OP2, - 1972, - 1973 | SPEC_RULE_OP1, - 1978 | SPEC_RULE_OP2, - 1983 | SPEC_RULE_OP1, - 1988 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, - 1998 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2048 | SPEC_RULE_OP1, - 2053 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2078 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, - 2128 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2153 | SPEC_RULE_OP2, - 2158, + 1350 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, + 1360, + 1361, + 1362 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1387 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, + 1437 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1462 | SPEC_RULE_OP1, + 1467, + 1468, + 1469 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1494 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1519 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, + 1529 | SPEC_RULE_OP1, + 1534 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1559 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1584 | SPEC_RULE_OP1, + 1589, + 1590, + 1591 | SPEC_RULE_OP1, + 1596 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1621 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1646 | SPEC_RULE_OP1, + 1651 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1676 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1701 | SPEC_RULE_OP1, + 1706 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1731 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1756 | SPEC_RULE_OP1, + 1761 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1786 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1811 | SPEC_RULE_OP1, + 1816 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1841 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1866 | SPEC_RULE_OP1, + 1871 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1896 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1921 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1946, + 1947 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962 | SPEC_RULE_OP2, + 1967, + 1968 | SPEC_RULE_OP1, + 1973 | SPEC_RULE_OP2, + 1978 | SPEC_RULE_OP1, + 1983 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, + 1993 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2018 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2043 | SPEC_RULE_OP1, + 2048 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2073 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG, + 2123 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2148 | SPEC_RULE_OP2, + 2153, + 2154 | SPEC_RULE_OP1, 2159 | SPEC_RULE_OP1, - 2164 | SPEC_RULE_OP1, - 2169, + 2164, + 2165 | SPEC_RULE_OP1, 2170 | SPEC_RULE_OP1, 2175 | SPEC_RULE_OP1, - 2180 | SPEC_RULE_OP1, - 2185, - 2186, - 2187 | SPEC_RULE_OP2, - 2192 | SPEC_RULE_RETVAL, - 2194 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER, - 2198 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER, - 2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2252 | SPEC_RULE_OP1, - 2257, - 2258 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2283, - 2284 | SPEC_RULE_OP1, + 2180, + 2181, + 2182 | SPEC_RULE_OP2, + 2187 | SPEC_RULE_RETVAL, + 2189 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER, + 2193 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER, + 2197 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2197 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2222 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2222 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2247 | SPEC_RULE_OP1, + 2252, + 2253 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2278, + 2279 | SPEC_RULE_OP1, + 2284, + 2285, + 2286, + 2287, + 2288, 2289, 2290, - 2291, - 2292, - 2293, - 2294, - 2295, - 2296 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2321, - 2322, - 2323, - 2324 | SPEC_RULE_OP1, - 2329, - 2330 | SPEC_RULE_ISSET, - 2332 | SPEC_RULE_OP2, - 2337, - 2338 | SPEC_RULE_OP1, - 2343 | SPEC_RULE_OBSERVER, - 2345, - 2346 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2371 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, - 2381, - 2382, - 2383, - 2384, - 2385 | SPEC_RULE_OP1, - 2390, - 2391, - 2392 | SPEC_RULE_OP1, - 2397 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2422, - 2423 | SPEC_RULE_OP1, + 2291 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2316, + 2317, + 2318, + 2319 | SPEC_RULE_OP1, + 2324, + 2325 | SPEC_RULE_ISSET, + 2327 | SPEC_RULE_OP2, + 2332, + 2333 | SPEC_RULE_OP1, + 2338 | SPEC_RULE_OBSERVER, + 2340, + 2341 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2366 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER, + 2376, + 2377, + 2378, + 2379, + 2380 | SPEC_RULE_OP1, + 2385, + 2386, + 2387 | SPEC_RULE_OP1, + 2392 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2417, + 2418 | SPEC_RULE_OP1, + 2423, + 2424, + 2425, + 2426, + 2427, 2428, 2429, 2430, - 2431, - 2432, - 2433, - 2434, - 2435, - 2436 | SPEC_RULE_OP1, - 2441, - 2442, - 2443, - 2444 | SPEC_RULE_OP2, - 2449, + 2431 | SPEC_RULE_OP1, + 2436, + 2437, + 2438, + 2439 | SPEC_RULE_OP2, + 2444, + 2445 | SPEC_RULE_OP1, 2450 | SPEC_RULE_OP1, 2455 | SPEC_RULE_OP1, 2460 | SPEC_RULE_OP1, 2465 | SPEC_RULE_OP1, - 2470 | SPEC_RULE_OP1, - 2475, - 2476 | SPEC_RULE_OP1, - 2481 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2506 | SPEC_RULE_OP1, - 2511 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2470, + 2471 | SPEC_RULE_OP1, + 2476 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2501 | SPEC_RULE_OP1, + 2506 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2531 | SPEC_RULE_OP1, 2536 | SPEC_RULE_OP1, - 2541 | SPEC_RULE_OP1, - 2546, - 2547, - 2548, - 2549, - 3453 + 2541, + 2542, + 2543, + 2544, + 3448 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -63720,7 +63593,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2552 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2547 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -63728,7 +63601,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2577 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2572 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -63736,7 +63609,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2602 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -63747,17 +63620,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2627 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2622 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2652 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2647 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2677 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 2672 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -63768,17 +63641,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2702 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2697 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2727 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2722 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2752 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 2747 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_IDENTICAL: @@ -63789,14 +63662,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2777 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2772 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2852 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2847 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) { - spec = 3077 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3072 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_IDENTICAL: @@ -63807,14 +63680,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2927 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2922 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3002 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2997 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) { - spec = 3082 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3077 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -63825,12 +63698,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2777 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2772 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2852 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2847 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -63841,12 +63714,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 2927 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2922 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3002 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 2997 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -63854,12 +63727,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3087 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3082 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3162 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3157 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -63867,74 +63740,74 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3237 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3232 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3312 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3307 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_LONG) { - spec = 3399 | SPEC_RULE_OP1; + spec = 3394 | SPEC_RULE_OP1; } else if (op1_info == MAY_BE_DOUBLE) { - spec = 3404 | SPEC_RULE_OP1; + spec = 3399 | SPEC_RULE_OP1; } else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { - spec = 3409 | SPEC_RULE_OP1; + spec = 3404 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3387 | SPEC_RULE_RETVAL; + spec = 3382 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3389 | SPEC_RULE_RETVAL; + spec = 3384 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3391 | SPEC_RULE_RETVAL; + spec = 3386 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 3393 | SPEC_RULE_RETVAL; + spec = 3388 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3395; + spec = 3390; } else if (op1_info == MAY_BE_LONG) { - spec = 3396; + spec = 3391; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 3397; + spec = 3392; } else if (op1_info == MAY_BE_LONG) { - spec = 3398; + spec = 3393; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 2551; + spec = 2546; } break; case ZEND_RECV: if (op->op2.num == MAY_BE_ANY) { - spec = 2550; + spec = 2545; } break; case ZEND_SEND_VAL: if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { - spec = 3449; + spec = 3444; } break; case ZEND_SEND_VAR_EX: if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3444 | SPEC_RULE_OP1; + spec = 3439 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 3451 | SPEC_RULE_RETVAL; + spec = 3446 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -63942,17 +63815,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3414 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3409 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAL_EX: if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) { - spec = 3450; + spec = 3445; } break; case ZEND_SEND_VAR: if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 3439 | SPEC_RULE_OP1; + spec = 3434 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index a5796187e11be..6ac1fba363417 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -575,1278 +575,1274 @@ _(1262, ZEND_JMPNZ_SPEC_TMPVAR) \ _(1263, ZEND_JMPNZ_SPEC_TMPVAR) \ _(1265, ZEND_JMPNZ_SPEC_CV) \ - _(1266, ZEND_JMPZNZ_SPEC_CONST) \ - _(1267, ZEND_JMPZNZ_SPEC_TMPVAR) \ - _(1268, ZEND_JMPZNZ_SPEC_TMPVAR) \ - _(1270, ZEND_JMPZNZ_SPEC_CV) \ - _(1271, ZEND_JMPZ_EX_SPEC_CONST) \ - _(1272, ZEND_JMPZ_EX_SPEC_TMPVAR) \ - _(1273, ZEND_JMPZ_EX_SPEC_TMPVAR) \ - _(1275, ZEND_JMPZ_EX_SPEC_CV) \ - _(1276, ZEND_JMPNZ_EX_SPEC_CONST) \ - _(1277, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ - _(1278, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ - _(1280, ZEND_JMPNZ_EX_SPEC_CV) \ - _(1281, ZEND_CASE_SPEC_TMPVAR_CONST) \ - _(1282, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ - _(1283, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ - _(1285, ZEND_CASE_SPEC_TMPVAR_CV) \ - _(1286, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \ - _(1287, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \ - _(1288, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \ - _(1293, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED) \ - _(1294, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED_QUICK) \ - _(1297, ZEND_CAST_SPEC_CONST) \ - _(1298, ZEND_CAST_SPEC_TMP) \ - _(1299, ZEND_CAST_SPEC_VAR) \ - _(1301, ZEND_CAST_SPEC_CV) \ - _(1302, ZEND_BOOL_SPEC_CONST) \ - _(1303, ZEND_BOOL_SPEC_TMPVAR) \ - _(1304, ZEND_BOOL_SPEC_TMPVAR) \ - _(1306, ZEND_BOOL_SPEC_CV) \ - _(1307, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \ - _(1308, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ - _(1309, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ - _(1311, ZEND_FAST_CONCAT_SPEC_CONST_CV) \ + _(1266, ZEND_JMPZ_EX_SPEC_CONST) \ + _(1267, ZEND_JMPZ_EX_SPEC_TMPVAR) \ + _(1268, ZEND_JMPZ_EX_SPEC_TMPVAR) \ + _(1270, ZEND_JMPZ_EX_SPEC_CV) \ + _(1271, ZEND_JMPNZ_EX_SPEC_CONST) \ + _(1272, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ + _(1273, ZEND_JMPNZ_EX_SPEC_TMPVAR) \ + _(1275, ZEND_JMPNZ_EX_SPEC_CV) \ + _(1276, ZEND_CASE_SPEC_TMPVAR_CONST) \ + _(1277, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ + _(1278, ZEND_CASE_SPEC_TMPVAR_TMPVAR) \ + _(1280, ZEND_CASE_SPEC_TMPVAR_CV) \ + _(1281, ZEND_CHECK_VAR_SPEC_CV_UNUSED) \ + _(1282, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \ + _(1283, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_CONST) \ + _(1288, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED) \ + _(1289, ZEND_SEND_VAR_NO_REF_EX_SPEC_VAR_UNUSED_QUICK) \ + _(1292, ZEND_CAST_SPEC_CONST) \ + _(1293, ZEND_CAST_SPEC_TMP) \ + _(1294, ZEND_CAST_SPEC_VAR) \ + _(1296, ZEND_CAST_SPEC_CV) \ + _(1297, ZEND_BOOL_SPEC_CONST) \ + _(1298, ZEND_BOOL_SPEC_TMPVAR) \ + _(1299, ZEND_BOOL_SPEC_TMPVAR) \ + _(1301, ZEND_BOOL_SPEC_CV) \ + _(1302, ZEND_FAST_CONCAT_SPEC_CONST_CONST) \ + _(1303, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ + _(1304, ZEND_FAST_CONCAT_SPEC_CONST_TMPVAR) \ + _(1306, ZEND_FAST_CONCAT_SPEC_CONST_CV) \ + _(1307, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ + _(1308, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ + _(1309, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ + _(1311, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ _(1312, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ _(1313, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ _(1314, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ _(1316, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ - _(1317, ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) \ - _(1318, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ - _(1319, ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR) \ - _(1321, ZEND_FAST_CONCAT_SPEC_TMPVAR_CV) \ - _(1327, ZEND_FAST_CONCAT_SPEC_CV_CONST) \ - _(1328, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ - _(1329, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ - _(1331, ZEND_FAST_CONCAT_SPEC_CV_CV) \ - _(1332, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \ - _(1333, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ - _(1334, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ - _(1336, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \ - _(1337, ZEND_ROPE_ADD_SPEC_TMP_CONST) \ - _(1338, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ - _(1339, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ - _(1341, ZEND_ROPE_ADD_SPEC_TMP_CV) \ - _(1342, ZEND_ROPE_END_SPEC_TMP_CONST) \ - _(1343, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ - _(1344, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ - _(1346, ZEND_ROPE_END_SPEC_TMP_CV) \ - _(1347, ZEND_BEGIN_SILENCE_SPEC) \ - _(1348, ZEND_END_SILENCE_SPEC_TMP) \ - _(1349, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \ - _(1350, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \ - _(1351, ZEND_DO_FCALL_SPEC_RETVAL_USED) \ - _(1352, ZEND_DO_FCALL_SPEC_OBSERVER) \ - _(1353, ZEND_DO_FCALL_SPEC_OBSERVER) \ - _(1354, ZEND_INIT_FCALL_SPEC_CONST) \ - _(1355, ZEND_RETURN_SPEC_CONST) \ - _(1356, ZEND_RETURN_SPEC_OBSERVER) \ - _(1357, ZEND_RETURN_SPEC_TMP) \ - _(1358, ZEND_RETURN_SPEC_OBSERVER) \ - _(1359, ZEND_RETURN_SPEC_VAR) \ - _(1360, ZEND_RETURN_SPEC_OBSERVER) \ - _(1363, ZEND_RETURN_SPEC_CV) \ - _(1364, ZEND_RETURN_SPEC_OBSERVER) \ - _(1365, ZEND_RECV_SPEC_UNUSED) \ - _(1366, ZEND_RECV_INIT_SPEC_CONST) \ - _(1367, ZEND_SEND_VAL_SPEC_CONST_CONST) \ - _(1370, ZEND_SEND_VAL_SPEC_CONST_UNUSED) \ + _(1322, ZEND_FAST_CONCAT_SPEC_CV_CONST) \ + _(1323, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ + _(1324, ZEND_FAST_CONCAT_SPEC_CV_TMPVAR) \ + _(1326, ZEND_FAST_CONCAT_SPEC_CV_CV) \ + _(1327, ZEND_ROPE_INIT_SPEC_UNUSED_CONST) \ + _(1328, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ + _(1329, ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR) \ + _(1331, ZEND_ROPE_INIT_SPEC_UNUSED_CV) \ + _(1332, ZEND_ROPE_ADD_SPEC_TMP_CONST) \ + _(1333, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ + _(1334, ZEND_ROPE_ADD_SPEC_TMP_TMPVAR) \ + _(1336, ZEND_ROPE_ADD_SPEC_TMP_CV) \ + _(1337, ZEND_ROPE_END_SPEC_TMP_CONST) \ + _(1338, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ + _(1339, ZEND_ROPE_END_SPEC_TMP_TMPVAR) \ + _(1341, ZEND_ROPE_END_SPEC_TMP_CV) \ + _(1342, ZEND_BEGIN_SILENCE_SPEC) \ + _(1343, ZEND_END_SILENCE_SPEC_TMP) \ + _(1344, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \ + _(1345, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \ + _(1346, ZEND_DO_FCALL_SPEC_RETVAL_USED) \ + _(1347, ZEND_DO_FCALL_SPEC_OBSERVER) \ + _(1348, ZEND_DO_FCALL_SPEC_OBSERVER) \ + _(1349, ZEND_INIT_FCALL_SPEC_CONST) \ + _(1350, ZEND_RETURN_SPEC_CONST) \ + _(1351, ZEND_RETURN_SPEC_OBSERVER) \ + _(1352, ZEND_RETURN_SPEC_TMP) \ + _(1353, ZEND_RETURN_SPEC_OBSERVER) \ + _(1354, ZEND_RETURN_SPEC_VAR) \ + _(1355, ZEND_RETURN_SPEC_OBSERVER) \ + _(1358, ZEND_RETURN_SPEC_CV) \ + _(1359, ZEND_RETURN_SPEC_OBSERVER) \ + _(1360, ZEND_RECV_SPEC_UNUSED) \ + _(1361, ZEND_RECV_INIT_SPEC_CONST) \ + _(1362, ZEND_SEND_VAL_SPEC_CONST_CONST) \ + _(1365, ZEND_SEND_VAL_SPEC_CONST_UNUSED) \ + _(1367, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \ + _(1370, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \ _(1372, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \ _(1375, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \ - _(1377, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \ - _(1380, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \ - _(1412, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \ - _(1413, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \ - _(1418, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED) \ - _(1419, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_QUICK) \ - _(1432, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \ - _(1433, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \ - _(1438, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED) \ - _(1439, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_QUICK) \ - _(1452, ZEND_SEND_REF_SPEC_VAR_CONST) \ - _(1455, ZEND_SEND_REF_SPEC_VAR_UNUSED) \ - _(1462, ZEND_SEND_REF_SPEC_CV_CONST) \ - _(1465, ZEND_SEND_REF_SPEC_CV_UNUSED) \ - _(1467, ZEND_NEW_SPEC_CONST_UNUSED) \ - _(1469, ZEND_NEW_SPEC_VAR_UNUSED) \ - _(1470, ZEND_NEW_SPEC_UNUSED_UNUSED) \ - _(1472, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \ - _(1473, ZEND_FREE_SPEC_TMPVAR) \ - _(1474, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \ - _(1475, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ - _(1476, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ - _(1477, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \ - _(1478, ZEND_INIT_ARRAY_SPEC_CONST_CV) \ - _(1479, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \ - _(1480, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ - _(1481, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ - _(1482, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \ - _(1483, ZEND_INIT_ARRAY_SPEC_TMP_CV) \ - _(1484, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \ - _(1485, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ - _(1486, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ - _(1487, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \ - _(1488, ZEND_INIT_ARRAY_SPEC_VAR_CV) \ - _(1489, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \ - _(1490, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \ - _(1491, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \ - _(1492, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \ - _(1493, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \ - _(1494, ZEND_INIT_ARRAY_SPEC_CV_CONST) \ - _(1495, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ - _(1496, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ - _(1497, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \ - _(1498, ZEND_INIT_ARRAY_SPEC_CV_CV) \ - _(1499, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \ - _(1500, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ - _(1501, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ - _(1502, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \ - _(1503, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \ - _(1504, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \ - _(1505, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ - _(1506, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ - _(1507, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \ - _(1508, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \ - _(1509, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \ - _(1510, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ - _(1511, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ - _(1512, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \ - _(1513, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \ - _(1519, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \ - _(1520, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ - _(1521, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ - _(1522, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \ - _(1523, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \ - _(1524, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \ - _(1525, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ - _(1526, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ - _(1527, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ - _(1528, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ - _(1529, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ - _(1532, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \ - _(1533, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ - _(1534, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \ - _(1535, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ - _(1536, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ - _(1538, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \ - _(1549, ZEND_UNSET_DIM_SPEC_VAR_CONST) \ - _(1550, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ - _(1551, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ - _(1553, ZEND_UNSET_DIM_SPEC_VAR_CV) \ - _(1559, ZEND_UNSET_DIM_SPEC_CV_CONST) \ - _(1560, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ - _(1561, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ - _(1563, ZEND_UNSET_DIM_SPEC_CV_CV) \ - _(1574, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \ - _(1575, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ - _(1576, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ - _(1578, ZEND_UNSET_OBJ_SPEC_VAR_CV) \ - _(1579, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \ - _(1580, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ - _(1581, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ - _(1583, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \ - _(1584, ZEND_UNSET_OBJ_SPEC_CV_CONST) \ - _(1585, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ - _(1586, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ - _(1588, ZEND_UNSET_OBJ_SPEC_CV_CV) \ - _(1589, ZEND_FE_RESET_R_SPEC_CONST) \ - _(1590, ZEND_FE_RESET_R_SPEC_TMP) \ - _(1591, ZEND_FE_RESET_R_SPEC_VAR) \ - _(1593, ZEND_FE_RESET_R_SPEC_CV) \ - _(1594, ZEND_FE_FETCH_R_SPEC_VAR) \ - _(1595, ZEND_EXIT_SPEC) \ - _(1596, ZEND_FETCH_R_SPEC_CONST_UNUSED) \ - _(1597, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ - _(1598, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ - _(1600, ZEND_FETCH_R_SPEC_CV_UNUSED) \ - _(1601, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \ - _(1602, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ - _(1603, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ - _(1605, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \ + _(1407, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \ + _(1408, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \ + _(1413, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED) \ + _(1414, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_QUICK) \ + _(1427, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \ + _(1428, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \ + _(1433, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED) \ + _(1434, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_QUICK) \ + _(1447, ZEND_SEND_REF_SPEC_VAR_CONST) \ + _(1450, ZEND_SEND_REF_SPEC_VAR_UNUSED) \ + _(1457, ZEND_SEND_REF_SPEC_CV_CONST) \ + _(1460, ZEND_SEND_REF_SPEC_CV_UNUSED) \ + _(1462, ZEND_NEW_SPEC_CONST_UNUSED) \ + _(1464, ZEND_NEW_SPEC_VAR_UNUSED) \ + _(1465, ZEND_NEW_SPEC_UNUSED_UNUSED) \ + _(1467, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \ + _(1468, ZEND_FREE_SPEC_TMPVAR) \ + _(1469, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \ + _(1470, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ + _(1471, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \ + _(1472, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \ + _(1473, ZEND_INIT_ARRAY_SPEC_CONST_CV) \ + _(1474, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \ + _(1475, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ + _(1476, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \ + _(1477, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \ + _(1478, ZEND_INIT_ARRAY_SPEC_TMP_CV) \ + _(1479, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \ + _(1480, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ + _(1481, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \ + _(1482, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \ + _(1483, ZEND_INIT_ARRAY_SPEC_VAR_CV) \ + _(1484, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \ + _(1485, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \ + _(1486, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \ + _(1487, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \ + _(1488, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \ + _(1489, ZEND_INIT_ARRAY_SPEC_CV_CONST) \ + _(1490, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ + _(1491, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \ + _(1492, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \ + _(1493, ZEND_INIT_ARRAY_SPEC_CV_CV) \ + _(1494, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \ + _(1495, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ + _(1496, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \ + _(1497, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \ + _(1498, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \ + _(1499, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \ + _(1500, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ + _(1501, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \ + _(1502, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \ + _(1503, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \ + _(1504, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \ + _(1505, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ + _(1506, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \ + _(1507, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \ + _(1508, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \ + _(1514, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \ + _(1515, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ + _(1516, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \ + _(1517, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \ + _(1518, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \ + _(1519, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \ + _(1520, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ + _(1521, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ + _(1522, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ + _(1523, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \ + _(1524, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ + _(1527, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \ + _(1528, ZEND_INCLUDE_OR_EVAL_SPEC_OBSERVER) \ + _(1529, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \ + _(1530, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ + _(1531, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \ + _(1533, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \ + _(1544, ZEND_UNSET_DIM_SPEC_VAR_CONST) \ + _(1545, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ + _(1546, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \ + _(1548, ZEND_UNSET_DIM_SPEC_VAR_CV) \ + _(1554, ZEND_UNSET_DIM_SPEC_CV_CONST) \ + _(1555, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ + _(1556, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \ + _(1558, ZEND_UNSET_DIM_SPEC_CV_CV) \ + _(1569, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \ + _(1570, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ + _(1571, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \ + _(1573, ZEND_UNSET_OBJ_SPEC_VAR_CV) \ + _(1574, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \ + _(1575, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ + _(1576, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \ + _(1578, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \ + _(1579, ZEND_UNSET_OBJ_SPEC_CV_CONST) \ + _(1580, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ + _(1581, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \ + _(1583, ZEND_UNSET_OBJ_SPEC_CV_CV) \ + _(1584, ZEND_FE_RESET_R_SPEC_CONST) \ + _(1585, ZEND_FE_RESET_R_SPEC_TMP) \ + _(1586, ZEND_FE_RESET_R_SPEC_VAR) \ + _(1588, ZEND_FE_RESET_R_SPEC_CV) \ + _(1589, ZEND_FE_FETCH_R_SPEC_VAR) \ + _(1590, ZEND_EXIT_SPEC) \ + _(1591, ZEND_FETCH_R_SPEC_CONST_UNUSED) \ + _(1592, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ + _(1593, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \ + _(1595, ZEND_FETCH_R_SPEC_CV_UNUSED) \ + _(1596, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \ + _(1597, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ + _(1598, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \ + _(1600, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \ + _(1601, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ + _(1602, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ + _(1603, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ + _(1605, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ _(1606, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ _(1607, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ _(1608, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ _(1610, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ - _(1611, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \ - _(1612, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ - _(1613, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \ - _(1615, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \ - _(1621, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \ - _(1622, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ - _(1623, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ - _(1625, ZEND_FETCH_DIM_R_SPEC_CV_CV) \ - _(1626, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \ - _(1627, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ - _(1628, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ - _(1630, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \ + _(1616, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \ + _(1617, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ + _(1618, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \ + _(1620, ZEND_FETCH_DIM_R_SPEC_CV_CV) \ + _(1621, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \ + _(1622, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ + _(1623, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \ + _(1625, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \ + _(1626, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ + _(1627, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ + _(1628, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ + _(1630, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ _(1631, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ _(1632, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ _(1633, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ _(1635, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ - _(1636, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \ - _(1637, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ - _(1638, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \ - _(1640, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \ - _(1641, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \ - _(1642, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ - _(1643, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ - _(1645, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \ - _(1646, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \ - _(1647, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ - _(1648, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ - _(1650, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \ - _(1651, ZEND_FETCH_W_SPEC_CONST_UNUSED) \ - _(1652, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ - _(1653, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ - _(1655, ZEND_FETCH_W_SPEC_CV_UNUSED) \ - _(1666, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \ - _(1667, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ - _(1668, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ - _(1669, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \ - _(1670, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \ - _(1676, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \ - _(1677, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ - _(1678, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ - _(1679, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \ - _(1680, ZEND_FETCH_DIM_W_SPEC_CV_CV) \ - _(1691, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \ - _(1692, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ - _(1693, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ - _(1695, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \ - _(1696, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \ - _(1697, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ - _(1698, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ - _(1700, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \ - _(1701, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \ - _(1702, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ - _(1703, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ - _(1705, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \ - _(1706, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \ - _(1707, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ - _(1708, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ - _(1710, ZEND_FETCH_RW_SPEC_CV_UNUSED) \ - _(1721, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \ - _(1722, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ - _(1723, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ - _(1724, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \ - _(1725, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \ - _(1731, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \ - _(1732, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ - _(1733, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ - _(1734, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \ - _(1735, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \ - _(1746, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \ - _(1747, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ - _(1748, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ - _(1750, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \ - _(1751, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \ - _(1752, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ - _(1753, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ - _(1755, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \ - _(1756, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \ - _(1757, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ - _(1758, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ - _(1760, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \ - _(1761, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \ - _(1762, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ - _(1763, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ - _(1765, ZEND_FETCH_IS_SPEC_CV_UNUSED) \ - _(1766, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \ - _(1767, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ - _(1768, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ - _(1770, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \ + _(1636, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \ + _(1637, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ + _(1638, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \ + _(1640, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \ + _(1641, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \ + _(1642, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ + _(1643, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \ + _(1645, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \ + _(1646, ZEND_FETCH_W_SPEC_CONST_UNUSED) \ + _(1647, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ + _(1648, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \ + _(1650, ZEND_FETCH_W_SPEC_CV_UNUSED) \ + _(1661, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \ + _(1662, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ + _(1663, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \ + _(1664, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \ + _(1665, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \ + _(1671, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \ + _(1672, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ + _(1673, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \ + _(1674, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \ + _(1675, ZEND_FETCH_DIM_W_SPEC_CV_CV) \ + _(1686, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \ + _(1687, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ + _(1688, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \ + _(1690, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \ + _(1691, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \ + _(1692, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ + _(1693, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \ + _(1695, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \ + _(1696, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \ + _(1697, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ + _(1698, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \ + _(1700, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \ + _(1701, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \ + _(1702, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ + _(1703, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \ + _(1705, ZEND_FETCH_RW_SPEC_CV_UNUSED) \ + _(1716, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \ + _(1717, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ + _(1718, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \ + _(1719, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \ + _(1720, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \ + _(1726, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \ + _(1727, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ + _(1728, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \ + _(1729, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \ + _(1730, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \ + _(1741, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \ + _(1742, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ + _(1743, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \ + _(1745, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \ + _(1746, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \ + _(1747, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ + _(1748, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \ + _(1750, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \ + _(1751, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \ + _(1752, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ + _(1753, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \ + _(1755, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \ + _(1756, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \ + _(1757, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ + _(1758, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \ + _(1760, ZEND_FETCH_IS_SPEC_CV_UNUSED) \ + _(1761, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \ + _(1762, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ + _(1763, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \ + _(1765, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \ + _(1766, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ + _(1767, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ + _(1768, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ + _(1770, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ _(1771, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ _(1772, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ _(1773, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ _(1775, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ - _(1776, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \ - _(1777, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ - _(1778, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \ - _(1780, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \ - _(1786, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \ - _(1787, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ - _(1788, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ - _(1790, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \ - _(1791, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \ - _(1792, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ - _(1793, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ - _(1795, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \ + _(1781, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \ + _(1782, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ + _(1783, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \ + _(1785, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \ + _(1786, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \ + _(1787, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ + _(1788, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \ + _(1790, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \ + _(1791, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ + _(1792, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ + _(1793, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ + _(1795, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ _(1796, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ _(1797, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ _(1798, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ _(1800, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ - _(1801, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \ - _(1802, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ - _(1803, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \ - _(1805, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \ - _(1806, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \ - _(1807, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ - _(1808, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ - _(1810, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \ - _(1811, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \ - _(1812, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ - _(1813, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ - _(1815, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \ - _(1816, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \ - _(1817, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ - _(1818, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ - _(1820, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \ - _(1821, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \ - _(1822, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1823, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1824, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \ - _(1825, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \ - _(1826, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \ - _(1827, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1828, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1829, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \ - _(1830, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \ - _(1831, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \ - _(1832, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1833, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1834, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \ - _(1835, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \ - _(1841, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \ - _(1842, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1843, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1844, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \ - _(1845, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \ - _(1846, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \ - _(1847, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1848, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ - _(1850, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \ - _(1851, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \ - _(1852, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1853, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ - _(1855, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \ - _(1856, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \ - _(1857, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1858, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ - _(1860, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \ - _(1861, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \ - _(1862, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ - _(1863, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ - _(1865, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \ - _(1866, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \ - _(1867, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1868, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ - _(1870, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \ - _(1871, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \ - _(1872, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ - _(1873, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ - _(1875, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \ - _(1886, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \ - _(1887, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ - _(1888, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ - _(1890, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \ - _(1896, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \ - _(1897, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ - _(1898, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ - _(1900, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \ - _(1911, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \ - _(1912, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ - _(1913, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ - _(1915, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \ - _(1916, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \ - _(1917, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ - _(1918, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ - _(1920, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \ - _(1921, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \ - _(1922, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ - _(1923, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ - _(1925, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \ - _(1926, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \ - _(1927, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ - _(1928, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ - _(1930, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \ + _(1801, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \ + _(1802, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ + _(1803, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \ + _(1805, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \ + _(1806, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \ + _(1807, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ + _(1808, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \ + _(1810, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \ + _(1811, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \ + _(1812, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ + _(1813, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \ + _(1815, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \ + _(1816, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \ + _(1817, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(1818, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(1819, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \ + _(1820, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \ + _(1821, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \ + _(1822, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(1823, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(1824, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \ + _(1825, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \ + _(1826, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \ + _(1827, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(1828, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(1829, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \ + _(1830, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \ + _(1836, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \ + _(1837, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(1838, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(1839, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \ + _(1840, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \ + _(1841, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \ + _(1842, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(1843, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \ + _(1845, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \ + _(1846, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \ + _(1847, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(1848, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \ + _(1850, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \ + _(1851, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \ + _(1852, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(1853, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \ + _(1855, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \ + _(1856, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \ + _(1857, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ + _(1858, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \ + _(1860, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \ + _(1861, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \ + _(1862, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(1863, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \ + _(1865, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \ + _(1866, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \ + _(1867, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ + _(1868, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \ + _(1870, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \ + _(1881, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \ + _(1882, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ + _(1883, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \ + _(1885, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \ + _(1891, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \ + _(1892, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ + _(1893, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \ + _(1895, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \ + _(1906, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \ + _(1907, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ + _(1908, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \ + _(1910, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \ + _(1911, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \ + _(1912, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ + _(1913, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \ + _(1915, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \ + _(1916, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \ + _(1917, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ + _(1918, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \ + _(1920, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \ + _(1921, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \ + _(1922, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ + _(1923, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \ + _(1925, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \ + _(1926, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ + _(1927, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(1928, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(1930, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ _(1931, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ _(1932, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ _(1933, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ _(1935, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ - _(1936, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ - _(1937, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1938, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1940, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ - _(1946, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ - _(1947, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1948, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ - _(1950, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ - _(1951, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \ - _(1952, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \ - _(1953, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \ - _(1958, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED) \ - _(1959, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED_QUICK) \ - _(1962, ZEND_EXT_STMT_SPEC) \ - _(1963, ZEND_EXT_FCALL_BEGIN_SPEC) \ - _(1964, ZEND_EXT_FCALL_END_SPEC) \ - _(1965, ZEND_EXT_NOP_SPEC) \ - _(1966, ZEND_TICKS_SPEC) \ - _(1967, ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST) \ - _(1970, ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSED) \ - _(1972, ZEND_CATCH_SPEC_CONST) \ - _(1973, ZEND_THROW_SPEC_CONST) \ - _(1974, ZEND_THROW_SPEC_TMPVAR) \ - _(1975, ZEND_THROW_SPEC_TMPVAR) \ - _(1977, ZEND_THROW_SPEC_CV) \ - _(1978, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \ - _(1979, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ - _(1980, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ - _(1981, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \ - _(1982, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \ - _(1983, ZEND_CLONE_SPEC_CONST) \ - _(1984, ZEND_CLONE_SPEC_TMPVAR) \ - _(1985, ZEND_CLONE_SPEC_TMPVAR) \ - _(1986, ZEND_CLONE_SPEC_UNUSED) \ - _(1987, ZEND_CLONE_SPEC_CV) \ - _(1988, ZEND_RETURN_BY_REF_SPEC_CONST) \ - _(1989, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ - _(1990, ZEND_RETURN_BY_REF_SPEC_TMP) \ - _(1991, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ - _(1992, ZEND_RETURN_BY_REF_SPEC_VAR) \ - _(1993, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ - _(1996, ZEND_RETURN_BY_REF_SPEC_CV) \ - _(1997, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ - _(1998, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \ - _(1999, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2000, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2002, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \ + _(1941, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \ + _(1942, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(1943, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \ + _(1945, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \ + _(1946, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \ + _(1947, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \ + _(1948, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \ + _(1953, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED) \ + _(1954, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED_QUICK) \ + _(1957, ZEND_EXT_STMT_SPEC) \ + _(1958, ZEND_EXT_FCALL_BEGIN_SPEC) \ + _(1959, ZEND_EXT_FCALL_END_SPEC) \ + _(1960, ZEND_EXT_NOP_SPEC) \ + _(1961, ZEND_TICKS_SPEC) \ + _(1962, ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST) \ + _(1965, ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSED) \ + _(1967, ZEND_CATCH_SPEC_CONST) \ + _(1968, ZEND_THROW_SPEC_CONST) \ + _(1969, ZEND_THROW_SPEC_TMPVAR) \ + _(1970, ZEND_THROW_SPEC_TMPVAR) \ + _(1972, ZEND_THROW_SPEC_CV) \ + _(1973, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \ + _(1974, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ + _(1975, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \ + _(1976, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \ + _(1977, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \ + _(1978, ZEND_CLONE_SPEC_CONST) \ + _(1979, ZEND_CLONE_SPEC_TMPVAR) \ + _(1980, ZEND_CLONE_SPEC_TMPVAR) \ + _(1981, ZEND_CLONE_SPEC_UNUSED) \ + _(1982, ZEND_CLONE_SPEC_CV) \ + _(1983, ZEND_RETURN_BY_REF_SPEC_CONST) \ + _(1984, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ + _(1985, ZEND_RETURN_BY_REF_SPEC_TMP) \ + _(1986, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ + _(1987, ZEND_RETURN_BY_REF_SPEC_VAR) \ + _(1988, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ + _(1991, ZEND_RETURN_BY_REF_SPEC_CV) \ + _(1992, ZEND_RETURN_BY_REF_SPEC_OBSERVER) \ + _(1993, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \ + _(1994, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(1995, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(1997, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \ + _(1998, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ + _(1999, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ + _(2000, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ + _(2002, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ _(2003, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ _(2004, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ _(2005, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ _(2007, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ - _(2008, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \ - _(2009, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ - _(2010, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \ - _(2012, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \ - _(2013, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \ - _(2014, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2015, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2017, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \ - _(2018, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \ - _(2019, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ - _(2020, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ - _(2022, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \ - _(2023, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \ - _(2024, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2025, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ - _(2026, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \ - _(2027, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \ - _(2033, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \ - _(2034, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ - _(2035, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ - _(2036, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \ - _(2037, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \ - _(2038, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \ - _(2039, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2040, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ - _(2041, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \ - _(2042, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \ - _(2048, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \ - _(2049, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ - _(2050, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ - _(2052, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \ - _(2053, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \ - _(2054, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ - _(2055, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ - _(2057, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \ + _(2008, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \ + _(2009, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2010, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2012, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \ + _(2013, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \ + _(2014, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ + _(2015, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \ + _(2017, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \ + _(2018, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \ + _(2019, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(2020, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \ + _(2021, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \ + _(2022, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \ + _(2028, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \ + _(2029, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ + _(2030, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \ + _(2031, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \ + _(2032, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \ + _(2033, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \ + _(2034, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2035, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \ + _(2036, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \ + _(2037, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \ + _(2043, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \ + _(2044, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ + _(2045, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \ + _(2047, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \ + _(2048, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \ + _(2049, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ + _(2050, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \ + _(2052, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \ + _(2053, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ + _(2054, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2055, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2057, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ _(2058, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ _(2059, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ _(2060, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ _(2062, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ - _(2063, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \ - _(2064, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2065, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2067, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \ - _(2073, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \ - _(2074, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ - _(2075, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ - _(2077, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \ - _(2078, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \ - _(2079, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \ - _(2084, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED) \ - _(2085, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_QUICK) \ - _(2088, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \ - _(2089, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \ - _(2094, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED) \ - _(2095, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_QUICK) \ - _(2138, ZEND_SEND_VAR_SPEC_VAR_CONST) \ - _(2141, ZEND_SEND_VAR_SPEC_VAR_UNUSED) \ - _(2148, ZEND_SEND_VAR_SPEC_CV_CONST) \ - _(2151, ZEND_SEND_VAR_SPEC_CV_UNUSED) \ - _(2153, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \ - _(2154, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ - _(2155, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ - _(2157, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \ - _(2158, ZEND_SEND_ARRAY_SPEC) \ - _(2159, ZEND_SEND_USER_SPEC_CONST) \ - _(2160, ZEND_SEND_USER_SPEC_TMP) \ - _(2161, ZEND_SEND_USER_SPEC_VAR) \ - _(2163, ZEND_SEND_USER_SPEC_CV) \ - _(2164, ZEND_STRLEN_SPEC_CONST) \ - _(2165, ZEND_STRLEN_SPEC_TMPVAR) \ - _(2166, ZEND_STRLEN_SPEC_TMPVAR) \ - _(2168, ZEND_STRLEN_SPEC_CV) \ - _(2169, ZEND_DEFINED_SPEC_CONST) \ - _(2170, ZEND_TYPE_CHECK_SPEC_CONST) \ - _(2171, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ - _(2172, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ - _(2174, ZEND_TYPE_CHECK_SPEC_CV) \ - _(2175, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \ - _(2176, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \ - _(2177, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \ - _(2178, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \ - _(2179, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \ - _(2180, ZEND_FE_RESET_RW_SPEC_CONST) \ - _(2181, ZEND_FE_RESET_RW_SPEC_TMP) \ - _(2182, ZEND_FE_RESET_RW_SPEC_VAR) \ - _(2184, ZEND_FE_RESET_RW_SPEC_CV) \ - _(2185, ZEND_FE_FETCH_RW_SPEC_VAR) \ - _(2186, ZEND_FE_FREE_SPEC_TMPVAR) \ - _(2187, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \ - _(2188, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ - _(2189, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ - _(2191, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \ - _(2192, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \ - _(2193, ZEND_DO_ICALL_SPEC_RETVAL_USED) \ - _(2194, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \ - _(2195, ZEND_DO_UCALL_SPEC_RETVAL_USED) \ - _(2196, ZEND_DO_UCALL_SPEC_OBSERVER) \ - _(2197, ZEND_DO_UCALL_SPEC_OBSERVER) \ - _(2198, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \ - _(2199, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \ - _(2200, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \ - _(2201, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \ - _(2212, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \ - _(2213, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2214, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2216, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \ - _(2217, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \ - _(2218, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2219, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2221, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \ - _(2222, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \ - _(2223, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2224, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2226, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \ - _(2237, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \ - _(2238, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2239, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ - _(2241, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \ - _(2242, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \ - _(2243, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2244, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2246, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \ - _(2247, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \ - _(2248, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2249, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ - _(2251, ZEND_POST_INC_OBJ_SPEC_CV_CV) \ - _(2252, ZEND_ECHO_SPEC_CONST) \ - _(2253, ZEND_ECHO_SPEC_TMPVAR) \ - _(2254, ZEND_ECHO_SPEC_TMPVAR) \ - _(2256, ZEND_ECHO_SPEC_CV) \ + _(2068, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \ + _(2069, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ + _(2070, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \ + _(2072, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \ + _(2073, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \ + _(2074, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \ + _(2079, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED) \ + _(2080, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_QUICK) \ + _(2083, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \ + _(2084, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \ + _(2089, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED) \ + _(2090, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_QUICK) \ + _(2133, ZEND_SEND_VAR_SPEC_VAR_CONST) \ + _(2136, ZEND_SEND_VAR_SPEC_VAR_UNUSED) \ + _(2143, ZEND_SEND_VAR_SPEC_CV_CONST) \ + _(2146, ZEND_SEND_VAR_SPEC_CV_UNUSED) \ + _(2148, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \ + _(2149, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ + _(2150, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \ + _(2152, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \ + _(2153, ZEND_SEND_ARRAY_SPEC) \ + _(2154, ZEND_SEND_USER_SPEC_CONST) \ + _(2155, ZEND_SEND_USER_SPEC_TMP) \ + _(2156, ZEND_SEND_USER_SPEC_VAR) \ + _(2158, ZEND_SEND_USER_SPEC_CV) \ + _(2159, ZEND_STRLEN_SPEC_CONST) \ + _(2160, ZEND_STRLEN_SPEC_TMPVAR) \ + _(2161, ZEND_STRLEN_SPEC_TMPVAR) \ + _(2163, ZEND_STRLEN_SPEC_CV) \ + _(2164, ZEND_DEFINED_SPEC_CONST) \ + _(2165, ZEND_TYPE_CHECK_SPEC_CONST) \ + _(2166, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ + _(2167, ZEND_TYPE_CHECK_SPEC_TMPVAR) \ + _(2169, ZEND_TYPE_CHECK_SPEC_CV) \ + _(2170, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \ + _(2171, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \ + _(2172, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \ + _(2173, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \ + _(2174, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \ + _(2175, ZEND_FE_RESET_RW_SPEC_CONST) \ + _(2176, ZEND_FE_RESET_RW_SPEC_TMP) \ + _(2177, ZEND_FE_RESET_RW_SPEC_VAR) \ + _(2179, ZEND_FE_RESET_RW_SPEC_CV) \ + _(2180, ZEND_FE_FETCH_RW_SPEC_VAR) \ + _(2181, ZEND_FE_FREE_SPEC_TMPVAR) \ + _(2182, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \ + _(2183, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ + _(2184, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \ + _(2186, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \ + _(2187, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \ + _(2188, ZEND_DO_ICALL_SPEC_RETVAL_USED) \ + _(2189, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \ + _(2190, ZEND_DO_UCALL_SPEC_RETVAL_USED) \ + _(2191, ZEND_DO_UCALL_SPEC_OBSERVER) \ + _(2192, ZEND_DO_UCALL_SPEC_OBSERVER) \ + _(2193, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \ + _(2194, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \ + _(2195, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \ + _(2196, ZEND_DO_FCALL_BY_NAME_SPEC_OBSERVER) \ + _(2207, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \ + _(2208, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2209, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2211, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \ + _(2212, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \ + _(2213, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2214, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2216, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \ + _(2217, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \ + _(2218, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2219, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2221, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \ + _(2232, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \ + _(2233, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2234, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \ + _(2236, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \ + _(2237, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \ + _(2238, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2239, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2241, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \ + _(2242, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \ + _(2243, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2244, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \ + _(2246, ZEND_POST_INC_OBJ_SPEC_CV_CV) \ + _(2247, ZEND_ECHO_SPEC_CONST) \ + _(2248, ZEND_ECHO_SPEC_TMPVAR) \ + _(2249, ZEND_ECHO_SPEC_TMPVAR) \ + _(2251, ZEND_ECHO_SPEC_CV) \ + _(2258, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ + _(2260, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ + _(2261, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ _(2263, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ _(2265, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ _(2266, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ - _(2268, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \ - _(2270, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \ - _(2271, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \ - _(2278, ZEND_INSTANCEOF_SPEC_CV_CONST) \ - _(2280, ZEND_INSTANCEOF_SPEC_CV_VAR) \ - _(2281, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \ - _(2283, ZEND_GENERATOR_CREATE_SPEC) \ - _(2286, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \ - _(2288, ZEND_MAKE_REF_SPEC_CV_UNUSED) \ - _(2289, ZEND_DECLARE_FUNCTION_SPEC) \ - _(2290, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST) \ - _(2291, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \ - _(2292, ZEND_DECLARE_CLASS_SPEC_CONST) \ - _(2293, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \ - _(2294, ZEND_DECLARE_ANON_CLASS_SPEC) \ - _(2295, ZEND_ADD_ARRAY_UNPACK_SPEC) \ - _(2296, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \ - _(2297, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ - _(2298, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ - _(2300, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \ + _(2273, ZEND_INSTANCEOF_SPEC_CV_CONST) \ + _(2275, ZEND_INSTANCEOF_SPEC_CV_VAR) \ + _(2276, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \ + _(2278, ZEND_GENERATOR_CREATE_SPEC) \ + _(2281, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \ + _(2283, ZEND_MAKE_REF_SPEC_CV_UNUSED) \ + _(2284, ZEND_DECLARE_FUNCTION_SPEC) \ + _(2285, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST) \ + _(2286, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \ + _(2287, ZEND_DECLARE_CLASS_SPEC_CONST) \ + _(2288, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \ + _(2289, ZEND_DECLARE_ANON_CLASS_SPEC) \ + _(2290, ZEND_ADD_ARRAY_UNPACK_SPEC) \ + _(2291, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \ + _(2292, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ + _(2293, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \ + _(2295, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \ + _(2296, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ + _(2297, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2298, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ + _(2300, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ _(2301, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ _(2302, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ _(2303, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ _(2305, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ - _(2306, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \ - _(2307, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2308, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \ - _(2310, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \ - _(2311, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \ - _(2312, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2313, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ - _(2315, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \ - _(2316, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \ - _(2317, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ - _(2318, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ - _(2320, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \ - _(2321, ZEND_HANDLE_EXCEPTION_SPEC) \ - _(2322, ZEND_USER_OPCODE_SPEC) \ - _(2323, ZEND_ASSERT_CHECK_SPEC) \ - _(2324, ZEND_JMP_SET_SPEC_CONST) \ - _(2325, ZEND_JMP_SET_SPEC_TMP) \ - _(2326, ZEND_JMP_SET_SPEC_VAR) \ - _(2328, ZEND_JMP_SET_SPEC_CV) \ - _(2329, ZEND_UNSET_CV_SPEC_CV_UNUSED) \ - _(2330, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \ - _(2331, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \ - _(2332, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \ - _(2333, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ - _(2334, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ - _(2336, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \ - _(2337, ZEND_SEPARATE_SPEC_VAR_UNUSED) \ - _(2339, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \ - _(2340, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \ - _(2341, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \ - _(2342, ZEND_FETCH_CLASS_NAME_SPEC_CV) \ - _(2343, ZEND_CALL_TRAMPOLINE_SPEC) \ - _(2344, ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER) \ - _(2345, ZEND_DISCARD_EXCEPTION_SPEC) \ - _(2346, ZEND_YIELD_SPEC_CONST_CONST) \ - _(2347, ZEND_YIELD_SPEC_CONST_TMPVAR) \ - _(2348, ZEND_YIELD_SPEC_CONST_TMPVAR) \ - _(2349, ZEND_YIELD_SPEC_CONST_UNUSED) \ - _(2350, ZEND_YIELD_SPEC_CONST_CV) \ - _(2351, ZEND_YIELD_SPEC_TMP_CONST) \ - _(2352, ZEND_YIELD_SPEC_TMP_TMPVAR) \ - _(2353, ZEND_YIELD_SPEC_TMP_TMPVAR) \ - _(2354, ZEND_YIELD_SPEC_TMP_UNUSED) \ - _(2355, ZEND_YIELD_SPEC_TMP_CV) \ - _(2356, ZEND_YIELD_SPEC_VAR_CONST) \ - _(2357, ZEND_YIELD_SPEC_VAR_TMPVAR) \ - _(2358, ZEND_YIELD_SPEC_VAR_TMPVAR) \ - _(2359, ZEND_YIELD_SPEC_VAR_UNUSED) \ - _(2360, ZEND_YIELD_SPEC_VAR_CV) \ - _(2361, ZEND_YIELD_SPEC_UNUSED_CONST) \ - _(2362, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \ - _(2363, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \ - _(2364, ZEND_YIELD_SPEC_UNUSED_UNUSED) \ - _(2365, ZEND_YIELD_SPEC_UNUSED_CV) \ - _(2366, ZEND_YIELD_SPEC_CV_CONST) \ - _(2367, ZEND_YIELD_SPEC_CV_TMPVAR) \ - _(2368, ZEND_YIELD_SPEC_CV_TMPVAR) \ - _(2369, ZEND_YIELD_SPEC_CV_UNUSED) \ - _(2370, ZEND_YIELD_SPEC_CV_CV) \ - _(2371, ZEND_GENERATOR_RETURN_SPEC_CONST) \ - _(2372, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ - _(2373, ZEND_GENERATOR_RETURN_SPEC_TMP) \ - _(2374, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ - _(2375, ZEND_GENERATOR_RETURN_SPEC_VAR) \ - _(2376, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ - _(2379, ZEND_GENERATOR_RETURN_SPEC_CV) \ - _(2380, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ - _(2381, ZEND_FAST_CALL_SPEC) \ - _(2382, ZEND_FAST_RET_SPEC) \ - _(2383, ZEND_RECV_VARIADIC_SPEC_UNUSED) \ - _(2384, ZEND_SEND_UNPACK_SPEC) \ - _(2385, ZEND_YIELD_FROM_SPEC_CONST) \ - _(2386, ZEND_YIELD_FROM_SPEC_TMPVAR) \ - _(2387, ZEND_YIELD_FROM_SPEC_TMPVAR) \ - _(2389, ZEND_YIELD_FROM_SPEC_CV) \ - _(2390, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \ - _(2391, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \ - _(2392, ZEND_COALESCE_SPEC_CONST) \ - _(2393, ZEND_COALESCE_SPEC_TMP) \ - _(2394, ZEND_COALESCE_SPEC_VAR) \ - _(2396, ZEND_COALESCE_SPEC_CV) \ - _(2397, ZEND_SPACESHIP_SPEC_CONST_CONST) \ - _(2398, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ - _(2399, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ - _(2401, ZEND_SPACESHIP_SPEC_CONST_CV) \ + _(2306, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \ + _(2307, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2308, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \ + _(2310, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \ + _(2311, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \ + _(2312, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ + _(2313, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \ + _(2315, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \ + _(2316, ZEND_HANDLE_EXCEPTION_SPEC) \ + _(2317, ZEND_USER_OPCODE_SPEC) \ + _(2318, ZEND_ASSERT_CHECK_SPEC) \ + _(2319, ZEND_JMP_SET_SPEC_CONST) \ + _(2320, ZEND_JMP_SET_SPEC_TMP) \ + _(2321, ZEND_JMP_SET_SPEC_VAR) \ + _(2323, ZEND_JMP_SET_SPEC_CV) \ + _(2324, ZEND_UNSET_CV_SPEC_CV_UNUSED) \ + _(2325, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \ + _(2326, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \ + _(2327, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \ + _(2328, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ + _(2329, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \ + _(2331, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \ + _(2332, ZEND_SEPARATE_SPEC_VAR_UNUSED) \ + _(2334, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \ + _(2335, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \ + _(2336, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \ + _(2337, ZEND_FETCH_CLASS_NAME_SPEC_CV) \ + _(2338, ZEND_CALL_TRAMPOLINE_SPEC) \ + _(2339, ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER) \ + _(2340, ZEND_DISCARD_EXCEPTION_SPEC) \ + _(2341, ZEND_YIELD_SPEC_CONST_CONST) \ + _(2342, ZEND_YIELD_SPEC_CONST_TMPVAR) \ + _(2343, ZEND_YIELD_SPEC_CONST_TMPVAR) \ + _(2344, ZEND_YIELD_SPEC_CONST_UNUSED) \ + _(2345, ZEND_YIELD_SPEC_CONST_CV) \ + _(2346, ZEND_YIELD_SPEC_TMP_CONST) \ + _(2347, ZEND_YIELD_SPEC_TMP_TMPVAR) \ + _(2348, ZEND_YIELD_SPEC_TMP_TMPVAR) \ + _(2349, ZEND_YIELD_SPEC_TMP_UNUSED) \ + _(2350, ZEND_YIELD_SPEC_TMP_CV) \ + _(2351, ZEND_YIELD_SPEC_VAR_CONST) \ + _(2352, ZEND_YIELD_SPEC_VAR_TMPVAR) \ + _(2353, ZEND_YIELD_SPEC_VAR_TMPVAR) \ + _(2354, ZEND_YIELD_SPEC_VAR_UNUSED) \ + _(2355, ZEND_YIELD_SPEC_VAR_CV) \ + _(2356, ZEND_YIELD_SPEC_UNUSED_CONST) \ + _(2357, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \ + _(2358, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \ + _(2359, ZEND_YIELD_SPEC_UNUSED_UNUSED) \ + _(2360, ZEND_YIELD_SPEC_UNUSED_CV) \ + _(2361, ZEND_YIELD_SPEC_CV_CONST) \ + _(2362, ZEND_YIELD_SPEC_CV_TMPVAR) \ + _(2363, ZEND_YIELD_SPEC_CV_TMPVAR) \ + _(2364, ZEND_YIELD_SPEC_CV_UNUSED) \ + _(2365, ZEND_YIELD_SPEC_CV_CV) \ + _(2366, ZEND_GENERATOR_RETURN_SPEC_CONST) \ + _(2367, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ + _(2368, ZEND_GENERATOR_RETURN_SPEC_TMP) \ + _(2369, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ + _(2370, ZEND_GENERATOR_RETURN_SPEC_VAR) \ + _(2371, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ + _(2374, ZEND_GENERATOR_RETURN_SPEC_CV) \ + _(2375, ZEND_GENERATOR_RETURN_SPEC_OBSERVER) \ + _(2376, ZEND_FAST_CALL_SPEC) \ + _(2377, ZEND_FAST_RET_SPEC) \ + _(2378, ZEND_RECV_VARIADIC_SPEC_UNUSED) \ + _(2379, ZEND_SEND_UNPACK_SPEC) \ + _(2380, ZEND_YIELD_FROM_SPEC_CONST) \ + _(2381, ZEND_YIELD_FROM_SPEC_TMPVAR) \ + _(2382, ZEND_YIELD_FROM_SPEC_TMPVAR) \ + _(2384, ZEND_YIELD_FROM_SPEC_CV) \ + _(2385, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \ + _(2386, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \ + _(2387, ZEND_COALESCE_SPEC_CONST) \ + _(2388, ZEND_COALESCE_SPEC_TMP) \ + _(2389, ZEND_COALESCE_SPEC_VAR) \ + _(2391, ZEND_COALESCE_SPEC_CV) \ + _(2392, ZEND_SPACESHIP_SPEC_CONST_CONST) \ + _(2393, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ + _(2394, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \ + _(2396, ZEND_SPACESHIP_SPEC_CONST_CV) \ + _(2397, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ + _(2398, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ + _(2399, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ + _(2401, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ _(2402, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ _(2403, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ _(2404, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ _(2406, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ - _(2407, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \ - _(2408, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ - _(2409, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \ - _(2411, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \ - _(2417, ZEND_SPACESHIP_SPEC_CV_CONST) \ - _(2418, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ - _(2419, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ - _(2421, ZEND_SPACESHIP_SPEC_CV_CV) \ - _(2422, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \ - _(2423, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \ - _(2426, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \ - _(2428, ZEND_FETCH_STATIC_PROP_R_SPEC) \ - _(2429, ZEND_FETCH_STATIC_PROP_W_SPEC) \ - _(2430, ZEND_FETCH_STATIC_PROP_RW_SPEC) \ - _(2431, ZEND_FETCH_STATIC_PROP_IS_SPEC) \ - _(2432, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \ - _(2433, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \ - _(2434, ZEND_UNSET_STATIC_PROP_SPEC) \ - _(2435, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \ - _(2436, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \ - _(2438, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \ - _(2439, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \ - _(2441, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \ - _(2442, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \ - _(2443, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \ - _(2444, ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST) \ - _(2447, ZEND_SEND_FUNC_ARG_SPEC_VAR_UNUSED) \ - _(2449, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \ - _(2450, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \ - _(2451, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ - _(2452, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ - _(2454, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ - _(2455, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \ - _(2456, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ - _(2457, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ - _(2459, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ - _(2460, ZEND_IN_ARRAY_SPEC_CONST_CONST) \ - _(2461, ZEND_IN_ARRAY_SPEC_TMP_CONST) \ - _(2462, ZEND_IN_ARRAY_SPEC_VAR_CONST) \ - _(2464, ZEND_IN_ARRAY_SPEC_CV_CONST) \ - _(2465, ZEND_COUNT_SPEC_CONST_UNUSED) \ - _(2466, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \ - _(2467, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \ - _(2469, ZEND_COUNT_SPEC_CV_UNUSED) \ - _(2470, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \ - _(2471, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \ - _(2472, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \ - _(2473, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \ - _(2474, ZEND_GET_CLASS_SPEC_CV_UNUSED) \ - _(2475, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \ - _(2476, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \ - _(2477, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \ - _(2478, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \ - _(2480, ZEND_GET_TYPE_SPEC_CV_UNUSED) \ - _(2481, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \ - _(2482, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ - _(2483, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ - _(2485, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \ + _(2412, ZEND_SPACESHIP_SPEC_CV_CONST) \ + _(2413, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ + _(2414, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \ + _(2416, ZEND_SPACESHIP_SPEC_CV_CV) \ + _(2417, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \ + _(2418, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \ + _(2421, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \ + _(2423, ZEND_FETCH_STATIC_PROP_R_SPEC) \ + _(2424, ZEND_FETCH_STATIC_PROP_W_SPEC) \ + _(2425, ZEND_FETCH_STATIC_PROP_RW_SPEC) \ + _(2426, ZEND_FETCH_STATIC_PROP_IS_SPEC) \ + _(2427, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \ + _(2428, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \ + _(2429, ZEND_UNSET_STATIC_PROP_SPEC) \ + _(2430, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \ + _(2431, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \ + _(2433, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \ + _(2434, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \ + _(2436, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \ + _(2437, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \ + _(2438, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \ + _(2439, ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST) \ + _(2442, ZEND_SEND_FUNC_ARG_SPEC_VAR_UNUSED) \ + _(2444, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \ + _(2445, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \ + _(2446, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ + _(2447, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ + _(2449, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \ + _(2450, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \ + _(2451, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ + _(2452, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ + _(2454, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \ + _(2455, ZEND_IN_ARRAY_SPEC_CONST_CONST) \ + _(2456, ZEND_IN_ARRAY_SPEC_TMP_CONST) \ + _(2457, ZEND_IN_ARRAY_SPEC_VAR_CONST) \ + _(2459, ZEND_IN_ARRAY_SPEC_CV_CONST) \ + _(2460, ZEND_COUNT_SPEC_CONST_UNUSED) \ + _(2461, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \ + _(2462, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \ + _(2464, ZEND_COUNT_SPEC_CV_UNUSED) \ + _(2465, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \ + _(2466, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \ + _(2467, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \ + _(2468, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \ + _(2469, ZEND_GET_CLASS_SPEC_CV_UNUSED) \ + _(2470, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \ + _(2471, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \ + _(2472, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \ + _(2473, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \ + _(2475, ZEND_GET_TYPE_SPEC_CV_UNUSED) \ + _(2476, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \ + _(2477, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ + _(2478, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \ + _(2480, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \ + _(2481, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ + _(2482, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ + _(2483, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ + _(2485, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ _(2486, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ _(2487, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ _(2488, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ _(2490, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ - _(2491, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \ - _(2492, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ - _(2493, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \ - _(2495, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \ - _(2501, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \ - _(2502, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ - _(2503, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ - _(2505, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \ - _(2506, ZEND_MATCH_SPEC_CONST_CONST) \ - _(2507, ZEND_MATCH_SPEC_TMPVARCV_CONST) \ - _(2508, ZEND_MATCH_SPEC_TMPVARCV_CONST) \ - _(2510, ZEND_MATCH_SPEC_TMPVARCV_CONST) \ - _(2516, ZEND_CASE_STRICT_SPEC_TMP_CONST) \ - _(2517, ZEND_CASE_STRICT_SPEC_TMP_TMP) \ - _(2518, ZEND_CASE_STRICT_SPEC_TMP_VAR) \ - _(2520, ZEND_CASE_STRICT_SPEC_TMP_CV) \ - _(2521, ZEND_CASE_STRICT_SPEC_VAR_CONST) \ - _(2522, ZEND_CASE_STRICT_SPEC_VAR_TMP) \ - _(2523, ZEND_CASE_STRICT_SPEC_VAR_VAR) \ - _(2525, ZEND_CASE_STRICT_SPEC_VAR_CV) \ - _(2536, ZEND_MATCH_ERROR_SPEC_CONST_UNUSED) \ - _(2537, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \ - _(2538, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \ - _(2540, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \ - _(2541, ZEND_JMP_NULL_SPEC_CONST) \ - _(2542, ZEND_JMP_NULL_SPEC_TMPVARCV) \ - _(2543, ZEND_JMP_NULL_SPEC_TMPVARCV) \ - _(2545, ZEND_JMP_NULL_SPEC_TMPVARCV) \ - _(2546, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \ - _(2547, ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED) \ - _(2548, ZEND_VERIFY_NEVER_TYPE_SPEC_UNUSED_UNUSED) \ - _(2549, ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED) \ - _(2550, ZEND_RECV_NOTYPE_SPEC) \ - _(2551, ZEND_JMP_FORWARD_SPEC) \ + _(2496, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \ + _(2497, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ + _(2498, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \ + _(2500, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \ + _(2501, ZEND_MATCH_SPEC_CONST_CONST) \ + _(2502, ZEND_MATCH_SPEC_TMPVARCV_CONST) \ + _(2503, ZEND_MATCH_SPEC_TMPVARCV_CONST) \ + _(2505, ZEND_MATCH_SPEC_TMPVARCV_CONST) \ + _(2511, ZEND_CASE_STRICT_SPEC_TMP_CONST) \ + _(2512, ZEND_CASE_STRICT_SPEC_TMP_TMP) \ + _(2513, ZEND_CASE_STRICT_SPEC_TMP_VAR) \ + _(2515, ZEND_CASE_STRICT_SPEC_TMP_CV) \ + _(2516, ZEND_CASE_STRICT_SPEC_VAR_CONST) \ + _(2517, ZEND_CASE_STRICT_SPEC_VAR_TMP) \ + _(2518, ZEND_CASE_STRICT_SPEC_VAR_VAR) \ + _(2520, ZEND_CASE_STRICT_SPEC_VAR_CV) \ + _(2531, ZEND_MATCH_ERROR_SPEC_CONST_UNUSED) \ + _(2532, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \ + _(2533, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \ + _(2535, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \ + _(2536, ZEND_JMP_NULL_SPEC_CONST) \ + _(2537, ZEND_JMP_NULL_SPEC_TMPVARCV) \ + _(2538, ZEND_JMP_NULL_SPEC_TMPVARCV) \ + _(2540, ZEND_JMP_NULL_SPEC_TMPVARCV) \ + _(2541, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \ + _(2542, ZEND_FETCH_GLOBALS_SPEC_UNUSED_UNUSED) \ + _(2543, ZEND_VERIFY_NEVER_TYPE_SPEC_UNUSED_UNUSED) \ + _(2544, ZEND_CALLABLE_CONVERT_SPEC_UNUSED_UNUSED) \ + _(2545, ZEND_RECV_NOTYPE_SPEC) \ + _(2546, ZEND_JMP_FORWARD_SPEC) \ + _(2552, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2553, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2554, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2556, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2557, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2558, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2559, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2561, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2562, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2563, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2564, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2566, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2572, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2573, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2574, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2576, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2567, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2568, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2569, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2571, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2577, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2578, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2579, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2581, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2582, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ _(2583, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2584, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2586, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2587, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2588, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2589, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2591, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2597, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(2598, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2599, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2601, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2592, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(2593, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2594, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2596, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2602, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2603, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2604, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2606, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2607, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2608, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2609, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2611, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2612, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2613, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2614, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2616, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2622, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2623, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2624, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2626, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2628, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2629, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(2631, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2617, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2618, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2619, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2621, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2623, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2624, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2626, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(2627, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2628, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2629, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2631, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2632, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2633, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2634, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2636, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2637, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2638, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2639, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2641, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2648, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2649, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2651, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2653, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2654, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(2656, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2642, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2643, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2644, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2646, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2648, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2649, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2651, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(2652, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2653, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2654, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2656, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2657, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ _(2658, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2659, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2661, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2662, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2663, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2664, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2666, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2672, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(2673, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2674, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2676, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2678, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2679, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(2681, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2667, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(2668, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2669, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2671, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2673, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2674, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2676, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(2677, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2678, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2679, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2681, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2682, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2683, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2684, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2686, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2687, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2688, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2689, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2691, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2697, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2698, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2699, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2701, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2692, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2693, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2694, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2696, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2702, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2703, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2704, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2706, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2707, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ _(2708, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2709, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ _(2711, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2712, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2713, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2714, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2716, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2722, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(2723, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2724, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(2726, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2717, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(2718, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2719, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2721, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(2727, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2728, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2729, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2731, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2732, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ _(2733, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2734, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ _(2736, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2737, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2738, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2739, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2741, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2747, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(2748, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2749, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2751, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2742, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(2743, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2744, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2746, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2752, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2753, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2754, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2756, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2757, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ _(2758, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2759, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ _(2761, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2762, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2763, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2764, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2766, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2772, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2773, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2774, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2776, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2792, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2793, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2794, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2795, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2796, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2797, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2798, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2799, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2800, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2804, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2805, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2806, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2849, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2850, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2851, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2867, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2868, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2869, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2870, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2871, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2872, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2873, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2874, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2875, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2879, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2880, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2881, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2924, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(2925, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2926, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2942, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2943, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2944, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2945, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2946, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2947, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2948, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2949, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2950, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2954, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2955, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2956, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(2994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(2995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(2999, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3000, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3001, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3017, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3018, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3019, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3020, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3021, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3022, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3023, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3024, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3025, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3029, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3030, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3031, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3074, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3075, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3076, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3077, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3081, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3082, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ - _(3086, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ - _(3090, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3091, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3092, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3093, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3094, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3095, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3099, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(3100, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3101, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3102, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3103, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3104, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3105, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3106, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3107, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3108, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3109, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3110, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3114, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3115, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3116, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3121, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3122, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3155, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3160, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3161, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3166, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3167, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3168, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3169, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3170, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3177, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3178, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3179, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3180, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3181, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3182, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3183, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3184, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3185, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3230, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3235, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3236, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3241, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3242, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3243, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3244, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3245, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3252, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3253, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3254, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3255, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3256, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3257, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3258, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3259, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3260, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3305, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3310, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3311, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3316, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3317, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3318, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3319, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3320, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(3327, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3328, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3329, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3330, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3331, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3332, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3333, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3334, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3335, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3380, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3385, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3386, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3387, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3388, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3389, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3390, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ - _(3391, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ - _(3392, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ - _(3393, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ - _(3394, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ - _(3395, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3396, ZEND_POST_INC_LONG_SPEC_CV) \ - _(3397, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ - _(3398, ZEND_POST_DEC_LONG_SPEC_CV) \ - _(3399, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ - _(3400, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3401, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3403, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ - _(3404, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(3405, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3406, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3408, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(3409, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(3410, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3411, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3413, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(3415, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3416, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(3418, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(2767, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2768, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2769, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2771, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2787, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2788, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2789, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2790, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2791, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2792, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2793, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2794, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2795, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2799, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2800, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2801, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2802, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2803, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2804, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2805, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2806, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2816, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2832, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2833, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2834, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2846, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2862, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2863, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2864, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2865, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2866, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2867, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2868, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2869, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2870, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2874, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2875, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2876, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2877, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2878, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2879, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2880, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2881, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2891, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2907, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(2908, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2909, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(2920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2921, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2937, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2938, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2939, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2940, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2941, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2942, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2943, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2944, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2945, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2949, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2950, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2951, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2952, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2953, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2954, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2955, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2956, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2966, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2982, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(2983, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(2984, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(2994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(2995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(2996, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3012, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3013, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3014, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3015, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3016, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3017, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3018, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3019, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3020, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3024, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3025, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3026, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3027, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3028, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3029, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3030, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3031, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3041, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3057, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3058, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3059, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3071, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3072, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3076, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3077, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \ + _(3081, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \ + _(3085, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3086, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3087, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3088, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3089, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3090, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3094, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(3095, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3096, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3097, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3098, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3099, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3100, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3101, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3102, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3103, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3104, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3105, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3109, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3110, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3111, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3112, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3113, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3114, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3115, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3116, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3126, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(3143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3155, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3156, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3160, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3161, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3162, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3163, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3164, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3169, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3170, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3171, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3172, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3173, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3177, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3178, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3179, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3180, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3184, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3185, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3186, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3201, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3230, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3231, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3235, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3236, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3237, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3238, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3239, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3244, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(3245, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3246, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3247, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3248, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3252, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3253, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3254, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3255, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3259, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3260, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3261, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3305, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3306, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3310, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3311, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3312, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3313, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3314, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3319, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3320, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(3321, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(3322, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3323, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3327, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3328, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3329, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3330, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3334, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3335, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3336, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3380, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3381, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3382, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3383, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3384, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3385, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \ + _(3386, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \ + _(3387, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \ + _(3388, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \ + _(3389, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \ + _(3390, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3391, ZEND_POST_INC_LONG_SPEC_CV) \ + _(3392, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \ + _(3393, ZEND_POST_DEC_LONG_SPEC_CV) \ + _(3394, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \ + _(3395, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3396, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3398, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \ + _(3399, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(3400, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3401, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3403, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(3404, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(3405, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3406, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3408, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(3410, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3411, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3413, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(3414, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(3415, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3416, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(3418, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3419, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ _(3420, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3421, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ _(3423, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3424, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(3425, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3426, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3428, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(3434, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(3435, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3436, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3438, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(3441, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(3443, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(3446, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ - _(3448, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ - _(3449, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ - _(3450, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ - _(3451, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(3452, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(3452+1, ZEND_NULL) + _(3429, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(3430, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3431, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3433, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(3436, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(3438, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(3441, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \ + _(3443, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \ + _(3444, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \ + _(3445, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \ + _(3446, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(3447, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(3447+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 085c473d59578..cbb0346821474 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -68,7 +68,7 @@ static const char *zend_vm_opcodes_names[203] = { "ZEND_JMP", "ZEND_JMPZ", "ZEND_JMPNZ", - "ZEND_JMPZNZ", + NULL, "ZEND_JMPZ_EX", "ZEND_JMPNZ_EX", "ZEND_CASE", @@ -274,7 +274,7 @@ static uint32_t zend_vm_opcodes_flags[203] = { 0x00000020, 0x00002007, 0x00002007, - 0x03002007, + 0x00000000, 0x00002007, 0x00002007, 0x00000705, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 83e409a9233c9..165e914e1cd53 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -128,7 +128,6 @@ END_EXTERN_C() #define ZEND_JMP 42 #define ZEND_JMPZ 43 #define ZEND_JMPNZ 44 -#define ZEND_JMPZNZ 45 #define ZEND_JMPZ_EX 46 #define ZEND_JMPNZ_EX 47 #define ZEND_CASE 48 diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 5d365504454a6..8f92da6df271d 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -316,7 +316,6 @@ static int zend_jit_needs_call_chain(zend_call_info *call_info, uint32_t b, cons case ZEND_INIT_USER_CALL: case ZEND_FAST_CALL: case ZEND_JMP: - case ZEND_JMPZNZ: case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -399,7 +398,6 @@ static int zend_jit_needs_call_chain(zend_call_info *call_info, uint32_t b, cons case ZEND_INIT_USER_CALL: case ZEND_FAST_CALL: case ZEND_JMP: - case ZEND_JMPZNZ: case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -3426,8 +3424,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op && ((opline+1)->opcode == ZEND_JMPZ || (opline+1)->opcode == ZEND_JMPNZ || (opline+1)->opcode == ZEND_JMPZ_EX - || (opline+1)->opcode == ZEND_JMPNZ_EX - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ_EX) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -3460,8 +3457,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if ((opline->result_type & IS_TMP_VAR) && (i + 1) <= end && ((opline+1)->opcode == ZEND_JMPZ - || (opline+1)->opcode == ZEND_JMPNZ - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -3486,8 +3482,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if ((opline->result_type & IS_TMP_VAR) && (i + 1) <= end && ((opline+1)->opcode == ZEND_JMPZ - || (opline+1)->opcode == ZEND_JMPNZ - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -3510,8 +3505,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if ((opline->result_type & IS_TMP_VAR) && (i + 1) <= end && ((opline+1)->opcode == ZEND_JMPZ - || (opline+1)->opcode == ZEND_JMPNZ - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -3606,7 +3600,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op goto done; } ZEND_FALLTHROUGH; - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: if (opline->result_type == IS_UNDEF) { @@ -3630,8 +3623,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if ((opline->result_type & IS_TMP_VAR) && (i + 1) <= end && ((opline+1)->opcode == ZEND_JMPZ - || (opline+1)->opcode == ZEND_JMPNZ - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -3660,8 +3652,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if ((opline->result_type & IS_TMP_VAR) && (i + 1) <= end && ((opline+1)->opcode == ZEND_JMPZ - || (opline+1)->opcode == ZEND_JMPNZ - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -3717,8 +3708,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op if ((opline->result_type & IS_TMP_VAR) && (i + 1) <= end && ((opline+1)->opcode == ZEND_JMPZ - || (opline+1)->opcode == ZEND_JMPNZ - || (opline+1)->opcode == ZEND_JMPZNZ) + || (opline+1)->opcode == ZEND_JMPNZ) && (opline+1)->op1_type == IS_TMP_VAR && (opline+1)->op1.var == opline->result.var) { i++; @@ -4004,15 +3994,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op } is_terminated = 1; break; - case ZEND_JMPZNZ: - if (!zend_jit_handler(&dasm_state, opline, - zend_may_throw(opline, ssa_op, op_array, ssa)) || - !zend_jit_cond_jmp(&dasm_state, OP_JMP_ADDR(opline, opline->op2), ssa->cfg.blocks[b].successors[1]) || - !zend_jit_jmp(&dasm_state, ssa->cfg.blocks[b].successors[0])) { - goto jit_failure; - } - is_terminated = 1; - break; case ZEND_JMPZ: case ZEND_JMPNZ: if (opline > op_array->opcodes + ssa->cfg.blocks[b].start && diff --git a/ext/opcache/jit/zend_jit_arm64.dasc b/ext/opcache/jit/zend_jit_arm64.dasc index 7bae3752d7137..d464b21348b77 100644 --- a/ext/opcache/jit/zend_jit_arm64.dasc +++ b/ext/opcache/jit/zend_jit_arm64.dasc @@ -3330,11 +3330,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra OP_JMP_ADDR(opline, opline->op2) : opline + 1; break; - case ZEND_JMPZNZ: - exit_opline = (trace->opline == OP_JMP_ADDR(opline, opline->op2)) ? - ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) : - OP_JMP_ADDR(opline, opline->op2); - break; case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: if (opline->op2_type == IS_CV) { @@ -6496,12 +6491,6 @@ static int zend_jit_cmp_long_long(dasm_State **Dst, if (result) { | b => target_label } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - if (!result) { - | b => target_label - } else { - | b => target_label2 - } } else { ZEND_UNREACHABLE(); } @@ -6697,36 +6686,6 @@ static int zend_jit_cmp_long_long(dasm_State **Dst, default: ZEND_UNREACHABLE(); } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - switch (opline->opcode) { - case ZEND_IS_EQUAL: - case ZEND_IS_IDENTICAL: - case ZEND_CASE: - case ZEND_CASE_STRICT: - | bne => target_label - break; - case ZEND_IS_NOT_EQUAL: - case ZEND_IS_NOT_IDENTICAL: - | beq => target_label - break; - case ZEND_IS_SMALLER: - if (swap) { - | ble => target_label - } else { - | bge => target_label - } - break; - case ZEND_IS_SMALLER_OR_EQUAL: - if (swap) { - | blt => target_label - } else { - | bgt => target_label - } - break; - default: - ZEND_UNREACHABLE(); - } - | b => target_label2 } else { ZEND_UNREACHABLE(); } @@ -6908,39 +6867,6 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, z default: ZEND_UNREACHABLE(); } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - switch (opline->opcode) { - case ZEND_IS_EQUAL: - case ZEND_IS_IDENTICAL: - case ZEND_CASE: - case ZEND_CASE_STRICT: - | bne => target_label - break; - case ZEND_IS_NOT_EQUAL: - case ZEND_IS_NOT_IDENTICAL: - | bvs => target_label2 - | beq => target_label - break; - case ZEND_IS_SMALLER: - if (swap) { - | bvs => target_label - | bls => target_label - } else { - | bhs => target_label - } - break; - case ZEND_IS_SMALLER_OR_EQUAL: - if (swap) { - | bvs => target_label - | blo => target_label - } else { - | bhi => target_label - } - break; - default: - ZEND_UNREACHABLE(); - } - | b => target_label2 } else if (smart_branch_opcode == ZEND_JMPZ_EX) { switch (opline->opcode) { case ZEND_IS_EQUAL: @@ -7233,25 +7159,6 @@ static int zend_jit_cmp_slow(dasm_State **Dst, const zend_op *opline, zend_jit_a default: ZEND_UNREACHABLE(); } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - switch (opline->opcode) { - case ZEND_IS_EQUAL: - case ZEND_CASE: - | bne => target_label - break; - case ZEND_IS_NOT_EQUAL: - | beq => target_label - break; - case ZEND_IS_SMALLER: - | bge => target_label - break; - case ZEND_IS_SMALLER_OR_EQUAL: - | bgt => target_label - break; - default: - ZEND_UNREACHABLE(); - } - | b => target_label2 } else { ZEND_UNREACHABLE(); } @@ -7533,9 +7440,6 @@ static int zend_jit_identical(dasm_State **Dst, not_identical_label = target_label; } else if (smart_branch_opcode == ZEND_JMPNZ) { identical_label = target_label; - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - not_identical_label = target_label; - identical_label = target_label2; } else { ZEND_UNREACHABLE(); } @@ -7544,9 +7448,6 @@ static int zend_jit_identical(dasm_State **Dst, identical_label = target_label; } else if (smart_branch_opcode == ZEND_JMPNZ) { not_identical_label = target_label; - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - identical_label = target_label; - not_identical_label = target_label2; } else { ZEND_UNREACHABLE(); } @@ -7922,9 +7823,6 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_ false_label = target_label; } else if (branch_opcode == ZEND_JMPNZ) { true_label = target_label; - } else if (branch_opcode == ZEND_JMPZNZ) { - true_label = target_label2; - false_label = target_label; } else if (branch_opcode == ZEND_JMPZ_EX) { set_bool = 1; false_label = target_label; @@ -10194,8 +10092,6 @@ static int zend_jit_smart_true(dasm_State **Dst, const zend_op *opline, int jmp, } } else if (smart_branch_opcode == ZEND_JMPNZ) { | b =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -10220,8 +10116,6 @@ static int zend_jit_smart_false(dasm_State **Dst, const zend_op *opline, int jmp if (jmp) { | b >7 } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | b =>target_label } else { ZEND_UNREACHABLE(); } @@ -10249,9 +10143,6 @@ static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, zend_uchar undefined_label = target_label; } else if (smart_branch_opcode == ZEND_JMPNZ) { defined_label = target_label; - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - undefined_label = target_label; - defined_label = target_label2; } else { ZEND_UNREACHABLE(); } @@ -10487,9 +10378,6 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t | beq =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | bne =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | beq =>target_label - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -10574,9 +10462,6 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t | beq =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | bne =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | beq =>target_label - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -10585,9 +10470,6 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t | bne =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | beq =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | bne =>target_label - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -11747,8 +11629,6 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst, | b =>target_label2 } else if (smart_branch_opcode == ZEND_JMPNZ) { | b =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -11780,8 +11660,6 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst, if (smart_branch_opcode == ZEND_JMPZ) { | b =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | b =>target_label } else { ZEND_UNREACHABLE(); } @@ -14306,8 +14184,6 @@ static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, ui } else if (smart_branch_opcode) { if (smart_branch_opcode == ZEND_JMPNZ) { | b =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | b =>target_label2 } } else { | SET_ZVAL_TYPE_INFO res_addr, IS_TRUE, TMP1w, TMP2 @@ -14337,9 +14213,6 @@ static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, ui | ble =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | bgt =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | ble =>target_label - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -14687,9 +14560,6 @@ static int zend_jit_in_array(dasm_State **Dst, const zend_op *opline, uint32_t o | cbz RETVALx, =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | cbnz RETVALx, =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | cbz RETVALx, =>target_label - | b =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -14985,7 +14855,6 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa ZEND_FALLTHROUGH; case ZEND_BOOL: case ZEND_BOOL_NOT: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: return 1; @@ -15302,7 +15171,6 @@ static zend_regset zend_jit_get_scratch_regset(const zend_op *opline, const zend case ZEND_BOOL_NOT: case ZEND_JMPZ: case ZEND_JMPNZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: op1_info = OP1_INFO(); diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index f6227a6c63094..4f0b4df1594c9 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -310,7 +310,6 @@ static int zend_jit_trace_may_exit(const zend_op_array *op_array, const zend_op return 1; } break; - case ZEND_JMPZNZ: case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -1835,7 +1834,6 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin break; case ZEND_JMPZ: case ZEND_JMPNZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: case ZEND_BOOL: @@ -5357,7 +5355,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto done; case ZEND_JMPZ: case ZEND_JMPNZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: op1_info = OP1_INFO(); @@ -5377,13 +5374,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } else { smart_branch_opcode = ZEND_JMPNZ; } - exit_opline = (opline->opcode == ZEND_JMPZNZ) ? - ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) : - opline + 1; - } else if (opline->opcode == ZEND_JMPZNZ) { - ZEND_ASSERT((p+1)->opline == ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value)); - smart_branch_opcode = ZEND_JMPZ; - exit_opline = OP_JMP_ADDR(opline, opline->op2); + exit_opline = opline + 1; } else if ((p+1)->opline == opline + 1) { /* not taken branch */ smart_branch_opcode = opline->opcode; diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 5f09e41eaed3e..e3f4c15e6a902 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -3660,11 +3660,6 @@ static int zend_jit_trace_handler(dasm_State **Dst, const zend_op_array *op_arra OP_JMP_ADDR(opline, opline->op2) : opline + 1; break; - case ZEND_JMPZNZ: - exit_opline = (trace->opline == OP_JMP_ADDR(opline, opline->op2)) ? - ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value) : - OP_JMP_ADDR(opline, opline->op2); - break; case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: if (opline->op2_type == IS_CV) { @@ -7048,12 +7043,6 @@ static int zend_jit_cmp_long_long(dasm_State **Dst, if (result) { | jmp => target_label } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - if (!result) { - | jmp => target_label - } else { - | jmp => target_label2 - } } else { ZEND_UNREACHABLE(); } @@ -7250,36 +7239,6 @@ static int zend_jit_cmp_long_long(dasm_State **Dst, default: ZEND_UNREACHABLE(); } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - switch (opline->opcode) { - case ZEND_IS_EQUAL: - case ZEND_IS_IDENTICAL: - case ZEND_CASE: - case ZEND_CASE_STRICT: - | jne => target_label - break; - case ZEND_IS_NOT_EQUAL: - case ZEND_IS_NOT_IDENTICAL: - | je => target_label - break; - case ZEND_IS_SMALLER: - if (swap) { - | jle => target_label - } else { - | jge => target_label - } - break; - case ZEND_IS_SMALLER_OR_EQUAL: - if (swap) { - | jl => target_label - } else { - | jg => target_label - } - break; - default: - ZEND_UNREACHABLE(); - } - | jmp => target_label2 } else { ZEND_UNREACHABLE(); } @@ -7463,40 +7422,6 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, z default: ZEND_UNREACHABLE(); } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - switch (opline->opcode) { - case ZEND_IS_EQUAL: - case ZEND_IS_IDENTICAL: - case ZEND_CASE: - case ZEND_CASE_STRICT: - | jne => target_label - | jp => target_label - break; - case ZEND_IS_NOT_EQUAL: - case ZEND_IS_NOT_IDENTICAL: - | jp => target_label2 - | je => target_label - break; - case ZEND_IS_SMALLER: - if (swap) { - | jbe => target_label - } else { - | jae => target_label - | jp => target_label - } - break; - case ZEND_IS_SMALLER_OR_EQUAL: - if (swap) { - | jb => target_label - } else { - | ja => target_label - | jp => target_label - } - break; - default: - ZEND_UNREACHABLE(); - } - | jmp => target_label2 } else if (smart_branch_opcode == ZEND_JMPZ_EX) { switch (opline->opcode) { case ZEND_IS_EQUAL: @@ -7793,25 +7718,6 @@ static int zend_jit_cmp_slow(dasm_State **Dst, const zend_op *opline, zend_jit_a default: ZEND_UNREACHABLE(); } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - switch (opline->opcode) { - case ZEND_IS_EQUAL: - case ZEND_CASE: - | jne => target_label - break; - case ZEND_IS_NOT_EQUAL: - | je => target_label - break; - case ZEND_IS_SMALLER: - | jge => target_label - break; - case ZEND_IS_SMALLER_OR_EQUAL: - | jg => target_label - break; - default: - ZEND_UNREACHABLE(); - } - | jmp => target_label2 } else { ZEND_UNREACHABLE(); } @@ -8110,9 +8016,6 @@ static int zend_jit_identical(dasm_State **Dst, not_identical_label = target_label; } else if (smart_branch_opcode == ZEND_JMPNZ) { identical_label = target_label; - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - not_identical_label = target_label; - identical_label = target_label2; } else { ZEND_UNREACHABLE(); } @@ -8121,9 +8024,6 @@ static int zend_jit_identical(dasm_State **Dst, identical_label = target_label; } else if (smart_branch_opcode == ZEND_JMPNZ) { not_identical_label = target_label; - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - identical_label = target_label; - not_identical_label = target_label2; } else { ZEND_UNREACHABLE(); } @@ -8501,9 +8401,6 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_ false_label = target_label; } else if (branch_opcode == ZEND_JMPNZ) { true_label = target_label; - } else if (branch_opcode == ZEND_JMPZNZ) { - true_label = target_label2; - false_label = target_label; } else if (branch_opcode == ZEND_JMPZ_EX) { set_bool = 1; false_label = target_label; @@ -10846,8 +10743,6 @@ static int zend_jit_smart_true(dasm_State **Dst, const zend_op *opline, int jmp, } } else if (smart_branch_opcode == ZEND_JMPNZ) { | jmp =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -10872,8 +10767,6 @@ static int zend_jit_smart_false(dasm_State **Dst, const zend_op *opline, int jmp if (jmp) { | jmp >7 } - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jmp =>target_label } else { ZEND_UNREACHABLE(); } @@ -10901,9 +10794,6 @@ static int zend_jit_defined(dasm_State **Dst, const zend_op *opline, zend_uchar undefined_label = target_label; } else if (smart_branch_opcode == ZEND_JMPNZ) { defined_label = target_label; - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - undefined_label = target_label; - defined_label = target_label2; } else { ZEND_UNREACHABLE(); } @@ -11141,9 +11031,6 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t | je =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | jne =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | je =>target_label - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -11225,9 +11112,6 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t | je =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | jne =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | je =>target_label - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -11236,9 +11120,6 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t | jne =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | je =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jne =>target_label - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -12452,8 +12333,6 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst, | jmp =>target_label2 } else if (smart_branch_opcode == ZEND_JMPNZ) { | jmp =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -12485,8 +12364,6 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst, if (smart_branch_opcode == ZEND_JMPZ) { | jmp =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jmp =>target_label } else { ZEND_UNREACHABLE(); } @@ -15196,8 +15073,6 @@ static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, ui } else if (smart_branch_opcode) { if (smart_branch_opcode == ZEND_JMPNZ) { | jmp =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jmp =>target_label2 } } else { | SET_ZVAL_TYPE_INFO res_addr, IS_TRUE @@ -15226,9 +15101,6 @@ static int zend_jit_isset_isempty_cv(dasm_State **Dst, const zend_op *opline, ui | jle =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | jg =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jle =>target_label - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -15580,9 +15452,6 @@ static int zend_jit_in_array(dasm_State **Dst, const zend_op *opline, uint32_t o | jz =>target_label } else if (smart_branch_opcode == ZEND_JMPNZ) { | jnz =>target_label - } else if (smart_branch_opcode == ZEND_JMPZNZ) { - | jz =>target_label - | jmp =>target_label2 } else { ZEND_UNREACHABLE(); } @@ -15875,7 +15744,6 @@ static bool zend_jit_opline_supports_reg(const zend_op_array *op_array, zend_ssa ZEND_FALLTHROUGH; case ZEND_BOOL: case ZEND_BOOL_NOT: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: return 1; @@ -16263,7 +16131,6 @@ bw_op: case ZEND_BOOL_NOT: case ZEND_JMPZ: case ZEND_JMPNZ: - case ZEND_JMPZNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: op1_info = OP1_INFO(); diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index ef59254d70937..b822f8992d4f4 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -542,9 +542,6 @@ static void zend_file_cache_serialize_op_array(zend_op_array *op_arra case ZEND_FAST_CALL: SERIALIZE_PTR(opline->op1.jmp_addr); break; - case ZEND_JMPZNZ: - /* relative extended_value don't have to be changed */ - /* break omitted intentionally */ case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: @@ -1369,9 +1366,6 @@ static void zend_file_cache_unserialize_op_array(zend_op_array *op_arr case ZEND_FAST_CALL: UNSERIALIZE_PTR(opline->op1.jmp_addr); break; - case ZEND_JMPZNZ: - /* relative extended_value don't have to be changed */ - /* break omitted intentionally */ case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 2ccfff3d04321..e21fa4cb9af2b 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -590,9 +590,6 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc case ZEND_FAST_CALL: opline->op1.jmp_addr = &new_opcodes[opline->op1.jmp_addr - op_array->opcodes]; break; - case ZEND_JMPZNZ: - /* relative extended_value don't have to be changed */ - /* break omitted intentionally */ case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: From e1782c08bff84e8aae0397b68f71236d8d1fd13f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 11 Jan 2022 09:13:22 +0300 Subject: [PATCH 0349/1346] Fix ASAN undefined behavior (unsigned char << 24) ext/mbstring/libmbfl/filters/mbfilter_utf32.c:259:20: runtime error: left shift of 128 by 24 places cannot be represented in type 'int' --- ext/mbstring/libmbfl/filters/mbfilter_ucs4.c | 24 +++++++++---------- ext/mbstring/libmbfl/filters/mbfilter_utf32.c | 24 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c index c7f5fb2ac04fa..09796390b3df6 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_ucs4.c @@ -320,10 +320,10 @@ static size_t mb_ucs4_to_wchar(unsigned char **in, size_t *in_len, uint32_t *buf return mb_ucs4le_to_wchar(in, in_len, buf, bufsize, NULL); } else if (*in_len >= 4) { unsigned char *p = *in; - unsigned char c1 = *p++; - unsigned char c2 = *p++; - unsigned char c3 = *p++; - unsigned char c4 = *p++; + uint32_t c1 = *p++; + uint32_t c2 = *p++; + uint32_t c3 = *p++; + uint32_t c4 = *p++; uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; if (w == 0xFFFE0000) { @@ -349,10 +349,10 @@ static size_t mb_ucs4be_to_wchar(unsigned char **in, size_t *in_len, uint32_t *b uint32_t *out = buf, *limit = buf + bufsize; while (p < e && out < limit) { - unsigned char c1 = *p++; - unsigned char c2 = *p++; - unsigned char c3 = *p++; - unsigned char c4 = *p++; + uint32_t c1 = *p++; + uint32_t c2 = *p++; + uint32_t c3 = *p++; + uint32_t c4 = *p++; uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; *out++ = w; } @@ -393,10 +393,10 @@ static size_t mb_ucs4le_to_wchar(unsigned char **in, size_t *in_len, uint32_t *b uint32_t *out = buf, *limit = buf + bufsize; while (p < e && out < limit) { - unsigned char c1 = *p++; - unsigned char c2 = *p++; - unsigned char c3 = *p++; - unsigned char c4 = *p++; + uint32_t c1 = *p++; + uint32_t c2 = *p++; + uint32_t c3 = *p++; + uint32_t c4 = *p++; uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1; *out++ = w; } diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c index c654e4cf51020..a6594ed75162e 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c @@ -252,10 +252,10 @@ static size_t mb_utf32_to_wchar(unsigned char **in, size_t *in_len, uint32_t *bu return mb_utf32le_to_wchar(in, in_len, buf, bufsize, NULL); } else if (*in_len >= 4) { unsigned char *p = *in; - unsigned char c1 = *p++; - unsigned char c2 = *p++; - unsigned char c3 = *p++; - unsigned char c4 = *p++; + uint32_t c1 = *p++; + uint32_t c2 = *p++; + uint32_t c3 = *p++; + uint32_t c4 = *p++; uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; if (w == 0xFFFE0000) { @@ -281,10 +281,10 @@ static size_t mb_utf32be_to_wchar(unsigned char **in, size_t *in_len, uint32_t * uint32_t *out = buf, *limit = buf + bufsize; while (p < e && out < limit) { - unsigned char c1 = *p++; - unsigned char c2 = *p++; - unsigned char c3 = *p++; - unsigned char c4 = *p++; + uint32_t c1 = *p++; + uint32_t c2 = *p++; + uint32_t c3 = *p++; + uint32_t c4 = *p++; uint32_t w = (c1 << 24) | (c2 << 16) | (c3 << 8) | c4; if (w < MBFL_WCSPLANE_UTF32MAX && (w < 0xD800 || w > 0xDFFF)) { @@ -330,10 +330,10 @@ static size_t mb_utf32le_to_wchar(unsigned char **in, size_t *in_len, uint32_t * uint32_t *out = buf, *limit = buf + bufsize; while (p < e && out < limit) { - unsigned char c1 = *p++; - unsigned char c2 = *p++; - unsigned char c3 = *p++; - unsigned char c4 = *p++; + uint32_t c1 = *p++; + uint32_t c2 = *p++; + uint32_t c3 = *p++; + uint32_t c4 = *p++; uint32_t w = (c4 << 24) | (c3 << 16) | (c2 << 8) | c1; if (w < MBFL_WCSPLANE_UTF32MAX && (w < 0xD800 || w > 0xDFFF)) { From 78974a4776a25425d836a8e842b8519b14d4127b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 11 Jan 2022 22:23:44 +0300 Subject: [PATCH 0350/1346] JIT: Fix incorrect flag check Fixes oss-fuzz #43538 --- ext/opcache/jit/zend_jit_x86.dasc | 4 ++-- ext/opcache/tests/jit/assign_dim_009.phpt | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 ext/opcache/tests/jit/assign_dim_009.phpt diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index ff272256c3267..20d76010c2e81 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -6135,7 +6135,7 @@ static int zend_jit_simple_assign(dasm_State **Dst, if (tmp_reg == ZREG_R0) { | IF_NOT_REFCOUNTED ah, >3 } else { - | IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >3 + | IF_NOT_FLAGS Rd(tmp_reg), (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT), >3 } | GET_ZVAL_PTR Ra(tmp_reg), var_addr @@ -6150,7 +6150,7 @@ static int zend_jit_simple_assign(dasm_State **Dst, if (tmp_reg == ZREG_R0) { | IF_NOT_REFCOUNTED ah, >2 } else { - | IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >2 + | IF_NOT_FLAGS Rd(tmp_reg), (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT), >2 } | GET_ZVAL_PTR Ra(tmp_reg), var_addr | GC_ADDREF Ra(tmp_reg) diff --git a/ext/opcache/tests/jit/assign_dim_009.phpt b/ext/opcache/tests/jit/assign_dim_009.phpt new file mode 100644 index 0000000000000..bea28098a5e9b --- /dev/null +++ b/ext/opcache/tests/jit/assign_dim_009.phpt @@ -0,0 +1,14 @@ +--TEST-- +JIT ASSIGN_DIM: 009 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +DONE +--EXPECT-- +DONE From 7e6558edf1570ebf09390624feb06747385f0224 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 12 Jan 2022 12:08:59 +0300 Subject: [PATCH 0351/1346] Fix ext/zend_test/tests/observer_bug81430_2.phpt failure --- ext/reflection/php_reflection.c | 48 ++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a1c97ae9ec037..b344943bf2288 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -6522,9 +6522,7 @@ static int call_attribute_constructor( zval *args, uint32_t argc, HashTable *named_params, zend_string *filename) { zend_function *ctor = ce->constructor; - zend_execute_data *prev_execute_data, dummy_frame; - zend_function dummy_func; - zend_op dummy_opline; + zend_execute_data *call = NULL; ZEND_ASSERT(ctor != NULL); if (!(ctor->common.fn_flags & ZEND_ACC_PUBLIC)) { @@ -6535,31 +6533,43 @@ static int call_attribute_constructor( if (filename) { /* Set up dummy call frame that makes it look like the attribute was invoked * from where it occurs in the code. */ - memset(&dummy_frame, 0, sizeof(zend_execute_data)); - memset(&dummy_func, 0, sizeof(zend_function)); - memset(&dummy_opline, 0, sizeof(zend_op)); + zend_function dummy_func; + zend_op *opline; - prev_execute_data = EG(current_execute_data); - dummy_frame.prev_execute_data = prev_execute_data; - dummy_frame.func = &dummy_func; - dummy_frame.opline = &dummy_opline; + memset(&dummy_func, 0, sizeof(zend_function)); - dummy_func.type = ZEND_USER_FUNCTION; - dummy_func.common.fn_flags = + call = zend_vm_stack_push_call_frame_ex( + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_execute_data), sizeof(zval)) + + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_op), sizeof(zval)) + + ZEND_MM_ALIGNED_SIZE_EX(sizeof(zend_function), sizeof(zval)), + 0, &dummy_func, 0, NULL); + + opline = (zend_op*)(call + 1); + memset(opline, 0, sizeof(zend_op)); + opline->opcode = ZEND_DO_FCALL; + opline->lineno = attr->lineno; + + call->opline = opline; + call->call = NULL; + call->return_value = NULL; + call->func = (zend_function*)(call->opline + 1); + call->prev_execute_data = EG(current_execute_data); + + memset(call->func, 0, sizeof(zend_function)); + call->func->type = ZEND_USER_FUNCTION; + call->func->op_array.fn_flags = attr->flags & ZEND_ATTRIBUTE_STRICT_TYPES ? ZEND_ACC_STRICT_TYPES : 0; - dummy_func.common.fn_flags |= ZEND_ACC_CALL_VIA_TRAMPOLINE; - dummy_func.op_array.filename = filename; - - dummy_opline.opcode = ZEND_DO_FCALL; - dummy_opline.lineno = attr->lineno; + call->func->op_array.fn_flags |= ZEND_ACC_CALL_VIA_TRAMPOLINE; + call->func->op_array.filename = filename; - EG(current_execute_data) = &dummy_frame; + EG(current_execute_data) = call; } zend_call_known_function(ctor, obj, obj->ce, NULL, argc, args, named_params); if (filename) { - EG(current_execute_data) = prev_execute_data; + EG(current_execute_data) = call->prev_execute_data; + zend_vm_stack_free_call_frame(call); } if (EG(exception)) { From 524ce9041862159ed1bbaf29d387782c6f8d534c Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Fri, 7 Jan 2022 15:04:36 +0100 Subject: [PATCH 0352/1346] fix GH-7899 Regression in unpack for negative int value --- NEWS | 3 +++ ext/standard/pack.c | 11 +++++++++-- ext/standard/tests/strings/pack64.phpt | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 812b1005ccb19..cbcabd058ac8c 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,9 @@ PHP NEWS - pcntl: . Fixed pcntl_rfork build for DragonFlyBSD. (David Carlier) +- Standard: + . Fixed bug GH-7899 (Regression in unpack for negative int value). (Remi) + 06 Jan 2022, PHP 8.1.2RC1 - Core: diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 46856874bc2a1..8736d291fb246 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -62,6 +62,7 @@ typedef ZEND_SET_ALIGNED(1, uint16_t unaligned_uint16_t); typedef ZEND_SET_ALIGNED(1, uint32_t unaligned_uint32_t); typedef ZEND_SET_ALIGNED(1, uint64_t unaligned_uint64_t); typedef ZEND_SET_ALIGNED(1, unsigned int unaligned_uint); +typedef ZEND_SET_ALIGNED(1, int unaligned_int); /* Mapping of byte from char (8bit) to long for machine endian */ static int byte_map[1]; @@ -1043,8 +1044,14 @@ PHP_FUNCTION(unpack) case 'i': /* signed integer, machine size, machine endian */ case 'I': { /* unsigned integer, machine size, machine endian */ - unsigned int x = *((unaligned_uint*) &input[inputpos]); - zend_long v = (type == 'i') ? (int) x : x; + zend_long v; + if (type == 'i') { + int x = *((unaligned_int*) &input[inputpos]); + v = x; + } else { + unsigned int x = *((unaligned_uint*) &input[inputpos]); + v = x; + } ZVAL_LONG(&val, v); zend_symtable_update(Z_ARRVAL_P(return_value), real_name, &val); diff --git a/ext/standard/tests/strings/pack64.phpt b/ext/standard/tests/strings/pack64.phpt index 753821f654299..84e69008284d4 100644 --- a/ext/standard/tests/strings/pack64.phpt +++ b/ext/standard/tests/strings/pack64.phpt @@ -31,6 +31,11 @@ print_r(unpack("q", pack("q", 0))); print_r(unpack("q", pack("q", 0x8000000000000002))); print_r(unpack("q", pack("q", -1))); print_r(unpack("q", pack("q", 0x8000000000000000))); + +print_r(unpack("i", pack("i", 2147483647))); // Max int32 +print_r(unpack("i", pack("i", -2147483647))); +print_r(unpack("i", pack("i", -2147483648))); // Min int32 +print_r(unpack("I", pack("I", 4294967295))); // Max uint32 ?> --EXPECT-- Array @@ -113,3 +118,19 @@ Array ( [1] => -9223372036854775808 ) +Array +( + [1] => 2147483647 +) +Array +( + [1] => -2147483647 +) +Array +( + [1] => -2147483648 +) +Array +( + [1] => 4294967295 +) From 944b6b6bbd6f05ad905f5f4ad07445792bee4027 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sun, 16 Jan 2022 13:31:58 -0500 Subject: [PATCH 0353/1346] Merge concatenated literal strings while compiling. (#7948) The output of token_get_all is unaffected, so projects such as the userland nikic/php-parser are unaffected. Extensions such as nikic/php-ast which expose the internal php ast would see literals be flattened, though. This makes php significantly faster at parsing code such as `$x = eval('return ' . var_export(str_repeat("\0", 100), true) . ';');` and avoids the stack overflow from recursing 100000 times in zend_eval_const_expr to process `'' . "\0" . '' . "\0" . ...` Closes GH-7946 * Don't create binary op if unnecessary * Update Zend/zend_ast.c Co-authored-by: Nikita Popov --- Zend/zend_ast.c | 13 +++++++++++++ Zend/zend_ast.h | 3 +++ Zend/zend_language_parser.y | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 0d69bfbaca369..e08a140a35541 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -420,6 +420,19 @@ ZEND_API zend_ast *zend_ast_create_list(uint32_t init_children, zend_ast_kind ki } #endif +zend_ast *zend_ast_create_concat_op(zend_ast *op0, zend_ast *op1) { + if (op0->kind == ZEND_AST_ZVAL && op1->kind == ZEND_AST_ZVAL) { + zval *zv0 = zend_ast_get_zval(op0); + zval *zv1 = zend_ast_get_zval(op1); + if (!zend_binary_op_produces_error(ZEND_CONCAT, zv0, zv1) && + concat_function(zv0, zv0, zv1) == SUCCESS) { + zval_ptr_dtor_nogc(zv1); + return zend_ast_create_zval(zv0); + } + } + return zend_ast_create_binary_op(ZEND_CONCAT, op0, op1); +} + static inline bool is_power_of_two(uint32_t n) { return ((n != 0) && (n == (n & (~n + 1)))); } diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 86f153580063c..d2940bbe633a8 100644 --- a/Zend/zend_ast.h +++ b/Zend/zend_ast.h @@ -355,6 +355,9 @@ static zend_always_inline uint32_t zend_ast_get_lineno(zend_ast *ast) { static zend_always_inline zend_ast *zend_ast_create_binary_op(uint32_t opcode, zend_ast *op0, zend_ast *op1) { return zend_ast_create_ex(ZEND_AST_BINARY_OP, opcode, op0, op1); } + +zend_ast *zend_ast_create_concat_op(zend_ast *op0, zend_ast *op1); + static zend_always_inline zend_ast *zend_ast_create_assign_op(uint32_t opcode, zend_ast *op0, zend_ast *op1) { return zend_ast_create_ex(ZEND_AST_ASSIGN_OP, opcode, op0, op1); } diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index a8bddfae50a3e..f6ba5465abebb 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -1129,7 +1129,7 @@ expr: | expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = zend_ast_create_binary_op(ZEND_BW_AND, $1, $3); } | expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr { $$ = zend_ast_create_binary_op(ZEND_BW_AND, $1, $3); } | expr '^' expr { $$ = zend_ast_create_binary_op(ZEND_BW_XOR, $1, $3); } - | expr '.' expr { $$ = zend_ast_create_binary_op(ZEND_CONCAT, $1, $3); } + | expr '.' expr { $$ = zend_ast_create_concat_op($1, $3); } | expr '+' expr { $$ = zend_ast_create_binary_op(ZEND_ADD, $1, $3); } | expr '-' expr { $$ = zend_ast_create_binary_op(ZEND_SUB, $1, $3); } | expr '*' expr { $$ = zend_ast_create_binary_op(ZEND_MUL, $1, $3); } From 2c4b9e995a5de31af8fb928351bd632fe0ac5ce6 Mon Sep 17 00:00:00 2001 From: Tony Su Date: Tue, 18 Jan 2022 18:41:50 +0800 Subject: [PATCH 0354/1346] [JIT] Print out more meaningful warning message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JIT] Print out more meaningful warning message When the setting value is out of range for jit_hot_loop, jit_hot_func, jit_hot_return, and jit_hot_side_exit, current PHP only prints out warning message like: Warning: Invalid "opcache.jit_hot_loop" setting. Should be between 0 and 256 in Unknown on line 0 With this small patch, PHP can print out more meaningful information, and tell user default value will be used and correct value range, like Warning: Invalid "opcache.jit_hot_loop" setting; using default value instead. Should be between 0 and 255 in Unknown on line 0 This patch has been verified on my local machine. Signed-off-by: Su, Tao Co-authored-by: Michael Voříšek Co-authored-by: Christoph M. Becker Closes GH-7955. --- ext/opcache/zend_accelerator_module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index f785303c936a7..b09eb9ff41ad9 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -182,7 +182,7 @@ static ZEND_INI_MH(OnUpdateCounter) *p = val; return SUCCESS; } - zend_error(E_WARNING, "Invalid \"%s\" setting. Should be between 0 and 256", ZSTR_VAL(entry->name)); + zend_error(E_WARNING, "Invalid \"%s\" setting; using default value instead. Should be between 0 and 255", ZSTR_VAL(entry->name)); return FAILURE; } From 20d8561ed4986c3ca1e514b7bcb2dda8b6fbe0ee Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 18 Jan 2022 14:04:42 +0000 Subject: [PATCH 0355/1346] fuzzer support for FreeBSD, getting opcache location Closes GH-7926. --- sapi/fuzzer/fuzzer-execute-common.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sapi/fuzzer/fuzzer-execute-common.h b/sapi/fuzzer/fuzzer-execute-common.h index 3189d514c02e3..3ecd27d3fd991 100644 --- a/sapi/fuzzer/fuzzer-execute-common.h +++ b/sapi/fuzzer/fuzzer-execute-common.h @@ -16,6 +16,10 @@ #include
+#if defined(__FreeBSD__) +# include +#endif + #include "fuzzer.h" #include "fuzzer-sapi.h" #include "zend_exceptions.h" @@ -140,7 +144,13 @@ ZEND_ATTRIBUTE_UNUSED char *get_opcache_path(void) { /* Try relative to binary location. */ char path[MAXPATHLEN]; +#if defined(__FreeBSD__) + size_t pathlen = sizeof(path); + int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; + if (sysctl(mib, 4, path, &pathlen, NULL, 0) < 0) { +#else if (readlink("/proc/self/exe", path, sizeof(path)) < 0) { +#endif ZEND_ASSERT(0 && "Failed to get binary path"); return NULL; } From aff3709adabe2c83ceb3afbe1f485e3f1a434968 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 19 Jan 2022 20:10:23 +0100 Subject: [PATCH 0356/1346] [ci skip] Extend my maintainership of com_dotnet and gd --- EXTENSIONS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EXTENSIONS b/EXTENSIONS index bdc1b6d3a39ea..25cf9fbd6a981 100644 --- a/EXTENSIONS +++ b/EXTENSIONS @@ -250,7 +250,7 @@ STATUS: Working ------------------------------------------------------------------------------- EXTENSION: com_dotnet PRIMARY MAINTAINER: Wez Furlong (2003 - 2005) - Christoph M. Becker (2018 - 2020) + Christoph M. Becker (2018 - 2022) MAINTENANCE: Maintained STATUS: Windows SINCE: 5.0 @@ -313,7 +313,7 @@ STATUS: Working ------------------------------------------------------------------------------- EXTENSION: gd PRIMARY MAINTAINER: Pierre-Alain Joye (2002 - 2016) - Christoph M. Becker (2015 - 2020) + Christoph M. Becker (2015 - 2022) MAINTENANCE: Maintained STATUS: Working ------------------------------------------------------------------------------- From b27d2fffbc551cebc3696718028bd22ebbc93dde Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sat, 22 Jan 2022 12:34:50 -0500 Subject: [PATCH 0357/1346] Update php-parser to 4.13.2 in build/gen_stub.php (#7989) v4.13.2 fixes a deprecation notice in php 8.2 for namespacedName --- build/gen_stub.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index b2213409b0b89..94eab3be1ef0d 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -3287,7 +3287,7 @@ function initPhpParser() { } $isInitialized = true; - $version = "4.13.0"; + $version = "4.13.2"; $phpParserDir = __DIR__ . "/PHP-Parser-$version"; if (!is_dir($phpParserDir)) { installPhpParser($version, $phpParserDir); From f1ae13509f23a639bd47b4035e6bf74c68cef752 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 28 Jan 2022 12:38:38 +0300 Subject: [PATCH 0358/1346] Fix memory leak Fixes oss-fuzz #43988 --- Zend/tests/dynamic_prop_deprecation_002.phpt | 13 ++++++++++++ Zend/zend_object_handlers.c | 21 +++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 Zend/tests/dynamic_prop_deprecation_002.phpt diff --git a/Zend/tests/dynamic_prop_deprecation_002.phpt b/Zend/tests/dynamic_prop_deprecation_002.phpt new file mode 100644 index 0000000000000..2ab7452fedb67 --- /dev/null +++ b/Zend/tests/dynamic_prop_deprecation_002.phpt @@ -0,0 +1,13 @@ +--TEST-- +Dynamic properties deprecation 002 (memory leak) +--FILE-- +y]; +?> +--EXPECT-- +Err: Creation of dynamic property class@anonymous::$y is deprecated \ No newline at end of file diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index e75ff8318cb48..721abe46998b8 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -277,10 +277,16 @@ static ZEND_COLD zend_never_inline void zend_forbidden_dynamic_property( ZSTR_VAL(ce->name), ZSTR_VAL(member)); } -static ZEND_COLD zend_never_inline void zend_deprecated_dynamic_property( - zend_class_entry *ce, zend_string *member) { +static ZEND_COLD zend_never_inline bool zend_deprecated_dynamic_property( + zend_object *obj, zend_string *member) { + GC_ADDREF(obj); zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated", - ZSTR_VAL(ce->name), ZSTR_VAL(member)); + ZSTR_VAL(obj->ce->name), ZSTR_VAL(member)); + if (UNEXPECTED(GC_DELREF(obj) == 0)) { + zend_objects_store_del(obj); + return 0; + } + return 1; } static ZEND_COLD zend_never_inline void zend_readonly_property_modification_scope_error( @@ -880,7 +886,10 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva goto exit; } if (UNEXPECTED(!(zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES))) { - zend_deprecated_dynamic_property(zobj->ce, name); + if (UNEXPECTED(!zend_deprecated_dynamic_property(zobj, name))) { + variable_ptr = &EG(error_zval); + goto exit; + } } Z_TRY_ADDREF_P(value); @@ -1063,7 +1072,9 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam return &EG(error_zval); } if (UNEXPECTED(!(zobj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES))) { - zend_deprecated_dynamic_property(zobj->ce, name); + if (UNEXPECTED(!zend_deprecated_dynamic_property(zobj, name))) { + return &EG(error_zval); + } } if (UNEXPECTED(!zobj->properties)) { rebuild_object_properties(zobj); From 22688c7822f46a39e2f59c0dbc09c72d57cfc5bf Mon Sep 17 00:00:00 2001 From: "Su, Tao" Date: Sat, 29 Jan 2022 00:12:32 -0800 Subject: [PATCH 0359/1346] [ci skip] [Zend] Update README.md with new Zend VM executors Closes GH-8008 As a new learner to PHP Zend VM, the first place I can find information is this README.md. Unfortunately, it has not included the latest Zend VM kind and code generation script. With code reading and trail-and-error experiments, I found a few updates that might be helpful to new learners. ChangeLog: 1) Add HYBRID threading model 2) Remove --without-old-executor option and description 3) ZE2 --> ZE3 (Since PHP 7) 4) Change default VM kind from CALL to HYBRID Signed-off-by: Su, Tao --- Zend/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/README.md b/Zend/README.md index cf1f15463d2f9..d164da4736e94 100644 --- a/Zend/README.md +++ b/Zend/README.md @@ -119,21 +119,21 @@ ZEND_VM_HELPER_EX(, , , ) } ``` -Executor's code is generated by PHP script zend_vm_gen.php it uses +The executors code is generated by the PHP script `zend_vm_gen.php`. It uses `zend_vm_def.h` and `zend_vm_execute.skl` as input and produces `zend_vm_opcodes.h` and `zend_vm_execute.h`. The first file is a list of opcode definitions. It is included from `zend_compile.h`. The second one is an executor code itself. It is included from `zend_execute.c`. -`zend_vm_gen.php` can produce different kind of executors. You can select -different opcode threading model using `--with-vm-kind=CALL|SWITCH|GOTO`. You -can disable opcode specialization using `--without-specializer`. You can include -or exclude old executor together with specialized one using -`--without-old-executor`. At last you can debug executor using original -`zend_vm_def.h` or generated file `zend_vm_execute.h`. Debugging with original -file requires `--with-lines` option. By default ZE2 uses the following command -to generate executor: +`zend_vm_gen.php` can produce different kind of executors. You can select a +different opcode threading model using `--with-vm-kind=CALL|SWITCH|GOTO|HYBRID`. +You can disable opcode specialization using `--without-specializer`. +At last you can debug the executor using the original `zend_vm_def.h` or the +generated `zend_vm_execute.h` file. Debugging with the original file requires +the `--with-lines` option. By default ZE3 (since PHP 7) uses the following +command to generate the executor: ```bash -php zend_vm_gen.php --with-vm-kind=CALL +# Default VM kind is HYBRID +php zend_vm_gen.php --with-vm-kind=HYBRID ``` From 70f712ce04920f27f4bbba7f716d3439f31096ce Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 25 Jan 2022 18:12:30 +0100 Subject: [PATCH 0360/1346] [ci skip] Close stale PRs with GitHub actions Closes GH-7999 --- .github/workflows/close-stale-prs.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/close-stale-prs.yml diff --git a/.github/workflows/close-stale-prs.yml b/.github/workflows/close-stale-prs.yml new file mode 100644 index 0000000000000..d4a88c209aa21 --- /dev/null +++ b/.github/workflows/close-stale-prs.yml @@ -0,0 +1,20 @@ +name: Close stale PRs + +on: + schedule: + - cron: "0 0 * * *" + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v4 + with: + days-before-close: 7 + days-before-stale: 60 + # Temporary, avoid closing PRs until this action merged + debug-only: true + # Hack to skip issues, unfortunately there's no option to disable issues + only-issue-labels: inexistent-label + only-pr-labels: Waiting on Author + stale-pr-message: There has not been any recent activity in this PR. It will automatically be closed in 7 days if no further action is taken. From 2f5295692fde289f99aa9701528dcde4c78b780f Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 29 Dec 2021 12:51:18 +0100 Subject: [PATCH 0361/1346] Optimize stripos/stristr Closes GH-7847 Closes GH-7852 Previously stripos/stristr would lowercase both the haystack and the needle to reuse strpos. The approach in this PR is similar to strpos. memchr is highly optimized so we're using it to search for the first character of the needle in the haystack. If we find it we compare the remaining characters of the needle manually. The new implementation seems to perform about half as well as strpos (as two memchr calls are necessary to find the next candidate). --- NEWS | 2 ++ UPGRADING.INTERNALS | 3 +++ Zend/zend_operators.h | 61 +++++++++++++++++++++++++++++++++++++++++++ ext/libxml/libxml.c | 5 ++-- ext/phar/phar.c | 7 +---- ext/phar/tar.c | 8 ++---- ext/phar/zip.c | 7 +---- ext/standard/string.c | 31 +++++----------------- main/php.h | 1 + 9 files changed, 79 insertions(+), 46 deletions(-) diff --git a/NEWS b/NEWS index 0a53434c36a9f..09da40c962e28 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,8 @@ PHP NEWS . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) . Finished AVIF support in getimagesize(). (Yannis Guyon) + . Fixed bug GH-7847 (stripos with large haystack has bad performance). + (ilutov) - Zip: . add ZipArchive::clearError() method diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 7175f0b54b4db..cec9356406556 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -17,6 +17,9 @@ PHP 8.2 INTERNALS UPGRADE NOTES zend_binary_str(n)casecmp() as one would expect. Call the appropriate wrapped function directly instead. * Removed the (ZEND_)WRONG_PARAM_COUNT_WITH_RETVAL() macros. +* php_stristr() no longer lowercases the haystack and needle as a side effect. + Call zend_str_tolower() yourself if necessary. You no longer need to copy + the haystack and needle before passing them to php_stristr(). ======================== 2. Build system changes diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index eb88eedb79da1..265b84409009a 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -919,6 +919,67 @@ static zend_always_inline void zend_unwrap_reference(zval *op) /* {{{ */ } /* }}} */ +static zend_always_inline bool zend_strnieq(const char *ptr1, const char *ptr2, size_t num) +{ + const char *end = ptr1 + num; + while (ptr1 < end) { + if (zend_tolower_ascii(*ptr1++) != zend_tolower_ascii(*ptr2++)) { + return 0; + } + } + return 1; +} + +static zend_always_inline const char * +zend_memnistr(const char *haystack, const char *needle, size_t needle_len, const char *end) +{ + ZEND_ASSERT(end >= haystack); + + if (UNEXPECTED(needle_len == 0)) { + return haystack; + } + + if (UNEXPECTED(needle_len > (end - haystack))) { + return NULL; + } + + const char first_lower = zend_tolower_ascii(*needle); + const char first_upper = zend_toupper_ascii(*needle); + const char *p_lower = (const char *)memchr(haystack, first_lower, end - haystack); + const char *p_upper = NULL; + if (first_lower != first_upper) { + // If the needle length is 1 we don't need to look beyond p_lower as it is a guaranteed match + size_t upper_search_length = end - (needle_len == 1 && p_lower != NULL ? p_lower : haystack); + p_upper = (const char *)memchr(haystack, first_upper, upper_search_length); + } + const char *p = !p_upper || (p_lower && p_lower < p_upper) ? p_lower : p_upper; + + if (needle_len == 1) { + return p; + } + + const char needle_end_lower = zend_tolower_ascii(needle[needle_len - 1]); + const char needle_end_upper = zend_toupper_ascii(needle[needle_len - 1]); + end -= needle_len; + + while (p && p <= end) { + if (needle_end_lower == p[needle_len - 1] || needle_end_upper == p[needle_len - 1]) { + if (zend_strnieq(needle + 1, p + 1, needle_len - 2)) { + return p; + } + } + if (p_lower == p) { + p_lower = (const char *)memchr(p_lower + 1, first_lower, end - p_lower); + } + if (p_upper == p) { + p_upper = (const char *)memchr(p_upper + 1, first_upper, end - p_upper); + } + p = !p_upper || (p_lower && p_lower < p_upper) ? p_lower : p_upper; + } + + return NULL; +} + END_EXTERN_C() diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c index 449bf3248313e..99d5696ebcf31 100644 --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -378,9 +378,9 @@ php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc) const char buf[] = "Content-Type:"; if (Z_TYPE_P(header) == IS_STRING && !zend_binary_strncasecmp(Z_STRVAL_P(header), Z_STRLEN_P(header), buf, sizeof(buf)-1, sizeof(buf)-1)) { - char *needle = estrdup("charset="); + char needle[] = "charset="; char *haystack = estrndup(Z_STRVAL_P(header), Z_STRLEN_P(header)); - char *encoding = php_stristr(haystack, needle, Z_STRLEN_P(header), sizeof("charset=")-1); + char *encoding = php_stristr(haystack, needle, Z_STRLEN_P(header), strlen(needle)); if (encoding) { char *end; @@ -408,7 +408,6 @@ php_libxml_input_buffer_create_filename(const char *URI, xmlCharEncoding enc) } } efree(haystack); - efree(needle); break; /* found content-type */ } } ZEND_HASH_FOREACH_END(); diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 91310c21e4967..6d5790e3089c4 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -2531,7 +2531,6 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv { char halt_stub[] = "__HALT_COMPILER();"; zend_string *newstub; - char *tmp; phar_entry_info *entry, *newentry; size_t halt_offset; int restore_alias_len, global_flags = 0, closeoldfile; @@ -2635,9 +2634,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv } else { free_user_stub = 0; } - tmp = estrndup(user_stub, len); - if ((pos = php_stristr(tmp, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) { - efree(tmp); + if ((pos = php_stristr(user_stub, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) { if (closeoldfile) { php_stream_close(oldfile); } @@ -2650,8 +2647,6 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv } return EOF; } - pos = user_stub + (pos - tmp); - efree(tmp); len = pos - user_stub + 18; if ((size_t)len != php_stream_write(newfile, user_stub, len) || 5 != php_stream_write(newfile, " ?>\r\n", 5)) { diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 07b784a0b9df2..3b2e4c2ca76aa 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -967,7 +967,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int int closeoldfile, free_user_stub; size_t signature_length; struct _phar_pass_tar_info pass; - char *buf, *signature, *tmp, sigbuf[8]; + char *buf, *signature, sigbuf[8]; char halt_stub[] = "__HALT_COMPILER();"; entry.flags = PHAR_ENT_PERM_DEF_FILE; @@ -1063,9 +1063,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int free_user_stub = 0; } - tmp = estrndup(user_stub, len); - if ((pos = php_stristr(tmp, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) { - efree(tmp); + if ((pos = php_stristr(user_stub, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) { if (error) { spprintf(error, 0, "illegal stub for tar-based phar \"%s\"", phar->fname); } @@ -1074,8 +1072,6 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int } return EOF; } - pos = user_stub + (pos - tmp); - efree(tmp); len = pos - user_stub + 18; entry.fp = php_stream_fopen_tmpfile(); diff --git a/ext/phar/zip.c b/ext/phar/zip.c index c5e38cabf7b87..bfa23e9768b32 100644 --- a/ext/phar/zip.c +++ b/ext/phar/zip.c @@ -1202,7 +1202,6 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int char *pos; static const char newstub[] = "fname); } @@ -1316,8 +1313,6 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int } return EOF; } - pos = user_stub + (pos - tmp); - efree(tmp); len = pos - user_stub + 18; entry.fp = php_stream_fopen_tmpfile(); diff --git a/ext/standard/string.c b/ext/standard/string.c index 7c2dce4595b0f..36e8c1a737e77 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1687,9 +1687,7 @@ PHP_FUNCTION(pathinfo) case insensitive strstr */ PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len) { - zend_str_tolower(s, s_len); - zend_str_tolower(t, t_len); - return (char*)php_memnstr(s, t, t_len, s + s_len); + return (char*)php_memnistr(s, t, t_len, s + s_len); } /* }}} */ @@ -1735,8 +1733,6 @@ PHP_FUNCTION(stristr) zend_string *haystack, *needle; const char *found = NULL; size_t found_offset; - char *haystack_dup; - char *orig_needle; bool part = 0; ZEND_PARSE_PARAMETERS_START(2, 3) @@ -1746,13 +1742,10 @@ PHP_FUNCTION(stristr) Z_PARAM_BOOL(part) ZEND_PARSE_PARAMETERS_END(); - haystack_dup = estrndup(ZSTR_VAL(haystack), ZSTR_LEN(haystack)); - orig_needle = estrndup(ZSTR_VAL(needle), ZSTR_LEN(needle)); - found = php_stristr(haystack_dup, orig_needle, ZSTR_LEN(haystack), ZSTR_LEN(needle)); - efree(orig_needle); + found = php_stristr(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(haystack), ZSTR_LEN(needle)); if (found) { - found_offset = found - haystack_dup; + found_offset = found - ZSTR_VAL(haystack); if (part) { RETVAL_STRINGL(ZSTR_VAL(haystack), found_offset); } else { @@ -1761,8 +1754,6 @@ PHP_FUNCTION(stristr) } else { RETVAL_FALSE; } - - efree(haystack_dup); } /* }}} */ @@ -1890,7 +1881,6 @@ PHP_FUNCTION(stripos) const char *found = NULL; zend_string *haystack, *needle; zend_long offset = 0; - zend_string *needle_dup = NULL, *haystack_dup; ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STR(haystack) @@ -1907,23 +1897,14 @@ PHP_FUNCTION(stripos) RETURN_THROWS(); } - if (ZSTR_LEN(needle) > ZSTR_LEN(haystack)) { - RETURN_FALSE; - } - - haystack_dup = zend_string_tolower(haystack); - needle_dup = zend_string_tolower(needle); - found = (char*)php_memnstr(ZSTR_VAL(haystack_dup) + offset, - ZSTR_VAL(needle_dup), ZSTR_LEN(needle_dup), ZSTR_VAL(haystack_dup) + ZSTR_LEN(haystack)); + found = (char*)php_memnistr(ZSTR_VAL(haystack) + offset, + ZSTR_VAL(needle), ZSTR_LEN(needle), ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); if (found) { - RETVAL_LONG(found - ZSTR_VAL(haystack_dup)); + RETVAL_LONG(found - ZSTR_VAL(haystack)); } else { RETVAL_FALSE; } - - zend_string_release_ex(haystack_dup, 0); - zend_string_release_ex(needle_dup, 0); } /* }}} */ diff --git a/main/php.h b/main/php.h index 91ecbb21dc726..e8fcea5b6f607 100644 --- a/main/php.h +++ b/main/php.h @@ -344,6 +344,7 @@ END_EXTERN_C() #define phpin zendin #define php_memnstr zend_memnstr +#define php_memnistr zend_memnistr /* functions */ BEGIN_EXTERN_C() From 8c7521d3ae957b53304b7fb7b2054417cc2e8a32 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 3 Feb 2022 10:42:30 +0100 Subject: [PATCH 0362/1346] [Close stale PRs] Skip RFCs and "Waiting on Review" Pull requests with the "Waiting on Author" label should still not be closed if they have the RFC label as closing them requires manual action. Also avoid closing "Waiting on Review". --- .github/workflows/close-stale-prs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/close-stale-prs.yml b/.github/workflows/close-stale-prs.yml index d4a88c209aa21..e5e8abdd9d625 100644 --- a/.github/workflows/close-stale-prs.yml +++ b/.github/workflows/close-stale-prs.yml @@ -12,6 +12,7 @@ jobs: with: days-before-close: 7 days-before-stale: 60 + exempt-pr-labels: RFC,Waiting on Review # Temporary, avoid closing PRs until this action merged debug-only: true # Hack to skip issues, unfortunately there's no option to disable issues From 706398fa9fb081c6385c66ac8af1fe952c80f17d Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Fri, 4 Feb 2022 18:39:05 +0100 Subject: [PATCH 0363/1346] [ci skip] [Close stale PRs] Enable GitHub action --- .github/workflows/close-stale-prs.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/close-stale-prs.yml b/.github/workflows/close-stale-prs.yml index e5e8abdd9d625..5aa178eed2c2c 100644 --- a/.github/workflows/close-stale-prs.yml +++ b/.github/workflows/close-stale-prs.yml @@ -13,8 +13,6 @@ jobs: days-before-close: 7 days-before-stale: 60 exempt-pr-labels: RFC,Waiting on Review - # Temporary, avoid closing PRs until this action merged - debug-only: true # Hack to skip issues, unfortunately there's no option to disable issues only-issue-labels: inexistent-label only-pr-labels: Waiting on Author From 0199b222583855f2b42b9b15d545bc4b8b8d87f0 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 5 Feb 2022 20:13:32 +0100 Subject: [PATCH 0364/1346] ext/opcache: check mkstemp() return value right after the call (#8031) Don't call fchmod(-1), which is not only wrong, but also clobbers errno and sets it to EBADF, breaking the following errno access for the log message. --- ext/opcache/zend_shared_alloc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c index 53c7b61ff3f36..ad6b69b34613e 100644 --- a/ext/opcache/zend_shared_alloc.c +++ b/ext/opcache/zend_shared_alloc.c @@ -83,11 +83,12 @@ void zend_shared_alloc_create_lock(char *lockfile_path) snprintf(lockfile_name, sizeof(lockfile_name), "%s/%sXXXXXX", lockfile_path, SEM_FILENAME_PREFIX); lock_file = mkstemp(lockfile_name); - fchmod(lock_file, 0666); - if (lock_file == -1) { zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Unable to create lock file: %s (%d)", strerror(errno), errno); } + + fchmod(lock_file, 0666); + val = fcntl(lock_file, F_GETFD, 0); val |= FD_CLOEXEC; fcntl(lock_file, F_SETFD, val); From 7b90ebeb3f954123915f6d62fb7b2cd3fdf3c6ec Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Sat, 5 Feb 2022 14:18:37 -0500 Subject: [PATCH 0365/1346] Fix `-Werror=sign-compare` warning in `zend_memnistr` (#8042) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `error: comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘long int’ [-Werror=sign-compare]` This is asserting `end >= haystack` as a precondition for callers (in debug builds) and existing callers are correct. An alternate option is to cast the left side to `int64_t`, but that may be slightly inefficient for 32-bit builds. --- Zend/zend_operators.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 265b84409009a..346706d22beae 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -939,7 +939,7 @@ zend_memnistr(const char *haystack, const char *needle, size_t needle_len, const return haystack; } - if (UNEXPECTED(needle_len > (end - haystack))) { + if (UNEXPECTED(needle_len > (size_t)(end - haystack))) { return NULL; } @@ -947,7 +947,7 @@ zend_memnistr(const char *haystack, const char *needle, size_t needle_len, const const char first_upper = zend_toupper_ascii(*needle); const char *p_lower = (const char *)memchr(haystack, first_lower, end - haystack); const char *p_upper = NULL; - if (first_lower != first_upper) { + if (first_lower != first_upper) { // If the needle length is 1 we don't need to look beyond p_lower as it is a guaranteed match size_t upper_search_length = end - (needle_len == 1 && p_lower != NULL ? p_lower : haystack); p_upper = (const char *)memchr(haystack, first_upper, upper_search_length); From ca0afc3c8e16952e1d3f553de7271762d52e2761 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 7 Feb 2022 12:48:44 +0300 Subject: [PATCH 0366/1346] Improve speed of dominators and loop identification algorithms --- Zend/Optimizer/zend_cfg.c | 83 +++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index 8b83ccad67726..cc946c1b9ef3a 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -672,6 +672,11 @@ ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, ze int blocks_count = cfg->blocks_count; int j, k, changed; + if (cfg->blocks_count == 1) { + blocks[0].level = 0; + return; + } + ALLOCA_FLAG(use_heap) int *postnum = do_alloca(sizeof(int) * cfg->blocks_count, use_heap); memset(postnum, -1, sizeof(int) * cfg->blocks_count); @@ -692,16 +697,14 @@ ZEND_API void zend_cfg_compute_dominators_tree(const zend_op_array *op_array, ze for (k = 0; k < blocks[j].predecessors_count; k++) { int pred = cfg->predecessors[blocks[j].predecessor_offset + k]; - if (idom < 0) { - if (blocks[pred].idom >= 0) - idom = pred; - continue; - } - if (blocks[pred].idom >= 0) { - while (idom != pred) { - while (postnum[pred] < postnum[idom]) pred = blocks[pred].idom; - while (postnum[idom] < postnum[pred]) idom = blocks[idom].idom; + if (idom < 0) { + idom = pred; + } else { + while (idom != pred) { + while (postnum[pred] < postnum[idom]) pred = blocks[pred].idom; + while (postnum[idom] < postnum[pred]) idom = blocks[idom].idom; + } } } } @@ -765,19 +768,6 @@ static bool dominates(zend_basic_block *blocks, int a, int b) /* {{{ */ } /* }}} */ -typedef struct { - int id; - int level; -} block_info; -static int compare_block_level(const block_info *a, const block_info *b) { - return b->level - a->level; -} -static void swap_blocks(block_info *a, block_info *b) { - block_info tmp = *a; - *a = *b; - *b = tmp; -} - ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg) /* {{{ */ { int i, j, k, n; @@ -786,17 +776,22 @@ ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *c int *entry_times, *exit_times; zend_worklist work; int flag = ZEND_FUNC_NO_LOOPS; - block_info *sorted_blocks; + int *sorted_blocks; ALLOCA_FLAG(list_use_heap) ALLOCA_FLAG(tree_use_heap) - ALLOCA_FLAG(sorted_blocks_use_heap) + + if (cfg->blocks_count == 1) { + cfg->flags |= flag; + return; + } ZEND_WORKLIST_ALLOCA(&work, cfg->blocks_count, list_use_heap); /* We don't materialize the DJ spanning tree explicitly, as we are only interested in ancestor * queries. These are implemented by checking entry/exit times of the DFS search. */ - entry_times = do_alloca(2 * sizeof(int) * cfg->blocks_count, tree_use_heap); + entry_times = do_alloca(3 * sizeof(int) * cfg->blocks_count, tree_use_heap); exit_times = entry_times + cfg->blocks_count; + sorted_blocks = exit_times + cfg->blocks_count; memset(entry_times, -1, 2 * sizeof(int) * cfg->blocks_count); zend_worklist_push(&work, 0); @@ -826,27 +821,35 @@ ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *c zend_worklist_pop(&work); } - /* Sort blocks by decreasing level, which is the order in which we want to process them */ - sorted_blocks = do_alloca(sizeof(block_info) * cfg->blocks_count, sorted_blocks_use_heap); - for (i = 0; i < cfg->blocks_count; i++) { - sorted_blocks[i].id = i; - sorted_blocks[i].level = blocks[i].level; + /* Sort blocks by level, which is the opposite order in which we want to process them */ + sorted_blocks[0] = 0; + j = 0; + n = 1; + while (j != n) { + i = j; + j = n; + for (; i < j; i++) { + int child; + for (child = blocks[sorted_blocks[i]].children; child >= 0; child = blocks[child].next_child) { + sorted_blocks[n++] = child; + } + } } - zend_sort(sorted_blocks, cfg->blocks_count, sizeof(block_info), - (compare_func_t) compare_block_level, (swap_func_t) swap_blocks); - /* Identify loops. See Sreedhar et al, "Identifying Loops Using DJ - Graphs". */ + /* Identify loops. See Sreedhar et al, "Identifying Loops Using DJ Graphs". */ + while (n > 0) { + i = sorted_blocks[--n]; - for (n = 0; n < cfg->blocks_count; n++) { - i = sorted_blocks[n].id; + if (blocks[i].predecessors_count < 2) { + /* loop header has at least two input edges */ + continue; + } - zend_bitset_clear(work.visited, zend_bitset_len(cfg->blocks_count)); for (j = 0; j < blocks[i].predecessors_count; j++) { int pred = cfg->predecessors[blocks[i].predecessor_offset + j]; /* A join edge is one for which the predecessor does not - immediately dominate the successor. */ + immediately dominate the successor. */ if (blocks[i].idom == pred) { continue; } @@ -856,6 +859,9 @@ ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *c if (dominates(blocks, i, pred)) { blocks[i].flags |= ZEND_BB_LOOP_HEADER; flag &= ~ZEND_FUNC_NO_LOOPS; + if (!zend_worklist_len(&work)) { + zend_bitset_clear(work.visited, zend_bitset_len(cfg->blocks_count)); + } zend_worklist_push(&work, pred); } else { /* Otherwise it's a cross-join edge. See if it's a branch @@ -885,7 +891,6 @@ ZEND_API void zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *c } } - free_alloca(sorted_blocks, sorted_blocks_use_heap); free_alloca(entry_times, tree_use_heap); ZEND_WORKLIST_FREE_ALLOCA(&work, list_use_heap); From 2d579a1495be77227aedd9fc8e7a85635ed6da3f Mon Sep 17 00:00:00 2001 From: Tony Su Date: Tue, 8 Feb 2022 17:38:33 +0800 Subject: [PATCH 0367/1346] [ci skip] Update README.md on ZE description Expand ZE to Zend Engine and remove Zend Engine version. per Christoph M. Becker's comment for PR-8008. Signed-off-by: Su, Tao Closes GH-8057. --- Zend/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/README.md b/Zend/README.md index d164da4736e94..26f3613c34bb3 100644 --- a/Zend/README.md +++ b/Zend/README.md @@ -130,7 +130,7 @@ different opcode threading model using `--with-vm-kind=CALL|SWITCH|GOTO|HYBRID`. You can disable opcode specialization using `--without-specializer`. At last you can debug the executor using the original `zend_vm_def.h` or the generated `zend_vm_execute.h` file. Debugging with the original file requires -the `--with-lines` option. By default ZE3 (since PHP 7) uses the following +the `--with-lines` option. By default, Zend Engine uses the following command to generate the executor: ```bash From c77bbcd4642a982fd9fdaf32dbe444d925c7883f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 11 Feb 2022 16:46:12 +0300 Subject: [PATCH 0368/1346] Fixed GH-8041 (php 8.2.0-dev crashes with assertion for cloning/get_object_vars on non-empty SplFixedArray) --- ext/spl/spl_fixedarray.c | 4 ++++ ext/spl/tests/fixedarray_023.phpt | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 ext/spl/tests/fixedarray_023.phpt diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 8901c95694f53..7bfc8413fb2ba 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -223,6 +223,10 @@ static HashTable* spl_fixedarray_object_get_properties(zend_object *obj) zend_hash_index_del(ht, i); } } + if (HT_IS_PACKED(ht)) { + /* Engine doesn't expet packed array */ + zend_hash_packed_to_hash(ht); + } } return ht; diff --git a/ext/spl/tests/fixedarray_023.phpt b/ext/spl/tests/fixedarray_023.phpt new file mode 100644 index 0000000000000..e0e2606c90a8a --- /dev/null +++ b/ext/spl/tests/fixedarray_023.phpt @@ -0,0 +1,11 @@ +--TEST-- +SPL: FixedArray: Bug GH-8041 (php 8.2.0-dev crashes with assertion for cloning/get_object_vars on non-empty SplFixedArray) +--FILE-- + +DONE +--EXPECT-- +DONE From f06ac9a486ada028d85cda8a73bdd709eb7b0d95 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 20 Jan 2022 11:30:35 +0100 Subject: [PATCH 0369/1346] Fix GH-7939: Cannot unserialize IntlTimeZone objects As it is now, `IntlTimeZone`, `IntlCalendar` and `IntlDateFormatter` and some other intl class instances can be serialized, but the representation is meaningless, and unserialization yields uninitialized/ unusable objects. To prevent users from noticing this too late, we deny serialization of such objects in the first place. Closes GH-7945. --- NEWS | 1 + UPGRADING | 8 ++++++++ ext/intl/breakiterator/breakiterator.stub.php | 3 +++ ext/intl/breakiterator/breakiterator_arginfo.h | 5 ++++- ext/intl/breakiterator/breakiterator_iterators.stub.php | 1 + ext/intl/breakiterator/breakiterator_iterators_arginfo.h | 3 ++- ext/intl/calendar/calendar.stub.php | 2 ++ ext/intl/calendar/calendar_arginfo.h | 4 +++- ext/intl/collator/collator.stub.php | 1 + ext/intl/collator/collator_arginfo.h | 3 ++- ext/intl/common/common.stub.php | 1 + ext/intl/common/common_arginfo.h | 3 ++- ext/intl/converter/converter.stub.php | 1 + ext/intl/converter/converter_arginfo.h | 3 ++- ext/intl/dateformat/dateformat.stub.php | 1 + ext/intl/dateformat/dateformat_arginfo.h | 3 ++- ext/intl/dateformat/datepatterngenerator.stub.php | 1 + ext/intl/dateformat/datepatterngenerator_arginfo.h | 3 ++- ext/intl/msgformat/msgformat.stub.php | 1 + ext/intl/msgformat/msgformat_arginfo.h | 3 ++- ext/intl/resourcebundle/resourcebundle.stub.php | 1 + ext/intl/resourcebundle/resourcebundle_arginfo.h | 3 ++- ext/intl/spoofchecker/spoofchecker.stub.php | 1 + ext/intl/spoofchecker/spoofchecker_arginfo.h | 3 ++- ext/intl/timezone/timezone.stub.php | 1 + ext/intl/timezone/timezone_arginfo.h | 3 ++- ext/intl/transliterator/transliterator.stub.php | 1 + ext/intl/transliterator/transliterator_arginfo.h | 3 ++- 28 files changed, 54 insertions(+), 13 deletions(-) diff --git a/NEWS b/NEWS index 09da40c962e28..00ba31fd248e2 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ PHP NEWS - Intl: . Update all grandfathered language tags with preferred values + . Fixed GH-7939 (Cannot unserialize IntlTimeZone objects). (cmb) - OCI8: . Added oci8.prefetch_lob_size directive to tune LOB query performance diff --git a/UPGRADING b/UPGRADING index 4d918a85bfc17..efc6f36df0eef 100644 --- a/UPGRADING +++ b/UPGRADING @@ -126,6 +126,14 @@ PHP 8.2 UPGRADE NOTES 9. Other Changes to Extensions ======================================== +- Intl: + . IntlBreakIterator, IntlRuleBasedBreakIterator, IntlCodePointBreakIterator, + IntlPartsIterator, IntlCalendar, IntlCalendar, Collator, IntlIterator, + UConverter, IntlDateFormatter, IntlDatePatternGenerator, MessageFormatter, + ResourceBundle, Spoofchecker, IntlTimeZone and Transliterator instances are + no longer serializable. Previously, they could be serialized, but + unserialization yielded unusable objects or failed. + - OCI8: . The minimum Oracle Client library version required is now 11.2. diff --git a/ext/intl/breakiterator/breakiterator.stub.php b/ext/intl/breakiterator/breakiterator.stub.php index c78e48da62700..951b4ffc1bdfd 100644 --- a/ext/intl/breakiterator/breakiterator.stub.php +++ b/ext/intl/breakiterator/breakiterator.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlBreakIterator implements IteratorAggregate { /** @tentative-return-type */ @@ -69,6 +70,7 @@ public function setText(string $text): ?bool {} // TODO return false instead of public function getIterator(): Iterator {} } +/** @not-serializable */ class IntlRuleBasedBreakIterator extends IntlBreakIterator { public function __construct(string $rules, bool $compiled = false) {} @@ -86,6 +88,7 @@ public function getRuleStatus(): int {} public function getRuleStatusVec(): array|false {} } +/** @not-serializable */ class IntlCodePointBreakIterator extends IntlBreakIterator { /** @tentative-return-type */ diff --git a/ext/intl/breakiterator/breakiterator_arginfo.h b/ext/intl/breakiterator/breakiterator_arginfo.h index 04f834a087eb0..ffb5017ab4263 100644 --- a/ext/intl/breakiterator/breakiterator_arginfo.h +++ b/ext/intl/breakiterator/breakiterator_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 1979da7ee2fa55b27f1c91bb4e0ddc37e8505b08 */ + * Stub hash: 724e0c36ee113b67906cc9a8cea23781f0a961bf */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_IntlBreakIterator_createCharacterInstance, 0, 0, IntlBreakIterator, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, locale, IS_STRING, 1, "null") @@ -161,6 +161,7 @@ static zend_class_entry *register_class_IntlBreakIterator(zend_class_entry *clas INIT_CLASS_ENTRY(ce, "IntlBreakIterator", class_IntlBreakIterator_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 1, class_entry_IteratorAggregate); return class_entry; @@ -172,6 +173,7 @@ static zend_class_entry *register_class_IntlRuleBasedBreakIterator(zend_class_en INIT_CLASS_ENTRY(ce, "IntlRuleBasedBreakIterator", class_IntlRuleBasedBreakIterator_methods); class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlBreakIterator); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } @@ -182,6 +184,7 @@ static zend_class_entry *register_class_IntlCodePointBreakIterator(zend_class_en INIT_CLASS_ENTRY(ce, "IntlCodePointBreakIterator", class_IntlCodePointBreakIterator_methods); class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlBreakIterator); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/breakiterator/breakiterator_iterators.stub.php b/ext/intl/breakiterator/breakiterator_iterators.stub.php index 7e7603fe6fd54..9d2fa9442819f 100644 --- a/ext/intl/breakiterator/breakiterator_iterators.stub.php +++ b/ext/intl/breakiterator/breakiterator_iterators.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlPartsIterator extends IntlIterator { /** @tentative-return-type */ diff --git a/ext/intl/breakiterator/breakiterator_iterators_arginfo.h b/ext/intl/breakiterator/breakiterator_iterators_arginfo.h index ee5e1279b5d2a..8db11d23739e0 100644 --- a/ext/intl/breakiterator/breakiterator_iterators_arginfo.h +++ b/ext/intl/breakiterator/breakiterator_iterators_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 267199a0a3532b5acf1d700f14329cdb2f2db0e1 */ + * Stub hash: f72f108e37541ac042bb25249ef226211c344189 */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_IntlPartsIterator_getBreakIterator, 0, 0, IntlBreakIterator, 0) ZEND_END_ARG_INFO() @@ -24,6 +24,7 @@ static zend_class_entry *register_class_IntlPartsIterator(zend_class_entry *clas INIT_CLASS_ENTRY(ce, "IntlPartsIterator", class_IntlPartsIterator_methods); class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlIterator); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/calendar/calendar.stub.php b/ext/intl/calendar/calendar.stub.php index 709d0e3667c7f..85c2c8a05e52c 100644 --- a/ext/intl/calendar/calendar.stub.php +++ b/ext/intl/calendar/calendar.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlCalendar { private function __construct() {} @@ -281,6 +282,7 @@ public function setTimeZone($timezone): bool {} public function toDateTime(): DateTime|false {} } +/** @not-serializable */ class IntlGregorianCalendar extends IntlCalendar { /** diff --git a/ext/intl/calendar/calendar_arginfo.h b/ext/intl/calendar/calendar_arginfo.h index 7be45231f9c90..7b22161f30f5d 100644 --- a/ext/intl/calendar/calendar_arginfo.h +++ b/ext/intl/calendar/calendar_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 7be0e49d2b898587c4bbefaaf613932ae4786c52 */ + * Stub hash: 0096dc9e60e2256054d23344e024df1d6527a5fa */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlCalendar___construct, 0, 0, 0) ZEND_END_ARG_INFO() @@ -291,6 +291,7 @@ static zend_class_entry *register_class_IntlCalendar(void) INIT_CLASS_ENTRY(ce, "IntlCalendar", class_IntlCalendar_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } @@ -301,6 +302,7 @@ static zend_class_entry *register_class_IntlGregorianCalendar(zend_class_entry * INIT_CLASS_ENTRY(ce, "IntlGregorianCalendar", class_IntlGregorianCalendar_methods); class_entry = zend_register_internal_class_ex(&ce, class_entry_IntlCalendar); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/collator/collator.stub.php b/ext/intl/collator/collator.stub.php index e0c8487af79ff..bd201ee28be61 100644 --- a/ext/intl/collator/collator.stub.php +++ b/ext/intl/collator/collator.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class Collator { public function __construct(string $locale) {} diff --git a/ext/intl/collator/collator_arginfo.h b/ext/intl/collator/collator_arginfo.h index f13e1197dd8eb..c693ad925088b 100644 --- a/ext/intl/collator/collator_arginfo.h +++ b/ext/intl/collator/collator_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 4baf9586ab91f37facc865cf1b3aa6a87e5d732d */ + * Stub hash: c2e08f16cdc3d64e82fc277b4a59250d4b19c84e */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Collator___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 0) @@ -96,6 +96,7 @@ static zend_class_entry *register_class_Collator(void) INIT_CLASS_ENTRY(ce, "Collator", class_Collator_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/common/common.stub.php b/ext/intl/common/common.stub.php index 0e87db6f51920..acadedd39934c 100644 --- a/ext/intl/common/common.stub.php +++ b/ext/intl/common/common.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlIterator implements Iterator { /** @tentative-return-type */ diff --git a/ext/intl/common/common_arginfo.h b/ext/intl/common/common_arginfo.h index 79d63aa5f4fdd..cbf422bf0d4c6 100644 --- a/ext/intl/common/common_arginfo.h +++ b/ext/intl/common/common_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: c4698dbe96a069a63265052e9a105f074e3dda0a */ + * Stub hash: 976f2d1417928226d6c04ff444c4feda152d91df */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_IntlIterator_current, 0, 0, IS_MIXED, 0) ZEND_END_ARG_INFO() @@ -37,6 +37,7 @@ static zend_class_entry *register_class_IntlIterator(zend_class_entry *class_ent INIT_CLASS_ENTRY(ce, "IntlIterator", class_IntlIterator_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 1, class_entry_Iterator); return class_entry; diff --git a/ext/intl/converter/converter.stub.php b/ext/intl/converter/converter.stub.php index 9e07341778b20..19a8bbef9512f 100644 --- a/ext/intl/converter/converter.stub.php +++ b/ext/intl/converter/converter.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class UConverter { public function __construct(?string $destination_encoding = null, ?string $source_encoding = null) {} diff --git a/ext/intl/converter/converter_arginfo.h b/ext/intl/converter/converter_arginfo.h index fa88dd2ab630e..cae2a68d4be07 100644 --- a/ext/intl/converter/converter_arginfo.h +++ b/ext/intl/converter/converter_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 2a6d8499e1a2d414130e366783a1c084f47a3293 */ + * Stub hash: 0ab2d741996611bbfcfb07462bc184a02f353585 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_UConverter___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, destination_encoding, IS_STRING, 1, "null") @@ -125,6 +125,7 @@ static zend_class_entry *register_class_UConverter(void) INIT_CLASS_ENTRY(ce, "UConverter", class_UConverter_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/dateformat/dateformat.stub.php b/ext/intl/dateformat/dateformat.stub.php index 11c0d05dc41e6..0ea15225f5a25 100644 --- a/ext/intl/dateformat/dateformat.stub.php +++ b/ext/intl/dateformat/dateformat.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlDateFormatter { /** diff --git a/ext/intl/dateformat/dateformat_arginfo.h b/ext/intl/dateformat/dateformat_arginfo.h index ccad07cd60a9d..9cb936f530992 100644 --- a/ext/intl/dateformat/dateformat_arginfo.h +++ b/ext/intl/dateformat/dateformat_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 82f90e7b0528b2b3515c086763dba4de0f92dfa7 */ + * Stub hash: c7c0d08433ab9dbf59777072550895d85294aad4 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDateFormatter___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1) @@ -141,6 +141,7 @@ static zend_class_entry *register_class_IntlDateFormatter(void) INIT_CLASS_ENTRY(ce, "IntlDateFormatter", class_IntlDateFormatter_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/dateformat/datepatterngenerator.stub.php b/ext/intl/dateformat/datepatterngenerator.stub.php index c0190fb4e9859..a9ce7c1463120 100644 --- a/ext/intl/dateformat/datepatterngenerator.stub.php +++ b/ext/intl/dateformat/datepatterngenerator.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlDatePatternGenerator { public function __construct(?string $locale = null) {} diff --git a/ext/intl/dateformat/datepatterngenerator_arginfo.h b/ext/intl/dateformat/datepatterngenerator_arginfo.h index 63e8df7a5429c..f72e24cd1e7aa 100644 --- a/ext/intl/dateformat/datepatterngenerator_arginfo.h +++ b/ext/intl/dateformat/datepatterngenerator_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 74026c524046787844da9f8132029735243176c6 */ + * Stub hash: 4456b13f7ed59847bbf129cd45b0d1f63ce70108 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlDatePatternGenerator___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, locale, IS_STRING, 1, "null") @@ -32,6 +32,7 @@ static zend_class_entry *register_class_IntlDatePatternGenerator(void) INIT_CLASS_ENTRY(ce, "IntlDatePatternGenerator", class_IntlDatePatternGenerator_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/msgformat/msgformat.stub.php b/ext/intl/msgformat/msgformat.stub.php index c85a9b92b3a32..20afbd2b42cd4 100644 --- a/ext/intl/msgformat/msgformat.stub.php +++ b/ext/intl/msgformat/msgformat.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class MessageFormatter { public function __construct(string $locale, string $pattern) {} diff --git a/ext/intl/msgformat/msgformat_arginfo.h b/ext/intl/msgformat/msgformat_arginfo.h index 8f0456f6cbb05..4e7146048640d 100644 --- a/ext/intl/msgformat/msgformat_arginfo.h +++ b/ext/intl/msgformat/msgformat_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 44bc7b87c0b6c674bf94764b3f036006e3933713 */ + * Stub hash: d595f5c582996ebb96ab39df8cb56c4cf6c8dfcf */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_MessageFormatter___construct, 0, 0, 2) ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 0) @@ -81,6 +81,7 @@ static zend_class_entry *register_class_MessageFormatter(void) INIT_CLASS_ENTRY(ce, "MessageFormatter", class_MessageFormatter_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/resourcebundle/resourcebundle.stub.php b/ext/intl/resourcebundle/resourcebundle.stub.php index 4247fca318a4e..47df7a19b3a9f 100644 --- a/ext/intl/resourcebundle/resourcebundle.stub.php +++ b/ext/intl/resourcebundle/resourcebundle.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class ResourceBundle implements IteratorAggregate, Countable { public function __construct(?string $locale, ?string $bundle, bool $fallback = true) {} diff --git a/ext/intl/resourcebundle/resourcebundle_arginfo.h b/ext/intl/resourcebundle/resourcebundle_arginfo.h index 0564b026dc39b..6a478edd430b2 100644 --- a/ext/intl/resourcebundle/resourcebundle_arginfo.h +++ b/ext/intl/resourcebundle/resourcebundle_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d27fa5a4dc092b94e48fc876070f440c247fa6c2 */ + * Stub hash: 7816536650d8513ef6998233096b0bf6a29d7af4 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ResourceBundle___construct, 0, 0, 2) ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1) @@ -62,6 +62,7 @@ static zend_class_entry *register_class_ResourceBundle(zend_class_entry *class_e INIT_CLASS_ENTRY(ce, "ResourceBundle", class_ResourceBundle_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zend_class_implements(class_entry, 2, class_entry_IteratorAggregate, class_entry_Countable); return class_entry; diff --git a/ext/intl/spoofchecker/spoofchecker.stub.php b/ext/intl/spoofchecker/spoofchecker.stub.php index 0ff7cc6da7c4a..dc414949b0ab8 100644 --- a/ext/intl/spoofchecker/spoofchecker.stub.php +++ b/ext/intl/spoofchecker/spoofchecker.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class Spoofchecker { public function __construct() {} diff --git a/ext/intl/spoofchecker/spoofchecker_arginfo.h b/ext/intl/spoofchecker/spoofchecker_arginfo.h index 281ea7f3ed330..c030015d49c86 100644 --- a/ext/intl/spoofchecker/spoofchecker_arginfo.h +++ b/ext/intl/spoofchecker/spoofchecker_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d915fb3698e0bde4af2a1175fff882cae1f55668 */ + * Stub hash: f1c86958a39aa8f89ee468a0753f6a5b232c3e1f */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Spoofchecker___construct, 0, 0, 0) ZEND_END_ARG_INFO() @@ -58,6 +58,7 @@ static zend_class_entry *register_class_Spoofchecker(void) INIT_CLASS_ENTRY(ce, "Spoofchecker", class_Spoofchecker_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/timezone/timezone.stub.php b/ext/intl/timezone/timezone.stub.php index cc4f6084fd535..55592a386cc0f 100644 --- a/ext/intl/timezone/timezone.stub.php +++ b/ext/intl/timezone/timezone.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class IntlTimeZone { private function __construct() {} diff --git a/ext/intl/timezone/timezone_arginfo.h b/ext/intl/timezone/timezone_arginfo.h index c8a77dcb07829..d0d1e94d2f84f 100644 --- a/ext/intl/timezone/timezone_arginfo.h +++ b/ext/intl/timezone/timezone_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 3f945431687a2f45b0ec8c3a6435ef68008c75ad */ + * Stub hash: 2ec7a46ca205dfeb9ef0dc3c8e8d78bce1cf43be */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlTimeZone___construct, 0, 0, 0) ZEND_END_ARG_INFO() @@ -169,6 +169,7 @@ static zend_class_entry *register_class_IntlTimeZone(void) INIT_CLASS_ENTRY(ce, "IntlTimeZone", class_IntlTimeZone_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; return class_entry; } diff --git a/ext/intl/transliterator/transliterator.stub.php b/ext/intl/transliterator/transliterator.stub.php index 6d52263e0646f..81c4070352825 100644 --- a/ext/intl/transliterator/transliterator.stub.php +++ b/ext/intl/transliterator/transliterator.stub.php @@ -2,6 +2,7 @@ /** @generate-class-entries */ +/** @not-serializable */ class Transliterator { public string $id; diff --git a/ext/intl/transliterator/transliterator_arginfo.h b/ext/intl/transliterator/transliterator_arginfo.h index c80be4f5b3460..03aa3b1f0ee9c 100644 --- a/ext/intl/transliterator/transliterator_arginfo.h +++ b/ext/intl/transliterator/transliterator_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 8a6aaab7dd89a014726bd1fdf1f40f7b6fa98ea5 */ + * Stub hash: 8ef1f285c6138fbc58c1e4cef04d4ac09dfc3fef */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Transliterator___construct, 0, 0, 0) ZEND_END_ARG_INFO() @@ -61,6 +61,7 @@ static zend_class_entry *register_class_Transliterator(void) INIT_CLASS_ENTRY(ce, "Transliterator", class_Transliterator_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_NOT_SERIALIZABLE; zval property_id_default_value; ZVAL_UNDEF(&property_id_default_value); From 2753b454f3cff026f9220b57c1f87b025608b9d0 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Fri, 18 Feb 2022 13:43:19 +0100 Subject: [PATCH 0370/1346] [ci skip] Don't run GitHub actions on forks Closes GH-8111 Closes GH-8119 --- .github/workflows/close-needs-feedback.yml | 1 + .github/workflows/close-stale-prs.yml | 1 + .github/workflows/remove-needs-feedback.yml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/close-needs-feedback.yml b/.github/workflows/close-needs-feedback.yml index 5af9133a44198..7197598f38c49 100644 --- a/.github/workflows/close-needs-feedback.yml +++ b/.github/workflows/close-needs-feedback.yml @@ -6,6 +6,7 @@ on: jobs: build: + if: github.repository_owner == 'php' runs-on: ubuntu-latest steps: - name: Close old issues that need feedback diff --git a/.github/workflows/close-stale-prs.yml b/.github/workflows/close-stale-prs.yml index 5aa178eed2c2c..e5fbacff5d152 100644 --- a/.github/workflows/close-stale-prs.yml +++ b/.github/workflows/close-stale-prs.yml @@ -6,6 +6,7 @@ on: jobs: stale: + if: github.repository_owner == 'php' runs-on: ubuntu-latest steps: - uses: actions/stale@v4 diff --git a/.github/workflows/remove-needs-feedback.yml b/.github/workflows/remove-needs-feedback.yml index 8f6dfc47f1664..fded33b442081 100644 --- a/.github/workflows/remove-needs-feedback.yml +++ b/.github/workflows/remove-needs-feedback.yml @@ -7,7 +7,7 @@ on: jobs: build: - if: "contains(github.event.issue.labels.*.name, 'Status: Needs Feedback') && github.event.issue.user.login == github.event.sender.login" + if: "github.repository_owner == 'php' && contains(github.event.issue.labels.*.name, 'Status: Needs Feedback') && github.event.issue.user.login == github.event.sender.login" runs-on: ubuntu-latest steps: - uses: actions-ecosystem/action-remove-labels@v1 From dfd2a80b69d469d879d60c12c1d9d9ca49cb3f76 Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Thu, 17 Feb 2022 14:40:56 -0400 Subject: [PATCH 0371/1346] Fix #80909: crash with persistent connections in PDO_ODBC When we have a complex connection string (more than a DSN), PHP appends a UID and PWD if none are present and a username and password are called, so SQLDriverConnect works as expected. However, it seems spprintf doesn't allocate with persistence if required. As a result, it'll be considering leaking and crash PHP on free when a persistent connection is used. Closes GH-8110. --- NEWS | 4 ++++ ext/pdo_odbc/odbc_driver.c | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 00ba31fd248e2..ab565d58ae5bd 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,10 @@ PHP NEWS . Support for building against Oracle Client libraries 10.1 and 10.2 has been dropped. Oracle Client libraries 11.2 or newer are now required. +- PDO_ODBC: + . Fixed bug #80909 (crash with persistent connections in PDO_ODBC). (Calvin + Buckley) + - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c index 4f59913937af2..840b7aeb8be3e 100644 --- a/ext/pdo_odbc/odbc_driver.c +++ b/ext/pdo_odbc/odbc_driver.c @@ -487,8 +487,16 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ /* Force UID and PWD to be set in the DSN */ if (dbh->username && *dbh->username && !strstr(dbh->data_source, "uid") && !strstr(dbh->data_source, "UID")) { - char *dsn; - spprintf(&dsn, 0, "%s;UID=%s;PWD=%s", dbh->data_source, dbh->username, dbh->password); + /* XXX: Do we check if password is null? */ + size_t new_dsn_size = strlen(dbh->data_source) + + strlen(dbh->username) + strlen(dbh->password) + + strlen(";UID=;PWD=") + 1; + char *dsn = pemalloc(new_dsn_size, dbh->is_persistent); + if (dsn == NULL) { + /* XXX: Do we inform the caller? */ + goto fail; + } + snprintf(dsn, new_dsn_size, "%s;UID=%s;PWD=%s", dbh->data_source, dbh->username, dbh->password); pefree((char*)dbh->data_source, dbh->is_persistent); dbh->data_source = dsn; } From 67dd48fbd5e0b081f95299244d889e30fe6dbf06 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Thu, 24 Feb 2022 15:44:09 +0100 Subject: [PATCH 0372/1346] fix [-Wstrict-prototypes] buid warnings --- Zend/zend_cpuinfo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h index fcaf33d5e721c..ebfbab799795d 100644 --- a/Zend/zend_cpuinfo.h +++ b/Zend/zend_cpuinfo.h @@ -208,7 +208,7 @@ static inline int zend_cpu_supports_avx2(void) { /* __builtin_cpu_supports has pclmul from gcc9 */ #if PHP_HAVE_BUILTIN_CPU_SUPPORTS && (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000)) ZEND_NO_SANITIZE_ADDRESS -static inline int zend_cpu_supports_pclmul() { +static inline int zend_cpu_supports_pclmul(void) { #if PHP_HAVE_BUILTIN_CPU_INIT __builtin_cpu_init(); #endif From 8c60e21515a566f500f21e36cfc572ab0918df22 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Thu, 24 Feb 2022 16:14:47 +0100 Subject: [PATCH 0373/1346] Avoid possible [-Wstrict-prototypes] build warnings --- Zend/zend_alloc.c | 2 +- Zend/zend_extensions.c | 4 ++-- Zend/zend_gc.c | 2 +- ext/standard/crc32_x86.c | 2 +- main/fastcgi.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index f91c38bb9b308..9635068a6bb86 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2816,7 +2816,7 @@ static void *tracked_realloc(void *ptr, size_t new_size) { return ptr; } -static void tracked_free_all() { +static void tracked_free_all(void) { HashTable *tracked_allocs = AG(mm_heap)->tracked_allocs; zend_ulong h; ZEND_HASH_FOREACH_NUM_KEY(tracked_allocs, h) { diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index 4d4b1ffe09b41..8e49866d2305e 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -203,7 +203,7 @@ static int zend_extension_startup(zend_extension *extension) } -void zend_startup_extensions_mechanism() +void zend_startup_extensions_mechanism(void) { /* Startup extensions mechanism */ zend_llist_init(&zend_extensions, sizeof(zend_extension), (void (*)(void *)) zend_extension_dtor, 1); @@ -212,7 +212,7 @@ void zend_startup_extensions_mechanism() } -void zend_startup_extensions() +void zend_startup_extensions(void) { zend_llist_apply_with_del(&zend_extensions, (int (*)(void *)) zend_extension_startup); } diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c index de7353013f0b4..3319b7aa34e64 100644 --- a/Zend/zend_gc.c +++ b/Zend/zend_gc.c @@ -1695,7 +1695,7 @@ ZEND_API void zend_get_gc_buffer_grow(zend_get_gc_buffer *gc_buffer) { gc_buffer->cur = gc_buffer->start + old_capacity; } -static void zend_get_gc_buffer_release() { +static void zend_get_gc_buffer_release(void) { zend_get_gc_buffer *gc_buffer = &EG(get_gc_buffer); efree(gc_buffer->start); gc_buffer->start = gc_buffer->end = gc_buffer->cur = NULL; diff --git a/ext/standard/crc32_x86.c b/ext/standard/crc32_x86.c index eec023264002f..fdcbed8782557 100644 --- a/ext/standard/crc32_x86.c +++ b/ext/standard/crc32_x86.c @@ -323,7 +323,7 @@ typedef size_t (*crc32_x86_simd_func_t)(X86_CRC32_TYPE type, uint32_t *crc, cons ZEND_NO_SANITIZE_ADDRESS ZEND_ATTRIBUTE_UNUSED /* clang mistakenly warns about this */ -static crc32_x86_simd_func_t resolve_crc32_x86_simd_update() { +static crc32_x86_simd_func_t resolve_crc32_x86_simd_update(void) { if (zend_cpu_supports_sse42() && zend_cpu_supports_pclmul()) { return crc32_sse42_pclmul_update; } diff --git a/main/fastcgi.c b/main/fastcgi.c index e3acd9ac3a186..6020cf4fda9a4 100644 --- a/main/fastcgi.c +++ b/main/fastcgi.c @@ -1742,7 +1742,7 @@ void fcgi_free_mgmt_var_cb(zval *zv) pefree(Z_STR_P(zv), 1); } -const char *fcgi_get_last_client_ip() +const char *fcgi_get_last_client_ip(void) { static char str[INET6_ADDRSTRLEN]; From 5ca2dd3d16e5d9591040a58313a2c0a0b94b7b36 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 28 Feb 2022 16:37:17 +0300 Subject: [PATCH 0374/1346] Fixed assertion after clobbering object by user error handler, because of creation dynamic property deprecation warning. Fixes oss-fuzz #44932 --- Zend/tests/dynamic_prop_deprecation_002.phpt | 9 +++++++-- Zend/zend_object_handlers.c | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Zend/tests/dynamic_prop_deprecation_002.phpt b/Zend/tests/dynamic_prop_deprecation_002.phpt index 2ab7452fedb67..bd0d3aa5a7df9 100644 --- a/Zend/tests/dynamic_prop_deprecation_002.phpt +++ b/Zend/tests/dynamic_prop_deprecation_002.phpt @@ -7,7 +7,12 @@ set_error_handler(function($code, $msg){ $GLOBALS['a']=null; }); $a = new class{}; -[&$a->y]; +try { + [&$a->y]; +} catch (Throwable $ex) { + echo "Exception: " .$ex->getMessage() . "\n"; +} ?> --EXPECT-- -Err: Creation of dynamic property class@anonymous::$y is deprecated \ No newline at end of file +Err: Creation of dynamic property class@anonymous::$y is deprecated +Exception: Cannot create dynamic property class@anonymous::$y diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 721abe46998b8..746897f641e0e 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -283,7 +283,13 @@ static ZEND_COLD zend_never_inline bool zend_deprecated_dynamic_property( zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated", ZSTR_VAL(obj->ce->name), ZSTR_VAL(member)); if (UNEXPECTED(GC_DELREF(obj) == 0)) { + zend_class_entry *ce = obj->ce; zend_objects_store_del(obj); + if (!EG(exception)) { + /* We cannot continue execution and have to throw an exception */ + zend_throw_error(NULL, "Cannot create dynamic property %s::$%s", + ZSTR_VAL(ce->name), ZSTR_VAL(member)); + } return 0; } return 1; From 67440096c50b771d5a99c15ad59dbd2519cc8360 Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Fri, 4 Mar 2022 13:24:08 +0100 Subject: [PATCH 0375/1346] Added: [zend_]memory_reset_peak_usage() (#8151) --- NEWS | 1 + UPGRADING | 4 ++++ Zend/tests/memory_reset_peak_usage.phpt | 23 +++++++++++++++++++++++ Zend/zend_alloc.c | 8 ++++++++ Zend/zend_alloc.h | 1 + ext/standard/basic_functions_arginfo.h | 5 +++++ ext/standard/var.c | 8 ++++++++ 7 files changed, 50 insertions(+) create mode 100644 Zend/tests/memory_reset_peak_usage.phpt diff --git a/NEWS b/NEWS index ab565d58ae5bd..49d3d7bac0ae2 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,7 @@ PHP NEWS . Finished AVIF support in getimagesize(). (Yannis Guyon) . Fixed bug GH-7847 (stripos with large haystack has bad performance). (ilutov) + . New function memory_reset_peak_usage(). (Patrick Allaert) - Zip: . add ZipArchive::clearError() method diff --git a/UPGRADING b/UPGRADING index efc6f36df0eef..b91229ec627ea 100644 --- a/UPGRADING +++ b/UPGRADING @@ -114,6 +114,10 @@ PHP 8.2 UPGRADE NOTES 6. New Functions ======================================== +- Standard: + . The peak memory usage can now be reset to the current usage thanks to + memory_reset_peak_usage(). + ======================================== 7. New Classes and Interfaces ======================================== diff --git a/Zend/tests/memory_reset_peak_usage.phpt b/Zend/tests/memory_reset_peak_usage.phpt new file mode 100644 index 0000000000000..0599e7c313c41 --- /dev/null +++ b/Zend/tests/memory_reset_peak_usage.phpt @@ -0,0 +1,23 @@ +--TEST-- +void memory_reset_peak_usage(); +--SKIPIF-- + +--INI-- +memory_limit=-1 +--FILE-- + $m0); +unset($array0, $array1); +memory_reset_peak_usage(); +var_dump(memory_get_peak_usage() < $m1); +?> +--EXPECT-- +bool(true) +bool(true) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 9635068a6bb86..d8a7b07db77fc 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -2724,6 +2724,14 @@ ZEND_API size_t zend_memory_peak_usage(bool real_usage) return 0; } +ZEND_API void zend_memory_reset_peak_usage(void) +{ +#if ZEND_MM_STAT + AG(mm_heap)->real_peak = AG(mm_heap)->real_size; + AG(mm_heap)->peak = AG(mm_heap)->size; +#endif +} + ZEND_API void shutdown_memory_manager(bool silent, bool full_shutdown) { zend_mm_shutdown(AG(mm_heap), full_shutdown, silent); diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index 9603af8a27d3f..f517b1231d1d2 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -229,6 +229,7 @@ ZEND_API bool is_zend_ptr(const void *ptr); ZEND_API size_t zend_memory_usage(bool real_usage); ZEND_API size_t zend_memory_peak_usage(bool real_usage); +ZEND_API void zend_memory_reset_peak_usage(void); /* fast cache for HashTables */ #define ALLOC_HASHTABLE(ht) \ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 850c3f7a3051a..10a6cfd7f2af0 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -2175,6 +2175,9 @@ ZEND_END_ARG_INFO() #define arginfo_memory_get_peak_usage arginfo_memory_get_usage +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memory_reset_peak_usage, 0, 0, IS_VOID, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_version_compare, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, version1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, version2, IS_STRING, 0) @@ -2824,6 +2827,7 @@ ZEND_FUNCTION(serialize); ZEND_FUNCTION(unserialize); ZEND_FUNCTION(memory_get_usage); ZEND_FUNCTION(memory_get_peak_usage); +ZEND_FUNCTION(memory_reset_peak_usage); ZEND_FUNCTION(version_compare); #if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_set); @@ -3479,6 +3483,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(unserialize, arginfo_unserialize) ZEND_FE(memory_get_usage, arginfo_memory_get_usage) ZEND_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage) + ZEND_FE(memory_reset_peak_usage, arginfo_memory_reset_peak_usage) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(version_compare, arginfo_version_compare) #if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set) diff --git a/ext/standard/var.c b/ext/standard/var.c index c429763eb9c86..dc9f8639b146f 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -1478,6 +1478,14 @@ PHP_FUNCTION(memory_get_peak_usage) { } /* }}} */ +/* {{{ Resets the peak PHP memory usage */ +PHP_FUNCTION(memory_reset_peak_usage) { + ZEND_PARSE_PARAMETERS_NONE(); + + zend_memory_reset_peak_usage(); +} +/* }}} */ + PHP_INI_BEGIN() STD_PHP_INI_ENTRY("unserialize_max_depth", "4096", PHP_INI_ALL, OnUpdateLong, unserialize_max_depth, php_basic_globals, basic_globals) PHP_INI_END() From e6bdf980eb44527b5e28ba9f11bbf94566c205c2 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 7 Mar 2022 22:31:36 +0100 Subject: [PATCH 0376/1346] Put packed back to attribute iterating after merge --- Zend/zend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend.c b/Zend/zend.c index cda035dac6012..23c93bb719230 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -670,7 +670,7 @@ static void function_copy_ctor(zval *zv) /* {{{ */ func->common.attributes = NULL; - ZEND_HASH_FOREACH_PTR(old_func->common.attributes, old_attr) { + ZEND_HASH_PACKED_FOREACH_PTR(old_func->common.attributes, old_attr) { uint32_t i; zend_attribute *attr; From 6a2c501626514eed1ef0102396d4908dc14498c7 Mon Sep 17 00:00:00 2001 From: Victor Kislov Date: Tue, 8 Mar 2022 14:00:23 +0200 Subject: [PATCH 0377/1346] Adjust PHP_SETUP_LIBXML description to mention what it doesnt use action-not-found Closes GH-8088. --- build/php.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php.m4 b/build/php.m4 index 01b8250598191..94e824f6cc263 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -2030,7 +2030,7 @@ ifelse([$3],[],,[else $3]) ]) dnl -dnl PHP_SETUP_LIBXML(shared-add [, action-found [, action-not-found]]) +dnl PHP_SETUP_LIBXML(shared-add [, action-found]) dnl dnl Common setup macro for libxml. dnl From e3ef7bbbb87bcbf6154a0a4854127b9cea8f92ff Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sat, 5 Feb 2022 13:00:17 +0100 Subject: [PATCH 0378/1346] Adjust filename/lineno for constant expressions Closes GH-7771 Closes GH-8124 --- NEWS | 1 + Zend/tests/bug41633_2.phpt | 2 +- Zend/tests/gh7771_1.phpt | 15 +++++++++++++++ Zend/tests/gh7771_1_definition.inc | 5 +++++ Zend/tests/gh7771_2.phpt | 15 +++++++++++++++ Zend/tests/gh7771_2_definition.inc | 8 ++++++++ Zend/zend_ast.c | 14 ++++++++++++++ Zend/zend_execute_API.c | 27 +++++++++++++++++---------- Zend/zend_globals.h | 4 ++++ 9 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 Zend/tests/gh7771_1.phpt create mode 100644 Zend/tests/gh7771_1_definition.inc create mode 100644 Zend/tests/gh7771_2.phpt create mode 100644 Zend/tests/gh7771_2_definition.inc diff --git a/NEWS b/NEWS index 49d3d7bac0ae2..0bb7114961c14 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ PHP NEWS - Core: . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) + . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) - Intl: . Update all grandfathered language tags with preferred values diff --git a/Zend/tests/bug41633_2.phpt b/Zend/tests/bug41633_2.phpt index 975d2218b55e3..bb768c0e11743 100644 --- a/Zend/tests/bug41633_2.phpt +++ b/Zend/tests/bug41633_2.phpt @@ -11,4 +11,4 @@ echo Foo::A."\n"; Fatal error: Uncaught Error: Undefined constant self::B in %s:%d Stack trace: #0 {main} - thrown in %sbug41633_2.php on line 5 + thrown in %sbug41633_2.php on line 3 diff --git a/Zend/tests/gh7771_1.phpt b/Zend/tests/gh7771_1.phpt new file mode 100644 index 0000000000000..dc24b4041c716 --- /dev/null +++ b/Zend/tests/gh7771_1.phpt @@ -0,0 +1,15 @@ +--TEST-- +GH-7771 (Incorrect file/line for class constant expression exceptions) +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Error: Class "NonExistent" not found in %sgh7771_1_definition.inc:4 +Stack trace: +#0 {main} + thrown in %sgh7771_1_definition.inc on line 4 diff --git a/Zend/tests/gh7771_1_definition.inc b/Zend/tests/gh7771_1_definition.inc new file mode 100644 index 0000000000000..16e94f41a0fa4 --- /dev/null +++ b/Zend/tests/gh7771_1_definition.inc @@ -0,0 +1,5 @@ + +--EXPECTF-- +Fatal error: Uncaught Error: Class "NonExistent" not found in %sgh7771_2_definition.inc:6 +Stack trace: +#0 {main} + thrown in %sgh7771_2_definition.inc on line 6 diff --git a/Zend/tests/gh7771_2_definition.inc b/Zend/tests/gh7771_2_definition.inc new file mode 100644 index 0000000000000..0162a9c8bf1ed --- /dev/null +++ b/Zend/tests/gh7771_2_definition.inc @@ -0,0 +1,8 @@ +child[0]); zend_string *const_name = zend_ast_get_str(ast->child[1]); + + zend_string *previous_filename; + zend_long previous_lineno; + if (scope) { + previous_filename = EG(filename_override); + previous_lineno = EG(lineno_override); + EG(filename_override) = scope->info.user.filename; + EG(lineno_override) = zend_ast_get_lineno(ast); + } zval *zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr); + if (scope) { + EG(filename_override) = previous_filename; + EG(lineno_override) = previous_lineno; + } if (UNEXPECTED(zv == NULL)) { ZVAL_UNDEF(result); @@ -951,6 +964,7 @@ static void* ZEND_FASTCALL zend_ast_tree_copy(zend_ast *ast, void *buf) zend_ast *new = (zend_ast*)buf; new->kind = ast->kind; new->attr = ast->attr; + new->lineno = ast->lineno; buf = (void*)((char*)buf + zend_ast_size(children)); for (i = 0; i < children; i++) { if (ast->child[i]) { diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 6a34971bd8a0e..e791f986f8e74 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -192,6 +192,9 @@ void init_executor(void) /* {{{ */ EG(num_errors) = 0; EG(errors) = NULL; + EG(filename_override) = NULL; + EG(lineno_override) = -1; + zend_fiber_init(); zend_weakrefs_init(); @@ -462,6 +465,8 @@ void shutdown_executor(void) /* {{{ */ if (EG(ht_iterators) != EG(ht_iterators_slots)) { efree(EG(ht_iterators)); } + + ZEND_ASSERT(EG(filename_override) == NULL); } #if ZEND_DEBUG @@ -591,21 +596,18 @@ ZEND_API const char *get_function_arg_name(const zend_function *func, uint32_t a ZEND_API const char *zend_get_executed_filename(void) /* {{{ */ { - zend_execute_data *ex = EG(current_execute_data); - - while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) { - ex = ex->prev_execute_data; - } - if (ex) { - return ZSTR_VAL(ex->func->op_array.filename); - } else { - return "[no active file]"; - } + zend_string *filename = zend_get_executed_filename_ex(); + return filename != NULL ? ZSTR_VAL(filename) : "[no active file]"; } /* }}} */ ZEND_API zend_string *zend_get_executed_filename_ex(void) /* {{{ */ { + zend_string *filename_override = EG(filename_override); + if (filename_override != NULL) { + return filename_override; + } + zend_execute_data *ex = EG(current_execute_data); while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) { @@ -621,6 +623,11 @@ ZEND_API zend_string *zend_get_executed_filename_ex(void) /* {{{ */ ZEND_API uint32_t zend_get_executed_lineno(void) /* {{{ */ { + zend_long lineno_override = EG(lineno_override); + if (lineno_override != -1) { + return lineno_override; + } + zend_execute_data *ex = EG(current_execute_data); while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) { diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 1726dee9ac12a..ccee57b3fb1bd 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -266,6 +266,10 @@ struct _zend_executor_globals { uint32_t num_errors; zend_error_info **errors; + /* Override filename or line number of thrown errors and exceptions */ + zend_string *filename_override; + zend_long lineno_override; + void *reserved[ZEND_MAX_RESERVED_RESOURCES]; }; From 0db03c4110b70e7515c98cf17d2c3c5b9ed4a034 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 10 Mar 2022 13:16:48 +0100 Subject: [PATCH 0379/1346] Improve sesson write failure message for user error handlers Closes GH-7787 Closes GH-8186 --- NEWS | 4 ++ ext/session/php_session.h | 1 + ext/session/session.c | 25 +++++++++- ext/session/tests/gh7787.phpt | 90 +++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 ext/session/tests/gh7787.phpt diff --git a/NEWS b/NEWS index 0bb7114961c14..dd939687ecaf6 100644 --- a/NEWS +++ b/NEWS @@ -35,4 +35,8 @@ PHP NEWS . add ZipArchive::getStreamName() method . add ZipArchive::getStreamIndex() method +- Session: + . Fixed bug GH-7787 (Improve session write failure message for user error + handlers). (ilutov) + <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> diff --git a/ext/session/php_session.h b/ext/session/php_session.h index bc8c3548c7059..ef139196ca900 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -176,6 +176,7 @@ typedef struct _php_ps_globals { } mod_user_names; int mod_user_implemented; int mod_user_is_open; + zend_string *mod_user_class_name; const struct ps_serializer_struct *serializer; zval http_session_vars; bool auto_start; diff --git a/ext/session/session.c b/ext/session/session.c index 32e2f33ae3028..8212ad23cd7bb 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -472,6 +472,9 @@ static void php_session_save_current_state(int write) /* {{{ */ if (write) { IF_SESSION_VARS() { + zend_string *handler_class_name = PS(mod_user_class_name); + const char *handler_function_name; + if (PS(mod_data) || PS(mod_user_implemented)) { zend_string *val; @@ -483,12 +486,15 @@ static void php_session_save_current_state(int write) /* {{{ */ && zend_string_equals(val, PS(session_vars)) ) { ret = PS(mod)->s_update_timestamp(&PS(mod_data), PS(id), val, PS(gc_maxlifetime)); + handler_function_name = handler_class_name != NULL ? "updateTimestamp" : "update_timestamp"; } else { ret = PS(mod)->s_write(&PS(mod_data), PS(id), val, PS(gc_maxlifetime)); + handler_function_name = "write"; } zend_string_release_ex(val, 0); } else { ret = PS(mod)->s_write(&PS(mod_data), PS(id), ZSTR_EMPTY_ALLOC(), PS(gc_maxlifetime)); + handler_function_name = "write"; } } @@ -499,9 +505,14 @@ static void php_session_save_current_state(int write) /* {{{ */ "is correct (%s)", PS(mod)->s_name, PS(save_path)); + } else if (handler_class_name != NULL) { + php_error_docref(NULL, E_WARNING, "Failed to write session data using user " + "defined save handler. (session.save_path: %s, handler: %s::%s)", PS(save_path), + ZSTR_VAL(handler_class_name), handler_function_name); } else { php_error_docref(NULL, E_WARNING, "Failed to write session data using user " - "defined save handler. (session.save_path: %s)", PS(save_path)); + "defined save handler. (session.save_path: %s, handler: %s)", PS(save_path), + handler_function_name); } } } @@ -2042,6 +2053,12 @@ PHP_FUNCTION(session_set_save_handler) ++i; } ZEND_HASH_FOREACH_END(); + + if (PS(mod_user_class_name)) { + zend_string_release(PS(mod_user_class_name)); + } + PS(mod_user_class_name) = zend_string_copy(Z_OBJCE_P(obj)->name); + if (register_shutdown) { /* create shutdown function */ php_shutdown_function_entry shutdown_function_entry; @@ -2095,6 +2112,11 @@ PHP_FUNCTION(session_set_save_handler) RETURN_FALSE; } + if (PS(mod_user_class_name)) { + zend_string_release(PS(mod_user_class_name)); + PS(mod_user_class_name) = NULL; + } + /* remove shutdown function */ remove_user_shutdown_function("session_shutdown", sizeof("session_shutdown") - 1); @@ -2775,6 +2797,7 @@ static PHP_GINIT_FUNCTION(ps) /* {{{ */ ps_globals->session_status = php_session_none; ps_globals->default_mod = NULL; ps_globals->mod_user_implemented = 0; + ps_globals->mod_user_class_name = NULL; ps_globals->mod_user_is_open = 0; ps_globals->session_vars = NULL; ps_globals->set_handler = 0; diff --git a/ext/session/tests/gh7787.phpt b/ext/session/tests/gh7787.phpt new file mode 100644 index 0000000000000..b38398827b087 --- /dev/null +++ b/ext/session/tests/gh7787.phpt @@ -0,0 +1,90 @@ +--TEST-- +GH-7787: Provide more SessionHandler failure information +--EXTENSIONS-- +session +--SKIPIF-- + +--INI-- +session.use_strict_mode=0 +session.save_handler=files +--FILE-- + true, + fn() => true, + fn() => 'foo|s:3:"foo";', + fn() => false, + fn() => true, + fn() => true, + fn() => sha1(random_bytes(32)), + fn() => true, + fn() => false, +); + +session_start(); +$_SESSION['foo'] = 'bar'; +session_write_close(); + +session_start(); +session_write_close(); + +?> +--EXPECTF-- +Warning: session_write_close(): Failed to write session data using user defined save handler. (session.save_path: , handler: MySessionHandler::write) in %s on line %d + +Warning: session_write_close(): Failed to write session data using user defined save handler. (session.save_path: , handler: MySessionHandler::updateTimestamp) in %s on line %d + +Warning: session_write_close(): Failed to write session data using user defined save handler. (session.save_path: , handler: write) in %s on line %d + +Warning: session_write_close(): Failed to write session data using user defined save handler. (session.save_path: , handler: update_timestamp) in %s on line %d From dd62ec065e71515234351d8b57778af1b946f7f0 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 13 Mar 2022 13:48:21 +0000 Subject: [PATCH 0380/1346] Refactor php_next_utf8_char() to use zend_result --- ext/json/json_encoder.c | 3 +-- ext/standard/html.c | 10 +++++----- ext/standard/html.h | 2 +- ext/standard/string.c | 2 +- ext/xml/xml.c | 4 ++-- 5 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index b0f703041b068..cae2f80ea5d1d 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -316,7 +316,6 @@ static int php_json_escape_string( smart_str *buf, const char *s, size_t len, int options, php_json_encoder *encoder) /* {{{ */ { - int status; unsigned int us; size_t pos, checkpoint; char *dst; @@ -371,7 +370,7 @@ static int php_json_escape_string( } us = (unsigned char)s[0]; if (UNEXPECTED(us >= 0x80)) { - + zend_result status; us = php_next_utf8_char((unsigned char *)s, len, &pos, &status); /* check whether UTF8 character is correct */ diff --git a/ext/standard/html.c b/ext/standard/html.c index b93ce95df1900..779fe549599bf 100644 --- a/ext/standard/html.c +++ b/ext/standard/html.c @@ -95,7 +95,7 @@ static inline unsigned int get_next_char( const unsigned char *str, size_t str_len, size_t *cursor, - int *status) + zend_result *status) { size_t pos = *cursor; unsigned int this_char = 0; @@ -356,7 +356,7 @@ PHPAPI unsigned int php_next_utf8_char( const unsigned char *str, size_t str_len, size_t *cursor, - int *status) + zend_result *status) { return get_next_char(cs_utf_8, str, str_len, cursor, status); } @@ -1045,8 +1045,8 @@ static inline void find_entity_for_char( *entity_len = c->data.ent.entity_len; } else { /* peek at next char */ - size_t cursor_before = *cursor; - int status = SUCCESS; + size_t cursor_before = *cursor; + zend_result status = SUCCESS; unsigned next_char; if (!(*cursor < oldlen)) @@ -1156,7 +1156,7 @@ PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t const unsigned char *mbsequence = NULL; size_t mbseqlen = 0, cursor_before = cursor; - int status = SUCCESS; + zend_result status = SUCCESS; unsigned int this_char = get_next_char(charset, old, oldlen, &cursor, &status); /* guarantee we have at least 40 bytes to write. diff --git a/ext/standard/html.h b/ext/standard/html.h index 2a4757062165b..e7e9486d406ac 100644 --- a/ext/standard/html.h +++ b/ext/standard/html.h @@ -47,6 +47,6 @@ void register_html_constants(INIT_FUNC_ARGS); PHPAPI zend_string *php_escape_html_entities(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset); PHPAPI zend_string *php_escape_html_entities_ex(const unsigned char *old, size_t oldlen, int all, int flags, const char *hint_charset, bool double_encode, bool quiet); PHPAPI zend_string *php_unescape_html_entities(zend_string *str, int all, int flags, const char *hint_charset); -PHPAPI unsigned int php_next_utf8_char(const unsigned char *str, size_t str_len, size_t *cursor, int *status); +PHPAPI unsigned int php_next_utf8_char(const unsigned char *str, size_t str_len, size_t *cursor, zend_result *status); #endif /* HTML_H */ diff --git a/ext/standard/string.c b/ext/standard/string.c index 36e8c1a737e77..826fa338be047 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -6056,7 +6056,7 @@ static zend_string *php_utf8_decode(const char *s, size_t len) str = zend_string_alloc(len, 0); ZSTR_LEN(str) = 0; while (pos < len) { - int status = FAILURE; + zend_result status = FAILURE; c = php_next_utf8_char((const unsigned char*)s, (size_t) len, &pos, &status); /* The lower 256 codepoints of Unicode are identical to Latin-1, diff --git a/ext/xml/xml.c b/ext/xml/xml.c index be69940545cda..3753320dd0144 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -550,8 +550,8 @@ static zend_string *xml_utf8_decode(const XML_Char *s, size_t len, const XML_Cha str = zend_string_alloc(len, 0); ZSTR_LEN(str) = 0; while (pos < len) { - int status = FAILURE; - c = php_next_utf8_char((const unsigned char*)s, (size_t) len, &pos, &status); + zend_result status = FAILURE; + c = php_next_utf8_char((const unsigned char*)s, len, &pos, &status); if (status == FAILURE || c > 0xFFU) { c = '?'; From efb014dda2faa7804c77624433c07366685fd5f0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 14 Mar 2022 11:07:49 +0300 Subject: [PATCH 0381/1346] Reset EG(filename_override) after fatal error Fixes oss-fuzz #45492 --- Zend/tests/gh7771_3.phpt | 16 ++++++++++++++++ Zend/zend_ast.c | 11 ++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/gh7771_3.phpt diff --git a/Zend/tests/gh7771_3.phpt b/Zend/tests/gh7771_3.phpt new file mode 100644 index 0000000000000..f6780814b89b4 --- /dev/null +++ b/Zend/tests/gh7771_3.phpt @@ -0,0 +1,16 @@ +--TEST-- +GH-7771.3 (Incorrect file/line for class constant expression exceptions) +--FILE-- + 'class y{const y="$y";}', + 'D' => 'class D{const HW=space1\C::y;}' +]; +spl_autoload_register(function($class) use ($classlist) { + eval($classlist[$class]); +}); +var_dump(D::HW); +?> +--EXPECTF-- +Fatal error: Constant expression contains invalid operations in %sgh7771_3.php(7) : eval()'d code(1) : eval()'d code on line 1 + diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 624471432d2d3..f1ea28112bdde 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -789,6 +789,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast { zend_string *class_name = zend_ast_get_str(ast->child[0]); zend_string *const_name = zend_ast_get_str(ast->child[1]); + zval *zv; + bool bailout = 0; zend_string *previous_filename; zend_long previous_lineno; @@ -798,11 +800,18 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast EG(filename_override) = scope->info.user.filename; EG(lineno_override) = zend_ast_get_lineno(ast); } - zval *zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr); + zend_try { + zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr); + } zend_catch { + bailout = 1; + } zend_end_try(); if (scope) { EG(filename_override) = previous_filename; EG(lineno_override) = previous_lineno; } + if (bailout) { + zend_bailout(); + } if (UNEXPECTED(zv == NULL)) { ZVAL_UNDEF(result); From ec53e17adf4f1669411334750a1d47954e2bc8e3 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 16 Mar 2022 22:53:41 +0000 Subject: [PATCH 0382/1346] Use more appropriate types in JSON extension (#8194) Mainly zend_result --- ext/json/json.c | 8 ++++---- ext/json/json_encoder.c | 16 ++++++++-------- ext/json/php_json.h | 8 ++++---- ext/json/php_json_encoder.h | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ext/json/json.c b/ext/json/json.c index 2d7846a5dbed9..b21ed4d14b20e 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -141,10 +141,10 @@ static PHP_MINFO_FUNCTION(json) } /* }}} */ -PHP_JSON_API int php_json_encode_ex(smart_str *buf, zval *val, int options, zend_long depth) /* {{{ */ +PHP_JSON_API zend_result php_json_encode_ex(smart_str *buf, zval *val, int options, zend_long depth) /* {{{ */ { php_json_encoder encoder; - int return_code; + zend_result return_code; php_json_encode_init(&encoder); encoder.max_depth = depth; @@ -156,7 +156,7 @@ PHP_JSON_API int php_json_encode_ex(smart_str *buf, zval *val, int options, zend } /* }}} */ -PHP_JSON_API int php_json_encode(smart_str *buf, zval *val, int options) /* {{{ */ +PHP_JSON_API zend_result php_json_encode(smart_str *buf, zval *val, int options) /* {{{ */ { return php_json_encode_ex(buf, val, options, JSON_G(encode_max_depth)); } @@ -195,7 +195,7 @@ static const char *php_json_get_error_msg(php_json_error_code error_code) /* {{{ } /* }}} */ -PHP_JSON_API int php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth) /* {{{ */ +PHP_JSON_API zend_result php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth) /* {{{ */ { php_json_parser parser; diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c index cae2f80ea5d1d..13c5ed0aad683 100644 --- a/ext/json/json_encoder.c +++ b/ext/json/json_encoder.c @@ -31,7 +31,7 @@ static const char digits[] = "0123456789abcdef"; -static int php_json_escape_string( +static zend_result php_json_escape_string( smart_str *buf, const char *s, size_t len, int options, php_json_encoder *encoder); @@ -71,7 +71,7 @@ static inline void php_json_pretty_print_indent(smart_str *buf, int options, php /* }}} */ -static inline int php_json_is_valid_double(double d) /* {{{ */ +static inline bool php_json_is_valid_double(double d) /* {{{ */ { return !zend_isinf(d) && !zend_isnan(d); } @@ -107,7 +107,7 @@ static inline void php_json_encode_double(smart_str *buf, double d, int options) } \ } while (0) -static int php_json_encode_array(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ +static zend_result php_json_encode_array(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ { int i, r, need_comma = 0; HashTable *myht, *prop_ht; @@ -312,7 +312,7 @@ static int php_json_encode_array(smart_str *buf, zval *val, int options, php_jso } /* }}} */ -static int php_json_escape_string( +static zend_result php_json_escape_string( smart_str *buf, const char *s, size_t len, int options, php_json_encoder *encoder) /* {{{ */ { @@ -525,12 +525,12 @@ static int php_json_escape_string( } /* }}} */ -static int php_json_encode_serializable_object(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ +static zend_result php_json_encode_serializable_object(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ { zend_class_entry *ce = Z_OBJCE_P(val); HashTable* myht = Z_OBJPROP_P(val); zval retval, fname; - int return_code; + zend_result return_code; if (myht && GC_IS_RECURSIVE(myht)) { encoder->error_code = PHP_JSON_ERROR_RECURSION; @@ -587,7 +587,7 @@ static int php_json_encode_serializable_object(smart_str *buf, zval *val, int op } /* }}} */ -static int php_json_encode_serializable_enum(smart_str *buf, zval *val, int options, php_json_encoder *encoder) +static zend_result php_json_encode_serializable_enum(smart_str *buf, zval *val, int options, php_json_encoder *encoder) { zend_class_entry *ce = Z_OBJCE_P(val); if (ce->enum_backing_type == IS_UNDEF) { @@ -600,7 +600,7 @@ static int php_json_encode_serializable_enum(smart_str *buf, zval *val, int opti return php_json_encode_zval(buf, value_zv, options, encoder); } -int php_json_encode_zval(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ +zend_result php_json_encode_zval(smart_str *buf, zval *val, int options, php_json_encoder *encoder) /* {{{ */ { again: switch (Z_TYPE_P(val)) diff --git a/ext/json/php_json.h b/ext/json/php_json.h index 89d04ed7f4d57..d4d8ac421f886 100644 --- a/ext/json/php_json.h +++ b/ext/json/php_json.h @@ -97,11 +97,11 @@ PHP_JSON_API ZEND_EXTERN_MODULE_GLOBALS(json) ZEND_TSRMLS_CACHE_EXTERN() #endif -PHP_JSON_API int php_json_encode_ex(smart_str *buf, zval *val, int options, zend_long depth); -PHP_JSON_API int php_json_encode(smart_str *buf, zval *val, int options); -PHP_JSON_API int php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth); +PHP_JSON_API zend_result php_json_encode_ex(smart_str *buf, zval *val, int options, zend_long depth); +PHP_JSON_API zend_result php_json_encode(smart_str *buf, zval *val, int options); +PHP_JSON_API zend_result php_json_decode_ex(zval *return_value, const char *str, size_t str_len, zend_long options, zend_long depth); -static inline int php_json_decode(zval *return_value, const char *str, int str_len, bool assoc, zend_long depth) +static inline zend_result php_json_decode(zval *return_value, const char *str, size_t str_len, bool assoc, zend_long depth) { return php_json_decode_ex(return_value, str, str_len, assoc ? PHP_JSON_OBJECT_AS_ARRAY : 0, depth); } diff --git a/ext/json/php_json_encoder.h b/ext/json/php_json_encoder.h index 51d2d6b59ab49..e1c48e2b50922 100644 --- a/ext/json/php_json_encoder.h +++ b/ext/json/php_json_encoder.h @@ -33,6 +33,6 @@ static inline void php_json_encode_init(php_json_encoder *encoder) memset(encoder, 0, sizeof(php_json_encoder)); } -int php_json_encode_zval(smart_str *buf, zval *val, int options, php_json_encoder *encoder); +zend_result php_json_encode_zval(smart_str *buf, zval *val, int options, php_json_encoder *encoder); #endif /* PHP_JSON_ENCODER_H */ From c9385ee1ad0d19e7c830f163cb91592924214ad7 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sat, 19 Mar 2022 11:12:00 +0000 Subject: [PATCH 0383/1346] zend_mm_map_fixed using MAP_TRYFIXED on NetBSD.DragonFlyBSD attempts to map on addr but does not replace it if already present. Note on OpenBSD it has no effect, addr is used just as a hint. Closes GH-7923. --- Zend/zend_alloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index d8a7b07db77fc..07f971e44df4c 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -425,12 +425,14 @@ static void *zend_mm_mmap_fixed(void *addr, size_t size) int flags = MAP_PRIVATE | MAP_ANON; #if defined(MAP_EXCL) flags |= MAP_FIXED | MAP_EXCL; +#elif defined(MAP_TRYFIXED) + flags |= MAP_TRYFIXED; #endif /* MAP_FIXED leads to discarding of the old mapping, so it can't be used. */ void *ptr = mmap(addr, size, PROT_READ | PROT_WRITE, flags /*| MAP_POPULATE | MAP_HUGETLB*/, ZEND_MM_FD, 0); if (ptr == MAP_FAILED) { -#if ZEND_MM_ERROR && !defined(MAP_EXCL) +#if ZEND_MM_ERROR && !defined(MAP_EXCL) && !defined(MAP_TRYFIXED) fprintf(stderr, "\nmmap() failed: [%d] %s\n", errno, strerror(errno)); #endif return NULL; From 82de4fcfe6c254e86d25eeca024e94697f955e87 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 19 Mar 2022 14:51:40 +0100 Subject: [PATCH 0384/1346] ext/opcache/ZendAccelerator: remove redundant check (#8222) The "accelerator_enabled" flag has been checked already in the previous "if". --- ext/opcache/ZendAccelerator.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index b753f805394e6..b3115893029e0 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1961,8 +1961,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) ZCG(cache_opline) = NULL; ZCG(cache_persistent_script) = NULL; return file_cache_compile_file(file_handle, type); - } else if (!ZCG(accelerator_enabled) || - (ZCSG(restart_in_progress) && accel_restart_is_active())) { + } else if ((ZCSG(restart_in_progress) && accel_restart_is_active())) { if (ZCG(accel_directives).file_cache) { return file_cache_compile_file(file_handle, type); } From bf2867bc7235dfb65675ff4e9c21c8bc537726e2 Mon Sep 17 00:00:00 2001 From: istiak101 <30789544+istiak101@users.noreply.github.com> Date: Sat, 19 Mar 2022 23:25:29 +0600 Subject: [PATCH 0385/1346] Fix FSF address & update year to 2022 FSF mailing address was changed long time ago. This patch updates that address. Also updated year from 2021 to 2022. Closes GH-8009. --- LICENSE | 2 +- build/pkg.m4 | 4 ++-- build/shtool | 2 +- ext/oci8/LICENSE | 2 +- ext/phar/phar.1.in | 2 +- sapi/cli/php.1.in | 2 +- sapi/fpm/php-fpm.8.in | 2 +- sapi/phpdbg/phpdbg.1.in | 2 +- scripts/man1/php-config.1.in | 2 +- scripts/man1/phpize.1.in | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/LICENSE b/LICENSE index 6a15be588547f..dffd7eab225d7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ -------------------------------------------------------------------- The PHP License, version 3.01 -Copyright (c) 1999 - 2021 The PHP Group. All rights reserved. +Copyright (c) 1999 - 2022 The PHP Group. All rights reserved. -------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without diff --git a/build/pkg.m4 b/build/pkg.m4 index f9075e56c87af..5bf9ba16505b7 100644 --- a/build/pkg.m4 +++ b/build/pkg.m4 @@ -16,8 +16,8 @@ dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software -dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -dnl 02111-1307, USA. +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +dnl 02110-1301, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a diff --git a/build/shtool b/build/shtool index fc6ae1e6efbbb..ea1119ac1ebea 100755 --- a/build/shtool +++ b/build/shtool @@ -23,7 +23,7 @@ ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software -## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ## USA, or contact Ralf S. Engelschall . ## ## NOTICE: Given that you include this file verbatim into your own diff --git a/ext/oci8/LICENSE b/ext/oci8/LICENSE index 6a15be588547f..dffd7eab225d7 100644 --- a/ext/oci8/LICENSE +++ b/ext/oci8/LICENSE @@ -1,6 +1,6 @@ -------------------------------------------------------------------- The PHP License, version 3.01 -Copyright (c) 1999 - 2021 The PHP Group. All rights reserved. +Copyright (c) 1999 - 2022 The PHP Group. All rights reserved. -------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without diff --git a/ext/phar/phar.1.in b/ext/phar/phar.1.in index 323e77b0e2a3b..75c3a354825be 100644 --- a/ext/phar/phar.1.in +++ b/ext/phar/phar.1.in @@ -1,4 +1,4 @@ -.TH PHAR 1 "2021" "The PHP Group" "User Commands" +.TH PHAR 1 "2022" "The PHP Group" "User Commands" .SH NAME phar, phar.phar \- PHAR (PHP archive) command line tool .SH SYNOPSIS diff --git a/sapi/cli/php.1.in b/sapi/cli/php.1.in index 98c8dc76f2603..e8b84ad3d12a9 100644 --- a/sapi/cli/php.1.in +++ b/sapi/cli/php.1.in @@ -1,4 +1,4 @@ -.TH @program_prefix@php 1 "2021" "The PHP Group" "Scripting Language" +.TH @program_prefix@php 1 "2022" "The PHP Group" "Scripting Language" .SH NAME @program_prefix@php \- PHP Command Line Interface 'CLI' .P diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in index 905946e70b119..6525c1eadad64 100644 --- a/sapi/fpm/php-fpm.8.in +++ b/sapi/fpm/php-fpm.8.in @@ -1,4 +1,4 @@ -.TH PHP-FPM 8 "2021" "The PHP Group" "Scripting Language" +.TH PHP-FPM 8 "2022" "The PHP Group" "Scripting Language" .SH NAME .TP 15 php-fpm \- PHP FastCGI Process Manager 'PHP-FPM' diff --git a/sapi/phpdbg/phpdbg.1.in b/sapi/phpdbg/phpdbg.1.in index 29f832407db75..926a1edcc4ed9 100644 --- a/sapi/phpdbg/phpdbg.1.in +++ b/sapi/phpdbg/phpdbg.1.in @@ -1,4 +1,4 @@ -.TH @program_prefix@phpdbg 1 "2021" "The PHP Group" "Scripting Language" +.TH @program_prefix@phpdbg 1 "2022" "The PHP Group" "Scripting Language" .SH NAME @program_prefix@phpdbg \- The interactive PHP debugger .SH SYNOPSIS diff --git a/scripts/man1/php-config.1.in b/scripts/man1/php-config.1.in index 20f09d611f114..5ed77c574cb42 100644 --- a/scripts/man1/php-config.1.in +++ b/scripts/man1/php-config.1.in @@ -1,4 +1,4 @@ -.TH @program_prefix@php\-config 1 "2021" "The PHP Group" "Scripting Language" +.TH @program_prefix@php\-config 1 "2022" "The PHP Group" "Scripting Language" .SH NAME @program_prefix@php\-config \- get information about PHP configuration and compile options .SH SYNOPSIS diff --git a/scripts/man1/phpize.1.in b/scripts/man1/phpize.1.in index 308b51e03d009..bf50aa0c1df37 100644 --- a/scripts/man1/phpize.1.in +++ b/scripts/man1/phpize.1.in @@ -1,4 +1,4 @@ -.TH @program_prefix@phpize 1 "2021" "The PHP Group" "Scripting Language" +.TH @program_prefix@phpize 1 "2022" "The PHP Group" "Scripting Language" .SH NAME @program_prefix@phpize \- prepare a PHP extension for compiling .SH SYNOPSIS From dd81dd92643e98ea61bdc9091a47c5cae0925a4b Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sun, 20 Mar 2022 00:30:15 +0100 Subject: [PATCH 0386/1346] build: Extend m4 to support C++20 Signed-off-by: Anatol Belski --- build/php_cxx_compile_stdcxx.m4 | 49 +++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/build/php_cxx_compile_stdcxx.m4 b/build/php_cxx_compile_stdcxx.m4 index 3c8d598e63a1d..f8e97fce708f0 100644 --- a/build/php_cxx_compile_stdcxx.m4 +++ b/build/php_cxx_compile_stdcxx.m4 @@ -6,7 +6,7 @@ dnl PHP_CXX_COMPILE_STDCXX(version, mandatory|optional, var_name_to_put_switch_i dnl dnl ARGUMENTS dnl -dnl first arg - version as 11, 14 or 17 +dnl first arg - version as 11, 14, 17 or 20 dnl second arg - if mandatory, the configure will fail when no features found. dnl Optional will make configure silently continue dnl third arg - a variable name where the corresponding switch would be put. If @@ -26,6 +26,7 @@ AC_DEFUN([PHP_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [$1], [20], [ax_cxx_compile_alternatives="20"], [m4_fatal([invalid first argument `$1' to PHP_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [ax_cxx_compile_cxx$1_required=true], [$2], [mandatory], [ax_cxx_compile_cxx$1_required=true], @@ -88,19 +89,21 @@ dnl # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016, 2018 Krzesimir Nowak # Copyright (c) 2019 Enji Cooper +# Copyright (c) 2020 Jason Merrill +# Copyright (c) 2021 Jörn Heusipp # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. + dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 ) - dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], @@ -108,12 +111,24 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 ) +dnl Test body for checking C++17 support + m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 ) +dnl Test body for checking C++20 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 +) + + dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ @@ -909,3 +924,33 @@ namespace cxx17 #endif // __cplusplus < 201703L ]]) + + +dnl Tests for new features in C++20 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 202002L + +#error "This is not a C++20 compiler" + +#else + +#include + +namespace cxx20 +{ + +// As C++20 supports feature test macros in the standard, there is no +// immediate need to actually test for feature availability on the +// Autoconf side. + +} // namespace cxx20 + +#endif // __cplusplus < 202002L + +]]) From 3b9af50465c9279987c842b2f61f2f24e21c543b Mon Sep 17 00:00:00 2001 From: Shrikant Dhayje Date: Mon, 21 Mar 2022 00:58:07 +0530 Subject: [PATCH 0387/1346] Fixed #8228 - updated details for filling bugs to GitHub Issue (#8231) * updated details for filling bugs to GitHub Issue * Remove superfluous word in README.md * Link new issue page directly Co-authored-by: Ilija Tovilo --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a77eec1e01fb9..4d18eb2c98cbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -58,8 +58,8 @@ and build PHP source code. We recommend to look at our ## Filing bugs -Bugs can be filed on the [PHP bug tracker](https://bugs.php.net/). If this is -the first time you've filed a bug, we suggest reading the +Bugs can be filed on [GitHub Issues](https://github.com/php/php-src/issues/new/choose). +If this is the first time you've filed a bug, we suggest reading the [guide to reporting a bug](https://bugs.php.net/how-to-report.php). Where possible, please include a self-contained reproduction case! From a83cc9d397b35aa2706791cffe8d6c0339d1d1fc Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 20 Mar 2022 20:30:03 +0100 Subject: [PATCH 0388/1346] Zend/zend_alloc: use bool and make internal variable static (#8230) * Zend/zend_alloc: make zend_mm_use_huge_pages static This is an internal variable and it should not be exported. * Zend/zend_alloc: convert zend_mm_use_huge_pages to bool * Zend/zend_alloc: convert has_free_pages to bool * Zend/zend_alloc: convert empty to bool --- Zend/zend_alloc.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 07f971e44df4c..488979d884143 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -69,6 +69,7 @@ # include "win32/winutil.h" #endif +#include #include #include #include @@ -196,7 +197,7 @@ typedef struct _zend_mm_free_slot zend_mm_free_slot; typedef struct _zend_mm_chunk zend_mm_chunk; typedef struct _zend_mm_huge_list zend_mm_huge_list; -int zend_mm_use_huge_pages = 0; +static bool zend_mm_use_huge_pages = false; /* * Memory is retrieved from OS by chunks of fixed size 2MB. @@ -1912,7 +1913,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap) int page_num; zend_mm_page_info info; uint32_t i, free_counter; - int has_free_pages; + bool has_free_pages; size_t collected = 0; #if ZEND_MM_CUSTOM @@ -1922,7 +1923,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap) #endif for (i = 0; i < ZEND_MM_BINS; i++) { - has_free_pages = 0; + has_free_pages = false; p = heap->free_slot[i]; while (p != NULL) { chunk = (zend_mm_chunk*)ZEND_MM_ALIGNED_BASE(p, ZEND_MM_CHUNK_SIZE); @@ -1941,7 +1942,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap) ZEND_ASSERT(ZEND_MM_SRUN_BIN_NUM(info) == i); free_counter = ZEND_MM_SRUN_FREE_COUNTER(info) + 1; if (free_counter == bin_elements[i]) { - has_free_pages = 1; + has_free_pages = true; } chunk->map[page_num] = ZEND_MM_SRUN_EX(i, free_counter); p = p->next_free_slot; @@ -2025,7 +2026,7 @@ ZEND_API size_t zend_mm_gc(zend_mm_heap *heap) static zend_long zend_mm_find_leaks_small(zend_mm_chunk *p, uint32_t i, uint32_t j, zend_leak_info *leak) { - int empty = 1; + bool empty = true; zend_long count = 0; int bin_num = ZEND_MM_SRUN_BIN_NUM(p->map[i]); zend_mm_debug_info *dbg = (zend_mm_debug_info*)((char*)p + ZEND_MM_PAGE_SIZE * i + bin_data_size[bin_num] * (j + 1) - ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_debug_info))); @@ -2038,7 +2039,7 @@ static zend_long zend_mm_find_leaks_small(zend_mm_chunk *p, uint32_t i, uint32_t dbg->filename = NULL; dbg->lineno = 0; } else { - empty = 0; + empty = false; } } j++; @@ -2869,7 +2870,7 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals) tmp = getenv("USE_ZEND_ALLOC_HUGE_PAGES"); if (tmp && ZEND_ATOL(tmp)) { - zend_mm_use_huge_pages = 1; + zend_mm_use_huge_pages = true; } alloc_globals->mm_heap = zend_mm_init(); } From 373f236673dc86b22b252095a4666a580cae130a Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 17 Mar 2022 19:28:34 +0100 Subject: [PATCH 0389/1346] ext/opcache: C++ compatibility --- Zend/zend_map_ptr.h | 4 ++++ ext/opcache/ZendAccelerator.h | 4 ++++ ext/opcache/zend_accelerator_hash.h | 4 ++++ ext/opcache/zend_accelerator_util_funcs.h | 4 ++++ ext/opcache/zend_shared_alloc.h | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h index f2fe96f19a72c..aa726e0cdd32d 100644 --- a/Zend/zend_map_ptr.h +++ b/Zend/zend_map_ptr.h @@ -69,9 +69,13 @@ # error "Unknown ZEND_MAP_PTR_KIND" #endif +BEGIN_EXTERN_C() + ZEND_API void zend_map_ptr_reset(void); ZEND_API void *zend_map_ptr_new(void); ZEND_API void zend_map_ptr_extend(size_t last); ZEND_API void zend_alloc_ce_cache(zend_string *type_name); +END_EXTERN_C() + #endif /* ZEND_MAP_PTR_H */ diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index 9d18493c7d52a..bd692495a5282 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -311,6 +311,8 @@ extern zend_accel_globals accel_globals; extern char *zps_api_failure_reason; +BEGIN_EXTERN_C() + void accel_shutdown(void); zend_result accel_activate(INIT_FUNC_ARGS); zend_result accel_post_deactivate(void); @@ -333,6 +335,8 @@ zend_string* ZEND_FASTCALL accel_new_interned_string(zend_string *str); uint32_t zend_accel_get_class_name_map_ptr(zend_string *type_name); +END_EXTERN_C() + /* memory write protection */ #define SHM_PROTECT() \ do { \ diff --git a/ext/opcache/zend_accelerator_hash.h b/ext/opcache/zend_accelerator_hash.h index 7cf995f3175e9..755d3f13ec516 100644 --- a/ext/opcache/zend_accelerator_hash.h +++ b/ext/opcache/zend_accelerator_hash.h @@ -60,6 +60,8 @@ typedef struct _zend_accel_hash { uint32_t num_direct_entries; } zend_accel_hash; +BEGIN_EXTERN_C() + void zend_accel_hash_init(zend_accel_hash *accel_hash, uint32_t hash_size); void zend_accel_hash_clean(zend_accel_hash *accel_hash); @@ -90,4 +92,6 @@ static inline bool zend_accel_hash_is_full(zend_accel_hash *accel_hash) } } +END_EXTERN_C() + #endif /* ZEND_ACCELERATOR_HASH_H */ diff --git a/ext/opcache/zend_accelerator_util_funcs.h b/ext/opcache/zend_accelerator_util_funcs.h index 1ce661635c19a..53cc1de9effaa 100644 --- a/ext/opcache/zend_accelerator_util_funcs.h +++ b/ext/opcache/zend_accelerator_util_funcs.h @@ -25,6 +25,8 @@ #include "zend.h" #include "ZendAccelerator.h" +BEGIN_EXTERN_C() + zend_persistent_script* create_persistent_script(void); void free_persistent_script(zend_persistent_script *persistent_script, int destroy_elements); @@ -42,4 +44,6 @@ unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t le unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script); +END_EXTERN_C() + #endif /* ZEND_ACCELERATOR_UTIL_FUNCS_H */ diff --git a/ext/opcache/zend_shared_alloc.h b/ext/opcache/zend_shared_alloc.h index 4e090b98ddadf..56c2da5e90ecb 100644 --- a/ext/opcache/zend_shared_alloc.h +++ b/ext/opcache/zend_shared_alloc.h @@ -125,6 +125,8 @@ extern zend_smm_shared_globals *smm_shared_globals; #define SHARED_ALLOC_REATTACHED (SUCCESS+1) +BEGIN_EXTERN_C() + int zend_shared_alloc_startup(size_t requested_size, size_t reserved_size); void zend_shared_alloc_shutdown(void); @@ -200,4 +202,6 @@ void zend_shared_alloc_lock_win32(void); void zend_shared_alloc_unlock_win32(void); #endif +END_EXTERN_C() + #endif /* ZEND_SHARED_ALLOC_H */ From ca134f7a3e53266a6c08ed9f841b4c5a366fe663 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 20 Mar 2022 20:39:21 +0100 Subject: [PATCH 0390/1346] Remove unused include of stdbool.h --- Zend/zend_alloc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 488979d884143..e2d06c1762dd9 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -69,7 +69,6 @@ # include "win32/winutil.h" #endif -#include #include #include #include From 63281763bf58e8b0ed62ad91854bd081a5f2c3f4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 18 Mar 2022 15:49:19 +0100 Subject: [PATCH 0391/1346] ext/opcache/zend_shared_alloc: add zend_shared_alloc_aligned() Eliminate some duplicate code. --- ext/opcache/ZendAccelerator.c | 10 ++-------- ext/opcache/zend_file_cache.c | 8 +------- ext/opcache/zend_shared_alloc.h | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index b3115893029e0..18dce13455329 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1538,11 +1538,9 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr memory_used = zend_accel_script_persist_calc(new_persistent_script, 1); /* Allocate shared memory */ + ZCG(mem) = zend_shared_alloc_aligned(memory_used); #if defined(__AVX__) || defined(__SSE2__) - /* Align to 64-byte boundary */ - ZCG(mem) = zend_shared_alloc(memory_used + 64); if (ZCG(mem)) { - ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 63L) & ~63L); #if defined(__x86_64__) memset(ZCG(mem), 0, memory_used); #elif defined(__AVX__) @@ -1574,7 +1572,6 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr #endif } #else - ZCG(mem) = zend_shared_alloc(memory_used); if (ZCG(mem)) { memset(ZCG(mem), 0, memory_used); } @@ -4237,11 +4234,9 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s memory_used = zend_accel_script_persist_calc(new_persistent_script, 1); /* Allocate shared memory */ + ZCG(mem) = zend_shared_alloc_aligned(memory_used); #if defined(__AVX__) || defined(__SSE2__) - /* Align to 64-byte boundary */ - ZCG(mem) = zend_shared_alloc(memory_used + 64); if (ZCG(mem)) { - ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 63L) & ~63L); #if defined(__x86_64__) memset(ZCG(mem), 0, memory_used); #elif defined(__AVX__) @@ -4273,7 +4268,6 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s #endif } #else - ZCG(mem) = zend_shared_alloc(memory_used); if (ZCG(mem)) { memset(ZCG(mem), 0, memory_used); } diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index b822f8992d4f4..bbfe3771afac6 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -1866,13 +1866,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl goto use_process_mem; } -#if defined(__AVX__) || defined(__SSE2__) - /* Align to 64-byte boundary */ - buf = zend_shared_alloc(info.mem_size + 64); - buf = (void*)(((zend_uintptr_t)buf + 63L) & ~63L); -#else - buf = zend_shared_alloc(info.mem_size); -#endif + buf = zend_shared_alloc_aligned(info.mem_size); if (!buf) { zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_OOM); diff --git a/ext/opcache/zend_shared_alloc.h b/ext/opcache/zend_shared_alloc.h index 56c2da5e90ecb..de5012b2204ad 100644 --- a/ext/opcache/zend_shared_alloc.h +++ b/ext/opcache/zend_shared_alloc.h @@ -134,6 +134,20 @@ void zend_shared_alloc_shutdown(void); void *zend_shared_alloc_pages(size_t requested_size); void *zend_shared_alloc(size_t size); +/** + * Wrapper for zend_shared_alloc() which aligns at 64-byte boundary if + * AVX or SSE2 are used. + */ +static inline void *zend_shared_alloc_aligned(size_t size) { +#if defined(__AVX__) || defined(__SSE2__) + /* Align to 64-byte boundary */ + void *p = zend_shared_alloc(size + 64); + return (void *)(((zend_uintptr_t)p + 63L) & ~63L); +#else + return zend_shared_alloc(size); +#endif +} + /* copy into shared memory */ void *zend_shared_memdup_get_put_free(void *source, size_t size); void *zend_shared_memdup_put_free(void *source, size_t size); From b9b134de5c3c418bc7f05e15dd4ad412e3b62f05 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 18 Mar 2022 16:58:34 +0100 Subject: [PATCH 0392/1346] ext/opcache/ZendAccelerator: move duplicate code into bzero_aligned() --- ext/opcache/ZendAccelerator.c | 112 ++++++++++++---------------------- 1 file changed, 38 insertions(+), 74 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 18dce13455329..a533a074a2603 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -139,6 +139,40 @@ static void preload_restart(void); # define LOCKVAL(v) (ZCSG(v)) #endif +/** + * Clear AVX/SSE2-aligned memory. + */ +static void bzero_aligned(void *mem, size_t size) +{ +#if defined(__x86_64__) + memset(mem, 0, size); +#elif defined(__AVX__) + char *p = (char*)mem; + char *end = p + size; + __m256i ymm0 = _mm256_setzero_si256(); + + while (p < end) { + _mm256_store_si256((__m256i*)p, ymm0); + _mm256_store_si256((__m256i*)(p+32), ymm0); + p += 64; + } +#elif defined(__SSE2__) + char *p = (char*)mem; + char *end = p + size; + __m128i xmm0 = _mm_setzero_si128(); + + while (p < end) { + _mm_store_si128((__m128i*)p, xmm0); + _mm_store_si128((__m128i*)(p+16), xmm0); + _mm_store_si128((__m128i*)(p+32), xmm0); + _mm_store_si128((__m128i*)(p+48), xmm0); + p += 64; + } +#else + memset(mem, 0, size); +#endif +} + #ifdef ZEND_WIN32 static time_t zend_accel_get_time(void) { @@ -1539,43 +1573,6 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr /* Allocate shared memory */ ZCG(mem) = zend_shared_alloc_aligned(memory_used); -#if defined(__AVX__) || defined(__SSE2__) - if (ZCG(mem)) { -#if defined(__x86_64__) - memset(ZCG(mem), 0, memory_used); -#elif defined(__AVX__) - { - char *p = (char*)ZCG(mem); - char *end = p + memory_used; - __m256i ymm0 = _mm256_setzero_si256(); - - while (p < end) { - _mm256_store_si256((__m256i*)p, ymm0); - _mm256_store_si256((__m256i*)(p+32), ymm0); - p += 64; - } - } -#else - { - char *p = (char*)ZCG(mem); - char *end = p + memory_used; - __m128i xmm0 = _mm_setzero_si128(); - - while (p < end) { - _mm_store_si128((__m128i*)p, xmm0); - _mm_store_si128((__m128i*)(p+16), xmm0); - _mm_store_si128((__m128i*)(p+32), xmm0); - _mm_store_si128((__m128i*)(p+48), xmm0); - p += 64; - } - } -#endif - } -#else - if (ZCG(mem)) { - memset(ZCG(mem), 0, memory_used); - } -#endif if (!ZCG(mem)) { zend_shared_alloc_destroy_xlat_table(); zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_OOM); @@ -1587,6 +1584,8 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr return new_persistent_script; } + bzero_aligned(ZCG(mem), memory_used); + zend_shared_alloc_clear_xlat_table(); /* Copy into shared memory */ @@ -4235,48 +4234,13 @@ static zend_persistent_script* preload_script_in_shared_memory(zend_persistent_s /* Allocate shared memory */ ZCG(mem) = zend_shared_alloc_aligned(memory_used); -#if defined(__AVX__) || defined(__SSE2__) - if (ZCG(mem)) { -#if defined(__x86_64__) - memset(ZCG(mem), 0, memory_used); -#elif defined(__AVX__) - { - char *p = (char*)ZCG(mem); - char *end = p + memory_used; - __m256i ymm0 = _mm256_setzero_si256(); - - while (p < end) { - _mm256_store_si256((__m256i*)p, ymm0); - _mm256_store_si256((__m256i*)(p+32), ymm0); - p += 64; - } - } -#else - { - char *p = (char*)ZCG(mem); - char *end = p + memory_used; - __m128i xmm0 = _mm_setzero_si128(); - - while (p < end) { - _mm_store_si128((__m128i*)p, xmm0); - _mm_store_si128((__m128i*)(p+16), xmm0); - _mm_store_si128((__m128i*)(p+32), xmm0); - _mm_store_si128((__m128i*)(p+48), xmm0); - p += 64; - } - } -#endif - } -#else - if (ZCG(mem)) { - memset(ZCG(mem), 0, memory_used); - } -#endif if (!ZCG(mem)) { zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Not enough shared memory for preloading. Consider increasing the value for the opcache.memory_consumption directive in php.ini."); return NULL; } + bzero_aligned(ZCG(mem), memory_used); + zend_shared_alloc_restore_xlat_table(checkpoint); /* Copy into shared memory */ From 733023b2e3099485a67baa18f33a19074740d4f1 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 10 Mar 2022 14:41:07 +0100 Subject: [PATCH 0393/1346] Improve error message class type Refer to interfaces/enums instead of classes in more places. Closes GH-7792 Closes GH-8187 --- NEWS | 1 + Zend/tests/class_alias_009.phpt | 2 +- .../final_constants/final_const12.phpt | 2 +- .../enum/no-enum-implements-backed-enum.phpt | 2 +- .../enum/no-enum-implements-unit-enum.phpt | 2 +- Zend/tests/gh7792_1.phpt | 14 ++++++++++++++ Zend/tests/gh7792_2.phpt | 10 ++++++++++ Zend/tests/gh7792_3.phpt | 18 ++++++++++++++++++ Zend/tests/gh7792_4.phpt | 12 ++++++++++++ Zend/tests/gh7792_5.phpt | 10 ++++++++++ Zend/tests/objects_014.phpt | 2 +- Zend/zend_API.c | 12 +++++++----- Zend/zend_API.h | 12 +++++++++++- Zend/zend_exceptions.c | 7 ++++++- Zend/zend_inheritance.c | 18 ++++++++++++------ Zend/zend_interfaces.c | 3 ++- 16 files changed, 108 insertions(+), 19 deletions(-) create mode 100644 Zend/tests/gh7792_1.phpt create mode 100644 Zend/tests/gh7792_2.phpt create mode 100644 Zend/tests/gh7792_3.phpt create mode 100644 Zend/tests/gh7792_4.phpt create mode 100644 Zend/tests/gh7792_5.phpt diff --git a/NEWS b/NEWS index dd939687ecaf6..75e3600f5480a 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ PHP NEWS - Core: . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) + . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) - Intl: . Update all grandfathered language tags with preferred values diff --git a/Zend/tests/class_alias_009.phpt b/Zend/tests/class_alias_009.phpt index f17769e1f4213..bb72312577aff 100644 --- a/Zend/tests/class_alias_009.phpt +++ b/Zend/tests/class_alias_009.phpt @@ -11,4 +11,4 @@ interface c extends a, b { } ?> --EXPECTF-- -Fatal error: Class c cannot implement previously implemented interface a in %s on line %d +Fatal error: Interface c cannot implement previously implemented interface a in %s on line %d diff --git a/Zend/tests/constants/final_constants/final_const12.phpt b/Zend/tests/constants/final_constants/final_const12.phpt index 300239f6a630e..3130af11da8bd 100644 --- a/Zend/tests/constants/final_constants/final_const12.phpt +++ b/Zend/tests/constants/final_constants/final_const12.phpt @@ -19,4 +19,4 @@ interface I3 extends I1, I2 ?> --EXPECTF-- -Fatal error: Class I3 inherits both I1::C and I2::C, which is ambiguous in %s on line %d +Fatal error: Interface I3 inherits both I1::C and I2::C, which is ambiguous in %s on line %d diff --git a/Zend/tests/enum/no-enum-implements-backed-enum.phpt b/Zend/tests/enum/no-enum-implements-backed-enum.phpt index 69922c13a8f51..c93994ad8bf58 100644 --- a/Zend/tests/enum/no-enum-implements-backed-enum.phpt +++ b/Zend/tests/enum/no-enum-implements-backed-enum.phpt @@ -7,4 +7,4 @@ enum Foo: int implements BackedEnum {} ?> --EXPECTF-- -Fatal error: Class Foo cannot implement previously implemented interface BackedEnum in %s on line %d +Fatal error: Enum Foo cannot implement previously implemented interface BackedEnum in %s on line %d diff --git a/Zend/tests/enum/no-enum-implements-unit-enum.phpt b/Zend/tests/enum/no-enum-implements-unit-enum.phpt index 458efbb67cdfa..ae1890c430518 100644 --- a/Zend/tests/enum/no-enum-implements-unit-enum.phpt +++ b/Zend/tests/enum/no-enum-implements-unit-enum.phpt @@ -7,4 +7,4 @@ enum Foo implements UnitEnum {} ?> --EXPECTF-- -Fatal error: Class Foo cannot implement previously implemented interface UnitEnum in %s on line %d +Fatal error: Enum Foo cannot implement previously implemented interface UnitEnum in %s on line %d diff --git a/Zend/tests/gh7792_1.phpt b/Zend/tests/gh7792_1.phpt new file mode 100644 index 0000000000000..a342f169d937c --- /dev/null +++ b/Zend/tests/gh7792_1.phpt @@ -0,0 +1,14 @@ +--TEST-- +GH-7792 (Refer to enum as enum instead of class) +--FILE-- + +--EXPECTF-- +Fatal error: Enum B must implement 1 abstract private method (A::a) in %s on line %d diff --git a/Zend/tests/gh7792_2.phpt b/Zend/tests/gh7792_2.phpt new file mode 100644 index 0000000000000..41f47a6e870ac --- /dev/null +++ b/Zend/tests/gh7792_2.phpt @@ -0,0 +1,10 @@ +--TEST-- +GH-7792 (Refer to enum as enum instead of class) +--FILE-- + +--EXPECTF-- +Fatal error: Enum Foo cannot implement interface Throwable in %s on line %d diff --git a/Zend/tests/gh7792_3.phpt b/Zend/tests/gh7792_3.phpt new file mode 100644 index 0000000000000..67e2c1c99dda1 --- /dev/null +++ b/Zend/tests/gh7792_3.phpt @@ -0,0 +1,18 @@ +--TEST-- +GH-7792 (Refer to enum as enum instead of class) +--FILE-- + +--EXPECTF-- +Fatal error: Enum Foo inherits both A::FOO and B::FOO, which is ambiguous in %s on line %d diff --git a/Zend/tests/gh7792_4.phpt b/Zend/tests/gh7792_4.phpt new file mode 100644 index 0000000000000..0d09835d7ee3a --- /dev/null +++ b/Zend/tests/gh7792_4.phpt @@ -0,0 +1,12 @@ +--TEST-- +GH-7792 (Refer to enum as enum instead of class) +--FILE-- + +--EXPECTF-- +Fatal error: Enum Foo cannot implement previously implemented interface A in %s on line %d diff --git a/Zend/tests/gh7792_5.phpt b/Zend/tests/gh7792_5.phpt new file mode 100644 index 0000000000000..824ed9ed1810d --- /dev/null +++ b/Zend/tests/gh7792_5.phpt @@ -0,0 +1,10 @@ +--TEST-- +GH-7792 (Refer to enum as enum instead of class) +--FILE-- + +--EXPECT-- +Fatal error: Enum Foo must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0 diff --git a/Zend/tests/objects_014.phpt b/Zend/tests/objects_014.phpt index 138fd4f294660..858de748b8e2e 100644 --- a/Zend/tests/objects_014.phpt +++ b/Zend/tests/objects_014.phpt @@ -12,4 +12,4 @@ interface bar extends foo, foo { echo "Done\n"; ?> --EXPECTF-- -Fatal error: Class bar cannot implement previously implemented interface foo in %s on line %d +Fatal error: Interface bar cannot implement previously implemented interface foo in %s on line %d diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 3ef291c315596..6ce9f593e17dd 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4783,14 +4783,16 @@ ZEND_API void zend_restore_error_handling(zend_error_handling *saved) /* {{{ */ } /* }}} */ -ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce) /* {{{ */ +ZEND_API ZEND_COLD const char *zend_get_object_type_case(const zend_class_entry *ce, bool upper_case) /* {{{ */ { - if(ce->ce_flags & ZEND_ACC_TRAIT) { - return "trait"; + if (ce->ce_flags & ZEND_ACC_TRAIT) { + return upper_case ? "Trait" : "trait"; } else if (ce->ce_flags & ZEND_ACC_INTERFACE) { - return "interface"; + return upper_case ? "Interface" : "interface"; + } else if (ce->ce_flags & ZEND_ACC_ENUM) { + return upper_case ? "Enum" : "enum"; } else { - return "class"; + return upper_case ? "Class" : "class"; } } /* }}} */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index ecb6e8296befb..705fe25e7665a 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -721,7 +721,17 @@ static zend_always_inline zend_result zend_forbid_dynamic_call(void) return SUCCESS; } -ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce); +ZEND_API ZEND_COLD const char *zend_get_object_type_case(const zend_class_entry *ce, bool upper_case); + +static zend_always_inline const char *zend_get_object_type(const zend_class_entry *ce) +{ + return zend_get_object_type_case(ce, false); +} + +static zend_always_inline const char *zend_get_object_type_uc(const zend_class_entry *ce) +{ + return zend_get_object_type_case(ce, true); +} ZEND_API bool zend_is_iterable(zval *iterable); diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 7138713510120..85e21c64a037b 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -67,8 +67,13 @@ static int zend_implement_throwable(zend_class_entry *interface, zend_class_entr return SUCCESS; } + bool can_extend = (class_type->ce_flags & ZEND_ACC_ENUM) == 0; + zend_error_noreturn(E_ERROR, - "Class %s cannot implement interface %s, extend Exception or Error instead", + can_extend + ? "%s %s cannot implement interface %s, extend Exception or Error instead" + : "%s %s cannot implement interface %s", + zend_get_object_type_uc(class_type), ZSTR_VAL(class_type->name), ZSTR_VAL(interface->name)); return FAILURE; diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 82af3d8afa75a..2709fb5639186 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1285,7 +1285,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke static inline void do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ { if (!(ce->ce_flags & ZEND_ACC_INTERFACE) && iface->interface_gets_implemented && iface->interface_gets_implemented(iface, ce) == FAILURE) { - zend_error_noreturn(E_CORE_ERROR, "Class %s could not implement interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name)); + zend_error_noreturn(E_CORE_ERROR, "%s %s could not implement interface %s", zend_get_object_type_uc(ce), ZSTR_VAL(ce->name), ZSTR_VAL(iface->name)); } /* This should be prevented by the class lookup logic. */ ZEND_ASSERT(ce != iface); @@ -1610,7 +1610,8 @@ static bool do_inherit_constant_check( if (old_constant->ce != parent_constant->ce && old_constant->ce != ce) { zend_error_noreturn(E_COMPILE_ERROR, - "Class %s inherits both %s::%s and %s::%s, which is ambiguous", + "%s %s inherits both %s::%s and %s::%s, which is ambiguous", + zend_get_object_type_uc(ce), ZSTR_VAL(ce->name), ZSTR_VAL(old_constant->ce->name), ZSTR_VAL(name), ZSTR_VAL(parent_constant->ce->name), ZSTR_VAL(name)); @@ -1729,7 +1730,10 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry if (interfaces[j] == iface) { if (j >= num_parent_interfaces) { efree(interfaces); - zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(iface->name)); + zend_error_noreturn(E_COMPILE_ERROR, "%s %s cannot implement previously implemented interface %s", + zend_get_object_type_uc(ce), + ZSTR_VAL(ce->name), + ZSTR_VAL(iface->name)); return; } /* skip duplications */ @@ -2311,6 +2315,7 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ 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; memset(&ai, 0, sizeof(ai)); ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, func) { @@ -2324,9 +2329,10 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ } ZEND_HASH_FOREACH_END(); if (ai.cnt) { - zend_error_noreturn(E_ERROR, !is_explicit_abstract - ? "Class %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 ")" - : "Class %s must implement %d abstract private method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")", + 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), diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 3defb97d2ec0e..1fa2493f17af5 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -266,7 +266,8 @@ static int zend_implement_traversable(zend_class_entry *interface, zend_class_en } } } - zend_error_noreturn(E_CORE_ERROR, "Class %s must implement interface %s as part of either %s or %s", + zend_error_noreturn(E_CORE_ERROR, "%s %s must implement interface %s as part of either %s or %s", + zend_get_object_type_uc(class_type), ZSTR_VAL(class_type->name), ZSTR_VAL(zend_ce_traversable->name), ZSTR_VAL(zend_ce_iterator->name), From 69ea2d8600462ba046e76a697cbad89706b858a5 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 16 Mar 2022 23:39:55 +0000 Subject: [PATCH 0394/1346] Convert check + exception to assertion Move the inside the __unserialize() method as that's the only one which now needs this check Closes GH-8207 --- ext/spl/spl_array.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 8a429fdf3f8bc..80a3a51dee881 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -993,11 +993,9 @@ static HashTable *spl_array_it_get_gc(zend_object_iterator *iter, zval **table, } /* {{{ spl_array_set_array */ -static void spl_array_set_array(zval *object, spl_array_object *intern, zval *array, zend_long ar_flags, int just_array) { - if (Z_TYPE_P(array) != IS_OBJECT && Z_TYPE_P(array) != IS_ARRAY) { - zend_throw_exception(spl_ce_InvalidArgumentException, "Passed variable is not an array or object", 0); - return; - } +static void spl_array_set_array(zval *object, spl_array_object *intern, zval *array, zend_long ar_flags, bool just_array) { + /* Handled by ZPP prior to this, or for __unserialize() before passing to here */ + ZEND_ASSERT(Z_TYPE_P(array) == IS_ARRAY || Z_TYPE_P(array) == IS_OBJECT); if (Z_TYPE_P(array) == IS_ARRAY) { zval_ptr_dtor(&intern->array); if (Z_REFCOUNT_P(array) == 1) { @@ -1739,6 +1737,11 @@ PHP_METHOD(ArrayObject, __unserialize) zval_ptr_dtor(&intern->array); ZVAL_UNDEF(&intern->array); } else { + if (Z_TYPE_P(storage_zv) != IS_OBJECT && Z_TYPE_P(storage_zv) != IS_ARRAY) { + /* TODO Use UnexpectedValueException instead? And better error message? */ + zend_throw_exception(spl_ce_InvalidArgumentException, "Passed variable is not an array or object", 0); + RETURN_THROWS(); + } spl_array_set_array(ZEND_THIS, intern, storage_zv, 0L, 1); } From 2fa33d1defcab4c2d646587d041a5091b3f88e1a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 23 Mar 2022 22:13:08 +0000 Subject: [PATCH 0395/1346] Use ZEND_THROWS() where applicable in spl_array.c --- ext/spl/spl_array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 80a3a51dee881..e07a08a71ed74 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1574,7 +1574,7 @@ PHP_METHOD(ArrayObject, unserialize) if (intern->nApplyCount > 0) { zend_throw_error(NULL, "Modification of ArrayObject during sorting is prohibited"); - return; + RETURN_THROWS(); } /* storage */ @@ -1773,7 +1773,7 @@ PHP_METHOD(ArrayObject, __unserialize) PHP_METHOD(ArrayObject, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_array_get_debug_info(Z_OBJ_P(ZEND_THIS))); From db0db2204f59f57be29e43721b569b876a31bc3a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 23 Mar 2022 22:21:04 +0000 Subject: [PATCH 0396/1346] Use zend_result/bool in spl_array.c --- ext/spl/spl_array.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index e07a08a71ed74..f6a11e7231da1 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -115,7 +115,7 @@ static inline bool spl_array_is_object(spl_array_object *intern) /* {{{ */ } /* }}} */ -static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht); +static zend_result spl_array_skip_protected(spl_array_object *intern, HashTable *aht); static zend_never_inline void spl_array_create_ht_iter(HashTable *ht, spl_array_object* intern) /* {{{ */ { @@ -552,7 +552,10 @@ static void spl_array_unset_dimension(zend_object *object, zval *offset) /* {{{ spl_array_unset_dimension_ex(1, object, offset); } /* }}} */ -static int spl_array_has_dimension_ex(bool check_inherited, zend_object *object, zval *offset, int check_empty) /* {{{ */ +/* check_empty can take value 0, 1, or 2 + * 0/1 are used as normal boolean, but 2 is used for the case when this function is called from + * the offsetExists() method, in which case it needs to report the offset exist even if the value is null */ +static bool spl_array_has_dimension_ex(bool check_inherited, zend_object *object, zval *offset, int check_empty) /* {{{ */ { spl_array_object *intern = spl_array_from_obj(object); zval rv, *value = NULL, *tmp; @@ -873,7 +876,7 @@ static int spl_array_compare_objects(zval *o1, zval *o2) /* {{{ */ return result; } /* }}} */ -static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht) /* {{{ */ +static zend_result spl_array_skip_protected(spl_array_object *intern, HashTable *aht) /* {{{ */ { zend_string *string_key; zend_ulong num_key; @@ -903,7 +906,7 @@ static int spl_array_skip_protected(spl_array_object *intern, HashTable *aht) /* return FAILURE; } /* }}} */ -static int spl_array_next_ex(spl_array_object *intern, HashTable *aht) /* {{{ */ +static zend_result spl_array_next_ex(spl_array_object *intern, HashTable *aht) /* {{{ */ { uint32_t *pos_ptr = spl_array_get_pos_ptr(aht, intern); @@ -915,7 +918,7 @@ static int spl_array_next_ex(spl_array_object *intern, HashTable *aht) /* {{{ */ } } /* }}} */ -static int spl_array_next(spl_array_object *intern) /* {{{ */ +static zend_result spl_array_next(spl_array_object *intern) /* {{{ */ { HashTable *aht = spl_array_get_hash_table(intern); From 71a110fcaab2e641f4cc5194867e7038a3ccbe9a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sun, 13 Mar 2022 15:15:57 +0000 Subject: [PATCH 0397/1346] Remove strnatcmp_ex() wrappers These APIs always returned SUCCESS. Closes GH-8195 --- UPGRADING.INTERNALS | 6 ++++++ ext/standard/php_string.h | 4 ---- ext/standard/string.c | 26 -------------------------- 3 files changed, 6 insertions(+), 30 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index cec9356406556..28fcb5e5a9540 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -29,6 +29,12 @@ PHP 8.2 INTERNALS UPGRADE NOTES 3. Module changes ======================== + a. ext/standard + - The PHP APIs string_natural_compare_function_ex(), + string_natural_case_compare_function(), and string_natural_compare_function() + have been removed. They always returned SUCCESS and were a wrapper around + strnatcmp_ex(). Use strnatcmp_ex() directly instead. + ======================== 4. OpCode changes ======================== diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index f795e4e2b69f6..0f31ff1e42827 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -59,10 +59,6 @@ PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return PHPAPI size_t php_strspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end); PHPAPI size_t php_strcspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end); -PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, bool case_insensitive); -PHPAPI int string_natural_compare_function(zval *result, zval *op1, zval *op2); -PHPAPI int string_natural_case_compare_function(zval *result, zval *op1, zval *op2); - #if defined(_REENTRANT) # ifdef PHP_WIN32 # include diff --git a/ext/standard/string.c b/ext/standard/string.c index 826fa338be047..ce461cab21249 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -5406,32 +5406,6 @@ static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case) } /* }}} */ -PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, bool case_insensitive) /* {{{ */ -{ - zend_string *tmp_str1, *tmp_str2; - zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1); - zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2); - - ZVAL_LONG(result, strnatcmp_ex(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2), case_insensitive)); - - zend_tmp_string_release(tmp_str1); - zend_tmp_string_release(tmp_str2); - return SUCCESS; -} -/* }}} */ - -PHPAPI int string_natural_case_compare_function(zval *result, zval *op1, zval *op2) /* {{{ */ -{ - return string_natural_compare_function_ex(result, op1, op2, 1); -} -/* }}} */ - -PHPAPI int string_natural_compare_function(zval *result, zval *op1, zval *op2) /* {{{ */ -{ - return string_natural_compare_function_ex(result, op1, op2, 0); -} -/* }}} */ - /* {{{ Returns the result of string comparison using 'natural' algorithm */ PHP_FUNCTION(strnatcmp) { From e948d3c9c83231491b7b1e3fe1d8faa12efd0123 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 23 Mar 2022 23:59:41 +0000 Subject: [PATCH 0398/1346] Use zend_string_to(upper|lower)() API directly --- ext/standard/array.c | 4 ++-- ext/standard/string.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index aa89e3755b123..a3ce0d6c80cf7 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -4529,9 +4529,9 @@ PHP_FUNCTION(array_change_key_case) entry = zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry); } else { if (change_to_upper) { - new_key = php_string_toupper(string_key); + new_key = zend_string_toupper(string_key); } else { - new_key = php_string_tolower(string_key); + new_key = zend_string_tolower(string_key); } entry = zend_hash_update(Z_ARRVAL_P(return_value), new_key, entry); zend_string_release_ex(new_key, 0); diff --git a/ext/standard/string.c b/ext/standard/string.c index ce461cab21249..593c67cb32248 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3120,7 +3120,7 @@ static zend_string *php_str_to_str_i_ex(zend_string *haystack, const char *lc_ha char *e; if (ZSTR_LEN(needle) == str_len) { - lc_needle = php_string_tolower(needle); + lc_needle = zend_string_tolower(needle); end = lc_haystack + ZSTR_LEN(haystack); for (p = lc_haystack; (r = (char*)php_memnstr(p, ZSTR_VAL(lc_needle), ZSTR_LEN(lc_needle), end)); p = r + ZSTR_LEN(lc_needle)) { if (!new_str) { @@ -3141,7 +3141,7 @@ static zend_string *php_str_to_str_i_ex(zend_string *haystack, const char *lc_ha const char *n; const char *endp = o + ZSTR_LEN(haystack); - lc_needle = php_string_tolower(needle); + lc_needle = zend_string_tolower(needle); n = ZSTR_VAL(lc_needle); while ((o = (char*)php_memnstr(o, n, ZSTR_LEN(lc_needle), endp))) { @@ -3185,7 +3185,7 @@ static zend_string *php_str_to_str_i_ex(zend_string *haystack, const char *lc_ha nothing_todo: return zend_string_copy(haystack); } else { - lc_needle = php_string_tolower(needle); + lc_needle = zend_string_tolower(needle); if (memcmp(lc_haystack, ZSTR_VAL(lc_needle), ZSTR_LEN(lc_needle))) { zend_string_release_ex(lc_needle, 0); From 814374faa1fe68dcf88dd1fe8b78685c27a8ab35 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Thu, 24 Mar 2022 00:13:51 +0000 Subject: [PATCH 0399/1346] fpm zlog_stream_buf_alloc_ex little simplifications. (#8224) --- sapi/fpm/fpm/zlog.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/sapi/fpm/fpm/zlog.c b/sapi/fpm/fpm/zlog.c index 0938f08e89de4..350d75d1952e6 100644 --- a/sapi/fpm/fpm/zlog.c +++ b/sapi/fpm/fpm/zlog.c @@ -286,14 +286,8 @@ static zlog_bool zlog_stream_buf_alloc_ex(struct zlog_stream *stream, size_t nee { char *buf; size_t size = stream->buf.size ?: stream->buf_init_size; - - if (stream->buf.data) { - size = MIN(zlog_limit, MAX(size * 2, needed)); - buf = realloc(stream->buf.data, size); - } else { - size = MIN(zlog_limit, MAX(size, needed)); - buf = malloc(size); - } + size = MIN(zlog_limit, MAX((stream->buf.data ? (size << 1) : size), needed)); + buf = realloc(stream->buf.data, size); if (buf == NULL) { return 0; From 04a4864b655b6ace1150e512179f23ec0d47566f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 24 Mar 2022 15:03:53 +0100 Subject: [PATCH 0400/1346] ext/opcache: merge redundant code and "bool" refactoring (#8237) * ext/opcache/ZendAccelerator: make check_persistent_script_access() static * ext/opcache/ZendAccelerator: convert "int" to "bool" * ext/opcache/zend_file_cache: convert "int" to "bool" * ext/opcache: use true/false for zend_persistent_script.corrupted * ext/opcache/ZendAccelerator: move duplicate code to zend_accel_discard_script() * ext/opcache/ZendAccelerator: convert accel_deactivate_now() to function Simplify the #iddef ZEND_WIN32. * ext/opcache/zend_file_cache: simplify iovec initializer * ext/opcache/zend_file_cache: add local zend_string* variables Eliminates lots of redundant casts and avoids reloading the variable from RAM into registers. * ext/opcache/zend_file_cache: use ZSTR_VAL() * ext/opcache/zend_file_cache: move code to zend_file_cache_script_write() This eliminates duplicate error handling code. --- ext/opcache/ZendAccelerator.c | 342 ++++++++++++++++---------------- ext/opcache/ZendAccelerator.h | 6 +- ext/opcache/zend_file_cache.c | 90 +++++---- ext/opcache/zend_file_cache.h | 2 +- ext/opcache/zend_persist.c | 6 +- ext/opcache/zend_persist_calc.c | 6 +- 6 files changed, 228 insertions(+), 224 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index a533a074a2603..e17fc16a947b7 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -109,12 +109,12 @@ zend_accel_shared_globals *accel_shared_globals = NULL; #ifdef ZEND_WIN32 char accel_uname_id[32]; #endif -bool accel_startup_ok = 0; +bool accel_startup_ok = false; static char *zps_failure_reason = NULL; char *zps_api_failure_reason = NULL; -bool file_cache_only = 0; /* process uses file cache only */ +bool file_cache_only = false; /* process uses file cache only */ #if ENABLE_FILE_CACHE_FALLBACK -bool fallback_process = 0; /* process uses file cache fallback */ +bool fallback_process = false; /* process uses file cache fallback */ #endif static zend_op_array *(*accelerator_orig_compile_file)(zend_file_handle *file_handle, int type); @@ -185,7 +185,7 @@ static time_t zend_accel_get_time(void) # define zend_accel_get_time() time(NULL) #endif -static inline int is_stream_path(const char *filename) +static inline bool is_stream_path(const char *filename) { const char *p; @@ -198,7 +198,7 @@ static inline int is_stream_path(const char *filename) return ((p != filename) && (p[0] == ':') && (p[1] == '/') && (p[2] == '/')); } -static inline int is_cacheable_stream_path(const char *filename) +static inline bool is_cacheable_stream_path(const char *filename) { return memcmp(filename, "file://", sizeof("file://") - 1) == 0 || memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; @@ -225,7 +225,7 @@ static ZEND_FUNCTION(accel_chdir) } } ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; } static inline zend_string* accel_getcwd(void) @@ -240,7 +240,7 @@ static inline zend_string* accel_getcwd(void) } ZCG(cwd) = zend_string_init(cwd, strlen(cwd), 0); ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; return ZCG(cwd); } } @@ -264,7 +264,7 @@ static ZEND_INI_MH(accel_include_path_on_modify) if (ret == SUCCESS) { ZCG(include_path) = new_value; ZCG(include_path_key_len) = 0; - ZCG(include_path_check) = 1; + ZCG(include_path_check) = true; } return ret; } @@ -285,13 +285,13 @@ static inline void accel_restart_enter(void) zend_accel_error(ACCEL_LOG_DEBUG, "RestartC(+1): %s (%d)", strerror(errno), errno); } #endif - ZCSG(restart_in_progress) = 1; + ZCSG(restart_in_progress) = true; } static inline void accel_restart_leave(void) { #ifdef ZEND_WIN32 - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; DECREMENT(restart_in); #else struct flock restart_finished; @@ -301,7 +301,7 @@ static inline void accel_restart_leave(void) restart_finished.l_start = 2; restart_finished.l_len = 1; - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; if (fcntl(lock_file, F_SETLK, &restart_finished) == -1) { zend_accel_error(ACCEL_LOG_DEBUG, "RestartC(-1): %s (%d)", strerror(errno), errno); } @@ -324,7 +324,7 @@ static inline int accel_restart_is_active(void) return FAILURE; } if (restart_check.l_type == F_UNLCK) { - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; return 0; } else { return 1; @@ -366,7 +366,7 @@ static inline void accel_deactivate_sub(void) if (ZCG(counted)) { SHM_UNPROTECT(); DECREMENT(mem_usage); - ZCG(counted) = 0; + ZCG(counted) = false; SHM_PROTECT(); } #else @@ -484,7 +484,7 @@ static zend_always_inline zend_string *accel_find_interned_string(zend_string *s if (!ZCG(accelerator_enabled) || accel_activate_add() == FAILURE) { return NULL; } - ZCG(counted) = 1; + ZCG(counted) = true; } h = zend_string_hash_val(str); @@ -802,9 +802,9 @@ static void accel_use_shm_interned_strings(void) if (ZCSG(interned_strings).saved_top == NULL) { accel_copy_permanent_strings(accel_new_interned_string); } else { - ZCG(counted) = 1; + ZCG(counted) = true; accel_copy_permanent_strings(accel_replace_string_by_shm_permanent); - ZCG(counted) = 0; + ZCG(counted) = false; } accel_interned_strings_save_state(); @@ -816,14 +816,14 @@ static void accel_use_shm_interned_strings(void) #ifndef ZEND_WIN32 static inline void kill_all_lockers(struct flock *mem_usage_check) { - int success, tries; + int tries; /* so that other process won't try to force while we are busy cleaning up */ ZCSG(force_restart_time) = 0; while (mem_usage_check->l_pid > 0) { /* Try SIGTERM first, switch to SIGKILL if not successful. */ int signal = SIGTERM; errno = 0; - success = 0; + bool success = false; tries = 10; while (tries--) { @@ -831,7 +831,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check) if (kill(mem_usage_check->l_pid, signal)) { if (errno == ESRCH) { /* Process died before the signal was sent */ - success = 1; + success = true; zend_accel_error(ACCEL_LOG_WARNING, "Process %d died before SIGKILL was sent", mem_usage_check->l_pid); } else if (errno != 0) { zend_accel_error(ACCEL_LOG_WARNING, "Failed to send SIGKILL to locker %d: %s", mem_usage_check->l_pid, strerror(errno)); @@ -843,7 +843,7 @@ static inline void kill_all_lockers(struct flock *mem_usage_check) if (kill(mem_usage_check->l_pid, 0)) { if (errno == ESRCH) { /* successfully killed locker, process no longer exists */ - success = 1; + success = true; zend_accel_error(ACCEL_LOG_WARNING, "Killed locker %d", mem_usage_check->l_pid); } else if (errno != 0) { zend_accel_error(ACCEL_LOG_WARNING, "Failed to check locker %d: %s", mem_usage_check->l_pid, strerror(errno)); @@ -1211,7 +1211,7 @@ zend_string *accel_make_persistent_key(zend_string *str) cwd = ZSTR_VAL(cwd_str); cwd_len = ZSTR_LEN(cwd_str); if (ZCG(cwd_check)) { - ZCG(cwd_check) = 0; + ZCG(cwd_check) = false; if (ZCG(accelerator_enabled)) { zend_string *str = accel_find_interned_string(cwd_str); @@ -1255,7 +1255,7 @@ zend_string *accel_make_persistent_key(zend_string *str) include_path_len = ZSTR_LEN(ZCG(include_path)); if (ZCG(include_path_check)) { - ZCG(include_path_check) = 0; + ZCG(include_path_check) = false; if (ZCG(accelerator_enabled)) { zend_string *str = accel_find_interned_string(ZCG(include_path)); @@ -1342,6 +1342,40 @@ zend_string *accel_make_persistent_key(zend_string *str) return str; } +/** + * Discard a #zend_persistent_script currently stored in shared + * memory. + * + * Caller must lock shared memory via zend_shared_alloc_lock(). + */ +static void zend_accel_discard_script(zend_persistent_script *persistent_script) +{ + if (persistent_script->corrupted) { + /* already discarded */ + return; + } + + persistent_script->corrupted = true; + persistent_script->timestamp = 0; + ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; + if (ZSMMG(memory_exhausted)) { + zend_accel_restart_reason reason = + zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; + zend_accel_schedule_restart_if_necessary(reason); + } +} + +/** + * Wrapper for zend_accel_discard_script() which locks shared memory + * via zend_shared_alloc_lock(). + */ +static void zend_accel_lock_discard_script(zend_persistent_script *persistent_script) +{ + zend_shared_alloc_lock(); + zend_accel_discard_script(persistent_script); + zend_shared_alloc_unlock(); +} + int zend_accel_invalidate(zend_string *filename, bool force) { zend_string *realpath; @@ -1372,18 +1406,7 @@ int zend_accel_invalidate(zend_string *filename, bool force) do_validate_timestamps(persistent_script, &file_handle) == FAILURE) { HANDLE_BLOCK_INTERRUPTIONS(); SHM_UNPROTECT(); - zend_shared_alloc_lock(); - if (!persistent_script->corrupted) { - persistent_script->corrupted = 1; - persistent_script->timestamp = 0; - ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; - if (ZSMMG(memory_exhausted)) { - zend_accel_restart_reason reason = - zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; - zend_accel_schedule_restart_if_necessary(reason); - } - } - zend_shared_alloc_unlock(); + zend_accel_lock_discard_script(persistent_script); SHM_PROTECT(); HANDLE_UNBLOCK_INTERRUPTIONS(); } @@ -1427,7 +1450,7 @@ static void zend_accel_add_key(zend_string *key, zend_accel_hash_entry *bucket) if (!zend_accel_hash_find(&ZCSG(hash), key)) { if (zend_accel_hash_is_full(&ZCSG(hash))) { zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!"); - ZSMMG(memory_exhausted) = 1; + ZSMMG(memory_exhausted) = true; zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH); } else { zend_string *new_key = accel_new_interned_key(key); @@ -1493,12 +1516,12 @@ static zend_persistent_script *store_script_in_file_cache(zend_persistent_script new_persistent_script->dynamic_members.checksum = zend_accel_script_checksum(new_persistent_script); - zend_file_cache_script_store(new_persistent_script, 0); + zend_file_cache_script_store(new_persistent_script, /* is_shm */ false); return new_persistent_script; } -static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script *new_persistent_script, int *from_shared_memory) +static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script *new_persistent_script, bool *from_shared_memory) { uint32_t orig_compiler_options; @@ -1508,11 +1531,11 @@ static zend_persistent_script *cache_script_in_file_cache(zend_persistent_script zend_accel_finalize_delayed_early_binding_list(new_persistent_script); CG(compiler_options) = orig_compiler_options; - *from_shared_memory = 1; + *from_shared_memory = true; return store_script_in_file_cache(new_persistent_script); } -static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_script *new_persistent_script, zend_string *key, int *from_shared_memory) +static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_script *new_persistent_script, zend_string *key, bool *from_shared_memory) { zend_accel_hash_entry *bucket; uint32_t memory_used; @@ -1546,7 +1569,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr #if 1 /* prefer the script already stored in SHM */ free_persistent_script(new_persistent_script, 1); - *from_shared_memory = 1; + *from_shared_memory = true; return existing_persistent_script; #else return new_persistent_script; @@ -1556,12 +1579,12 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr if (zend_accel_hash_is_full(&ZCSG(hash))) { zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!"); - ZSMMG(memory_exhausted) = 1; + ZSMMG(memory_exhausted) = true; zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH); zend_shared_alloc_unlock(); if (ZCG(accel_directives).file_cache) { new_persistent_script = store_script_in_file_cache(new_persistent_script); - *from_shared_memory = 1; + *from_shared_memory = true; } return new_persistent_script; } @@ -1579,7 +1602,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr zend_shared_alloc_unlock(); if (ZCG(accel_directives).file_cache) { new_persistent_script = store_script_in_file_cache(new_persistent_script); - *from_shared_memory = 1; + *from_shared_memory = true; } return new_persistent_script; } @@ -1624,7 +1647,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr zend_accel_error(ACCEL_LOG_INFO, "Added key '%s'", ZSTR_VAL(key)); } else { zend_accel_error(ACCEL_LOG_DEBUG, "No more entries in hash table!"); - ZSMMG(memory_exhausted) = 1; + ZSMMG(memory_exhausted) = true; zend_accel_schedule_restart_if_necessary(ACCEL_RESTART_HASH); } } else { @@ -1639,11 +1662,11 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr if (ZCG(accel_directives).file_cache) { SHM_PROTECT(); - zend_file_cache_script_store(new_persistent_script, 1); + zend_file_cache_script_store(new_persistent_script, /* is_shm */ true); SHM_UNPROTECT(); } - *from_shared_memory = 1; + *from_shared_memory = true; return new_persistent_script; } @@ -1694,7 +1717,7 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl zend_op_array *orig_active_op_array; zval orig_user_error_handler; zend_op_array *op_array; - int do_bailout = 0; + bool do_bailout = false; accel_time_t timestamp = 0; uint32_t orig_compiler_options = 0; @@ -1782,7 +1805,7 @@ static zend_persistent_script *opcache_compile_file(zend_file_handle *file_handl CG(compiler_options) = orig_compiler_options; } zend_catch { op_array = NULL; - do_bailout = 1; + do_bailout = true; CG(compiler_options) = orig_compiler_options; } zend_end_try(); @@ -1845,7 +1868,7 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type) { zend_persistent_script *persistent_script; zend_op_array *op_array = NULL; - int from_memory; /* if the script we've got is stored in SHM */ + bool from_memory; /* if the script we've got is stored in SHM */ if (is_stream_path(ZSTR_VAL(file_handle->filename)) && !is_cacheable_stream_path(ZSTR_VAL(file_handle->filename))) { @@ -1906,7 +1929,7 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type) persistent_script = opcache_compile_file(file_handle, type, &op_array); if (persistent_script) { - from_memory = 0; + from_memory = false; persistent_script = cache_script_in_file_cache(persistent_script, &from_memory); return zend_accel_load_script(persistent_script, from_memory); } @@ -1914,10 +1937,9 @@ zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int type) return op_array; } -int check_persistent_script_access(zend_persistent_script *persistent_script) +static int check_persistent_script_access(zend_persistent_script *persistent_script) { char *phar_path, *ptr; - int ret; if ((ZSTR_LEN(persistent_script->script.filename)script.filename), "phar://", sizeof("phar://")-1)) { @@ -1930,7 +1952,7 @@ int check_persistent_script_access(zend_persistent_script *persistent_script) { *(ptr+sizeof(".phar/")-2) = 0; /* strip path inside .phar file */ } - ret = access(phar_path, R_OK) != 0; + bool ret = access(phar_path, R_OK) != 0; efree(phar_path); return ret; } @@ -1941,7 +1963,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) { zend_persistent_script *persistent_script = NULL; zend_string *key = NULL; - int from_shared_memory; /* if the script we've got is stored in SHM */ + bool from_shared_memory; /* if the script we've got is stored in SHM */ if (!file_handle->filename || !ZCG(accelerator_enabled)) { /* The Accelerator is disabled, act as if without the Accelerator */ @@ -2055,7 +2077,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) } return accelerator_orig_compile_file(file_handle, type); } - ZCG(counted) = 1; + ZCG(counted) = true; } /* Revalidate accessibility of cached file */ @@ -2079,18 +2101,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) /* If script is found then validate_timestamps if option is enabled */ if (persistent_script && ZCG(accel_directives).validate_timestamps) { if (validate_timestamp_and_record(persistent_script, file_handle) == FAILURE) { - zend_shared_alloc_lock(); - if (!persistent_script->corrupted) { - persistent_script->corrupted = 1; - persistent_script->timestamp = 0; - ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; - if (ZSMMG(memory_exhausted)) { - zend_accel_restart_reason reason = - zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; - zend_accel_schedule_restart_if_necessary(reason); - } - } - zend_shared_alloc_unlock(); + zend_accel_lock_discard_script(persistent_script); persistent_script = NULL; } } @@ -2104,18 +2115,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) /* The checksum is wrong */ zend_accel_error(ACCEL_LOG_INFO, "Checksum failed for '%s': expected=0x%08x, found=0x%08x", ZSTR_VAL(persistent_script->script.filename), persistent_script->dynamic_members.checksum, checksum); - zend_shared_alloc_lock(); - if (!persistent_script->corrupted) { - persistent_script->corrupted = 1; - persistent_script->timestamp = 0; - ZSMMG(wasted_shared_memory) += persistent_script->dynamic_members.memory_consumption; - if (ZSMMG(memory_exhausted)) { - zend_accel_restart_reason reason = - zend_accel_hash_is_full(&ZCSG(hash)) ? ACCEL_RESTART_HASH : ACCEL_RESTART_OOM; - zend_accel_schedule_restart_if_necessary(reason); - } - } - zend_shared_alloc_unlock(); + zend_accel_lock_discard_script(persistent_script); persistent_script = NULL; } } @@ -2152,7 +2152,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) /* Try and cache the script and assume that it is returned from_shared_memory. * If it isn't compile_and_cache_file() changes the flag to 0 */ - from_shared_memory = 0; + from_shared_memory = false; if (persistent_script) { persistent_script = cache_script_in_shared_memory(persistent_script, key, &from_shared_memory); } @@ -2217,7 +2217,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type) HANDLE_UNBLOCK_INTERRUPTIONS(); replay_warnings(persistent_script->num_warnings, persistent_script->warnings); - from_shared_memory = 1; + from_shared_memory = true; } /* Fetch jit auto globals used in the script before execution */ @@ -2236,15 +2236,15 @@ static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_c ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_LINKED)); while (entry) { - bool found = 1; - bool needs_autoload = 0; + bool found = true; + bool needs_autoload = false; if (entry->parent != parent) { - found = 0; + found = false; } else { for (i = 0; i < ce->num_traits + ce->num_interfaces; i++) { if (entry->traits_and_interfaces[i] != traits_and_interfaces[i]) { - found = 0; + found = false; break; } } @@ -2254,9 +2254,9 @@ static zend_always_inline zend_inheritance_cache_entry* zend_accel_inheritance_c if (ce != entry->dependencies[i].ce) { if (!ce) { - needs_autoload = 1; + needs_autoload = true; } else { - found = 0; + found = false; break; } } @@ -2572,12 +2572,12 @@ static zend_string* persistent_zend_resolve_path(zend_string *filename) static void zend_reset_cache_vars(void) { - ZSMMG(memory_exhausted) = 0; + ZSMMG(memory_exhausted) = false; ZCSG(hits) = 0; ZCSG(misses) = 0; ZCSG(blacklist_misses) = 0; ZSMMG(wasted_shared_memory) = 0; - ZCSG(restart_pending) = 0; + ZCSG(restart_pending) = false; ZCSG(force_restart_time) = 0; ZCSG(map_ptr_last) = CG(map_ptr_last); } @@ -2602,7 +2602,7 @@ static void accel_reset_pcre_cache(void) zend_result accel_activate(INIT_FUNC_ARGS) { if (!ZCG(enabled) || !accel_startup_ok) { - ZCG(accelerator_enabled) = 0; + ZCG(accelerator_enabled) = false; return SUCCESS; } @@ -2612,14 +2612,14 @@ zend_result accel_activate(INIT_FUNC_ARGS) ZCG(cache_opline) = NULL; ZCG(cache_persistent_script) = NULL; ZCG(include_path_key_len) = 0; - ZCG(include_path_check) = 1; + ZCG(include_path_check) = true; ZCG(cwd) = NULL; ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; if (file_cache_only) { - ZCG(accelerator_enabled) = 0; + ZCG(accelerator_enabled) = false; return SUCCESS; } @@ -2656,15 +2656,15 @@ zend_result accel_activate(INIT_FUNC_ARGS) zend_accel_error(ACCEL_LOG_WARNING, "Stuck count for pid %d", getpid()); #endif accel_unlock_all(); - ZCG(counted) = 0; + ZCG(counted) = false; } if (ZCSG(restart_pending)) { zend_shared_alloc_lock(); - if (ZCSG(restart_pending) != 0) { /* check again, to ensure that the cache wasn't already cleaned by another process */ + if (ZCSG(restart_pending)) { /* check again, to ensure that the cache wasn't already cleaned by another process */ if (accel_is_inactive() == SUCCESS) { zend_accel_error(ACCEL_LOG_DEBUG, "Restarting!"); - ZCSG(restart_pending) = 0; + ZCSG(restart_pending) = false; switch ZCSG(restart_reason) { case ACCEL_RESTART_OOM: ZCSG(oom_restarts)++; @@ -2720,10 +2720,10 @@ zend_result accel_activate(INIT_FUNC_ARGS) realpath_cache_clean(); accel_reset_pcre_cache(); - ZCG(pcre_reseted) = 0; + ZCG(pcre_reseted) = false; } else if (!ZCG(accelerator_enabled) && !ZCG(pcre_reseted)) { accel_reset_pcre_cache(); - ZCG(pcre_reseted) = 1; + ZCG(pcre_reseted) = true; } @@ -2758,7 +2758,7 @@ zend_result accel_post_deactivate(void) zend_shared_alloc_safe_unlock(); /* be sure we didn't leave cache locked */ accel_unlock_all(); - ZCG(counted) = 0; + ZCG(counted) = false; return SUCCESS; } @@ -2788,7 +2788,7 @@ static int accelerator_remove_cb(zend_extension *element1, zend_extension *eleme static void zps_startup_failure(char *reason, char *api_reason, int (*cb)(zend_extension *, zend_extension *)) { - accel_startup_ok = 0; + accel_startup_ok = false; zps_failure_reason = reason; zps_api_failure_reason = api_reason?api_reason:reason; zend_llist_del_element(&zend_extensions, NULL, (int (*)(void *, void *))cb); @@ -2896,10 +2896,10 @@ static int zend_accel_init_shm(void) ZCSG(hash_restarts) = 0; ZCSG(manual_restarts) = 0; - ZCSG(accelerator_enabled) = 1; + ZCSG(accelerator_enabled) = true; ZCSG(start_time) = zend_accel_get_time(); ZCSG(last_restart_time) = 0; - ZCSG(restart_in_progress) = 0; + ZCSG(restart_in_progress) = false; for (i = 0; i < -HT_MIN_MASK; i++) { ZCSG(uninitialized_bucket)[i] = HT_INVALID_IDX; @@ -3103,7 +3103,7 @@ static int accel_startup(zend_extension *extension) #endif if (start_accel_module() == FAILURE) { - accel_startup_ok = 0; + accel_startup_ok = false; zend_error(E_WARNING, ACCELERATOR_PRODUCT_NAME ": module registration failed!"); return FAILURE; } @@ -3127,7 +3127,7 @@ static int accel_startup(zend_extension *extension) /* no supported SAPI found - disable acceleration and stop initialization */ if (accel_find_sapi() == FAILURE) { - accel_startup_ok = 0; + accel_startup_ok = false; if (!ZCG(accel_directives).enable_cli && strcmp(sapi_module.name, "cli") == 0) { zps_startup_failure("Opcode Caching is disabled for CLI", NULL, accelerator_remove_cb); @@ -3172,7 +3172,7 @@ static zend_result accel_post_startup(void) size_t shm_size = ZCG(accel_directives).memory_consumption; #ifdef HAVE_JIT size_t jit_size = 0; - bool reattached = 0; + bool reattached = false; if (JIT_G(enabled) && JIT_G(buffer_size) && zend_jit_check_support() == SUCCESS) { @@ -3194,17 +3194,17 @@ static zend_result accel_post_startup(void) #endif case ALLOC_SUCCESS: if (zend_accel_init_shm() == FAILURE) { - accel_startup_ok = 0; + accel_startup_ok = false; return FAILURE; } break; case ALLOC_FAILURE: - accel_startup_ok = 0; + accel_startup_ok = false; zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - probably not enough shared memory."); return SUCCESS; case SUCCESSFULLY_REATTACHED: #ifdef HAVE_JIT - reattached = 1; + reattached = true; #endif zend_shared_alloc_lock(); accel_shared_globals = (zend_accel_shared_globals *) ZSMMG(app_shared_globals); @@ -3215,15 +3215,15 @@ static zend_result accel_post_startup(void) zend_shared_alloc_unlock(); break; case FAILED_REATTACHED: - accel_startup_ok = 0; + accel_startup_ok = false; zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Failure to initialize shared memory structures - cannot reattach to exiting shared memory."); return SUCCESS; break; #if ENABLE_FILE_CACHE_FALLBACK case ALLOC_FALLBACK: zend_shared_alloc_lock(); - file_cache_only = 1; - fallback_process = 1; + file_cache_only = true; + fallback_process = true; zend_shared_alloc_unlock(); goto file_cache_fallback; break; @@ -3241,8 +3241,8 @@ static zend_result accel_post_startup(void) if (JIT_G(buffer_size) == 0 || !ZSMMG(reserved) || zend_jit_startup(ZSMMG(reserved), jit_size, reattached) != SUCCESS) { - JIT_G(enabled) = 0; - JIT_G(on) = 0; + JIT_G(enabled) = false; + JIT_G(on) = false; } } #endif @@ -3251,13 +3251,13 @@ static zend_result accel_post_startup(void) SHM_PROTECT(); } else if (!ZCG(accel_directives).file_cache) { - accel_startup_ok = 0; + accel_startup_ok = false; zend_accel_error_noreturn(ACCEL_LOG_FATAL, "opcache.file_cache_only is set without a proper setting of opcache.file_cache"); return SUCCESS; } else { #ifdef HAVE_JIT - JIT_G(enabled) = 0; - JIT_G(on) = 0; + JIT_G(enabled) = false; + JIT_G(on) = false; #endif accel_shared_globals = calloc(1, sizeof(zend_accel_shared_globals)); } @@ -3295,7 +3295,7 @@ static zend_result accel_post_startup(void) ini_entry->on_modify = accel_include_path_on_modify; } - accel_startup_ok = 1; + accel_startup_ok = true; /* Override file_exists(), is_file() and is_readable() */ zend_accel_override_file_functions(); @@ -3338,7 +3338,7 @@ static void accel_post_shutdown(void) void accel_shutdown(void) { zend_ini_entry *ini_entry; - bool _file_cache_only = 0; + bool _file_cache_only = false; #ifdef HAVE_JIT zend_jit_shutdown(); @@ -3397,10 +3397,10 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason) HANDLE_BLOCK_INTERRUPTIONS(); SHM_UNPROTECT(); - ZCSG(restart_pending) = 1; + ZCSG(restart_pending) = true; ZCSG(restart_reason) = reason; ZCSG(cache_status_before_restart) = ZCSG(accelerator_enabled); - ZCSG(accelerator_enabled) = 0; + ZCSG(accelerator_enabled) = false; if (ZCG(accel_directives).force_restart_timeout) { ZCSG(force_restart_time) = zend_accel_get_time() + ZCG(accel_directives).force_restart_timeout; @@ -3411,12 +3411,14 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason) HANDLE_UNBLOCK_INTERRUPTIONS(); } -/* this is needed because on WIN32 lock is not decreased unless ZCG(counted) is set */ +static void accel_deactivate_now() +{ + /* this is needed because on WIN32 lock is not decreased unless ZCG(counted) is set */ #ifdef ZEND_WIN32 -#define accel_deactivate_now() ZCG(counted) = 1; accel_deactivate_sub() -#else -#define accel_deactivate_now() accel_deactivate_sub() + ZCG(counted) = true; #endif + accel_deactivate_sub(); +} /* ensures it is OK to read SHM if it's not OK (restart in progress) returns FAILURE @@ -3440,7 +3442,7 @@ int accelerator_shm_read_lock(void) accel_deactivate_now(); /* drop usage lock */ return FAILURE; } - ZCG(counted) = 1; + ZCG(counted) = true; } return SUCCESS; } @@ -3449,7 +3451,7 @@ int accelerator_shm_read_lock(void) void accelerator_shm_read_unlock(void) { if (!ZCG(counted)) { - /* counted is 0 - meaning we had to readlock manually, release readlock now */ + /* counted is false - meaning we had to readlock manually, release readlock now */ accel_deactivate_now(); } } @@ -3528,7 +3530,7 @@ static void preload_move_user_functions(HashTable *src, HashTable *dst) Bucket *p; dtor_func_t orig_dtor = src->pDestructor; zend_string *filename = NULL; - int copy = 0; + bool copy = false; src->pDestructor = NULL; zend_hash_extend(dst, dst->nNumUsed + src->nNumUsed, 0); @@ -3546,7 +3548,7 @@ static void preload_move_user_functions(HashTable *src, HashTable *dst) } } } else { - copy = 0; + copy = false; } } if (copy) { @@ -3567,7 +3569,7 @@ static void preload_move_user_classes(HashTable *src, HashTable *dst) Bucket *p; dtor_func_t orig_dtor = src->pDestructor; zend_string *filename = NULL; - int copy = 0; + bool copy = false; src->pDestructor = NULL; zend_hash_extend(dst, dst->nNumUsed + src->nNumUsed, 0); @@ -3584,7 +3586,7 @@ static void preload_move_user_classes(HashTable *src, HashTable *dst) } } } else { - copy = 0; + copy = false; } } if (copy) { @@ -3728,21 +3730,21 @@ static zend_result preload_update_constant(zval *val, zend_class_entry *scope) static bool preload_try_resolve_constants(zend_class_entry *ce) { - bool ok, changed, was_changed = 0; + bool ok, changed, was_changed = false; zend_class_constant *c; zval *val; EG(exception) = (void*)(uintptr_t)-1; /* prevent error reporting */ do { - ok = 1; - changed = 0; + ok = true; + changed = false; ZEND_HASH_MAP_FOREACH_PTR(&ce->constants_table, c) { val = &c->value; if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (EXPECTED(preload_update_constant(val, c->ce) == SUCCESS)) { - was_changed = changed = 1; + was_changed = changed = true; } else { - ok = 0; + ok = false; } } } ZEND_HASH_FOREACH_END(); @@ -3751,14 +3753,14 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) } if (ce->default_properties_count) { uint32_t i; - bool resolved = 1; + bool resolved = true; for (i = 0; i < ce->default_properties_count; i++) { val = &ce->default_properties_table[i]; if (Z_TYPE_P(val) == IS_CONSTANT_AST) { zend_property_info *prop = ce->properties_info_table[i]; if (UNEXPECTED(preload_update_constant(val, prop->ce) != SUCCESS)) { - resolved = ok = 0; + resolved = ok = false; } } } @@ -3768,13 +3770,13 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) } if (ce->default_static_members_count) { uint32_t count = ce->parent ? ce->default_static_members_count - ce->parent->default_static_members_count : ce->default_static_members_count; - bool resolved = 1; + bool resolved = true; val = ce->default_static_members_table + ce->default_static_members_count - 1; while (count) { if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (UNEXPECTED(preload_update_constant(val, ce) != SUCCESS)) { - resolved = ok = 0; + resolved = ok = false; } } val--; @@ -3786,7 +3788,7 @@ static bool preload_try_resolve_constants(zend_class_entry *ce) } } while (changed && !ok); EG(exception) = NULL; - CG(in_compilation) = 0; + CG(in_compilation) = false; if (ok) { ce->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED; @@ -3875,7 +3877,7 @@ static void preload_link(void) /* Resolve class dependencies */ do { - changed = 0; + changed = false; ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_FROM(EG(class_table), key, zv, EG(persistent_classes_count)) { ce = Z_PTR_P(zv); @@ -3919,7 +3921,7 @@ static void preload_link(void) zend_begin_record_errors(); /* Set filename & lineno information for inheritance errors */ - CG(in_compilation) = 1; + CG(in_compilation) = true; CG(compiled_filename) = ce->info.user.filename; CG(zend_lineno) = ce->info.user.line_start; zend_try { @@ -3958,7 +3960,7 @@ static void preload_link(void) zend_hash_update_ptr(&errors, key, EG(errors)[EG(num_errors)-1]); EG(num_errors)--; } zend_end_try(); - CG(in_compilation) = 0; + CG(in_compilation) = false; CG(compiled_filename) = NULL; zend_free_recorded_errors(); zend_string_release(lcname); @@ -3966,7 +3968,7 @@ static void preload_link(void) } while (changed); do { - changed = 0; + changed = false; ZEND_HASH_MAP_REVERSE_FOREACH_VAL(EG(class_table), zv) { ce = Z_PTR_P(zv); @@ -3975,11 +3977,11 @@ static void preload_link(void) } if (!(ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED)) { if (!(ce->ce_flags & ZEND_ACC_TRAIT)) { /* don't update traits */ - CG(in_compilation) = 1; /* prevent autoloading */ + CG(in_compilation) = true; /* prevent autoloading */ if (preload_try_resolve_constants(ce)) { - changed = 1; + changed = true; } - CG(in_compilation) = 0; + CG(in_compilation) = false; } } } ZEND_HASH_FOREACH_END(); @@ -4060,15 +4062,15 @@ static void preload_remove_empty_includes(void) /* mark all as empty */ ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { - script->empty = 1; + script->empty = true; } ZEND_HASH_FOREACH_END(); /* find non empty scripts */ do { - changed = 0; + changed = false; ZEND_HASH_MAP_FOREACH_PTR(preload_scripts, script) { if (script->empty) { - int empty = 1; + bool empty = true; zend_op *opline = script->script.main_op_array.opcodes; zend_op *end = opline + script->script.main_op_array.last; @@ -4085,24 +4087,24 @@ static void preload_remove_empty_includes(void) zend_persistent_script *incl = zend_hash_find_ptr(preload_scripts, resolved_path); zend_string_release(resolved_path); if (!incl || !incl->empty) { - empty = 0; + empty = false; break; } } else { - empty = 0; + empty = false; break; } } else if (opline->opcode != ZEND_NOP && opline->opcode != ZEND_RETURN && opline->opcode != ZEND_HANDLE_EXCEPTION) { - empty = 0; + empty = false; break; } opline++; } if (!empty) { - script->empty = 0; - changed = 1; + script->empty = false; + changed = true; } } } ZEND_HASH_FOREACH_END(); @@ -4326,8 +4328,8 @@ static int accel_preload(const char *config, bool in_child) size_t orig_map_ptr_last; uint32_t orig_compiler_options; - ZCG(enabled) = 0; - ZCG(accelerator_enabled) = 0; + ZCG(enabled) = false; + ZCG(accelerator_enabled) = false; orig_open_basedir = PG(open_basedir); PG(open_basedir) = NULL; preload_orig_compile_file = accelerator_orig_compile_file; @@ -4350,7 +4352,7 @@ static int accel_preload(const char *config, bool in_child) CG(compiler_options) |= ZEND_COMPILE_DELAYED_BINDING; CG(compiler_options) |= ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION; CG(compiler_options) |= ZEND_COMPILE_IGNORE_OTHER_FILES; - CG(skip_shebang) = 1; + CG(skip_shebang) = true; zend_try { zend_op_array *op_array; @@ -4371,7 +4373,7 @@ static int accel_preload(const char *config, bool in_child) if (EG(exception)) { ret = zend_exception_error(EG(exception), E_ERROR); if (ret == FAILURE) { - CG(unclean_shutdown) = 1; + CG(unclean_shutdown) = true; } } } @@ -4382,7 +4384,7 @@ static int accel_preload(const char *config, bool in_child) zend_exception_error(EG(exception), E_ERROR); } - CG(unclean_shutdown) = 1; + CG(unclean_shutdown) = true; ret = FAILURE; } } zend_catch { @@ -4391,7 +4393,7 @@ static int accel_preload(const char *config, bool in_child) PG(open_basedir) = orig_open_basedir; accelerator_orig_compile_file = preload_orig_compile_file; - ZCG(enabled) = 1; + ZCG(enabled) = true; zend_destroy_file_handle(&file_handle); @@ -4575,7 +4577,7 @@ static int accel_finish_startup(void) zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Preloading is not supported on Windows"); return FAILURE; #else - int in_child = 0; + bool in_child = false; int ret = SUCCESS; int rc; int orig_error_reporting; @@ -4644,7 +4646,7 @@ static int accel_finish_startup(void) zend_accel_error(ACCEL_LOG_WARNING, "Preloading failed to setuid(%d)", pw->pw_uid); exit(1); } - in_child = 1; + in_child = true; } else { /* parent */ int status; @@ -4685,7 +4687,7 @@ static int accel_finish_startup(void) zend_interned_strings_switch_storage(1); #ifdef ZEND_SIGNALS - SIGG(reset) = 0; + SIGG(reset) = false; #endif orig_error_reporting = EG(error_reporting); @@ -4699,8 +4701,8 @@ static int accel_finish_startup(void) bool orig_report_memleaks; /* don't send headers */ - SG(headers_sent) = 1; - SG(request_info).no_headers = 1; + SG(headers_sent) = true; + SG(request_info).no_headers = true; php_output_set_status(0); ZCG(auto_globals_mask) = 0; @@ -4708,11 +4710,11 @@ static int accel_finish_startup(void) ZCG(cache_opline) = NULL; ZCG(cache_persistent_script) = NULL; ZCG(include_path_key_len) = 0; - ZCG(include_path_check) = 1; + ZCG(include_path_check) = true; ZCG(cwd) = NULL; ZCG(cwd_key_len) = 0; - ZCG(cwd_check) = 1; + ZCG(cwd_check) = true; if (accel_preload(ZCG(accel_directives).preload, in_child) != SUCCESS) { ret = FAILURE; @@ -4720,11 +4722,11 @@ static int accel_finish_startup(void) preload_flush(NULL); orig_report_memleaks = PG(report_memleaks); - PG(report_memleaks) = 0; + PG(report_memleaks) = false; #ifdef ZEND_SIGNALS /* We may not have registered signal handlers due to SIGG(reset)=0, so * also disable the check that they are registered. */ - SIGG(check) = 0; + SIGG(check) = false; #endif php_request_shutdown(NULL); /* calls zend_shared_alloc_unlock(); */ PG(report_memleaks) = orig_report_memleaks; diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index bd692495a5282..bc7236fbdb3fa 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -204,7 +204,7 @@ typedef struct _zend_accel_directives { } zend_accel_directives; typedef struct _zend_accel_globals { - int counted; /* the process uses shared memory */ + bool counted; /* the process uses shared memory */ bool enabled; bool locked; /* thread obtained exclusive lock */ bool accelerator_enabled; /* accelerator enabled for current request */ @@ -215,9 +215,9 @@ typedef struct _zend_accel_globals { char include_path_key[32]; /* key of current "include_path" */ char cwd_key[32]; /* key of current working directory */ int include_path_key_len; - int include_path_check; + bool include_path_check; int cwd_key_len; - int cwd_check; + bool cwd_check; int auto_globals_mask; time_t request_time; time_t last_restart_time; /* used to synchronize SHM and in-process caches */ diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index bbfe3771afac6..e3300d1ebb381 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -253,15 +253,18 @@ static void *zend_file_cache_serialize_interned(zend_string *str, len = ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(ZSTR_LEN(str))); ret = (void*)(info->str_size | Z_UL(1)); zend_shared_alloc_register_xlat_entry(str, ret); - if (info->str_size + len > ZSTR_LEN((zend_string*)ZCG(mem))) { + + zend_string *s = (zend_string*)ZCG(mem); + if (info->str_size + len > ZSTR_LEN(s)) { size_t new_len = info->str_size + len; - ZCG(mem) = (void*)zend_string_realloc( - (zend_string*)ZCG(mem), + s = zend_string_realloc( + s, ((_ZSTR_HEADER_SIZE + 1 + new_len + 4095) & ~0xfff) - (_ZSTR_HEADER_SIZE + 1), 0); + ZCG(mem) = (void*)s; } - zend_string *new_str = (zend_string *) (ZSTR_VAL((zend_string*)ZCG(mem)) + info->str_size); + zend_string *new_str = (zend_string *) (ZSTR_VAL(s) + info->str_size); memcpy(new_str, str, len); GC_ADD_FLAGS(new_str, IS_STR_INTERNED); GC_DEL_FLAGS(new_str, IS_STR_PERMANENT|IS_STR_CLASS_NAME_MAP_PTR); @@ -269,7 +272,7 @@ static void *zend_file_cache_serialize_interned(zend_string *str, return ret; } -static void *zend_file_cache_unserialize_interned(zend_string *str, int in_shm) +static void *zend_file_cache_unserialize_interned(zend_string *str, bool in_shm) { str = (zend_string*)((char*)ZCG(mem) + ((size_t)(str) & ~Z_UL(1))); if (!in_shm) { @@ -1006,14 +1009,34 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path) return filename; } -int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) +/** + * Helper function for zend_file_cache_script_store(). + * + * @return true on success, false on error + */ +static bool zend_file_cache_script_write(int fd, const zend_persistent_script *script, const zend_file_cache_metainfo *info, const void *buf, const zend_string *s) +{ +#ifdef HAVE_SYS_UIO_H + const struct iovec vec[] = { + { .iov_base = (void *)info, .iov_len = sizeof(*info) }, + { .iov_base = (void *)buf, .iov_len = script->size }, + { .iov_base = (void *)ZSTR_VAL(s), .iov_len = info->str_size }, + }; + + return writev(fd, vec, sizeof(vec) / sizeof(vec[0])) == (ssize_t)(sizeof(*info) + script->size + info->str_size); +#else + return ZEND_LONG_MAX >= (zend_long)(sizeof(*info) + script->size + info->str_size) && + write(fd, info, sizeof(*info)) == sizeof(*info) && + write(fd, buf, script->size) == script->size && + write(fd, ZSTR_VAL(s), info->str_size) == info->str_size; +#endif +} + +int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm) { int fd; char *filename; zend_file_cache_metainfo info; -#ifdef HAVE_SYS_UIO_H - struct iovec vec[3]; -#endif void *mem, *buf; #ifdef HAVE_JIT @@ -1058,16 +1081,18 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) zend_shared_alloc_init_xlat_table(); if (!in_shm) { - script->corrupted = 1; /* used to check if script restored to SHM or process memory */ + script->corrupted = true; /* used to check if script restored to SHM or process memory */ } zend_file_cache_serialize(script, &info, buf); if (!in_shm) { - script->corrupted = 0; + script->corrupted = false; } zend_shared_alloc_destroy_xlat_table(); + zend_string *const s = (zend_string*)ZCG(mem); + info.checksum = zend_adler32(ADLER32_INIT, buf, script->size); - info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size); + info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL(s), info.str_size); #if __has_feature(memory_sanitizer) /* The buffer may contain uninitialized regions. However, the uninitialized parts will not be @@ -1077,40 +1102,17 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm) __msan_unpoison(buf, script->size); #endif -#ifdef HAVE_SYS_UIO_H - vec[0].iov_base = (void *)&info; - vec[0].iov_len = sizeof(info); - vec[1].iov_base = buf; - vec[1].iov_len = script->size; - vec[2].iov_base = ZSTR_VAL((zend_string*)ZCG(mem)); - vec[2].iov_len = info.str_size; - - if (writev(fd, vec, 3) != (ssize_t)(sizeof(info) + script->size + info.str_size)) { - zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename); - zend_string_release_ex((zend_string*)ZCG(mem), 0); - close(fd); - efree(mem); - zend_file_cache_unlink(filename); - efree(filename); - return FAILURE; - } -#else - if (ZEND_LONG_MAX < (zend_long)(sizeof(info) + script->size + info.str_size) || - write(fd, &info, sizeof(info)) != sizeof(info) || - write(fd, buf, script->size) != script->size || - write(fd, ((zend_string*)ZCG(mem))->val, info.str_size) != info.str_size - ) { + if (!zend_file_cache_script_write(fd, script, &info, buf, s)) { zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename); - zend_string_release_ex((zend_string*)ZCG(mem), 0); + zend_string_release_ex(s, 0); close(fd); efree(mem); zend_file_cache_unlink(filename); efree(filename); return FAILURE; } -#endif - zend_string_release_ex((zend_string*)ZCG(mem), 0); + zend_string_release_ex(s, 0); efree(mem); if (zend_file_cache_flock(fd, LOCK_UN) != 0) { zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s'\n", filename); @@ -1744,9 +1746,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl zend_file_cache_metainfo info; zend_accel_hash_entry *bucket; void *mem, *checkpoint, *buf; - int cache_it = 1; + bool cache_it = true; unsigned int actual_checksum; - int ok; + bool ok; if (!full_path) { return NULL; @@ -1878,18 +1880,18 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl } else { use_process_mem: buf = mem; - cache_it = 0; + cache_it = false; } ZCG(mem) = ((char*)mem + info.mem_size); script = (zend_persistent_script*)((char*)buf + info.script_offset); script->corrupted = !cache_it; /* used to check if script restored to SHM or process memory */ - ok = 1; + ok = true; zend_try { zend_file_cache_unserialize(script, buf); } zend_catch { - ok = 0; + ok = false; } zend_end_try(); if (!ok) { if (cache_it) { @@ -1902,7 +1904,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl } } - script->corrupted = 0; + script->corrupted = false; if (cache_it) { ZCSG(map_ptr_last) = CG(map_ptr_last); diff --git a/ext/opcache/zend_file_cache.h b/ext/opcache/zend_file_cache.h index a6e87197b4caa..8f067f5f37abb 100644 --- a/ext/opcache/zend_file_cache.h +++ b/ext/opcache/zend_file_cache.h @@ -19,7 +19,7 @@ #ifndef ZEND_FILE_CACHE_H #define ZEND_FILE_CACHE_H -int zend_file_cache_script_store(zend_persistent_script *script, int in_shm); +int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm); zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle); void zend_file_cache_invalidate(zend_string *full_path); diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index e21fa4cb9af2b..82dd4ccf434aa 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -1331,12 +1331,12 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script ZEND_ASSERT(((zend_uintptr_t)ZCG(mem) & 0x7) == 0); /* should be 8 byte aligned */ script = zend_shared_memdup_free(script, sizeof(zend_persistent_script)); - script->corrupted = 0; + script->corrupted = false; ZCG(current_persistent_script) = script; if (!for_shm) { /* script is not going to be saved in SHM */ - script->corrupted = 1; + script->corrupted = true; } zend_accel_store_interned_string(script->script.filename); @@ -1392,7 +1392,7 @@ zend_persistent_script *zend_accel_script_persist(zend_persistent_script *script } #endif - script->corrupted = 0; + script->corrupted = false; ZCG(current_persistent_script) = NULL; return script; diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 06d746218d2ec..b79158e7294af 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -610,12 +610,12 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s new_persistent_script->mem = NULL; new_persistent_script->size = 0; - new_persistent_script->corrupted = 0; + new_persistent_script->corrupted = false; ZCG(current_persistent_script) = new_persistent_script; if (!for_shm) { /* script is not going to be saved in SHM */ - new_persistent_script->corrupted = 1; + new_persistent_script->corrupted = true; } ADD_SIZE(sizeof(zend_persistent_script)); @@ -645,7 +645,7 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s zend_persist_early_bindings_calc( new_persistent_script->num_early_bindings, new_persistent_script->early_bindings); - new_persistent_script->corrupted = 0; + new_persistent_script->corrupted = false; ZCG(current_persistent_script) = NULL; From 2fc1ddc0f18fde218cf905486b57270e081bbb44 Mon Sep 17 00:00:00 2001 From: Martin Kealey Date: Fri, 25 Mar 2022 01:56:04 +1000 Subject: [PATCH 0401/1346] line break before --prefix in php-fpm man page --- sapi/fpm/php-fpm.8.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapi/fpm/php-fpm.8.in b/sapi/fpm/php-fpm.8.in index 6525c1eadad64..6a42412440193 100644 --- a/sapi/fpm/php-fpm.8.in +++ b/sapi/fpm/php-fpm.8.in @@ -77,6 +77,8 @@ Show compiled in modules .PD 1 .B \-v Version number +.TP +.PD 0 .B \-\-prefix \fIpath\fP .TP .PD 1 From 48e07076209c6163ecb4a756f73f511f1f09200e Mon Sep 17 00:00:00 2001 From: Zhou Qingyang Date: Tue, 29 Mar 2022 23:37:18 +0800 Subject: [PATCH 0402/1346] spl_ptr_llist_offset() is not supposed to return NULL here This issue has found by a static analyzer. Closes GH-8272. --- ext/spl/spl_dllist.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index f82a3ffe91e97..0daf486e40b60 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -1191,6 +1191,7 @@ PHP_METHOD(SplDoublyLinkedList, add) /* Get the element we want to insert before */ element = spl_ptr_llist_offset(intern->llist, index, intern->flags & SPL_DLLIST_IT_LIFO); + ZEND_ASSERT(element != NULL); ZVAL_COPY(&elem->data, value); SPL_LLIST_RC(elem) = 1; From b9e895bca0a479cfebc63c782f556b016ea07f19 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 31 Mar 2022 16:27:58 +0200 Subject: [PATCH 0403/1346] Replace memcmp() with zend_string functions (#8216) * ext/oci8: use zend_string_equals() Eliminate duplicate code. * main/php_variables: use zend_string_equals_literal() Eliminate duplicate code. * Zend/zend_string: add zend_string_equals_cstr() Allows eliminating duplicate code. * Zend, ext/{opcache,standard}, main/output: use zend_string_equals_cstr() Eliminate duplicate code. * Zend/zend_string: add zend_string_starts_with() * ext/{opcache,phar,spl,standard}: use zend_string_starts_with() This adds missing length checks to several callers, e.g. in cache_script_in_shared_memory(). This is important when the zend_string is shorter than the string parameter, when memcmp() happens to check backwards; this can result in an out-of-bounds memory access. --- Zend/zend_attributes.c | 6 ++---- Zend/zend_compile.c | 6 ++---- Zend/zend_execute.c | 2 +- Zend/zend_execute_API.c | 3 +-- Zend/zend_hash.c | 9 +++------ Zend/zend_string.c | 6 ++---- Zend/zend_string.h | 20 +++++++++++++++++++- ext/oci8/oci8.c | 7 ++----- ext/opcache/ZendAccelerator.c | 8 +++----- ext/phar/stream.c | 6 ++---- ext/spl/spl_directory.c | 2 +- ext/standard/proc_open.c | 2 +- ext/standard/string.c | 10 +++------- main/output.c | 2 +- main/php_variables.c | 3 +-- 15 files changed, 44 insertions(+), 48 deletions(-) diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index 8a37375247269..0d27d1bcaa216 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -112,10 +112,8 @@ static zend_attribute *get_attribute_str(HashTable *attributes, const char *str, zend_attribute *attr; ZEND_HASH_PACKED_FOREACH_PTR(attributes, attr) { - if (attr->offset == offset && ZSTR_LEN(attr->lcname) == len) { - if (0 == memcmp(ZSTR_VAL(attr->lcname), str, len)) { - return attr; - } + if (attr->offset == offset && zend_string_equals_cstr(attr->lcname, str, len)) { + return attr; } } ZEND_HASH_FOREACH_END(); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 039e95913f6d3..cfe44d3f3766f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -266,9 +266,7 @@ static zend_always_inline bool zend_is_confusable_type(const zend_string *name, /* Intentionally using case-sensitive comparison here, because "integer" is likely intended * as a scalar type, while "Integer" is likely a class type. */ for (; info->name; ++info) { - if (ZSTR_LEN(name) == info->name_len - && memcmp(ZSTR_VAL(name), info->name, info->name_len) == 0 - ) { + if (zend_string_equals_cstr(name, info->name, info->name_len)) { *correct_name = info->correct_name; return 1; } @@ -3379,7 +3377,7 @@ static uint32_t zend_get_arg_num(zend_function *fn, zend_string *arg_name) { for (uint32_t i = 0; i < fn->common.num_args; i++) { zend_internal_arg_info *arg_info = &fn->internal_function.arg_info[i]; size_t len = strlen(arg_info->name); - if (len == ZSTR_LEN(arg_name) && !memcmp(arg_info->name, ZSTR_VAL(arg_name), len)) { + if (zend_string_equals_cstr(arg_name, arg_info->name, len)) { return i + 1; } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5b2ce68ffb3b7..c176696f3f236 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4675,7 +4675,7 @@ static zend_always_inline uint32_t zend_get_arg_offset_by_name( for (uint32_t i = 0; i < num_args; i++) { zend_internal_arg_info *arg_info = &fbc->internal_function.arg_info[i]; size_t len = strlen(arg_info->name); - if (len == ZSTR_LEN(arg_name) && !memcmp(arg_info->name, ZSTR_VAL(arg_name), len)) { + if (zend_string_equals_cstr(arg_name, arg_info->name, len)) { *cache_slot = fbc; *(uintptr_t *)(cache_slot + 1) = i; return i; diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e791f986f8e74..e9ecc5d6697d6 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1817,8 +1817,7 @@ ZEND_API zend_result zend_set_local_var_str(const char *name, size_t len, zval * do { if (ZSTR_H(*str) == h && - ZSTR_LEN(*str) == len && - memcmp(ZSTR_VAL(*str), name, len) == 0) { + zend_string_equals_cstr(*str, name, len)) { zval *var = EX_VAR_NUM(str - op_array->vars); zval_ptr_dtor(var); ZVAL_COPY_VALUE(var, value); diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 6e809c873417a..0bfe1271ea3c3 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -711,8 +711,7 @@ static zend_always_inline Bucket *zend_hash_str_find_bucket(const HashTable *ht, p = HT_HASH_TO_BUCKET_EX(arData, idx); if ((p->h == h) && p->key - && (ZSTR_LEN(p->key) == len) - && !memcmp(ZSTR_VAL(p->key), str, len)) { + && zend_string_equals_cstr(p->key, str, len)) { return p; } idx = Z_NEXT(p->val); @@ -1556,8 +1555,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const ch p = HT_HASH_TO_BUCKET(ht, idx); if ((p->h == h) && p->key - && (ZSTR_LEN(p->key) == len) - && !memcmp(ZSTR_VAL(p->key), str, len)) { + && zend_string_equals_cstr(p->key, str, len)) { if (Z_TYPE(p->val) == IS_INDIRECT) { zval *data = Z_INDIRECT(p->val); @@ -1602,8 +1600,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char * p = HT_HASH_TO_BUCKET(ht, idx); if ((p->h == h) && p->key - && (ZSTR_LEN(p->key) == len) - && !memcmp(ZSTR_VAL(p->key), str, len)) { + && zend_string_equals_cstr(p->key, str, len)) { zend_string_release(p->key); p->key = NULL; _zend_hash_del_el_ex(ht, idx, p, prev); diff --git a/Zend/zend_string.c b/Zend/zend_string.c index c24d5dfcdb478..1284e908a55b1 100644 --- a/Zend/zend_string.c +++ b/Zend/zend_string.c @@ -135,10 +135,8 @@ static zend_always_inline zend_string *zend_interned_string_ht_lookup_ex(zend_ul idx = HT_HASH(interned_strings, nIndex); while (idx != HT_INVALID_IDX) { p = HT_HASH_TO_BUCKET(interned_strings, idx); - if ((p->h == h) && (ZSTR_LEN(p->key) == size)) { - if (!memcmp(ZSTR_VAL(p->key), str, size)) { - return p->key; - } + if ((p->h == h) && zend_string_equals_cstr(p->key, str, size)) { + return p->key; } idx = Z_NEXT(p->val); } diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 19cd926eff7be..06a4edc01ae51 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -339,6 +339,11 @@ static zend_always_inline void zend_string_release_ex(zend_string *s, bool persi } } +static zend_always_inline bool zend_string_equals_cstr(const zend_string *s1, const char *s2, size_t s2_length) +{ + return ZSTR_LEN(s1) == s2_length && !memcmp(ZSTR_VAL(s1), s2, s2_length); +} + #if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__))) BEGIN_EXTERN_C() ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2); @@ -367,7 +372,20 @@ static zend_always_inline bool zend_string_equals(zend_string *s1, zend_string * (ZSTR_LEN(str) == sizeof(c) - 1 && !zend_binary_strcasecmp(ZSTR_VAL(str), ZSTR_LEN(str), (c), sizeof(c) - 1)) #define zend_string_equals_literal(str, literal) \ - (ZSTR_LEN(str) == sizeof(literal)-1 && !memcmp(ZSTR_VAL(str), literal, sizeof(literal) - 1)) + zend_string_equals_cstr(str, literal, strlen(literal)) + +static zend_always_inline bool zend_string_starts_with_cstr(const zend_string *str, const char *prefix, size_t prefix_length) +{ + return ZSTR_LEN(str) >= prefix_length && !memcmp(ZSTR_VAL(str), prefix, prefix_length); +} + +static zend_always_inline bool zend_string_starts_with(const zend_string *str, const zend_string *prefix) +{ + return zend_string_starts_with_cstr(str, ZSTR_VAL(prefix), ZSTR_LEN(prefix)); +} + +#define zend_string_starts_with_literal(str, prefix) \ + zend_string_starts_with_cstr(str, prefix, strlen(prefix)) /* * DJBX33A (Daniel J. Bernstein, Times 33 with Addition) diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index ac79c57f2b2a9..f75a3a89187c7 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -1096,9 +1096,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } if ((tmp_val != NULL) && (tmp != NULL) && - (ZSTR_LEN(tmp->hash_key) == ZSTR_LEN(hashed_details.s)) && - (memcmp(ZSTR_VAL(tmp->hash_key), ZSTR_VAL(hashed_details.s), - ZSTR_LEN(tmp->hash_key)) == 0)) { + zend_string_equals(tmp->hash_key, hashed_details.s)) { connection = tmp; GC_ADDREF(connection->id); } @@ -2120,8 +2118,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * } zend_register_persistent_resource_ex(session_pool->spool_hash_key, session_pool, le_psessionpool); } else if (spool_out_le->type == le_psessionpool && - ZSTR_LEN(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key) == ZSTR_LEN(spool_hashed_details.s) && - memcmp(ZSTR_VAL(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key), ZSTR_VAL(spool_hashed_details.s), ZSTR_LEN(spool_hashed_details.s)) == 0) { + zend_string_equals(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key, spool_hashed_details.s)) { /* retrieve the cached session pool */ session_pool = (php_oci_spool *)(spool_out_le->ptr); } diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index e17fc16a947b7..362126db23d2d 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -590,10 +590,8 @@ static zend_always_inline zend_string *accel_find_interned_string_ex(zend_ulong if (EXPECTED(pos != STRTAB_INVALID_POS)) { do { s = STRTAB_POS_TO_STR(&ZCSG(interned_strings), pos); - if (EXPECTED(ZSTR_H(s) == h) && EXPECTED(ZSTR_LEN(s) == size)) { - if (!memcmp(ZSTR_VAL(s), str, size)) { - return s; - } + if (EXPECTED(ZSTR_H(s) == h) && zend_string_equals_cstr(s, str, size)) { + return s; } pos = STRTAB_COLLISION(s); } while (pos != STRTAB_INVALID_POS); @@ -1637,7 +1635,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr zend_accel_error(ACCEL_LOG_INFO, "Cached script '%s'", ZSTR_VAL(new_persistent_script->script.filename)); if (key && /* key may contain non-persistent PHAR aliases (see issues #115 and #149) */ - memcmp(ZSTR_VAL(key), "phar://", sizeof("phar://") - 1) != 0 && + !zend_string_starts_with_literal(key, "phar://") && !zend_string_equals(new_persistent_script->script.filename, key)) { /* link key to the same persistent script in hash table */ zend_string *new_key = accel_new_interned_key(key); diff --git a/ext/phar/stream.c b/ext/phar/stream.c index 9bba67c6fc963..b45b662398c79 100644 --- a/ext/phar/stream.c +++ b/ext/phar/stream.c @@ -912,8 +912,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from ZEND_HASH_MAP_FOREACH_BUCKET(&phar->virtual_dirs, b) { str_key = b->key; - if (ZSTR_LEN(str_key) >= from_len && - memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource_from->path)+1, from_len) == 0 && + if (zend_string_starts_with_cstr(str_key, ZSTR_VAL(resource_from->path)+1, from_len) && (ZSTR_LEN(str_key) == from_len || IS_SLASH(ZSTR_VAL(str_key)[from_len]))) { new_str_key = zend_string_alloc(ZSTR_LEN(str_key) + to_len - from_len, 0); @@ -930,8 +929,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from ZEND_HASH_MAP_FOREACH_BUCKET(&phar->mounted_dirs, b) { str_key = b->key; - if (ZSTR_LEN(str_key) >= from_len && - memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource_from->path)+1, from_len) == 0 && + if (zend_string_starts_with_cstr(str_key, ZSTR_VAL(resource_from->path)+1, from_len) && (ZSTR_LEN(str_key) == from_len || IS_SLASH(ZSTR_VAL(str_key)[from_len]))) { new_str_key = zend_string_alloc(ZSTR_LEN(str_key) + to_len - from_len, 0); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index b6e53c2921b7d..f752593c92351 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -740,7 +740,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto /* spl_filesystem_dir_open() may emit an E_WARNING */ zend_replace_error_handling(EH_THROW, spl_ce_UnexpectedValueException, &error_handling); #ifdef HAVE_GLOB - if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && memcmp(ZSTR_VAL(path), "glob://", sizeof("glob://")-1) != 0) { + if (SPL_HAS_FLAG(ctor_flags, DIT_CTOR_GLOB) && !zend_string_starts_with_literal(path, "glob://")) { path = zend_strpprintf(0, "glob://%s", ZSTR_VAL(path)); spl_filesystem_dir_open(intern, path); zend_string_release(path); diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index a57e66bd97954..28420b4f803aa 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -728,7 +728,7 @@ static zend_result set_proc_descriptor_to_pipe(descriptorspec_item *desc, zend_s desc->type = DESCRIPTOR_TYPE_PIPE; - if (strncmp(ZSTR_VAL(zmode), "w", 1) != 0) { + if (!zend_string_starts_with_literal(zmode, "w")) { desc->parentend = newpipe[1]; desc->childend = newpipe[0]; desc->mode_flags = O_WRONLY; diff --git a/ext/standard/string.c b/ext/standard/string.c index 593c67cb32248..00d422fb18564 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -1810,11 +1810,7 @@ PHP_FUNCTION(str_starts_with) Z_PARAM_STR(needle) ZEND_PARSE_PARAMETERS_END(); - if (ZSTR_LEN(needle) > ZSTR_LEN(haystack)) { - RETURN_FALSE; - } - - RETURN_BOOL(memcmp(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(needle)) == 0); + RETURN_BOOL(zend_string_starts_with(haystack, needle)); } /* }}} */ @@ -4738,14 +4734,14 @@ static zend_string *try_setlocale_str(zend_long cat, zend_string *loc) { /* C locale is represented as NULL. */ BG(ctype_string) = NULL; return ZSTR_CHAR('C'); - } else if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) { + } else if (zend_string_equals_cstr(loc, retval, len)) { BG(ctype_string) = zend_string_copy(loc); return zend_string_copy(BG(ctype_string)); } else { BG(ctype_string) = zend_string_init(retval, len, 0); return zend_string_copy(BG(ctype_string)); } - } else if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) { + } else if (zend_string_equals_cstr(loc, retval, len)) { return zend_string_copy(loc); } } diff --git a/main/output.c b/main/output.c index 3e29f8f152673..7b5bc49dab87e 100644 --- a/main/output.c +++ b/main/output.c @@ -584,7 +584,7 @@ PHPAPI int php_output_handler_started(const char *name, size_t name_len) handlers = (php_output_handler **) zend_stack_base(&OG(handlers)); for (i = 0; i < count; ++i) { - if (name_len == ZSTR_LEN(handlers[i]->name) && !memcmp(ZSTR_VAL(handlers[i]->name), name, name_len)) { + if (zend_string_equals_cstr(handlers[i]->name, name, name_len)) { return 1; } } diff --git a/main/php_variables.c b/main/php_variables.c index 0261cf0098ee4..812b46bc9c73a 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -702,8 +702,7 @@ static void php_autoglobal_merge(HashTable *dest, HashTable *src) || Z_TYPE_P(dest_entry) != IS_ARRAY) { Z_TRY_ADDREF_P(src_entry); if (string_key) { - if (!globals_check || ZSTR_LEN(string_key) != sizeof("GLOBALS") - 1 - || memcmp(ZSTR_VAL(string_key), "GLOBALS", sizeof("GLOBALS") - 1)) { + if (!globals_check || !zend_string_equals_literal(string_key, "GLOBALS")) { zend_hash_update(dest, string_key, src_entry); } else { Z_TRY_DELREF_P(src_entry); From 738adce79fd345d5f9dd604641084588f8adf6d9 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 7 Aug 2020 20:15:38 +0200 Subject: [PATCH 0404/1346] Fix [-Wundef] warnings in DBA extension --- ext/dba/dba.c | 52 +++++++++++++++++++++--------------------- ext/dba/dba_cdb.c | 2 +- ext/dba/dba_db1.c | 2 +- ext/dba/dba_db2.c | 2 +- ext/dba/dba_db3.c | 2 +- ext/dba/dba_db4.c | 2 +- ext/dba/dba_dbm.c | 4 ++-- ext/dba/dba_flatfile.c | 2 +- ext/dba/dba_gdbm.c | 2 +- ext/dba/dba_inifile.c | 2 +- ext/dba/dba_lmdb.c | 2 +- ext/dba/dba_ndbm.c | 2 +- ext/dba/dba_qdbm.c | 2 +- ext/dba/dba_tcadb.c | 2 +- ext/dba/php_cdb.h | 2 +- ext/dba/php_db1.h | 2 +- ext/dba/php_db2.h | 2 +- ext/dba/php_db3.h | 2 +- ext/dba/php_db4.h | 2 +- ext/dba/php_dba.h | 2 +- ext/dba/php_dbm.h | 2 +- ext/dba/php_flatfile.h | 2 +- ext/dba/php_gdbm.h | 2 +- ext/dba/php_inifile.h | 2 +- ext/dba/php_lmdb.h | 2 +- ext/dba/php_ndbm.h | 2 +- ext/dba/php_qdbm.h | 2 +- ext/dba/php_tcadb.h | 2 +- 28 files changed, 54 insertions(+), 54 deletions(-) diff --git a/ext/dba/dba.c b/ext/dba/dba.c index b01d11e165f61..842f85d73dcdb 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -21,7 +21,7 @@ #include "php.h" -#if HAVE_DBA +#ifdef HAVE_DBA #include "php_ini.h" #include @@ -160,72 +160,72 @@ static zend_string* php_dba_make_key(HashTable *key) /* {{{ globals */ static dba_handler handler[] = { -#if DBA_GDBM +#ifdef DBA_GDBM DBA_HND(gdbm, DBA_LOCK_EXT) /* Locking done in library if set */ #endif -#if DBA_DBM +#ifdef DBA_DBM DBA_HND(dbm, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_NDBM +#ifdef DBA_NDBM DBA_HND(ndbm, DBA_LOCK_ALL) /* Could be done in library: filemode = 0644 + S_ENFMT */ #endif -#if DBA_CDB +#ifdef DBA_CDB DBA_HND(cdb, DBA_STREAM_OPEN|DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_CDB_BUILTIN +#ifdef DBA_CDB_BUILTIN DBA_NAMED_HND(cdb_make, cdb, DBA_STREAM_OPEN|DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB1 +#ifdef DBA_DB1 DBA_HND(db1, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB2 +#ifdef DBA_DB2 DBA_HND(db2, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB3 +#ifdef DBA_DB3 DBA_HND(db3, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_DB4 +#ifdef DBA_DB4 DBA_HND(db4, DBA_LOCK_ALL) /* No lock in lib */ #endif -#if DBA_INIFILE +#ifdef DBA_INIFILE DBA_HND(inifile, DBA_STREAM_OPEN|DBA_LOCK_ALL|DBA_CAST_AS_FD) /* No lock in lib */ #endif -#if DBA_FLATFILE +#ifdef DBA_FLATFILE DBA_HND(flatfile, DBA_STREAM_OPEN|DBA_LOCK_ALL|DBA_NO_APPEND) /* No lock in lib */ #endif -#if DBA_QDBM +#ifdef DBA_QDBM DBA_HND(qdbm, DBA_LOCK_EXT) #endif -#if DBA_TCADB +#ifdef DBA_TCADB DBA_HND(tcadb, DBA_LOCK_ALL) #endif -#if DBA_LMDB +#ifdef DBA_LMDB DBA_HND(lmdb, DBA_LOCK_EXT) #endif { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } }; -#if DBA_FLATFILE +#ifdef DBA_FLATFILE #define DBA_DEFAULT "flatfile" -#elif DBA_DB4 +#elif defined(DBA_DB4) #define DBA_DEFAULT "db4" -#elif DBA_DB3 +#elif defined(DBA_DB3) #define DBA_DEFAULT "db3" -#elif DBA_DB2 +#elif defined(DBA_DB2) #define DBA_DEFAULT "db2" -#elif DBA_DB1 +#elif defined(DBA_DB1) #define DBA_DEFAULT "db1" -#elif DBA_GDBM +#elif defined(DBA_GDBM) #define DBA_DEFAULT "gdbm" -#elif DBA_NBBM +#elif defined(DBA_NBBM) #define DBA_DEFAULT "ndbm" -#elif DBA_DBM +#elif defined(DBA_DBM) #define DBA_DEFAULT "dbm" -#elif DBA_QDBM +#elif defined(DBA_QDBM) #define DBA_DEFAULT "qdbm" -#elif DBA_TCADB +#elif defined(DBA_TCADB) #define DBA_DEFAULT "tcadb" -#elif DBA_LMDB +#elif defined(DBA_LMDB) #define DBA_DEFAULT "lmdb" #else #define DBA_DEFAULT "" diff --git a/ext/dba/dba_cdb.c b/ext/dba/dba_cdb.c index 6b5013961f760..5af9121b565a6 100644 --- a/ext/dba/dba_cdb.c +++ b/ext/dba/dba_cdb.c @@ -21,7 +21,7 @@ #include "php.h" -#if DBA_CDB +#ifdef DBA_CDB #include "php_cdb.h" #include diff --git a/ext/dba/dba_db1.c b/ext/dba/dba_db1.c index 6f0f402b8d350..3a95cea460c14 100644 --- a/ext/dba/dba_db1.c +++ b/ext/dba/dba_db1.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_DB1 +#ifdef DBA_DB1 #include "php_db1.h" #ifdef DB1_INCLUDE_FILE diff --git a/ext/dba/dba_db2.c b/ext/dba/dba_db2.c index 373464f80ec9b..8f6d47a9239c9 100644 --- a/ext/dba/dba_db2.c +++ b/ext/dba/dba_db2.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_DB2 +#ifdef DBA_DB2 #include "php_db2.h" #include diff --git a/ext/dba/dba_db3.c b/ext/dba/dba_db3.c index 8d25c7463ac84..d9e948a623f50 100644 --- a/ext/dba/dba_db3.c +++ b/ext/dba/dba_db3.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_DB3 +#ifdef DBA_DB3 #include "php_db3.h" #include diff --git a/ext/dba/dba_db4.c b/ext/dba/dba_db4.c index 3e9aaa13d4300..3de66a4274432 100644 --- a/ext/dba/dba_db4.c +++ b/ext/dba/dba_db4.c @@ -21,7 +21,7 @@ #include "php.h" -#if DBA_DB4 +#ifdef DBA_DB4 #include "php_db4.h" #include diff --git a/ext/dba/dba_dbm.c b/ext/dba/dba_dbm.c index 316398e6ac736..afa645cb2fe70 100644 --- a/ext/dba/dba_dbm.c +++ b/ext/dba/dba_dbm.c @@ -20,13 +20,13 @@ #include "php.h" -#if DBA_DBM +#ifdef DBA_DBM #include "php_dbm.h" #ifdef DBM_INCLUDE_FILE #include DBM_INCLUDE_FILE #endif -#if DBA_GDBM +#ifdef DBA_GDBM #include "php_gdbm.h" #endif diff --git a/ext/dba/dba_flatfile.c b/ext/dba/dba_flatfile.c index b631fe9352baa..9d5b31128c076 100644 --- a/ext/dba/dba_flatfile.c +++ b/ext/dba/dba_flatfile.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_FLATFILE +#ifdef DBA_FLATFILE #include "php_flatfile.h" #include "libflatfile/flatfile.h" diff --git a/ext/dba/dba_gdbm.c b/ext/dba/dba_gdbm.c index 1a47d1d708aa4..ec968f3f203e7 100644 --- a/ext/dba/dba_gdbm.c +++ b/ext/dba/dba_gdbm.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_GDBM +#ifdef DBA_GDBM #include "php_gdbm.h" #ifdef GDBM_INCLUDE_FILE diff --git a/ext/dba/dba_inifile.c b/ext/dba/dba_inifile.c index dd0bc30f3d349..fe0adbccbfe9c 100644 --- a/ext/dba/dba_inifile.c +++ b/ext/dba/dba_inifile.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_INIFILE +#ifdef DBA_INIFILE #include "php_inifile.h" #include "libinifile/inifile.h" diff --git a/ext/dba/dba_lmdb.c b/ext/dba/dba_lmdb.c index b7c8151204d5c..e8fb99b569827 100644 --- a/ext/dba/dba_lmdb.c +++ b/ext/dba/dba_lmdb.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_LMDB +#ifdef DBA_LMDB #include "php_lmdb.h" #ifdef LMDB_INCLUDE_FILE diff --git a/ext/dba/dba_ndbm.c b/ext/dba/dba_ndbm.c index a97d3595a0cda..d872add48e6ab 100644 --- a/ext/dba/dba_ndbm.c +++ b/ext/dba/dba_ndbm.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_NDBM +#ifdef DBA_NDBM #include "php_ndbm.h" #include diff --git a/ext/dba/dba_qdbm.c b/ext/dba/dba_qdbm.c index 129b40915fab3..d06af20659909 100644 --- a/ext/dba/dba_qdbm.c +++ b/ext/dba/dba_qdbm.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_QDBM +#ifdef DBA_QDBM #include "php_qdbm.h" #ifdef QDBM_INCLUDE_FILE diff --git a/ext/dba/dba_tcadb.c b/ext/dba/dba_tcadb.c index 4d0d65bf91529..23c9e2d1d363d 100644 --- a/ext/dba/dba_tcadb.c +++ b/ext/dba/dba_tcadb.c @@ -20,7 +20,7 @@ #include "php.h" -#if DBA_TCADB +#ifdef DBA_TCADB #include "php_tcadb.h" #ifdef TCADB_INCLUDE_FILE diff --git a/ext/dba/php_cdb.h b/ext/dba/php_cdb.h index a046f0796b378..9e6ebff9c6ba2 100644 --- a/ext/dba/php_cdb.h +++ b/ext/dba/php_cdb.h @@ -1,7 +1,7 @@ #ifndef PHP_CDB_H #define PHP_CDB_H -#if DBA_CDB +#ifdef DBA_CDB #include "php_dba.h" diff --git a/ext/dba/php_db1.h b/ext/dba/php_db1.h index c0bb5f08b4b6c..f8a97e6b83adf 100644 --- a/ext/dba/php_db1.h +++ b/ext/dba/php_db1.h @@ -1,7 +1,7 @@ #ifndef PHP_DB1_H #define PHP_DB1_H -#if DBA_DB1 +#ifdef DBA_DB1 #include "php_dba.h" diff --git a/ext/dba/php_db2.h b/ext/dba/php_db2.h index 2a95223a85442..b54dcdeec02bd 100644 --- a/ext/dba/php_db2.h +++ b/ext/dba/php_db2.h @@ -1,7 +1,7 @@ #ifndef PHP_DB2_H #define PHP_DB2_H -#if DBA_DB2 +#ifdef DBA_DB2 #include "php_dba.h" diff --git a/ext/dba/php_db3.h b/ext/dba/php_db3.h index 58bb0b62a08f7..f27380bbb1dc2 100644 --- a/ext/dba/php_db3.h +++ b/ext/dba/php_db3.h @@ -1,7 +1,7 @@ #ifndef PHP_DB3_H #define PHP_DB3_H -#if DBA_DB3 +#ifdef DBA_DB3 #include "php_dba.h" diff --git a/ext/dba/php_db4.h b/ext/dba/php_db4.h index fa814c3f5ec4b..1eb8067e820fb 100644 --- a/ext/dba/php_db4.h +++ b/ext/dba/php_db4.h @@ -1,7 +1,7 @@ #ifndef PHP_DB4_H #define PHP_DB4_H -#if DBA_DB4 +#ifdef DBA_DB4 #include "php_dba.h" diff --git a/ext/dba/php_dba.h b/ext/dba/php_dba.h index a2ad7fad60466..28ca887222f9c 100644 --- a/ext/dba/php_dba.h +++ b/ext/dba/php_dba.h @@ -20,7 +20,7 @@ #include "php_version.h" #define PHP_DBA_VERSION PHP_VERSION -#if HAVE_DBA +#ifdef HAVE_DBA typedef enum { /* do not allow 0 here */ diff --git a/ext/dba/php_dbm.h b/ext/dba/php_dbm.h index 4c963d18ed91f..d53c09fcb2bfd 100644 --- a/ext/dba/php_dbm.h +++ b/ext/dba/php_dbm.h @@ -1,7 +1,7 @@ #ifndef PHP_DBM_H #define PHP_DBM_H -#if DBA_DBM +#ifdef DBA_DBM #include "php_dba.h" diff --git a/ext/dba/php_flatfile.h b/ext/dba/php_flatfile.h index afa9f6d5d3920..71c46a95eaaf5 100644 --- a/ext/dba/php_flatfile.h +++ b/ext/dba/php_flatfile.h @@ -1,7 +1,7 @@ #ifndef PHP_FLATFILE_H #define PHP_FLATFILE_H -#if DBA_FLATFILE +#ifdef DBA_FLATFILE #include "php_dba.h" diff --git a/ext/dba/php_gdbm.h b/ext/dba/php_gdbm.h index 3068404cfe265..0657c424a1ada 100644 --- a/ext/dba/php_gdbm.h +++ b/ext/dba/php_gdbm.h @@ -1,7 +1,7 @@ #ifndef PHP_GDBM_H #define PHP_GDBM_H -#if DBA_GDBM +#ifdef DBA_GDBM #include "php_dba.h" diff --git a/ext/dba/php_inifile.h b/ext/dba/php_inifile.h index 69444df3c6d48..eef58acfa6723 100644 --- a/ext/dba/php_inifile.h +++ b/ext/dba/php_inifile.h @@ -1,7 +1,7 @@ #ifndef PHP_INIFILE_H #define PHP_INIFILE_H -#if DBA_INIFILE +#ifdef DBA_INIFILE #include "php_dba.h" diff --git a/ext/dba/php_lmdb.h b/ext/dba/php_lmdb.h index 1b4928f49bffa..421f6a0094958 100644 --- a/ext/dba/php_lmdb.h +++ b/ext/dba/php_lmdb.h @@ -1,7 +1,7 @@ #ifndef PHP_LMDB_H #define PHP_LMDB_H -#if DBA_LMDB +#ifdef DBA_LMDB #include "php_dba.h" diff --git a/ext/dba/php_ndbm.h b/ext/dba/php_ndbm.h index b1ebf15af32d7..68c04c680cfe1 100644 --- a/ext/dba/php_ndbm.h +++ b/ext/dba/php_ndbm.h @@ -1,7 +1,7 @@ #ifndef PHP_NDBM_H #define PHP_NDBM_H -#if DBA_NDBM +#ifdef DBA_NDBM #include "php_dba.h" diff --git a/ext/dba/php_qdbm.h b/ext/dba/php_qdbm.h index c88efcff4cfa1..bec4e8c50b3b8 100644 --- a/ext/dba/php_qdbm.h +++ b/ext/dba/php_qdbm.h @@ -1,7 +1,7 @@ #ifndef PHP_QDBM_H #define PHP_QDBM_H -#if DBA_QDBM +#ifdef DBA_QDBM #include "php_dba.h" diff --git a/ext/dba/php_tcadb.h b/ext/dba/php_tcadb.h index 8b145f3ea5c37..6bfecf7d6d96f 100644 --- a/ext/dba/php_tcadb.h +++ b/ext/dba/php_tcadb.h @@ -17,7 +17,7 @@ #ifndef PHP_TCADB_H #define PHP_TCADB_H -#if DBA_TCADB +#ifdef DBA_TCADB #include "php_dba.h" From 2c2ecba063faf70cbceed3bc780182a238deee95 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 1 Apr 2022 15:43:42 +0100 Subject: [PATCH 0405/1346] Determine value of ZEND_MM_* during config and fix sign conversion (#6981) Also add a new ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT definition. This fixes many [-Wsign-conversion] warnings. Co-authored-by: Guillaume Charifi Co-authored-by: Bob Weinand --- Zend/Zend.m4 | 11 +++++++---- Zend/zend_alloc.h | 8 +------- ext/opcache/ZendAccelerator.c | 6 +++--- win32/build/config.w32.h.in | 4 ++++ 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Zend/Zend.m4 b/Zend/Zend.m4 index d4dcd5459078b..fe28134dd92d6 100644 --- a/Zend/Zend.m4 +++ b/Zend/Zend.m4 @@ -256,7 +256,7 @@ typedef union _mm_align_test { int main() { - int i = ZEND_MM_ALIGNMENT; + size_t i = ZEND_MM_ALIGNMENT; int zeros = 0; FILE *fp; @@ -266,7 +266,7 @@ int main() } fp = fopen("conftest.zend", "w"); - fprintf(fp, "%d %d\n", ZEND_MM_ALIGNMENT, zeros); + fprintf(fp, "(size_t)%zu (size_t)%d %d\n", ZEND_MM_ALIGNMENT, zeros, ZEND_MM_ALIGNMENT < 4); fclose(fp); return 0; @@ -274,12 +274,15 @@ int main() ]])], [ LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1` LIBZEND_MM_ALIGN_LOG2=`cat conftest.zend | cut -d ' ' -f 2` + LIBZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT=`cat conftest.zend | cut -d ' ' -f 3` AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ]) AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, $LIBZEND_MM_ALIGN_LOG2, [ ]) + AC_DEFINE_UNQUOTED(ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT, $LIBZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT, [ ]) ], [], [ dnl Cross compilation needs something here. - AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, 8, [ ]) - AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, 3, [ ]) + AC_DEFINE(ZEND_MM_ALIGNMENT, 8, [ ]) + AC_DEFINE(ZEND_MM_ALIGNMENT_LOG2, 3, [ ]) + AC_DEFINE(ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT, 0, [ ]) ]) AC_MSG_RESULT(done) diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h index f517b1231d1d2..9e10e6971f810 100644 --- a/Zend/zend_alloc.h +++ b/Zend/zend_alloc.h @@ -27,13 +27,7 @@ #include "zend.h" #ifndef ZEND_MM_ALIGNMENT -# define ZEND_MM_ALIGNMENT Z_UL(8) -# define ZEND_MM_ALIGNMENT_LOG2 Z_L(3) -#elif ZEND_MM_ALIGNMENT < 4 -# undef ZEND_MM_ALIGNMENT -# undef ZEND_MM_ALIGNMENT_LOG2 -# define ZEND_MM_ALIGNMENT Z_UL(4) -# define ZEND_MM_ALIGNMENT_LOG2 Z_L(2) +# error "ZEND_MM_ALIGNMENT was not defined during configure" #endif #define ZEND_MM_ALIGNMENT_MASK ~(ZEND_MM_ALIGNMENT - 1) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 362126db23d2d..af040eba9ca93 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1484,7 +1484,7 @@ static zend_persistent_script *store_script_in_file_cache(zend_persistent_script /* Align to 64-byte boundary */ ZCG(mem) = zend_arena_alloc(&CG(arena), memory_used + 64); ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 63L) & ~63L); -#elif ZEND_MM_ALIGNMENT < 8 +#elif ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT /* Align to 8-byte boundary */ ZCG(mem) = zend_arena_alloc(&CG(arena), memory_used + 8); ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 7L) & ~7L); @@ -2365,7 +2365,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, zend_shared_alloc_clear_xlat_table(); -#if ZEND_MM_ALIGNMENT < 8 +#if ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT /* Align to 8-byte boundary */ ZCG(mem) = zend_shared_alloc(size + 8); #else @@ -2381,7 +2381,7 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce, zend_map_ptr_extend(ZCSG(map_ptr_last)); -#if ZEND_MM_ALIGNMENT < 8 +#if ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT /* Align to 8-byte boundary */ ZCG(mem) = (void*)(((zend_uintptr_t)ZCG(mem) + 7L) & ~7L); #endif diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in index ce4b71282e7a0..7686fb83a4a32 100644 --- a/win32/build/config.w32.h.in +++ b/win32/build/config.w32.h.in @@ -27,6 +27,10 @@ #define DEFAULT_SHORT_OPEN_TAG "1" /* Platform-Specific Configuration. Should not be changed. */ +/* Alignment for Zend memory allocator */ +#define ZEND_MM_ALIGNMENT (size_t)8 +#define ZEND_MM_ALIGNMENT_LOG2 (size_t)3 +#define ZEND_MM_NEED_EIGHT_BYTE_REALIGNMENT 0 #define PHP_SIGCHILD 0 #define HAVE_GETSERVBYNAME 1 #define HAVE_GETSERVBYPORT 1 From 62ab9293ae3281cc0ccc526bb35bebfa4c8f8a28 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 20 May 2020 14:47:11 +0200 Subject: [PATCH 0406/1346] Fix [-Wundef] warnings in SNMP extension --- ext/snmp/php_snmp.h | 2 +- ext/snmp/snmp.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/snmp/php_snmp.h b/ext/snmp/php_snmp.h index 4a9f89abba6ef..0615d6a3e9a0d 100644 --- a/ext/snmp/php_snmp.h +++ b/ext/snmp/php_snmp.h @@ -24,7 +24,7 @@ #define PHP_SNMP_VERSION PHP_VERSION -#if HAVE_SNMP +#ifdef HAVE_SNMP #ifndef DLEXPORT #define DLEXPORT diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 035b0f846f7bd..a14bf2aed34c6 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -33,7 +33,7 @@ #include "ext/spl/spl_exceptions.h" #include "snmp_arginfo.h" -#if HAVE_SNMP +#ifdef HAVE_SNMP #include #include @@ -865,7 +865,7 @@ static bool netsnmp_session_init(php_snmp_session **session_p, int version, zend res = psal; while (n-- > 0) { pptr = session->peername; -#if HAVE_GETADDRINFO && HAVE_IPV6 && HAVE_INET_NTOP +#if defined(HAVE_GETADDRINFO) && defined(HAVE_IPV6) && defined(HAVE_INET_NTOP) if (force_ipv6 && (*res)->sa_family != AF_INET6) { res++; continue; From 5171cb435a69c418231acc487819ce47b52711df Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 20 May 2020 18:34:20 +0200 Subject: [PATCH 0407/1346] Fix [-Wundef] warnings in standard extension --- ext/standard/basic_functions.c | 66 +- ext/standard/basic_functions.stub.php | 29 +- ext/standard/basic_functions_arginfo.h | 1315 +++++++++++++++++++++--- ext/standard/crc32.c | 4 +- ext/standard/crypt.c | 4 +- ext/standard/crypt_sha512.c | 2 +- ext/standard/datetime.c | 2 +- ext/standard/dir.c | 8 +- ext/standard/dl.c | 4 +- ext/standard/dns.c | 20 +- ext/standard/exec.c | 10 +- ext/standard/file.c | 4 +- ext/standard/file.h | 2 +- ext/standard/filestat.c | 28 +- ext/standard/flock_compat.c | 4 +- ext/standard/flock_compat.h | 21 +- ext/standard/ftok.c | 2 +- ext/standard/ftp_fopen_wrapper.c | 4 +- ext/standard/hrtime.c | 2 +- ext/standard/html.c | 2 +- ext/standard/http_fopen_wrapper.c | 4 +- ext/standard/image.c | 14 +- ext/standard/info.c | 4 +- ext/standard/lcg.c | 2 +- ext/standard/link.c | 4 +- ext/standard/mail.c | 12 +- ext/standard/net.c | 10 +- ext/standard/pack.c | 4 +- ext/standard/pageinfo.c | 4 +- ext/standard/password.c | 10 +- ext/standard/php_dns.h | 8 +- ext/standard/php_fopen_wrapper.c | 6 +- ext/standard/php_password.h | 4 +- ext/standard/php_string.h | 8 +- ext/standard/proc_open.c | 12 +- ext/standard/random.c | 2 +- ext/standard/streamsfuncs.c | 6 +- ext/standard/string.c | 40 +- ext/standard/syslog.c | 2 +- ext/standard/uniqid.c | 2 +- ext/standard/url_scanner_ex.re | 2 +- 41 files changed, 1352 insertions(+), 341 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 09f67b2e3f60b..15a0f83b9af8a 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -67,22 +67,22 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; #include "win32/inet.h" #endif -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H # include #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H # include #endif #include #include -#if HAVE_SYS_MMAN_H +#ifdef HAVE_SYS_MMAN_H # include #endif -#if HAVE_SYS_LOADAVG_H +#ifdef HAVE_SYS_LOADAVG_H # include #endif @@ -91,7 +91,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef INADDR_NONE -#define INADDR_NONE ((zend_ulong) -1) +# define INADDR_NONE ((zend_ulong) -1) #endif #include "zend_globals.h" @@ -149,13 +149,13 @@ zend_module_entry basic_functions_module = { /* {{{ */ }; /* }}} */ -#if defined(HAVE_PUTENV) +#ifdef HAVE_PUTENV static void php_putenv_destructor(zval *zv) /* {{{ */ { putenv_entry *pe = Z_PTR_P(zv); if (pe->previous_value) { -# if defined(PHP_WIN32) +# ifdef PHP_WIN32 /* MSVCRT has a bug in putenv() when setting a variable that * is already set; if the SetEnvironmentVariable() API call * fails, the Crt will double free() a string. @@ -163,11 +163,11 @@ static void php_putenv_destructor(zval *zv) /* {{{ */ SetEnvironmentVariable(ZSTR_VAL(pe->key), "bugbug"); # endif putenv(pe->previous_value); -# if defined(PHP_WIN32) +# ifdef PHP_WIN32 efree(pe->previous_value); # endif } else { -# if HAVE_UNSETENV +# ifdef HAVE_UNSETENV unsetenv(ZSTR_VAL(pe->key)); # elif defined(PHP_WIN32) SetEnvironmentVariable(ZSTR_VAL(pe->key), NULL); @@ -282,14 +282,14 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ { #ifdef ZTS ts_allocate_id(&basic_globals_id, sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor); -#ifdef PHP_WIN32 +# ifdef PHP_WIN32 ts_allocate_id(&php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor)php_win32_core_globals_ctor, (ts_allocate_dtor)php_win32_core_globals_dtor ); -#endif +# endif #else basic_globals_ctor(&basic_globals); -#ifdef PHP_WIN32 +# ifdef PHP_WIN32 php_win32_core_globals_ctor(&the_php_win32_core_globals); -#endif +# endif #endif php_ce_incomplete_class = register_class___PHP_Incomplete_Class(); @@ -347,7 +347,7 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_EVEN", PHP_ROUND_HALF_EVEN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_CS | CONST_PERSISTENT); -#if ENABLE_TEST_CLASS +#ifdef ENABLE_TEST_CLASS test_class_startup(); #endif @@ -364,23 +364,23 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ BASIC_MINIT_SUBMODULE(password) BASIC_MINIT_SUBMODULE(mt_rand) -#if defined(ZTS) +#ifdef ZTS BASIC_MINIT_SUBMODULE(localeconv) #endif -#if defined(HAVE_NL_LANGINFO) +#ifdef HAVE_NL_LANGINFO BASIC_MINIT_SUBMODULE(nl_langinfo) #endif -#if ZEND_INTRIN_SSE4_2_FUNC_PTR +#ifdef ZEND_INTRIN_SSE4_2_FUNC_PTR BASIC_MINIT_SUBMODULE(string_intrin) #endif -#if ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PTR +#ifdef ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PTR BASIC_MINIT_SUBMODULE(crc32_x86_intrin) #endif -#if ZEND_INTRIN_AVX2_FUNC_PTR || ZEND_INTRIN_SSSE3_FUNC_PTR +#if defined(ZEND_INTRIN_AVX2_FUNC_PTR) || defined(ZEND_INTRIN_SSSE3_FUNC_PTR) BASIC_MINIT_SUBMODULE(base64_intrin) #endif @@ -411,8 +411,8 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ php_register_url_stream_wrapper("http", &php_stream_http_wrapper); php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC -# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +# if defined(PHP_WIN32) || defined(HAVE_FULL_DNS_FUNCS) BASIC_MINIT_SUBMODULE(dns) # endif #endif @@ -452,7 +452,7 @@ PHP_MSHUTDOWN_FUNCTION(basic) /* {{{ */ BASIC_MSHUTDOWN_SUBMODULE(url_scanner_ex) BASIC_MSHUTDOWN_SUBMODULE(file) BASIC_MSHUTDOWN_SUBMODULE(standard_filters) -#if defined(ZTS) +#ifdef ZTS BASIC_MSHUTDOWN_SUBMODULE(localeconv) #endif BASIC_MSHUTDOWN_SUBMODULE(crypt) @@ -876,7 +876,7 @@ PHP_FUNCTION(putenv) for (env = environ; env != NULL && *env != NULL; env++) { if (!strncmp(*env, ZSTR_VAL(pe.key), ZSTR_LEN(pe.key)) && (*env)[ZSTR_LEN(pe.key)] == '=') { /* found it */ -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 /* must copy previous value because MSVCRT's putenv can free the string without notice */ pe.previous_value = estrdup(*env); #else @@ -886,7 +886,7 @@ PHP_FUNCTION(putenv) } } -#if HAVE_UNSETENV +#ifdef HAVE_UNSETENV if (!p) { /* no '=' means we want to unset it */ unsetenv(pe.putenv_string); } @@ -932,7 +932,7 @@ PHP_FUNCTION(putenv) } #endif tsrm_env_unlock(); -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 free(keyw); free(valw); #endif @@ -940,7 +940,7 @@ PHP_FUNCTION(putenv) } else { free(pe.putenv_string); zend_string_release(pe.key); -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 free(keyw); free(valw); #endif @@ -1245,13 +1245,13 @@ PHP_FUNCTION(usleep) RETURN_THROWS(); } -#if HAVE_USLEEP +#ifdef HAVE_USLEEP usleep((unsigned int)num); #endif } /* }}} */ -#if HAVE_NANOSLEEP +#ifdef HAVE_NANOSLEEP /* {{{ Delay for a number of seconds and nano seconds */ PHP_FUNCTION(time_nanosleep) { @@ -2245,7 +2245,7 @@ PHP_FUNCTION(ignore_user_abort) } /* }}} */ -#if HAVE_GETSERVBYNAME +#ifdef HAVE_GETSERVBYNAME /* {{{ Returns port associated with service. Protocol must be "tcp" or "udp" */ PHP_FUNCTION(getservbyname) { @@ -2270,7 +2270,7 @@ PHP_FUNCTION(getservbyname) serv = getservbyname(ZSTR_VAL(name), proto); -#if defined(_AIX) +#ifdef _AIX /* On AIX, imap is only known as imap2 in /etc/services, while on Linux imap is an alias for imap2. If a request for imap gives no result, we try again with imap2. @@ -2288,7 +2288,7 @@ PHP_FUNCTION(getservbyname) /* }}} */ #endif -#if HAVE_GETSERVBYPORT +#ifdef HAVE_GETSERVBYPORT /* {{{ Returns service name associated with port. Protocol must be "tcp" or "udp" */ PHP_FUNCTION(getservbyport) { @@ -2313,7 +2313,7 @@ PHP_FUNCTION(getservbyport) /* }}} */ #endif -#if HAVE_GETPROTOBYNAME +#ifdef HAVE_GETPROTOBYNAME /* {{{ Returns protocol number associated with name as per /etc/protocols */ PHP_FUNCTION(getprotobyname) { @@ -2336,7 +2336,7 @@ PHP_FUNCTION(getprotobyname) /* }}} */ #endif -#if HAVE_GETPROTOBYNUMBER +#ifdef HAVE_GETPROTOBYNUMBER /* {{{ Returns protocol name associated with protocol number proto */ PHP_FUNCTION(getprotobynumber) { diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 5a6e611e8778a..9ab3d3512dadb 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -430,7 +430,7 @@ function sleep(int $seconds): int {} function usleep(int $microseconds): void {} -#if HAVE_NANOSLEEP +#ifdef HAVE_NANOSLEEP /** * @return array|bool * @refcount 1 @@ -509,20 +509,20 @@ function connection_status(): int {} function ignore_user_abort(?bool $enable = null): int {} -#if HAVE_GETSERVBYNAME +#ifdef HAVE_GETSERVBYNAME function getservbyname(string $service, string $protocol): int|false {} #endif -#if HAVE_GETSERVBYPORT +#ifdef HAVE_GETSERVBYPORT /** @refcount 1 */ function getservbyport(int $port, string $protocol): string|false {} #endif -#if HAVE_GETPROTOBYNAME +#ifdef HAVE_GETPROTOBYNAME function getprotobyname(string $protocol): int|false {} #endif -#if HAVE_GETPROTOBYNUMBER +#ifdef HAVE_GETPROTOBYNUMBER /** @refcount 1 */ function getprotobynumber(int $protocol): string|false {} #endif @@ -583,7 +583,7 @@ function crypt(string $string, string $salt): string {} /* datetime.c */ -#if HAVE_STRPTIME +#ifdef HAVE_STRPTIME /** * @return array|false * @deprecated @@ -611,7 +611,7 @@ function gethostbyname(string $hostname): string {} */ function gethostbynamel(string $hostname): array|false {} -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) function dns_check_record(string $hostname, string $type = "MX"): bool {} /** @alias dns_check_record */ @@ -647,7 +647,7 @@ function net_get_interfaces(): array|false {} /* ftok.c */ -#if HAVE_FTOK +#ifdef HAVE_FTOK function ftok(string $filename, string $project_id): int {} #endif @@ -781,7 +781,7 @@ function strspn(string $string, string $characters, int $offset = 0, ?int $lengt function strcspn(string $string, string $characters, int $offset = 0, ?int $length = null): int {} -#if HAVE_NL_LANGINFO +#ifdef HAVE_NL_LANGINFO /** @refcount 1 */ function nl_langinfo(int $item): string|false {} #endif @@ -1041,7 +1041,7 @@ function closedir($dir_handle = null): void {} function chdir(string $directory): bool {} -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) function chroot(string $directory): bool {} #endif @@ -1323,7 +1323,7 @@ function chown(string $filename, string|int $user): bool {} function chgrp(string $filename, string|int $group): bool {} -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN function lchown(string $filename, string|int $user): bool {} function lchgrp(string $filename, string|int $group): bool {} @@ -1331,9 +1331,8 @@ function lchgrp(string $filename, string|int $group): bool {} function chmod(string $filename, int $permissions): bool {} -#if HAVE_UTIME +#ifdef HAVE_UTIME function touch(string $filename, ?int $mtime = null, ?int $atime = null): bool {} -#endif function clearstatcache(bool $clear_realpath_cache = false, string $filename = ""): void {} @@ -1796,7 +1795,7 @@ function stream_socket_enable_crypto($stream, bool $enable, ?int $crypto_method function stream_socket_shutdown($stream, int $mode): bool {} #endif -#if HAVE_SOCKETPAIR +#ifdef HAVE_SOCKETPAIR /** * @return array|false * @refcount 1 @@ -1888,7 +1887,7 @@ function sapi_windows_vt100_support($stream, ?bool $enable = null): bool {} /** @param resource $stream */ function stream_set_chunk_size($stream, int $size): int {} -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) /** @param resource $stream */ function stream_set_timeout($stream, int $seconds, int $microseconds = 0): bool {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 10a6cfd7f2af0..1162315157f88 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: ed5328c35c17c591847feba6cb00f5badb2b446c */ + * Stub hash: f9668ae68c1f7d0336b974f83c2552fbf9bf898a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -413,14 +413,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_usleep, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, microseconds, IS_LONG, 0) ZEND_END_ARG_INFO() -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_time_nanosleep, 0, 2, MAY_BE_ARRAY|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, nanoseconds, IS_LONG, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_time_sleep_until, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, timestamp, IS_DOUBLE, 0) ZEND_END_ARG_INFO() @@ -519,27 +519,27 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ignore_user_abort, 0, 0, IS_LONG ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null") ZEND_END_ARG_INFO() -#if HAVE_GETSERVBYNAME +#if defined(HAVE_GETSERVBYNAME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getservbyname, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, service, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getservbyport, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, port, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_GETPROTOBYNAME +#if defined(HAVE_GETPROTOBYNAME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobyname, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, protocol, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobynumber, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, protocol, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -599,7 +599,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_crypt, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, salt, IS_STRING, 0) ZEND_END_ARG_INFO() -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strptime, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, timestamp, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) @@ -623,18 +623,18 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gethostbynamel, 0, 1, MAY_BE_ARR ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_END_ARG_INFO() -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_check_record, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 0, "\"MX\"") ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) #define arginfo_checkdnsrr arginfo_dns_check_record #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "DNS_ANY") @@ -644,7 +644,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARR ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_INFO(1, hosts) @@ -652,7 +652,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) #define arginfo_getmxrr arginfo_dns_get_mx #endif @@ -661,7 +661,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_net_get_interfaces, 0, 0, MAY_BE ZEND_END_ARG_INFO() #endif -#if HAVE_FTOK +#if defined(HAVE_FTOK) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ftok, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, project_id, IS_STRING, 0) @@ -820,7 +820,7 @@ ZEND_END_ARG_INFO() #define arginfo_strcspn arginfo_strspn -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_nl_langinfo, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, item, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -1113,7 +1113,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chdir, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chroot, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -1415,14 +1415,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chgrp, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_MASK(0, group, MAY_BE_STRING|MAY_BE_LONG, NULL) ZEND_END_ARG_INFO() -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lchown, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, user, MAY_BE_STRING|MAY_BE_LONG, NULL) ZEND_END_ARG_INFO() #endif -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_lchgrp, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, group, MAY_BE_STRING|MAY_BE_LONG, NULL) @@ -1434,7 +1434,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chmod, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, permissions, IS_LONG, 0) ZEND_END_ARG_INFO() -#if HAVE_UTIME +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_touch, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mtime, IS_LONG, 1, "null") @@ -1442,55 +1442,82 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_touch, 0, 1, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_clearstatcache, 0, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, clear_realpath_cache, _IS_BOOL, 0, "false") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filename, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_disk_total_space, 0, 1, MAY_BE_DOUBLE|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_disk_free_space arginfo_disk_total_space +#endif +#if defined(HAVE_UTIME) #define arginfo_diskfreespace arginfo_disk_total_space +#endif -#define arginfo_realpath_cache_get arginfo_ob_list_handlers +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_realpath_cache_get, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() +#endif -#define arginfo_realpath_cache_size arginfo_ob_get_level +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_realpath_cache_size, 0, 0, IS_LONG, 0) +ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sprintf, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_printf, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vprintf, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vsprintf, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fprintf, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vfprintf, 0, 3, IS_LONG, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_fsockopen, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "-1") @@ -1498,67 +1525,100 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_fsockopen, 0, 0, 1) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_message, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 1, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_pfsockopen arginfo_fsockopen +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_http_build_query, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, data, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, numeric_prefix, IS_STRING, 0, "\"\"") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arg_separator, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding_type, IS_LONG, 0, "PHP_QUERY_RFC1738") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_image_type_to_mime_type, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, image_type, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_image_type_to_extension, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, image_type, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, include_dot, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getimagesize, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, image_info, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getimagesizefromstring, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, image_info, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpinfo, 0, 0, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "INFO_ALL") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_phpversion, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, extension, IS_STRING, 1, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpcredits, 0, 0, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "CREDITS_ALL") ZEND_END_ARG_INFO() +#endif -#define arginfo_php_sapi_name arginfo_ob_get_flush +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_php_sapi_name, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) +ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_php_uname, 0, 0, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_STRING, 0, "\"a\"") ZEND_END_ARG_INFO() +#endif -#define arginfo_php_ini_scanned_files arginfo_ob_get_flush +#if defined(HAVE_UTIME) +#define arginfo_php_ini_scanned_files arginfo_php_sapi_name +#endif -#define arginfo_php_ini_loaded_file arginfo_ob_get_flush +#if defined(HAVE_UTIME) +#define arginfo_php_ini_loaded_file arginfo_php_sapi_name +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_iptcembed, 0, 2, MAY_BE_STRING|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, iptc_data, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spool, IS_LONG, 0, "0") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_iptcparse, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, iptc_block, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_levenshtein, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, string1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string2, IS_STRING, 0) @@ -1566,30 +1626,32 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_levenshtein, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, replacement_cost, IS_LONG, 0, "1") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, deletion_cost, IS_LONG, 0, "1") ZEND_END_ARG_INFO() +#endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_readlink, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_linkinfo, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_symlink, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, target, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, link, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) #define arginfo_link arginfo_symlink #endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mail, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, subject, IS_STRING, 0) @@ -1597,188 +1659,288 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mail, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_MASK(0, additional_headers, MAY_BE_ARRAY|MAY_BE_STRING, "[]") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, additional_params, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_abs, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ceil, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_floor arginfo_ceil +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_round, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, precision, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "PHP_ROUND_HALF_UP") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sin, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_cos arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_tan arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_asin arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_acos arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_atan arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_atanh arginfo_sin +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_atan2, 0, 2, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, y, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, x, IS_DOUBLE, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_sinh arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_cosh arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_tanh arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_asinh arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_acosh arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_expm1 arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_log1p arginfo_sin +#endif -#define arginfo_pi arginfo_lcg_value +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pi, 0, 0, IS_DOUBLE, 0) +ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_finite, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_is_nan arginfo_is_finite +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intdiv, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num2, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_is_infinite arginfo_is_finite +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pow, 0, 2, MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_OBJECT) ZEND_ARG_TYPE_INFO(0, num, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, exponent, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_exp arginfo_sin +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_log, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_DOUBLE, 0, "M_E") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_log10 arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_sqrt arginfo_sin +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_hypot, 0, 2, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, x, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, y, IS_DOUBLE, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_deg2rad arginfo_sin +#endif +#if defined(HAVE_UTIME) #define arginfo_rad2deg arginfo_sin +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_bindec, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO(0, binary_string, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hexdec, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO(0, hex_string, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_octdec, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO(0, octal_string, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_decbin, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, num, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_decoct arginfo_decbin +#endif +#if defined(HAVE_UTIME) #define arginfo_dechex arginfo_decbin +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_base_convert, 0, 3, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, num, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, from_base, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, to_base, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_number_format, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, decimals, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, decimal_separator, IS_STRING, 1, "\".\"") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, thousands_separator, IS_STRING, 1, "\",\"") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fmod, 0, 2, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num2, IS_DOUBLE, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_fdiv arginfo_fmod +#endif -#if defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_microtime, 0, 0, MAY_BE_STRING|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, as_float, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gettimeofday, 0, 0, MAY_BE_ARRAY|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, as_float, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_GETRUSAGE) +#if defined(HAVE_UTIME) && defined(HAVE_GETRUSAGE) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getrusage, 0, 0, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0") ZEND_END_ARG_INFO() #endif +#if defined(HAVE_UTIME) #define arginfo_pack arginfo_sprintf +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_unpack, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "0") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_get_info, 0, 1, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, hash, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_hash, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, algo, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_NULL, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_needs_rehash, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hash, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, algo, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_NULL, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_verify, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, hash, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif -#define arginfo_password_algos arginfo_ob_list_handlers +#if defined(HAVE_UTIME) +#define arginfo_password_algos arginfo_realpath_cache_get +#endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_INFO_EX(arginfo_proc_open, 0, 0, 3) ZEND_ARG_TYPE_MASK(0, command, MAY_BE_ARRAY|MAY_BE_STRING, NULL) ZEND_ARG_TYPE_INFO(0, descriptor_spec, IS_ARRAY, 0) @@ -1789,58 +1951,83 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_proc_open, 0, 0, 3) ZEND_END_ARG_INFO() #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_close, 0, 1, IS_LONG, 0) ZEND_ARG_INFO(0, process) ZEND_END_ARG_INFO() #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_terminate, 0, 1, _IS_BOOL, 0) ZEND_ARG_INFO(0, process) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, signal, IS_LONG, 0, "15") ZEND_END_ARG_INFO() #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_get_status, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, process) ZEND_END_ARG_INFO() #endif -#define arginfo_quoted_printable_decode arginfo_base64_encode +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_quoted_printable_decode, 0, 1, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) +ZEND_END_ARG_INFO() +#endif -#define arginfo_quoted_printable_encode arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_quoted_printable_encode arginfo_quoted_printable_decode +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mt_srand, 0, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, seed, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "MT_RAND_MT19937") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_srand arginfo_mt_srand +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rand, 0, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, max, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_mt_rand arginfo_rand +#endif -#define arginfo_mt_getrandmax arginfo_ob_get_level +#if defined(HAVE_UTIME) +#define arginfo_mt_getrandmax arginfo_realpath_cache_size +#endif -#define arginfo_getrandmax arginfo_ob_get_level +#if defined(HAVE_UTIME) +#define arginfo_getrandmax arginfo_realpath_cache_size +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_random_bytes, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_random_int, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, max, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif -#define arginfo_soundex arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_soundex arginfo_quoted_printable_decode +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) ZEND_ARG_TYPE_INFO(1, write, IS_ARRAY, 1) @@ -1848,53 +2035,75 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, microseconds, IS_LONG, 1, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_create, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, params, IS_ARRAY, 1, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_params, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, context) ZEND_ARG_TYPE_INFO(0, params, IS_ARRAY, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_params, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, context) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_option, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, context) ZEND_ARG_TYPE_MASK(0, wrapper_or_options, MAY_BE_ARRAY|MAY_BE_STRING, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, option_name, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, stream_or_context) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_default, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_set_default, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_prepend, 0, 0, 2) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, filter_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO(0, params, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_stream_filter_append arginfo_stream_filter_prepend +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_remove, 0, 1, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream_filter) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, address, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_code, "null") @@ -1903,7 +2112,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "STREAM_CLIENT_CONNECT") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, address, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_code, "null") @@ -1911,47 +2122,58 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "STREAM_SERVER_BIND | STREAM_SERVER_LISTEN") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_accept, 0, 0, 1) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 1, "null") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, peer_name, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_get_name, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO(0, remote, _IS_BOOL, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_recvfrom, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, address, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_sendto, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, address, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_enable_crypto, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, crypto_method, IS_LONG, 1, "null") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, session_stream, "null") ZEND_END_ARG_INFO() +#endif -#if defined(HAVE_SHUTDOWN) +#if defined(HAVE_UTIME) && defined(HAVE_SHUTDOWN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_socket_shutdown, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0) ZEND_END_ARG_INFO() #endif -#if HAVE_SOCKETPAIR +#if defined(HAVE_UTIME) && defined(HAVE_SOCKETPAIR) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, domain, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0) @@ -1959,69 +2181,107 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE ZEND_END_ARG_INFO() #endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_copy_to_stream, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_INFO(0, from) ZEND_ARG_INFO(0, to) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, length, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "0") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_contents, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, length, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() +#endif -#define arginfo_stream_supports_lock arginfo_rewind +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_supports_lock, 0, 1, _IS_BOOL, 0) + ZEND_ARG_INFO(0, stream) +ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_write_buffer, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_set_file_buffer arginfo_stream_set_write_buffer +#endif +#if defined(HAVE_UTIME) #define arginfo_stream_set_read_buffer arginfo_stream_set_write_buffer +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_blocking, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_socket_set_blocking arginfo_stream_set_blocking +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_get_meta_data, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, stream) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_socket_get_status arginfo_stream_get_meta_data +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_line, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, ending, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() +#endif -#define arginfo_stream_resolve_include_path arginfo_filetype +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_resolve_include_path, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) +ZEND_END_ARG_INFO() +#endif -#define arginfo_stream_get_wrappers arginfo_ob_list_handlers +#if defined(HAVE_UTIME) +#define arginfo_stream_get_wrappers arginfo_realpath_cache_get +#endif -#define arginfo_stream_get_transports arginfo_ob_list_handlers +#if defined(HAVE_UTIME) +#define arginfo_stream_get_transports arginfo_realpath_cache_get +#endif -#define arginfo_stream_is_local arginfo_rewind +#if defined(HAVE_UTIME) +#define arginfo_stream_is_local arginfo_stream_supports_lock +#endif -#define arginfo_stream_isatty arginfo_rewind +#if defined(HAVE_UTIME) +#define arginfo_stream_isatty arginfo_stream_supports_lock +#endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_vt100_support, 0, 1, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null") ZEND_END_ARG_INFO() #endif +#if defined(HAVE_UTIME) #define arginfo_stream_set_chunk_size arginfo_stream_set_write_buffer +#endif -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2029,174 +2289,265 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BO ZEND_END_ARG_INFO() #endif -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) #define arginfo_socket_set_timeout arginfo_stream_set_timeout #endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettype, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_get_debug_type arginfo_gettype +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_settype, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(1, var, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intval, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "10") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_floatval, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_doubleval arginfo_floatval +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_boolval, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_strval arginfo_gettype +#endif +#if defined(HAVE_UTIME) #define arginfo_is_null arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_resource arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_bool arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_int arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_integer arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_long arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_float arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_double arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_numeric arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_string arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_array arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_object arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_scalar arginfo_boolval +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_callable, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, syntax_only, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, callable_name, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_is_iterable arginfo_boolval +#endif +#if defined(HAVE_UTIME) #define arginfo_is_countable arginfo_boolval +#endif -#if defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_uniqid, 0, 0, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, prefix, IS_STRING, 0, "\"\"") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, more_entropy, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() #endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_parse_url, 0, 1, MAY_BE_LONG|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_NULL|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, url, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, component, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() +#endif -#define arginfo_urlencode arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_urlencode arginfo_quoted_printable_decode +#endif -#define arginfo_urldecode arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_urldecode arginfo_quoted_printable_decode +#endif -#define arginfo_rawurlencode arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_rawurlencode arginfo_quoted_printable_decode +#endif -#define arginfo_rawurldecode arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_rawurldecode arginfo_quoted_printable_decode +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_get_headers, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, url, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, associative, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_make_writeable, 0, 1, IS_OBJECT, 1) ZEND_ARG_INFO(0, brigade) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_prepend, 0, 2, IS_VOID, 0) ZEND_ARG_INFO(0, brigade) ZEND_ARG_TYPE_INFO(0, bucket, IS_OBJECT, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_stream_bucket_append arginfo_stream_bucket_prepend +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_new, 0, 2, IS_OBJECT, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, buffer, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif -#define arginfo_stream_get_filters arginfo_ob_list_handlers +#if defined(HAVE_UTIME) +#define arginfo_stream_get_filters arginfo_realpath_cache_get +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_register, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filter_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, class, IS_STRING, 0) ZEND_END_ARG_INFO() +#endif -#define arginfo_convert_uuencode arginfo_base64_encode +#if defined(HAVE_UTIME) +#define arginfo_convert_uuencode arginfo_quoted_printable_decode +#endif -#define arginfo_convert_uudecode arginfo_hex2bin +#if defined(HAVE_UTIME) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_convert_uudecode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) +ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_dump, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_export, 0, 1, IS_STRING, 1) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_debug_zval_dump arginfo_var_dump +#endif +#if defined(HAVE_UTIME) #define arginfo_serialize arginfo_gettype +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memory_get_usage, 0, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, real_usage, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() +#endif +#if defined(HAVE_UTIME) #define arginfo_memory_get_peak_usage arginfo_memory_get_usage +#endif -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memory_reset_peak_usage, 0, 0, IS_VOID, 0) -ZEND_END_ARG_INFO() - +#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_version_compare, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, version1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, version2, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, operator, IS_STRING, 1, "null") ZEND_END_ARG_INFO() +#endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_set, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, codepage, IS_LONG, 0) ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_get, 0, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, kind, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_conv, 0, 3, IS_STRING, 1) ZEND_ARG_TYPE_MASK(0, in_codepage, MAY_BE_LONG|MAY_BE_STRING, NULL) ZEND_ARG_TYPE_MASK(0, out_codepage, MAY_BE_LONG|MAY_BE_STRING, NULL) @@ -2204,19 +2555,19 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_conv, 0, 3, IS_S ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_is_utf8, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_set_ctrl_handler, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, handler, IS_CALLABLE, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, add, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_generate_ctrl_event, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, event, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pid, IS_LONG, 0, "0") @@ -2335,10 +2686,10 @@ ZEND_FUNCTION(getopt); ZEND_FUNCTION(flush); ZEND_FUNCTION(sleep); ZEND_FUNCTION(usleep); -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FUNCTION(time_nanosleep); #endif -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FUNCTION(time_sleep_until); #endif ZEND_FUNCTION(get_current_user); @@ -2364,16 +2715,16 @@ ZEND_FUNCTION(print_r); ZEND_FUNCTION(connection_aborted); ZEND_FUNCTION(connection_status); ZEND_FUNCTION(ignore_user_abort); -#if HAVE_GETSERVBYNAME +#if defined(HAVE_GETSERVBYNAME) ZEND_FUNCTION(getservbyname); #endif -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) ZEND_FUNCTION(getservbyport); #endif -#if HAVE_GETPROTOBYNAME +#if defined(HAVE_GETPROTOBYNAME) ZEND_FUNCTION(getprotobyname); #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) ZEND_FUNCTION(getprotobynumber); #endif ZEND_FUNCTION(register_tick_function); @@ -2391,7 +2742,7 @@ ZEND_FUNCTION(sys_getloadavg); ZEND_FUNCTION(get_browser); ZEND_FUNCTION(crc32); ZEND_FUNCTION(crypt); -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) ZEND_FUNCTION(strptime); #endif #if defined(HAVE_GETHOSTNAME) @@ -2400,19 +2751,19 @@ ZEND_FUNCTION(gethostname); ZEND_FUNCTION(gethostbyaddr); ZEND_FUNCTION(gethostbyname); ZEND_FUNCTION(gethostbynamel); -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FUNCTION(dns_check_record); #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FUNCTION(dns_get_record); #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FUNCTION(dns_get_mx); #endif #if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) ZEND_FUNCTION(net_get_interfaces); #endif -#if HAVE_FTOK +#if defined(HAVE_FTOK) ZEND_FUNCTION(ftok); #endif ZEND_FUNCTION(hrtime); @@ -2460,7 +2811,7 @@ ZEND_FUNCTION(bin2hex); ZEND_FUNCTION(hex2bin); ZEND_FUNCTION(strspn); ZEND_FUNCTION(strcspn); -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) ZEND_FUNCTION(nl_langinfo); #endif ZEND_FUNCTION(strcoll); @@ -2530,7 +2881,7 @@ ZEND_FUNCTION(opendir); ZEND_FUNCTION(dir); ZEND_FUNCTION(closedir); ZEND_FUNCTION(chdir); -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) ZEND_FUNCTION(chroot); #endif ZEND_FUNCTION(getcwd); @@ -2609,242 +2960,563 @@ ZEND_FUNCTION(stat); ZEND_FUNCTION(lstat); ZEND_FUNCTION(chown); ZEND_FUNCTION(chgrp); -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FUNCTION(lchown); #endif -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FUNCTION(lchgrp); #endif ZEND_FUNCTION(chmod); -#if HAVE_UTIME +#if defined(HAVE_UTIME) ZEND_FUNCTION(touch); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(clearstatcache); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(disk_total_space); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(disk_free_space); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(realpath_cache_get); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(realpath_cache_size); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(sprintf); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(printf); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(vprintf); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(vsprintf); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(fprintf); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(vfprintf); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(fsockopen); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(pfsockopen); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(http_build_query); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(image_type_to_mime_type); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(image_type_to_extension); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(getimagesize); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(getimagesizefromstring); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(phpinfo); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(phpversion); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(phpcredits); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(php_sapi_name); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(php_uname); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(php_ini_scanned_files); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(php_ini_loaded_file); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(iptcembed); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(iptcparse); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(levenshtein); -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(readlink); #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(linkinfo); #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(symlink); #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(link); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(mail); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(abs); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(ceil); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(floor); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(round); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(sin); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(cos); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(tan); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(asin); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(acos); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(atan); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(atanh); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(atan2); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(sinh); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(cosh); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(tanh); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(asinh); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(acosh); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(expm1); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(log1p); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(pi); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_finite); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_nan); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(intdiv); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_infinite); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(pow); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(exp); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(log); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(log10); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(sqrt); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(hypot); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(deg2rad); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(rad2deg); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(bindec); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(hexdec); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(octdec); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(decbin); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(decoct); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(dechex); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(base_convert); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(number_format); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(fmod); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(fdiv); -#if defined(HAVE_GETTIMEOFDAY) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(microtime); #endif -#if defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(gettimeofday); #endif -#if defined(HAVE_GETRUSAGE) +#if defined(HAVE_UTIME) && defined(HAVE_GETRUSAGE) ZEND_FUNCTION(getrusage); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(pack); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(unpack); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(password_get_info); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(password_hash); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(password_needs_rehash); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(password_verify); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(password_algos); -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#endif +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_open); #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_close); #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_terminate); #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_get_status); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(quoted_printable_decode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(quoted_printable_encode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(mt_srand); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(rand); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(mt_rand); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(mt_getrandmax); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(random_bytes); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(random_int); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(soundex); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_select); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_create); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_set_params); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_get_params); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_set_option); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_get_options); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_get_default); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_set_default); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_prepend); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_append); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_remove); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_client); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_server); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_accept); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_get_name); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_recvfrom); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_sendto); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_enable_crypto); -#if defined(HAVE_SHUTDOWN) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_SHUTDOWN) ZEND_FUNCTION(stream_socket_shutdown); #endif -#if HAVE_SOCKETPAIR +#if defined(HAVE_UTIME) && defined(HAVE_SOCKETPAIR) ZEND_FUNCTION(stream_socket_pair); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_copy_to_stream); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_contents); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_supports_lock); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_write_buffer); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_read_buffer); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_blocking); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_meta_data); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_line); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_resolve_include_path); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_wrappers); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_transports); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_is_local); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_isatty); -#if defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_vt100_support); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_chunk_size); -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FUNCTION(stream_set_timeout); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(gettype); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(get_debug_type); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(settype); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(intval); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(floatval); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(boolval); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(strval); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_null); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_resource); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_bool); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_int); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_float); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_numeric); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_string); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_array); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_object); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_scalar); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_callable); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_iterable); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(is_countable); -#if defined(HAVE_GETTIMEOFDAY) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(uniqid); #endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(parse_url); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(urlencode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(urldecode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(rawurlencode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(rawurldecode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(get_headers); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_make_writeable); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_prepend); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_append); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_new); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_filters); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_register); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(convert_uuencode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(convert_uudecode); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(var_dump); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(var_export); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(debug_zval_dump); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(serialize); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(unserialize); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(memory_get_usage); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(memory_get_peak_usage); -ZEND_FUNCTION(memory_reset_peak_usage); +#endif +#if defined(HAVE_UTIME) ZEND_FUNCTION(version_compare); -#if defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_set); #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_get); #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_conv); #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_is_utf8); #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_set_ctrl_handler); #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_generate_ctrl_event); #endif @@ -2965,10 +3637,10 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(flush, arginfo_flush) ZEND_FE(sleep, arginfo_sleep) ZEND_FE(usleep, arginfo_usleep) -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FE(time_nanosleep, arginfo_time_nanosleep) #endif -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) ZEND_FE(time_sleep_until, arginfo_time_sleep_until) #endif ZEND_FE(get_current_user, arginfo_get_current_user) @@ -2996,16 +3668,16 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(connection_aborted, arginfo_connection_aborted) ZEND_FE(connection_status, arginfo_connection_status) ZEND_FE(ignore_user_abort, arginfo_ignore_user_abort) -#if HAVE_GETSERVBYNAME +#if defined(HAVE_GETSERVBYNAME) ZEND_FE(getservbyname, arginfo_getservbyname) #endif -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) ZEND_FE(getservbyport, arginfo_getservbyport) #endif -#if HAVE_GETPROTOBYNAME +#if defined(HAVE_GETPROTOBYNAME) ZEND_FE(getprotobyname, arginfo_getprotobyname) #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) ZEND_FE(getprotobynumber, arginfo_getprotobynumber) #endif ZEND_FE(register_tick_function, arginfo_register_tick_function) @@ -3023,7 +3695,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(get_browser, arginfo_get_browser) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(crc32, arginfo_crc32) ZEND_FE(crypt, arginfo_crypt) -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) ZEND_DEP_FE(strptime, arginfo_strptime) #endif #if defined(HAVE_GETHOSTNAME) @@ -3032,25 +3704,25 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(gethostbyaddr, arginfo_gethostbyaddr) ZEND_FE(gethostbyname, arginfo_gethostbyname) ZEND_FE(gethostbynamel, arginfo_gethostbynamel) -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FE(dns_check_record, arginfo_dns_check_record) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FALIAS(checkdnsrr, dns_check_record, arginfo_checkdnsrr) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FE(dns_get_record, arginfo_dns_get_record) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FE(dns_get_mx, arginfo_dns_get_mx) #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) ZEND_FALIAS(getmxrr, dns_get_mx, arginfo_getmxrr) #endif #if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) ZEND_FE(net_get_interfaces, arginfo_net_get_interfaces) #endif -#if HAVE_FTOK +#if defined(HAVE_FTOK) ZEND_FE(ftok, arginfo_ftok) #endif ZEND_FE(hrtime, arginfo_hrtime) @@ -3098,7 +3770,7 @@ static const zend_function_entry ext_functions[] = { ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hex2bin, arginfo_hex2bin) ZEND_FE(strspn, arginfo_strspn) ZEND_FE(strcspn, arginfo_strcspn) -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) ZEND_FE(nl_langinfo, arginfo_nl_langinfo) #endif ZEND_FE(strcoll, arginfo_strcoll) @@ -3171,7 +3843,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(dir, arginfo_dir) ZEND_FE(closedir, arginfo_closedir) ZEND_FE(chdir, arginfo_chdir) -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) ZEND_FE(chroot, arginfo_chroot) #endif ZEND_FE(getcwd, arginfo_getcwd) @@ -3252,255 +3924,596 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(lstat, arginfo_lstat) ZEND_FE(chown, arginfo_chown) ZEND_FE(chgrp, arginfo_chgrp) -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FE(lchown, arginfo_lchown) #endif -#if HAVE_LCHOWN +#if defined(HAVE_LCHOWN) ZEND_FE(lchgrp, arginfo_lchgrp) #endif ZEND_FE(chmod, arginfo_chmod) -#if HAVE_UTIME +#if defined(HAVE_UTIME) ZEND_FE(touch, arginfo_touch) #endif +#if defined(HAVE_UTIME) ZEND_FE(clearstatcache, arginfo_clearstatcache) +#endif +#if defined(HAVE_UTIME) ZEND_FE(disk_total_space, arginfo_disk_total_space) +#endif +#if defined(HAVE_UTIME) ZEND_FE(disk_free_space, arginfo_disk_free_space) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(diskfreespace, disk_free_space, arginfo_diskfreespace) +#endif +#if defined(HAVE_UTIME) ZEND_FE(realpath_cache_get, arginfo_realpath_cache_get) +#endif +#if defined(HAVE_UTIME) ZEND_FE(realpath_cache_size, arginfo_realpath_cache_size) +#endif +#if defined(HAVE_UTIME) ZEND_FE(sprintf, arginfo_sprintf) +#endif +#if defined(HAVE_UTIME) ZEND_FE(printf, arginfo_printf) +#endif +#if defined(HAVE_UTIME) ZEND_FE(vprintf, arginfo_vprintf) +#endif +#if defined(HAVE_UTIME) ZEND_FE(vsprintf, arginfo_vsprintf) +#endif +#if defined(HAVE_UTIME) ZEND_FE(fprintf, arginfo_fprintf) +#endif +#if defined(HAVE_UTIME) ZEND_FE(vfprintf, arginfo_vfprintf) +#endif +#if defined(HAVE_UTIME) ZEND_FE(fsockopen, arginfo_fsockopen) +#endif +#if defined(HAVE_UTIME) ZEND_FE(pfsockopen, arginfo_pfsockopen) +#endif +#if defined(HAVE_UTIME) ZEND_FE(http_build_query, arginfo_http_build_query) +#endif +#if defined(HAVE_UTIME) ZEND_FE(image_type_to_mime_type, arginfo_image_type_to_mime_type) +#endif +#if defined(HAVE_UTIME) ZEND_FE(image_type_to_extension, arginfo_image_type_to_extension) +#endif +#if defined(HAVE_UTIME) ZEND_FE(getimagesize, arginfo_getimagesize) +#endif +#if defined(HAVE_UTIME) ZEND_FE(getimagesizefromstring, arginfo_getimagesizefromstring) +#endif +#if defined(HAVE_UTIME) ZEND_FE(phpinfo, arginfo_phpinfo) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(phpversion, arginfo_phpversion) +#endif +#if defined(HAVE_UTIME) ZEND_FE(phpcredits, arginfo_phpcredits) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_sapi_name, arginfo_php_sapi_name) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_uname, arginfo_php_uname) +#endif +#if defined(HAVE_UTIME) ZEND_FE(php_ini_scanned_files, arginfo_php_ini_scanned_files) +#endif +#if defined(HAVE_UTIME) ZEND_FE(php_ini_loaded_file, arginfo_php_ini_loaded_file) +#endif +#if defined(HAVE_UTIME) ZEND_FE(iptcembed, arginfo_iptcembed) +#endif +#if defined(HAVE_UTIME) ZEND_FE(iptcparse, arginfo_iptcparse) +#endif +#if defined(HAVE_UTIME) ZEND_FE(levenshtein, arginfo_levenshtein) -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(readlink, arginfo_readlink) #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(linkinfo, arginfo_linkinfo) #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(symlink, arginfo_symlink) #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(link, arginfo_link) #endif +#if defined(HAVE_UTIME) ZEND_FE(mail, arginfo_mail) +#endif +#if defined(HAVE_UTIME) ZEND_FE(abs, arginfo_abs) +#endif +#if defined(HAVE_UTIME) ZEND_FE(ceil, arginfo_ceil) +#endif +#if defined(HAVE_UTIME) ZEND_FE(floor, arginfo_floor) +#endif +#if defined(HAVE_UTIME) ZEND_FE(round, arginfo_round) +#endif +#if defined(HAVE_UTIME) ZEND_FE(sin, arginfo_sin) +#endif +#if defined(HAVE_UTIME) ZEND_FE(cos, arginfo_cos) +#endif +#if defined(HAVE_UTIME) ZEND_FE(tan, arginfo_tan) +#endif +#if defined(HAVE_UTIME) ZEND_FE(asin, arginfo_asin) +#endif +#if defined(HAVE_UTIME) ZEND_FE(acos, arginfo_acos) +#endif +#if defined(HAVE_UTIME) ZEND_FE(atan, arginfo_atan) +#endif +#if defined(HAVE_UTIME) ZEND_FE(atanh, arginfo_atanh) +#endif +#if defined(HAVE_UTIME) ZEND_FE(atan2, arginfo_atan2) +#endif +#if defined(HAVE_UTIME) ZEND_FE(sinh, arginfo_sinh) +#endif +#if defined(HAVE_UTIME) ZEND_FE(cosh, arginfo_cosh) +#endif +#if defined(HAVE_UTIME) ZEND_FE(tanh, arginfo_tanh) +#endif +#if defined(HAVE_UTIME) ZEND_FE(asinh, arginfo_asinh) +#endif +#if defined(HAVE_UTIME) ZEND_FE(acosh, arginfo_acosh) +#endif +#if defined(HAVE_UTIME) ZEND_FE(expm1, arginfo_expm1) +#endif +#if defined(HAVE_UTIME) ZEND_FE(log1p, arginfo_log1p) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pi, arginfo_pi) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_finite, arginfo_is_finite) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_nan, arginfo_is_nan) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(intdiv, arginfo_intdiv) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_infinite, arginfo_is_infinite) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pow, arginfo_pow) +#endif +#if defined(HAVE_UTIME) ZEND_FE(exp, arginfo_exp) +#endif +#if defined(HAVE_UTIME) ZEND_FE(log, arginfo_log) +#endif +#if defined(HAVE_UTIME) ZEND_FE(log10, arginfo_log10) +#endif +#if defined(HAVE_UTIME) ZEND_FE(sqrt, arginfo_sqrt) +#endif +#if defined(HAVE_UTIME) ZEND_FE(hypot, arginfo_hypot) +#endif +#if defined(HAVE_UTIME) ZEND_FE(deg2rad, arginfo_deg2rad) +#endif +#if defined(HAVE_UTIME) ZEND_FE(rad2deg, arginfo_rad2deg) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(bindec, arginfo_bindec) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hexdec, arginfo_hexdec) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(octdec, arginfo_octdec) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decbin, arginfo_decbin) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decoct, arginfo_decoct) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(dechex, arginfo_dechex) +#endif +#if defined(HAVE_UTIME) ZEND_FE(base_convert, arginfo_base_convert) +#endif +#if defined(HAVE_UTIME) ZEND_FE(number_format, arginfo_number_format) +#endif +#if defined(HAVE_UTIME) ZEND_FE(fmod, arginfo_fmod) +#endif +#if defined(HAVE_UTIME) ZEND_FE(fdiv, arginfo_fdiv) -#if defined(HAVE_GETTIMEOFDAY) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_FE(microtime, arginfo_microtime) #endif -#if defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_FE(gettimeofday, arginfo_gettimeofday) #endif -#if defined(HAVE_GETRUSAGE) +#if defined(HAVE_UTIME) && defined(HAVE_GETRUSAGE) ZEND_FE(getrusage, arginfo_getrusage) #endif +#if defined(HAVE_UTIME) ZEND_FE(pack, arginfo_pack) +#endif +#if defined(HAVE_UTIME) ZEND_FE(unpack, arginfo_unpack) +#endif +#if defined(HAVE_UTIME) ZEND_FE(password_get_info, arginfo_password_get_info) +#endif +#if defined(HAVE_UTIME) ZEND_FE(password_hash, arginfo_password_hash) +#endif +#if defined(HAVE_UTIME) ZEND_FE(password_needs_rehash, arginfo_password_needs_rehash) +#endif +#if defined(HAVE_UTIME) ZEND_FE(password_verify, arginfo_password_verify) +#endif +#if defined(HAVE_UTIME) ZEND_FE(password_algos, arginfo_password_algos) -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#endif +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_open, arginfo_proc_open) #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_close, arginfo_proc_close) #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_terminate, arginfo_proc_terminate) #endif -#if defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_get_status, arginfo_proc_get_status) #endif +#if defined(HAVE_UTIME) ZEND_FE(quoted_printable_decode, arginfo_quoted_printable_decode) +#endif +#if defined(HAVE_UTIME) ZEND_FE(quoted_printable_encode, arginfo_quoted_printable_encode) +#endif +#if defined(HAVE_UTIME) ZEND_FE(mt_srand, arginfo_mt_srand) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(srand, mt_srand, arginfo_srand) +#endif +#if defined(HAVE_UTIME) ZEND_FE(rand, arginfo_rand) +#endif +#if defined(HAVE_UTIME) ZEND_FE(mt_rand, arginfo_mt_rand) +#endif +#if defined(HAVE_UTIME) ZEND_FE(mt_getrandmax, arginfo_mt_getrandmax) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(getrandmax, mt_getrandmax, arginfo_getrandmax) +#endif +#if defined(HAVE_UTIME) ZEND_FE(random_bytes, arginfo_random_bytes) +#endif +#if defined(HAVE_UTIME) ZEND_FE(random_int, arginfo_random_int) +#endif +#if defined(HAVE_UTIME) ZEND_FE(soundex, arginfo_soundex) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_select, arginfo_stream_select) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_create, arginfo_stream_context_create) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_set_params, arginfo_stream_context_set_params) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_get_params, arginfo_stream_context_get_params) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_set_option, arginfo_stream_context_set_option) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_get_options, arginfo_stream_context_get_options) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_get_default, arginfo_stream_context_get_default) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_context_set_default, arginfo_stream_context_set_default) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_filter_prepend, arginfo_stream_filter_prepend) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_filter_append, arginfo_stream_filter_append) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_filter_remove, arginfo_stream_filter_remove) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_client, arginfo_stream_socket_client) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_server, arginfo_stream_socket_server) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_accept, arginfo_stream_socket_accept) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_get_name, arginfo_stream_socket_get_name) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_recvfrom, arginfo_stream_socket_recvfrom) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_sendto, arginfo_stream_socket_sendto) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_socket_enable_crypto, arginfo_stream_socket_enable_crypto) -#if defined(HAVE_SHUTDOWN) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_SHUTDOWN) ZEND_FE(stream_socket_shutdown, arginfo_stream_socket_shutdown) #endif -#if HAVE_SOCKETPAIR +#if defined(HAVE_UTIME) && defined(HAVE_SOCKETPAIR) ZEND_FE(stream_socket_pair, arginfo_stream_socket_pair) #endif +#if defined(HAVE_UTIME) ZEND_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_get_contents, arginfo_stream_get_contents) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_supports_lock, arginfo_stream_supports_lock) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_set_write_buffer, arginfo_stream_set_write_buffer) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(set_file_buffer, stream_set_write_buffer, arginfo_set_file_buffer) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_set_read_buffer, arginfo_stream_set_read_buffer) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_set_blocking, arginfo_stream_set_blocking) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(socket_set_blocking, stream_set_blocking, arginfo_socket_set_blocking) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_get_meta_data, arginfo_stream_get_meta_data) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(socket_get_status, stream_get_meta_data, arginfo_socket_get_status) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_get_line, arginfo_stream_get_line) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_get_wrappers, arginfo_stream_get_wrappers) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_get_transports, arginfo_stream_get_transports) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_is_local, arginfo_stream_is_local) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_isatty, arginfo_stream_isatty) -#if defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_vt100_support, arginfo_sapi_windows_vt100_support) #endif +#if defined(HAVE_UTIME) ZEND_FE(stream_set_chunk_size, arginfo_stream_set_chunk_size) -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FE(stream_set_timeout, arginfo_stream_set_timeout) #endif -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FALIAS(socket_set_timeout, stream_set_timeout, arginfo_socket_set_timeout) #endif +#if defined(HAVE_UTIME) ZEND_FE(gettype, arginfo_gettype) +#endif +#if defined(HAVE_UTIME) ZEND_FE(get_debug_type, arginfo_get_debug_type) +#endif +#if defined(HAVE_UTIME) ZEND_FE(settype, arginfo_settype) +#endif +#if defined(HAVE_UTIME) ZEND_FE(intval, arginfo_intval) +#endif +#if defined(HAVE_UTIME) ZEND_FE(floatval, arginfo_floatval) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(doubleval, floatval, arginfo_doubleval) +#endif +#if defined(HAVE_UTIME) ZEND_FE(boolval, arginfo_boolval) +#endif +#if defined(HAVE_UTIME) ZEND_FE(strval, arginfo_strval) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_null, arginfo_is_null) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_resource, arginfo_is_resource) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_bool, arginfo_is_bool) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_int, arginfo_is_int) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(is_integer, is_int, arginfo_is_integer) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(is_long, is_int, arginfo_is_long) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_float, arginfo_is_float) +#endif +#if defined(HAVE_UTIME) ZEND_FALIAS(is_double, is_float, arginfo_is_double) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_numeric, arginfo_is_numeric) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_string, arginfo_is_string) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_array, arginfo_is_array) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_object, arginfo_is_object) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_scalar, arginfo_is_scalar) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_callable, arginfo_is_callable) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_iterable, arginfo_is_iterable) +#endif +#if defined(HAVE_UTIME) ZEND_FE(is_countable, arginfo_is_countable) -#if defined(HAVE_GETTIMEOFDAY) +#endif +#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) ZEND_FE(uniqid, arginfo_uniqid) #endif +#if defined(HAVE_UTIME) ZEND_FE(parse_url, arginfo_parse_url) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urlencode, arginfo_urlencode) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urldecode, arginfo_urldecode) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurlencode, arginfo_rawurlencode) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurldecode, arginfo_rawurldecode) +#endif +#if defined(HAVE_UTIME) ZEND_FE(get_headers, arginfo_get_headers) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_make_writeable, arginfo_stream_bucket_make_writeable) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_prepend, arginfo_stream_bucket_prepend) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_append, arginfo_stream_bucket_append) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_new, arginfo_stream_bucket_new) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_get_filters, arginfo_stream_get_filters) +#endif +#if defined(HAVE_UTIME) ZEND_FE(stream_filter_register, arginfo_stream_filter_register) +#endif +#if defined(HAVE_UTIME) ZEND_FE(convert_uuencode, arginfo_convert_uuencode) +#endif +#if defined(HAVE_UTIME) ZEND_FE(convert_uudecode, arginfo_convert_uudecode) +#endif +#if defined(HAVE_UTIME) ZEND_FE(var_dump, arginfo_var_dump) +#endif +#if defined(HAVE_UTIME) ZEND_FE(var_export, arginfo_var_export) +#endif +#if defined(HAVE_UTIME) ZEND_FE(debug_zval_dump, arginfo_debug_zval_dump) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(serialize, arginfo_serialize) +#endif +#if defined(HAVE_UTIME) ZEND_FE(unserialize, arginfo_unserialize) +#endif +#if defined(HAVE_UTIME) ZEND_FE(memory_get_usage, arginfo_memory_get_usage) +#endif +#if defined(HAVE_UTIME) ZEND_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage) - ZEND_FE(memory_reset_peak_usage, arginfo_memory_reset_peak_usage) +#endif +#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(version_compare, arginfo_version_compare) -#if defined(PHP_WIN32) +#endif +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set) #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_get, arginfo_sapi_windows_cp_get) #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_conv, arginfo_sapi_windows_cp_conv) #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_is_utf8, arginfo_sapi_windows_cp_is_utf8) #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_set_ctrl_handler, arginfo_sapi_windows_set_ctrl_handler) #endif -#if defined(PHP_WIN32) +#if defined(HAVE_UTIME) && defined(PHP_WIN32) ZEND_FE(sapi_windows_generate_ctrl_event, arginfo_sapi_windows_generate_ctrl_event) #endif ZEND_FE_END diff --git a/ext/standard/crc32.c b/ext/standard/crc32.c index 221b864ba58d5..d13eee14fbe9d 100644 --- a/ext/standard/crc32.c +++ b/ext/standard/crc32.c @@ -19,7 +19,7 @@ #include "crc32.h" #include "crc32_x86.h" -#if HAVE_AARCH64_CRC32 +#ifdef HAVE_AARCH64_CRC32 # include # if defined(__linux__) # include @@ -91,7 +91,7 @@ static uint32_t crc32_aarch64(uint32_t crc, const char *p, size_t nr) { PHPAPI uint32_t php_crc32_bulk_update(uint32_t crc, const char *p, size_t nr) { -#if HAVE_AARCH64_CRC32 +#ifdef HAVE_AARCH64_CRC32 if (has_crc32_insn()) { crc = crc32_aarch64(crc, p, nr); return crc; diff --git a/ext/standard/crypt.c b/ext/standard/crypt.c index 117071bffc235..fa18dd316e889 100644 --- a/ext/standard/crypt.c +++ b/ext/standard/crypt.c @@ -21,14 +21,14 @@ #include "php.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #if PHP_USE_PHP_CRYPT_R # include "php_crypt_r.h" # include "crypt_freesec.h" #else -# if HAVE_CRYPT_H +# ifdef HAVE_CRYPT_H # if defined(CRYPT_R_GNU_SOURCE) && !defined(_GNU_SOURCE) # define _GNU_SOURCE # endif diff --git a/ext/standard/crypt_sha512.c b/ext/standard/crypt_sha512.c index f896dad5a8142..a7696d63f7e84 100644 --- a/ext/standard/crypt_sha512.c +++ b/ext/standard/crypt_sha512.c @@ -296,7 +296,7 @@ sha512_process_bytes(const void *buffer, size_t len, struct sha512_ctx *ctx) { /* Process available complete blocks. */ if (len >= 128) { -#if !_STRING_ARCH_unaligned +#ifndef _STRING_ARCH_unaligned /* To check alignment gcc has an appropriate operator. Other compilers don't. */ # if __GNUC__ >= 2 diff --git a/ext/standard/datetime.c b/ext/standard/datetime.c index d8054336bffc6..5308a0e249487 100644 --- a/ext/standard/datetime.c +++ b/ext/standard/datetime.c @@ -62,7 +62,7 @@ PHPAPI char *php_std_date(time_t t) } /* }}} */ -#if HAVE_STRPTIME +#ifdef HAVE_STRPTIME #ifndef HAVE_STRPTIME_DECL_FAILS char *strptime(const char *s, const char *format, struct tm *tm); #endif diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 7c9012cb6b198..8f2ddf742b679 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -25,7 +25,7 @@ #include "basic_functions.h" #include "dir_arginfo.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif @@ -268,7 +268,7 @@ PHP_FUNCTION(closedir) } /* }}} */ -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC +#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) /* {{{ Change root directory */ PHP_FUNCTION(chroot) { @@ -342,9 +342,9 @@ PHP_FUNCTION(getcwd) ZEND_PARSE_PARAMETERS_NONE(); -#if HAVE_GETCWD +#ifdef HAVE_GETCWD ret = VCWD_GETCWD(path, MAXPATHLEN); -#elif HAVE_GETWD +#elif defined(HAVE_GETWD) ret = VCWD_GETWD(path); #endif diff --git a/ext/standard/dl.c b/ext/standard/dl.c index 77d296ced77a9..15755962f410f 100644 --- a/ext/standard/dl.c +++ b/ext/standard/dl.c @@ -24,7 +24,7 @@ #include "SAPI.h" -#if defined(HAVE_LIBDL) +#ifdef HAVE_LIBDL #include #include #include @@ -65,7 +65,7 @@ PHPAPI PHP_FUNCTION(dl) } /* }}} */ -#if defined(HAVE_LIBDL) +#ifdef HAVE_LIBDL /* {{{ php_load_shlib */ PHPAPI void *php_load_shlib(const char *path, char **errp) diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 6d22e644a8eff..01d97ce0c4e7b 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -20,7 +20,7 @@ #include "php.h" #include "php_network.h" -#if HAVE_SYS_SOCKET_H +#ifdef HAVE_SYS_SOCKET_H #include #endif @@ -31,7 +31,7 @@ # include #else #include -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H #include #endif #include @@ -39,13 +39,13 @@ #undef STATUS #undef T_UNSPEC #endif -#if HAVE_ARPA_NAMESER_H +#ifdef HAVE_ARPA_NAMESER_H #ifdef DARWIN # define BIND_8_COMPAT 1 #endif #include #endif -#if HAVE_RESOLV_H +#ifdef HAVE_RESOLV_H #include #if defined(__HAIKU__) extern void __res_ndestroy(res_state statp); @@ -157,7 +157,7 @@ PHP_FUNCTION(gethostbyaddr) hostname = php_gethostbyaddr(addr); if (hostname == NULL) { -#if HAVE_IPV6 && HAVE_INET_PTON +#if defined(HAVE_IPV6) && defined(HAVE_INET_PTON) php_error_docref(NULL, E_WARNING, "Address is not a valid IPv4 or IPv6 address"); #else php_error_docref(NULL, E_WARNING, "Address is not in a.b.c.d form"); @@ -172,7 +172,7 @@ PHP_FUNCTION(gethostbyaddr) /* {{{ php_gethostbyaddr */ static zend_string *php_gethostbyaddr(char *ip) { -#if HAVE_IPV6 && HAVE_INET_PTON +#if defined(HAVE_IPV6) && defined(HAVE_INET_PTON) struct sockaddr_in sa4; struct sockaddr_in6 sa6; char out[NI_MAXHOST]; @@ -316,7 +316,7 @@ static zend_string *php_gethostbyname(char *name) } /* }}} */ -#if HAVE_FULL_DNS_FUNCS || defined(PHP_WIN32) +#if defined(HAVE_FULL_DNS_FUNCS) || defined(PHP_WIN32) # define PHP_DNS_NUM_TYPES 13 /* Number of DNS Types Supported by PHP currently */ # define PHP_DNS_A 0x00000001 @@ -337,7 +337,7 @@ static zend_string *php_gethostbyname(char *name) #endif /* HAVE_FULL_DNS_FUNCS || defined(PHP_WIN32) */ /* Note: These functions are defined in ext/standard/dns_win32.c for Windows! */ -#if !defined(PHP_WIN32) && HAVE_DNS_SEARCH_FUNC +#if !defined(PHP_WIN32) && defined(HAVE_DNS_SEARCH_FUNC) #ifndef HFIXEDSZ #define HFIXEDSZ 12 /* fixed data in header */ @@ -454,7 +454,7 @@ PHP_FUNCTION(dns_check_record) } /* }}} */ -#if HAVE_FULL_DNS_FUNCS +#ifdef HAVE_FULL_DNS_FUNCS #define CHECKCP(n) do { \ if (cp + n > end) { \ @@ -1162,7 +1162,7 @@ PHP_FUNCTION(dns_get_mx) #endif /* HAVE_FULL_DNS_FUNCS */ #endif /* !defined(PHP_WIN32) && HAVE_DNS_SEARCH_FUNC */ -#if HAVE_FULL_DNS_FUNCS && !defined(PHP_WIN32) +#if defined(HAVE_FULL_DNS_FUNCS) && !defined(PHP_WIN32) PHP_MINIT_FUNCTION(dns) { REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DNS_NS", PHP_DNS_NS, CONST_CS | CONST_PERSISTENT); diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 1831b8eaa54d7..1b1b0ab9e9ce1 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -26,23 +26,23 @@ #include "php_globals.h" #include "SAPI.h" -#if HAVE_SYS_WAIT_H +#ifdef HAVE_SYS_WAIT_H #include #endif #include -#if HAVE_SYS_TYPES_H +#ifdef HAVE_SYS_TYPES_H #include #endif -#if HAVE_SYS_STAT_H +#ifdef HAVE_SYS_STAT_H #include #endif -#if HAVE_FCNTL_H +#ifdef HAVE_FCNTL_H #include #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/file.c b/ext/standard/file.c index 4c31ee0eae661..628b8dc8f0fe1 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -65,7 +65,7 @@ #include "php_string.h" #include "file.h" -#if HAVE_PWD_H +#ifdef HAVE_PWD_H # ifdef PHP_WIN32 # include "win32/pwd.h" # else @@ -246,7 +246,7 @@ PHP_MINIT_FUNCTION(file) REGISTER_LONG_CONSTANT("STREAM_PF_INET", AF_INET, CONST_CS|CONST_PERSISTENT); #endif -#if HAVE_IPV6 +#ifdef HAVE_IPV6 # ifdef PF_INET6 REGISTER_LONG_CONSTANT("STREAM_PF_INET6", PF_INET6, CONST_CS|CONST_PERSISTENT); # elif defined(AF_INET6) diff --git a/ext/standard/file.h b/ext/standard/file.h index be7e3cf8e6d02..7fe9c4738faa6 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -96,7 +96,7 @@ typedef struct { HashTable *stream_filters; /* per-request copy of stream_filters_hash */ HashTable *wrapper_errors; /* key: wrapper address; value: linked list of char* */ int pclose_wait; -#if defined(HAVE_GETHOSTBYNAME_R) +#ifdef HAVE_GETHOSTBYNAME_R struct hostent tmp_host_info; char *tmp_host_buf; size_t tmp_host_buf_len; diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c index 2937f6a6da18a..a11ecf09f8f13 100644 --- a/ext/standard/filestat.c +++ b/ext/standard/filestat.c @@ -25,15 +25,15 @@ #include #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H # include #endif -#if HAVE_SYS_PARAM_H +#ifdef HAVE_SYS_PARAM_H # include #endif -#if HAVE_SYS_VFS_H +#ifdef HAVE_SYS_VFS_H # include #endif @@ -60,7 +60,7 @@ # include #endif -#if HAVE_PWD_H +#ifdef HAVE_PWD_H # ifdef PHP_WIN32 # include "win32/pwd.h" # else @@ -72,7 +72,7 @@ # include #endif -#if HAVE_UTIME +#ifdef HAVE_UTIME # ifdef PHP_WIN32 # include # else @@ -373,7 +373,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ RETURN_FALSE; } } else { -#if !defined(WINDOWS) +#ifndef WINDOWS /* On Windows, we expect regular chgrp to fail silently by default */ php_error_docref(NULL, E_WARNING, "Cannot call chgrp() for a non-standard stream"); #endif @@ -381,7 +381,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ } } -#if defined(WINDOWS) +#ifdef WINDOWS /* We have no native chgrp on Windows, nothing left to do if stream doesn't have own implementation */ RETURN_FALSE; #else @@ -400,7 +400,7 @@ static void php_do_chgrp(INTERNAL_FUNCTION_PARAMETERS, int do_lchgrp) /* {{{ */ } if (do_lchgrp) { -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN ret = VCWD_LCHOWN(filename, -1, gid); #endif } else { @@ -423,7 +423,7 @@ PHP_FUNCTION(chgrp) /* }}} */ /* {{{ Change symlink group */ -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN PHP_FUNCTION(lchgrp) { php_do_chgrp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); @@ -499,7 +499,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ RETURN_FALSE; } } else { -#if !defined(WINDOWS) +#ifndef WINDOWS /* On Windows, we expect regular chown to fail silently by default */ php_error_docref(NULL, E_WARNING, "Cannot call chown() for a non-standard stream"); #endif @@ -507,7 +507,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ } } -#if defined(WINDOWS) +#ifdef WINDOWS /* We have no native chown on Windows, nothing left to do if stream doesn't have own implementation */ RETURN_FALSE; #else @@ -527,7 +527,7 @@ static void php_do_chown(INTERNAL_FUNCTION_PARAMETERS, int do_lchown) /* {{{ */ } if (do_lchown) { -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN ret = VCWD_LCHOWN(filename, uid, -1); #endif } else { @@ -551,7 +551,7 @@ PHP_FUNCTION(chown) /* }}} */ /* {{{ Change file owner */ -#if HAVE_LCHOWN +#ifdef HAVE_LCHOWN PHP_FUNCTION(lchown) { RETVAL_TRUE; @@ -605,7 +605,7 @@ PHP_FUNCTION(chmod) } /* }}} */ -#if HAVE_UTIME +#ifdef HAVE_UTIME /* {{{ Set modification time of file */ PHP_FUNCTION(touch) { diff --git a/ext/standard/flock_compat.c b/ext/standard/flock_compat.c index 6b4fa3dcedb0a..8622ec1aeca98 100644 --- a/ext/standard/flock_compat.c +++ b/ext/standard/flock_compat.c @@ -26,7 +26,7 @@ PHPAPI int flock(int fd, int operation) #endif /* !defined(HAVE_FLOCK) */ PHPAPI int php_flock(int fd, int operation) -#if HAVE_STRUCT_FLOCK /* {{{ */ +#ifdef HAVE_STRUCT_FLOCK /* {{{ */ { struct flock flck; int ret; @@ -151,7 +151,7 @@ PHPAPI int php_flock(int fd, int operation) #endif #ifndef PHP_WIN32 -#if !(HAVE_INET_ATON) +#ifndef HAVE_INET_ATON /* {{{ inet_aton * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. diff --git a/ext/standard/flock_compat.h b/ext/standard/flock_compat.h index 983b36a8457fd..a55c3af9ca8f7 100644 --- a/ext/standard/flock_compat.h +++ b/ext/standard/flock_compat.h @@ -17,7 +17,7 @@ #ifndef FLOCK_COMPAT_H #define FLOCK_COMPAT_H -#if HAVE_STRUCT_FLOCK +#ifdef HAVE_STRUCT_FLOCK #include #include #include @@ -57,17 +57,16 @@ PHPAPI int flock(int fd, int operation); # define ftruncate(a, b) chsize(a, b) #endif /* defined(PHP_WIN32) */ -#if !HAVE_INET_ATON -#if HAVE_NETINET_IN_H -#include -#endif -#if HAVE_ARPA_INET_H -#include -#endif - -#ifndef PHP_WIN32 +#ifndef HAVE_INET_ATON +# ifdef HAVE_NETINET_IN_H +# include +# endif +# ifdef HAVE_ARPA_INET_H +# include +# endif +# ifndef PHP_WIN32 extern int inet_aton(const char *, struct in_addr *); -#endif +# endif #endif #endif /* FLOCK_COMPAT_H */ diff --git a/ext/standard/ftok.c b/ext/standard/ftok.c index 171e54f499e87..1a046b3de6979 100644 --- a/ext/standard/ftok.c +++ b/ext/standard/ftok.c @@ -26,7 +26,7 @@ #include "win32/ipc.h" #endif -#if HAVE_FTOK +#ifdef HAVE_FTOK /* {{{ Convert a pathname and a project identifier to a System V IPC key */ PHP_FUNCTION(ftok) { diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c index f20f4245bd469..0be729a59fddb 100644 --- a/ext/standard/ftp_fopen_wrapper.c +++ b/ext/standard/ftp_fopen_wrapper.c @@ -40,7 +40,7 @@ #include "php_standard.h" #include -#if HAVE_SYS_SOCKET_H +#ifdef HAVE_SYS_SOCKET_H #include #endif @@ -49,7 +49,7 @@ #else #include #include -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H #include #endif #endif diff --git a/ext/standard/hrtime.c b/ext/standard/hrtime.c index 5d72e021c12c6..7dca135c920aa 100644 --- a/ext/standard/hrtime.c +++ b/ext/standard/hrtime.c @@ -134,7 +134,7 @@ static zend_always_inline php_hrtime_t _timer_current(void) #endif }/*}}}*/ -#if ZEND_ENABLE_ZVAL_LONG64 +#ifdef ZEND_ENABLE_ZVAL_LONG64 #define PHP_RETURN_HRTIME(t) RETURN_LONG((zend_long)t) #else #ifdef _WIN32 diff --git a/ext/standard/html.c b/ext/standard/html.c index 779fe549599bf..d3736daf3bd61 100644 --- a/ext/standard/html.c +++ b/ext/standard/html.c @@ -44,7 +44,7 @@ #include "php_string.h" #include "SAPI.h" #include -#if HAVE_LANGINFO_H +#ifdef HAVE_LANGINFO_H #include #endif diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c index b5132d9e005a3..099a5241ab58e 100644 --- a/ext/standard/http_fopen_wrapper.c +++ b/ext/standard/http_fopen_wrapper.c @@ -43,7 +43,7 @@ #include "php_standard.h" #include -#if HAVE_SYS_SOCKET_H +#ifdef HAVE_SYS_SOCKET_H #include #endif @@ -52,7 +52,7 @@ #else #include #include -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H #include #endif #endif diff --git a/ext/standard/image.c b/ext/standard/image.c index a614521ae1091..831cd8a28bc1f 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -17,18 +17,18 @@ #include "php.h" #include -#if HAVE_FCNTL_H +#ifdef HAVE_FCNTL_H #include #endif #include "fopen_wrappers.h" #include "ext/standard/fsock.h" #include "libavifinfo/avifinfo.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #include "php_image.h" -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) #include "zlib.h" #endif @@ -80,7 +80,7 @@ PHP_MINIT_FUNCTION(imagetypes) REGISTER_LONG_CONSTANT("IMAGETYPE_JP2", IMAGE_FILETYPE_JP2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JPX", IMAGE_FILETYPE_JPX, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMAGETYPE_JB2", IMAGE_FILETYPE_JB2, CONST_CS | CONST_PERSISTENT); -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) REGISTER_LONG_CONSTANT("IMAGETYPE_SWC", IMAGE_FILETYPE_SWC, CONST_CS | CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("IMAGETYPE_IFF", IMAGE_FILETYPE_IFF, CONST_CS | CONST_PERSISTENT); @@ -188,7 +188,7 @@ static unsigned long int php_swf_get_bits (unsigned char* buffer, unsigned int p } /* }}} */ -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) /* {{{ php_handle_swc */ static struct gfxinfo *php_handle_swc(php_stream * stream) { @@ -619,7 +619,7 @@ static struct gfxinfo *php_handle_jpc(php_stream * stream) result->width = php_read4(stream); /* Xsiz */ result->height = php_read4(stream); /* Ysiz */ -#if MBO_0 +#ifdef MBO_0 php_read4(stream); /* XOsiz */ php_read4(stream); /* YOsiz */ php_read4(stream); /* XTsiz */ @@ -1486,7 +1486,7 @@ static void php_getimagesize_from_stream(php_stream *stream, char *input, zval * result = php_handle_swf(stream); break; case IMAGE_FILETYPE_SWC: -#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB) +#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) result = php_handle_swc(stream); #else php_error_docref(NULL, E_NOTICE, "The image is a compressed SWF file, but you do not have a static version of the zlib extension enabled"); diff --git a/ext/standard/info.c b/ext/standard/info.c index 5ac6ccb00ee96..acd1a1b36cfce 100644 --- a/ext/standard/info.c +++ b/ext/standard/info.c @@ -893,13 +893,13 @@ PHPAPI ZEND_COLD void php_print_info(int flag) efree(descr); } -#if HAVE_IPV6 +#ifdef HAVE_IPV6 php_info_print_table_row(2, "IPv6 Support", "enabled" ); #else php_info_print_table_row(2, "IPv6 Support", "disabled" ); #endif -#if HAVE_DTRACE +#ifdef HAVE_DTRACE php_info_print_table_row(2, "DTrace Support", (zend_dtrace_enabled ? "enabled" : "available, disabled")); #else php_info_print_table_row(2, "DTrace Support", "disabled" ); diff --git a/ext/standard/lcg.c b/ext/standard/lcg.c index 9030b360ae85e..397844844e345 100644 --- a/ext/standard/lcg.c +++ b/ext/standard/lcg.c @@ -17,7 +17,7 @@ #include "php.h" #include "php_lcg.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/link.c b/ext/standard/link.c index eae0929af0037..2f29b5bcc0288 100644 --- a/ext/standard/link.c +++ b/ext/standard/link.c @@ -25,14 +25,14 @@ #endif #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #ifndef PHP_WIN32 #include #endif #include -#if HAVE_PWD_H +#ifdef HAVE_PWD_H #ifdef PHP_WIN32 #include "win32/pwd.h" #else diff --git a/ext/standard/mail.c b/ext/standard/mail.c index 003fad3ea18c5..55790e6100fce 100644 --- a/ext/standard/mail.c +++ b/ext/standard/mail.c @@ -25,15 +25,15 @@ #include "ext/date/php_date.h" #include "zend_smart_str.h" -#if HAVE_SYSEXITS_H -#include +#ifdef HAVE_SYSEXITS_H +# include #endif -#if HAVE_SYS_SYSEXITS_H -#include +#ifdef HAVE_SYS_SYSEXITS_H +# include #endif #if PHP_SIGCHILD -#include +# include #endif #include "php_syslog.h" @@ -43,7 +43,7 @@ #include "exec.h" #ifdef PHP_WIN32 -#include "win32/sendmail.h" +# include "win32/sendmail.h" #endif #define SKIP_LONG_HEADER_SEP(str, pos) \ diff --git a/ext/standard/net.c b/ext/standard/net.c index f8e934d5393cc..b22f304c8eb33 100644 --- a/ext/standard/net.c +++ b/ext/standard/net.c @@ -17,15 +17,15 @@ #include "php.h" #include "php_network.h" -#if HAVE_ARPA_INET_H +#ifdef HAVE_ARPA_INET_H # include #endif -#if HAVE_NET_IF_H +#ifdef HAVE_NET_IF_H # include #endif -#if HAVE_GETIFADDRS +#ifdef HAVE_GETIFADDRS # include #elif defined(__PASE__) /* IBM i implements getifaddrs, but under its own name */ @@ -53,7 +53,7 @@ PHPAPI zend_string* php_inet_ntop(const struct sockaddr *addr) { if (!addr) { return NULL; } /* Prefer inet_ntop() as it's more task-specific and doesn't have to be demangled */ -#if HAVE_INET_NTOP +#ifdef HAVE_INET_NTOP switch (addr->sa_family) { #ifdef AF_INET6 case AF_INET6: { @@ -102,7 +102,7 @@ PHPAPI zend_string* php_inet_ntop(const struct sockaddr *addr) { return NULL; } -#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) +#if defined(PHP_WIN32) || defined(HAVE_GETIFADDRS) || defined(__PASE__) static void iface_append_unicast(zval *unicast, zend_long flags, struct sockaddr *addr, struct sockaddr *netmask, struct sockaddr *broadcast, struct sockaddr *ptp) { diff --git a/ext/standard/pack.c b/ext/standard/pack.c index 8736d291fb246..a58925219482e 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -31,7 +31,7 @@ #include "ext/standard/head.h" #include "php_string.h" #include "pack.h" -#if HAVE_PWD_H +#ifdef HAVE_PWD_H #ifdef PHP_WIN32 #include "win32/pwd.h" #else @@ -39,7 +39,7 @@ #endif #endif #include "fsock.h" -#if HAVE_NETINET_IN_H +#ifdef HAVE_NETINET_IN_H #include #endif diff --git a/ext/standard/pageinfo.c b/ext/standard/pageinfo.c index 06867fbda5ab7..8e15d2b06c35e 100644 --- a/ext/standard/pageinfo.c +++ b/ext/standard/pageinfo.c @@ -20,7 +20,7 @@ #include #include -#if HAVE_PWD_H +#ifdef HAVE_PWD_H #ifdef PHP_WIN32 #include "win32/pwd.h" #else @@ -36,7 +36,7 @@ #define getgid() 1 #define getuid() 1 #endif -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif #include diff --git a/ext/standard/password.c b/ext/standard/password.c index 98b27ff34bd0c..96b74aa39554f 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -27,7 +27,7 @@ #include "zend_interfaces.h" #include "info.h" #include "php_random.h" -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB #include "argon2.h" #endif @@ -231,7 +231,7 @@ const php_password_algo php_password_algo_bcrypt = { }; -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB /* argon2i/argon2id shared implementation */ static int extract_argon2_parameters(const zend_string *hash, @@ -427,7 +427,7 @@ PHP_MINIT_FUNCTION(password) /* {{{ */ } REGISTER_STRING_CONSTANT("PASSWORD_BCRYPT", "2y", CONST_CS | CONST_PERSISTENT); -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB if (FAILURE == php_password_algo_register("argon2i", &php_password_algo_argon2i)) { return FAILURE; } @@ -440,7 +440,7 @@ PHP_MINIT_FUNCTION(password) /* {{{ */ #endif REGISTER_LONG_CONSTANT("PASSWORD_BCRYPT_DEFAULT_COST", PHP_PASSWORD_BCRYPT_COST, CONST_CS | CONST_PERSISTENT); -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB REGISTER_LONG_CONSTANT("PASSWORD_ARGON2_DEFAULT_MEMORY_COST", PHP_PASSWORD_ARGON2_MEMORY_COST, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PASSWORD_ARGON2_DEFAULT_TIME_COST", PHP_PASSWORD_ARGON2_TIME_COST, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PASSWORD_ARGON2_DEFAULT_THREADS", PHP_PASSWORD_ARGON2_THREADS, CONST_CS | CONST_PERSISTENT); @@ -495,7 +495,7 @@ static const php_password_algo* php_password_algo_find_zval(zend_string *arg_str switch (arg_long) { case 0: return php_password_algo_default(); case 1: return &php_password_algo_bcrypt; -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB case 2: return &php_password_algo_argon2i; case 3: return &php_password_algo_argon2id; #else diff --git a/ext/standard/php_dns.h b/ext/standard/php_dns.h index 0d56633530bd2..53fbc76514f53 100644 --- a/ext/standard/php_dns.h +++ b/ext/standard/php_dns.h @@ -29,7 +29,7 @@ #elif defined(HAVE_RES_NSEARCH) #define php_dns_search(res, dname, class, type, answer, anslen) \ res_nsearch(res, dname, class, type, answer, anslen); -#if HAVE_RES_NDESTROY +#ifdef HAVE_RES_NDESTROY #define php_dns_free_handle(res) \ res_ndestroy(res); \ php_dns_free_res(res) @@ -52,12 +52,12 @@ #define HAVE_DNS_SEARCH_FUNC 1 #endif -#if HAVE_DNS_SEARCH_FUNC && HAVE_DN_EXPAND && HAVE_DN_SKIPNAME +#if defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_DN_EXPAND) && defined(HAVE_DN_SKIPNAME) #define HAVE_FULL_DNS_FUNCS 1 #endif -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC -# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +# if defined(PHP_WIN32) || defined(HAVE_FULL_DNS_FUNCS) PHP_MINIT_FUNCTION(dns); # endif #endif /* defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC */ diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index 4287045511e86..0353c8efae674 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper.c @@ -18,8 +18,8 @@ #include #include -#if HAVE_UNISTD_H -#include +#ifdef HAVE_UNISTD_H +# include #endif #include "php.h" @@ -317,7 +317,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, const char *pa return NULL; } -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H dtablesize = getdtablesize(); #else dtablesize = INT_MAX; diff --git a/ext/standard/php_password.h b/ext/standard/php_password.h index 600086cc5a2d7..50f330d3d6ce8 100644 --- a/ext/standard/php_password.h +++ b/ext/standard/php_password.h @@ -24,7 +24,7 @@ PHP_MSHUTDOWN_FUNCTION(password); #define PHP_PASSWORD_DEFAULT PHP_PASSWORD_BCRYPT #define PHP_PASSWORD_BCRYPT_COST 10 -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB /** * When updating these values, synchronize ext/sodium/sodium_pwhash.c values. * Note that libargon expresses memlimit in KB, while libsoidum uses bytes. @@ -44,7 +44,7 @@ typedef struct _php_password_algo { } php_password_algo; extern const php_password_algo php_password_algo_bcrypt; -#if HAVE_ARGON2LIB +#ifdef HAVE_ARGON2LIB extern const php_password_algo php_password_algo_argon2i; extern const php_password_algo php_password_algo_argon2id; #endif diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 0f31ff1e42827..d0c40817fa33f 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -18,14 +18,14 @@ #ifndef PHP_STRING_H #define PHP_STRING_H -#if defined(ZTS) +#ifdef ZTS PHP_MINIT_FUNCTION(localeconv); PHP_MSHUTDOWN_FUNCTION(localeconv); #endif -#if HAVE_NL_LANGINFO +#ifdef HAVE_NL_LANGINFO PHP_MINIT_FUNCTION(nl_langinfo); #endif -#if ZEND_INTRIN_SSE4_2_FUNC_PTR +#ifdef ZEND_INTRIN_SSE4_2_FUNC_PTR PHP_MINIT_FUNCTION(string_intrin); #endif @@ -59,7 +59,7 @@ PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return PHPAPI size_t php_strspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end); PHPAPI size_t php_strcspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end); -#if defined(_REENTRANT) +#ifdef _REENTRANT # ifdef PHP_WIN32 # include # endif diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 28420b4f803aa..53ec6faa1019e 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -28,11 +28,11 @@ #include "main/php_network.h" #include "zend_smart_str.h" -#if HAVE_SYS_WAIT_H +#ifdef HAVE_SYS_WAIT_H #include #endif -#if HAVE_FCNTL_H +#ifdef HAVE_FCNTL_H #include #endif @@ -42,8 +42,8 @@ * around the alternate code. */ #ifdef PHP_CAN_SUPPORT_PROC_OPEN -#if HAVE_OPENPTY -# if HAVE_PTY_H +#ifdef HAVE_OPENPTY +# ifdef HAVE_PTY_H # include # elif defined(__FreeBSD__) /* FreeBSD defines `openpty` in */ @@ -680,7 +680,7 @@ static zend_result set_proc_descriptor_to_blackhole(descriptorspec_item *desc) static zend_result set_proc_descriptor_to_pty(descriptorspec_item *desc, int *master_fd, int *slave_fd) { -#if HAVE_OPENPTY +#ifdef HAVE_OPENPTY /* All FDs set to PTY in the child process will go to the slave end of the same PTY. * Likewise, all the corresponding entries in `$pipes` in the parent will all go to the master * end of the same PTY. @@ -1318,7 +1318,7 @@ PHP_FUNCTION(proc_open) #else efree_argv(argv); #endif -#if HAVE_OPENPTY +#ifdef HAVE_OPENPTY if (pty_master_fd != -1) { close(pty_master_fd); } diff --git a/ext/standard/random.c b/ext/standard/random.c index d6140ffd2ae25..bea2a474d4408 100644 --- a/ext/standard/random.c +++ b/ext/standard/random.c @@ -147,7 +147,7 @@ PHPAPI int php_random_bytes(void *bytes, size_t size, bool should_throw) struct stat st; if (fd < 0) { -#if HAVE_DEV_URANDOM +#ifdef HAVE_DEV_URANDOM fd = open("/dev/urandom", O_RDONLY); #endif if (fd < 0) { diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 419b49e586f71..49daae56b5ea6 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -26,7 +26,7 @@ #include "streamsfuncs.h" #include "php_network.h" #include "php_string.h" -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif @@ -46,7 +46,7 @@ static php_stream_context *decode_context_param(zval *contextresource); /* Streams based network functions */ -#if HAVE_SOCKETPAIR +#ifdef HAVE_SOCKETPAIR /* {{{ Creates a pair of connected, indistinguishable socket streams */ PHP_FUNCTION(stream_socket_pair) { @@ -1343,7 +1343,7 @@ PHP_FUNCTION(stream_set_blocking) /* }}} */ /* {{{ Set timeout on stream read to seconds + microseonds */ -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) PHP_FUNCTION(stream_set_timeout) { zval *socket; diff --git a/ext/standard/string.c b/ext/standard/string.c index 00d422fb18564..59f633fd18587 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -320,7 +320,7 @@ PHP_FUNCTION(strcspn) /* }}} */ /* {{{ PHP_MINIT_FUNCTION(nl_langinfo) */ -#if HAVE_NL_LANGINFO +#ifdef HAVE_NL_LANGINFO PHP_MINIT_FUNCTION(nl_langinfo) { #define REGISTER_NL_LANGINFO_CONSTANT(x) REGISTER_LONG_CONSTANT(#x, x, CONST_CS | CONST_PERSISTENT) @@ -1429,7 +1429,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, /* Strip trailing slashes */ while (basename_end >= s -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 && (*basename_end == '/' || *basename_end == '\\' || (*basename_end == ':' @@ -1447,7 +1447,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, basename_start = basename_end; basename_end++; while (basename_start > s -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 && *(basename_start-1) != '/' && *(basename_start-1) != '\\') { @@ -1474,7 +1474,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, case 0: goto quit_loop; case 1: -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 if (*s == '/' || *s == '\\') { #else if (*s == '/') { @@ -1483,7 +1483,7 @@ PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, state = 0; basename_end = s; } -#if defined(PHP_WIN32) +#ifdef PHP_WIN32 /* Catch relative paths in c:file.txt style. They're not to confuse with the NTFS streams. This part ensures also, that no drive letter traversing happens. */ @@ -3344,7 +3344,7 @@ PHP_FUNCTION(strtr) /* }}} */ /* {{{ Reverse a string */ -#if ZEND_INTRIN_SSSE3_NATIVE +#ifdef ZEND_INTRIN_SSSE3_NATIVE #include #elif defined(__aarch64__) #include @@ -3366,7 +3366,7 @@ PHP_FUNCTION(strrev) s = ZSTR_VAL(str); e = s + ZSTR_LEN(str); --e; -#if ZEND_INTRIN_SSSE3_NATIVE +#ifdef ZEND_INTRIN_SSSE3_NATIVE if (e - s > 15) { const __m128i map = _mm_set_epi8( 0, 1, 2, 3, @@ -3664,10 +3664,10 @@ PHPAPI zend_string *php_addcslashes(zend_string *str, const char *what, size_t w /* {{{ php_addslashes */ -#if ZEND_INTRIN_SSE4_2_NATIVE +#ifdef ZEND_INTRIN_SSE4_2_NATIVE # include # include "Zend/zend_bitset.h" -#elif ZEND_INTRIN_SSE4_2_RESOLVER +#elif defined(ZEND_INTRIN_SSE4_2_RESOLVER) # include # include "Zend/zend_bitset.h" # include "Zend/zend_cpuinfo.h" @@ -3678,7 +3678,7 @@ zend_string *php_addslashes_default(zend_string *str); ZEND_INTRIN_SSE4_2_FUNC_DECL(void php_stripslashes_sse42(zend_string *str)); void php_stripslashes_default(zend_string *str); -# if ZEND_INTRIN_SSE4_2_FUNC_PROTO +# ifdef ZEND_INTRIN_SSE4_2_FUNC_PROTO PHPAPI zend_string *php_addslashes(zend_string *str) __attribute__((ifunc("resolve_addslashes"))); PHPAPI void php_stripslashes(zend_string *str) __attribute__((ifunc("resolve_stripslashes"))); @@ -3730,10 +3730,10 @@ PHP_MINIT_FUNCTION(string_intrin) # endif #endif -#if ZEND_INTRIN_SSE4_2_NATIVE || ZEND_INTRIN_SSE4_2_RESOLVER -# if ZEND_INTRIN_SSE4_2_NATIVE +#if defined(ZEND_INTRIN_SSE4_2_NATIVE) || defined(ZEND_INTRIN_SSE4_2_RESOLVER) +# ifdef ZEND_INTRIN_SSE4_2_NATIVE PHPAPI zend_string *php_addslashes(zend_string *str) /* {{{ */ -# elif ZEND_INTRIN_SSE4_2_RESOLVER +# elif defined(ZEND_INTRIN_SSE4_2_RESOLVER) zend_string *php_addslashes_sse42(zend_string *str) # endif { @@ -3910,8 +3910,8 @@ static zend_always_inline char *aarch64_add_slashes(quad_word res, const char *s } #endif /* __aarch64__ */ -#if !ZEND_INTRIN_SSE4_2_NATIVE -# if ZEND_INTRIN_SSE4_2_RESOLVER +#ifndef ZEND_INTRIN_SSE4_2_NATIVE +# ifdef ZEND_INTRIN_SSE4_2_RESOLVER zend_string *php_addslashes_default(zend_string *str) /* {{{ */ # else PHPAPI zend_string *php_addslashes(zend_string *str) @@ -4072,10 +4072,10 @@ static zend_always_inline char *php_stripslashes_impl(const char *str, char *out return out; } -#if ZEND_INTRIN_SSE4_2_NATIVE || ZEND_INTRIN_SSE4_2_RESOLVER -# if ZEND_INTRIN_SSE4_2_NATIVE +#if defined(ZEND_INTRIN_SSE4_2_NATIVE) || defined(ZEND_INTRIN_SSE4_2_RESOLVER) +# ifdef ZEND_INTRIN_SSE4_2_NATIVE PHPAPI void php_stripslashes(zend_string *str) -# elif ZEND_INTRIN_SSE4_2_RESOLVER +# elif defined(ZEND_INTRIN_SSE4_2_RESOLVER) void php_stripslashes_sse42(zend_string *str) # endif { @@ -4130,8 +4130,8 @@ void php_stripslashes_sse42(zend_string *str) } #endif -#if !ZEND_INTRIN_SSE4_2_NATIVE -# if ZEND_INTRIN_SSE4_2_RESOLVER +#ifndef ZEND_INTRIN_SSE4_2_NATIVE +# ifdef ZEND_INTRIN_SSE4_2_RESOLVER void php_stripslashes_default(zend_string *str) /* {{{ */ # else PHPAPI void php_stripslashes(zend_string *str) diff --git a/ext/standard/syslog.c b/ext/standard/syslog.c index d2cfcab9deda0..d16a3c90bb8ab 100644 --- a/ext/standard/syslog.c +++ b/ext/standard/syslog.c @@ -21,7 +21,7 @@ #include "zend_globals.h" #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/uniqid.c b/ext/standard/uniqid.c index 04f81deeb2d91..a28f30e969a14 100644 --- a/ext/standard/uniqid.c +++ b/ext/standard/uniqid.c @@ -17,7 +17,7 @@ #include "php.h" #include -#if HAVE_UNISTD_H +#ifdef HAVE_UNISTD_H #include #endif diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re index bac49206e63e8..8e5b43467fc88 100644 --- a/ext/standard/url_scanner_ex.re +++ b/ext/standard/url_scanner_ex.re @@ -333,7 +333,7 @@ enum { #define STD_PARA url_adapt_state_ex_t *ctx, char *start, char *YYCURSOR #define STD_ARGS ctx, start, xp -#if SCANNER_DEBUG +#ifdef SCANNER_DEBUG #define scdebug(x) printf x #else #define scdebug(x) From 083b64efb53a4d9621a27b95b44acbceb94a0869 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 1 Apr 2022 16:26:38 +0100 Subject: [PATCH 0408/1346] Add missing #endif in stubs This slipped away during the rebase of 5171cb435a69c418231acc487819ce47b52711df --- ext/standard/basic_functions.stub.php | 1 + ext/standard/basic_functions_arginfo.h | 1206 ++---------------------- 2 files changed, 95 insertions(+), 1112 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 9ab3d3512dadb..972963430c694 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -1333,6 +1333,7 @@ function chmod(string $filename, int $permissions): bool {} #ifdef HAVE_UTIME function touch(string $filename, ?int $mtime = null, ?int $atime = null): bool {} +#endif function clearstatcache(bool $clear_realpath_cache = false, string $filename = ""): void {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 1162315157f88..b3ea9968461d4 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: f9668ae68c1f7d0336b974f83c2552fbf9bf898a */ + * Stub hash: e53bcb20eb22fd198019ca24ebbf10a0decde13a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -1442,82 +1442,55 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_touch, 0, 1, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_clearstatcache, 0, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, clear_realpath_cache, _IS_BOOL, 0, "false") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, filename, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_disk_total_space, 0, 1, MAY_BE_DOUBLE|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_disk_free_space arginfo_disk_total_space -#endif -#if defined(HAVE_UTIME) #define arginfo_diskfreespace arginfo_disk_total_space -#endif -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_realpath_cache_get, 0, 0, IS_ARRAY, 0) -ZEND_END_ARG_INFO() -#endif +#define arginfo_realpath_cache_get arginfo_ob_list_handlers -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_realpath_cache_size, 0, 0, IS_LONG, 0) -ZEND_END_ARG_INFO() -#endif +#define arginfo_realpath_cache_size arginfo_ob_get_level -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sprintf, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_printf, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vprintf, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vsprintf, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fprintf, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_vfprintf, 0, 3, IS_LONG, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, values, IS_ARRAY, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_fsockopen, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, port, IS_LONG, 0, "-1") @@ -1525,100 +1498,67 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_fsockopen, 0, 0, 1) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_message, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 1, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_pfsockopen arginfo_fsockopen -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_http_build_query, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, data, MAY_BE_ARRAY|MAY_BE_OBJECT, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, numeric_prefix, IS_STRING, 0, "\"\"") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arg_separator, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding_type, IS_LONG, 0, "PHP_QUERY_RFC1738") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_image_type_to_mime_type, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, image_type, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_image_type_to_extension, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, image_type, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, include_dot, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getimagesize, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, image_info, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getimagesizefromstring, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, image_info, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpinfo, 0, 0, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "INFO_ALL") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_phpversion, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, extension, IS_STRING, 1, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_phpcredits, 0, 0, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "CREDITS_ALL") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_php_sapi_name, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) -ZEND_END_ARG_INFO() -#endif +#define arginfo_php_sapi_name arginfo_ob_get_flush -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_php_uname, 0, 0, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_STRING, 0, "\"a\"") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -#define arginfo_php_ini_scanned_files arginfo_php_sapi_name -#endif +#define arginfo_php_ini_scanned_files arginfo_ob_get_flush -#if defined(HAVE_UTIME) -#define arginfo_php_ini_loaded_file arginfo_php_sapi_name -#endif +#define arginfo_php_ini_loaded_file arginfo_ob_get_flush -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_iptcembed, 0, 2, MAY_BE_STRING|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, iptc_data, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, spool, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_iptcparse, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, iptc_block, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_levenshtein, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, string1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string2, IS_STRING, 0) @@ -1626,32 +1566,30 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_levenshtein, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, replacement_cost, IS_LONG, 0, "1") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, deletion_cost, IS_LONG, 0, "1") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_readlink, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_linkinfo, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_symlink, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, target, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, link, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) #define arginfo_link arginfo_symlink #endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mail, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, to, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, subject, IS_STRING, 0) @@ -1659,288 +1597,188 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mail, 0, 3, _IS_BOOL, 0) ZEND_ARG_TYPE_MASK(0, additional_headers, MAY_BE_ARRAY|MAY_BE_STRING, "[]") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, additional_params, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_abs, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ceil, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_floor arginfo_ceil -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_round, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_MASK(0, num, MAY_BE_LONG|MAY_BE_DOUBLE, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, precision, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "PHP_ROUND_HALF_UP") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sin, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_cos arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_tan arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_asin arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_acos arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_atan arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_atanh arginfo_sin -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_atan2, 0, 2, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, y, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, x, IS_DOUBLE, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_sinh arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_cosh arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_tanh arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_asinh arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_acosh arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_expm1 arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_log1p arginfo_sin -#endif -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pi, 0, 0, IS_DOUBLE, 0) -ZEND_END_ARG_INFO() -#endif +#define arginfo_pi arginfo_lcg_value -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_finite, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_is_nan arginfo_is_finite -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intdiv, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, num2, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_is_infinite arginfo_is_finite -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pow, 0, 2, MAY_BE_LONG|MAY_BE_DOUBLE|MAY_BE_OBJECT) ZEND_ARG_TYPE_INFO(0, num, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, exponent, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_exp arginfo_sin -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_log, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_DOUBLE, 0, "M_E") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_log10 arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_sqrt arginfo_sin -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_hypot, 0, 2, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, x, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, y, IS_DOUBLE, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_deg2rad arginfo_sin -#endif -#if defined(HAVE_UTIME) #define arginfo_rad2deg arginfo_sin -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_bindec, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO(0, binary_string, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_hexdec, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO(0, hex_string, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_octdec, 0, 1, MAY_BE_LONG|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO(0, octal_string, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_decbin, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, num, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_decoct arginfo_decbin -#endif -#if defined(HAVE_UTIME) #define arginfo_dechex arginfo_decbin -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_base_convert, 0, 3, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, num, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, from_base, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, to_base, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_number_format, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, num, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, decimals, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, decimal_separator, IS_STRING, 1, "\".\"") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, thousands_separator, IS_STRING, 1, "\",\"") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_fmod, 0, 2, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, num2, IS_DOUBLE, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_fdiv arginfo_fmod -#endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_microtime, 0, 0, MAY_BE_STRING|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, as_float, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gettimeofday, 0, 0, MAY_BE_ARRAY|MAY_BE_DOUBLE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, as_float, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_GETRUSAGE) +#if defined(HAVE_GETRUSAGE) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getrusage, 0, 0, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) #define arginfo_pack arginfo_sprintf -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_unpack, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, format, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_get_info, 0, 1, IS_ARRAY, 0) ZEND_ARG_TYPE_INFO(0, hash, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_hash, 0, 2, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, algo, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_NULL, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_needs_rehash, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hash, IS_STRING, 0) ZEND_ARG_TYPE_MASK(0, algo, MAY_BE_STRING|MAY_BE_LONG|MAY_BE_NULL, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_password_verify, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, hash, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -#define arginfo_password_algos arginfo_realpath_cache_get -#endif +#define arginfo_password_algos arginfo_ob_list_handlers -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_INFO_EX(arginfo_proc_open, 0, 0, 3) ZEND_ARG_TYPE_MASK(0, command, MAY_BE_ARRAY|MAY_BE_STRING, NULL) ZEND_ARG_TYPE_INFO(0, descriptor_spec, IS_ARRAY, 0) @@ -1951,83 +1789,58 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_proc_open, 0, 0, 3) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_close, 0, 1, IS_LONG, 0) ZEND_ARG_INFO(0, process) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_terminate, 0, 1, _IS_BOOL, 0) ZEND_ARG_INFO(0, process) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, signal, IS_LONG, 0, "15") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_proc_get_status, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, process) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_quoted_printable_decode, 0, 1, IS_STRING, 0) - ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) -ZEND_END_ARG_INFO() -#endif +#define arginfo_quoted_printable_decode arginfo_base64_encode -#if defined(HAVE_UTIME) -#define arginfo_quoted_printable_encode arginfo_quoted_printable_decode -#endif +#define arginfo_quoted_printable_encode arginfo_base64_encode -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_mt_srand, 0, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, seed, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "MT_RAND_MT19937") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_srand arginfo_mt_srand -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_rand, 0, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, max, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_mt_rand arginfo_rand -#endif -#if defined(HAVE_UTIME) -#define arginfo_mt_getrandmax arginfo_realpath_cache_size -#endif +#define arginfo_mt_getrandmax arginfo_ob_get_level -#if defined(HAVE_UTIME) -#define arginfo_getrandmax arginfo_realpath_cache_size -#endif +#define arginfo_getrandmax arginfo_ob_get_level -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_random_bytes, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_random_int, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, min, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, max, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -#define arginfo_soundex arginfo_quoted_printable_decode -#endif +#define arginfo_soundex arginfo_base64_encode -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) ZEND_ARG_TYPE_INFO(1, write, IS_ARRAY, 1) @@ -2035,75 +1848,53 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_select, 0, 4, MAY_BE_LONG ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, microseconds, IS_LONG, 1, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_create, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, params, IS_ARRAY, 1, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_params, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, context) ZEND_ARG_TYPE_INFO(0, params, IS_ARRAY, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_params, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, context) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_set_option, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, context) ZEND_ARG_TYPE_MASK(0, wrapper_or_options, MAY_BE_ARRAY|MAY_BE_STRING, NULL) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, option_name, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_context_get_options, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, stream_or_context) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_get_default, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_context_set_default, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, options, IS_ARRAY, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_filter_prepend, 0, 0, 2) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, filter_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO(0, params, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_stream_filter_append arginfo_stream_filter_prepend -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_remove, 0, 1, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream_filter) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, address, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_code, "null") @@ -2112,9 +1903,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_client, 0, 0, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "STREAM_CLIENT_CONNECT") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, address, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, error_code, "null") @@ -2122,58 +1911,47 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_server, 0, 0, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "STREAM_SERVER_BIND | STREAM_SERVER_LISTEN") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_socket_accept, 0, 0, 1) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 1, "null") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, peer_name, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_get_name, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO(0, remote, _IS_BOOL, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_recvfrom, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, address, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_sendto, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_INFO(0, socket) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, address, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_enable_crypto, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, crypto_method, IS_LONG, 1, "null") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, session_stream, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SHUTDOWN) +#if defined(HAVE_SHUTDOWN) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_socket_shutdown, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, mode, IS_LONG, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_SOCKETPAIR) +#if defined(HAVE_SOCKETPAIR) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, domain, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, type, IS_LONG, 0) @@ -2181,107 +1959,69 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_socket_pair, 0, 3, MAY_BE ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_copy_to_stream, 0, 2, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_INFO(0, from) ZEND_ARG_INFO(0, to) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, length, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_contents, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, length, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, offset, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_supports_lock, 0, 1, _IS_BOOL, 0) - ZEND_ARG_INFO(0, stream) -ZEND_END_ARG_INFO() -#endif +#define arginfo_stream_supports_lock arginfo_rewind -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_write_buffer, 0, 2, IS_LONG, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_set_file_buffer arginfo_stream_set_write_buffer -#endif -#if defined(HAVE_UTIME) #define arginfo_stream_set_read_buffer arginfo_stream_set_write_buffer -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_blocking, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, enable, _IS_BOOL, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_socket_set_blocking arginfo_stream_set_blocking -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_get_meta_data, 0, 1, IS_ARRAY, 0) ZEND_ARG_INFO(0, stream) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_socket_get_status arginfo_stream_get_meta_data -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_get_line, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, length, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, ending, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_stream_resolve_include_path, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) -ZEND_END_ARG_INFO() -#endif +#define arginfo_stream_resolve_include_path arginfo_filetype -#if defined(HAVE_UTIME) -#define arginfo_stream_get_wrappers arginfo_realpath_cache_get -#endif +#define arginfo_stream_get_wrappers arginfo_ob_list_handlers -#if defined(HAVE_UTIME) -#define arginfo_stream_get_transports arginfo_realpath_cache_get -#endif +#define arginfo_stream_get_transports arginfo_ob_list_handlers -#if defined(HAVE_UTIME) -#define arginfo_stream_is_local arginfo_stream_supports_lock -#endif +#define arginfo_stream_is_local arginfo_rewind -#if defined(HAVE_UTIME) -#define arginfo_stream_isatty arginfo_stream_supports_lock -#endif +#define arginfo_stream_isatty arginfo_rewind -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_vt100_support, 0, 1, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) #define arginfo_stream_set_chunk_size arginfo_stream_set_write_buffer -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2289,265 +2029,171 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BO ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) #define arginfo_socket_set_timeout arginfo_stream_set_timeout #endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gettype, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_get_debug_type arginfo_gettype -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_settype, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(1, var, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_intval, 0, 1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, base, IS_LONG, 0, "10") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_floatval, 0, 1, IS_DOUBLE, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_doubleval arginfo_floatval -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_boolval, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_strval arginfo_gettype -#endif -#if defined(HAVE_UTIME) #define arginfo_is_null arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_resource arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_bool arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_int arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_integer arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_long arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_float arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_double arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_numeric arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_string arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_array arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_object arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_scalar arginfo_boolval -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_is_callable, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, syntax_only, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, callable_name, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_is_iterable arginfo_boolval -#endif -#if defined(HAVE_UTIME) #define arginfo_is_countable arginfo_boolval -#endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_uniqid, 0, 0, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, prefix, IS_STRING, 0, "\"\"") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, more_entropy, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_parse_url, 0, 1, MAY_BE_LONG|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_NULL|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, url, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, component, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -#define arginfo_urlencode arginfo_quoted_printable_decode -#endif +#define arginfo_urlencode arginfo_base64_encode -#if defined(HAVE_UTIME) -#define arginfo_urldecode arginfo_quoted_printable_decode -#endif +#define arginfo_urldecode arginfo_base64_encode -#if defined(HAVE_UTIME) -#define arginfo_rawurlencode arginfo_quoted_printable_decode -#endif +#define arginfo_rawurlencode arginfo_base64_encode -#if defined(HAVE_UTIME) -#define arginfo_rawurldecode arginfo_quoted_printable_decode -#endif +#define arginfo_rawurldecode arginfo_base64_encode -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_get_headers, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, url, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, associative, _IS_BOOL, 0, "false") ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_make_writeable, 0, 1, IS_OBJECT, 1) ZEND_ARG_INFO(0, brigade) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_prepend, 0, 2, IS_VOID, 0) ZEND_ARG_INFO(0, brigade) ZEND_ARG_TYPE_INFO(0, bucket, IS_OBJECT, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_stream_bucket_append arginfo_stream_bucket_prepend -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_bucket_new, 0, 2, IS_OBJECT, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, buffer, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -#define arginfo_stream_get_filters arginfo_realpath_cache_get -#endif +#define arginfo_stream_get_filters arginfo_ob_list_handlers -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_filter_register, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, filter_name, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, class, IS_STRING, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) -#define arginfo_convert_uuencode arginfo_quoted_printable_decode -#endif +#define arginfo_convert_uuencode arginfo_base64_encode -#if defined(HAVE_UTIME) -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_convert_uudecode, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) -ZEND_END_ARG_INFO() -#endif +#define arginfo_convert_uudecode arginfo_hex2bin -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_dump, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, values, IS_MIXED, 0) ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_var_export, 0, 1, IS_STRING, 1) ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_debug_zval_dump arginfo_var_dump -#endif -#if defined(HAVE_UTIME) #define arginfo_serialize arginfo_gettype -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_unserialize, 0, 1, IS_MIXED, 0) ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_memory_get_usage, 0, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, real_usage, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) #define arginfo_memory_get_peak_usage arginfo_memory_get_usage -#endif -#if defined(HAVE_UTIME) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_version_compare, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, version1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, version2, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, operator, IS_STRING, 1, "null") ZEND_END_ARG_INFO() -#endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_set, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, codepage, IS_LONG, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_get, 0, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, kind, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_conv, 0, 3, IS_STRING, 1) ZEND_ARG_TYPE_MASK(0, in_codepage, MAY_BE_LONG|MAY_BE_STRING, NULL) ZEND_ARG_TYPE_MASK(0, out_codepage, MAY_BE_LONG|MAY_BE_STRING, NULL) @@ -2555,19 +2201,19 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_conv, 0, 3, IS_S ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_cp_is_utf8, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_set_ctrl_handler, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, handler, IS_CALLABLE, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, add, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sapi_windows_generate_ctrl_event, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, event, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pid, IS_LONG, 0, "0") @@ -2970,553 +2616,231 @@ ZEND_FUNCTION(chmod); #if defined(HAVE_UTIME) ZEND_FUNCTION(touch); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(clearstatcache); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(disk_total_space); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(disk_free_space); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(realpath_cache_get); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(realpath_cache_size); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(sprintf); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(printf); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(vprintf); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(vsprintf); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(fprintf); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(vfprintf); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(fsockopen); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(pfsockopen); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(http_build_query); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(image_type_to_mime_type); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(image_type_to_extension); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(getimagesize); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(getimagesizefromstring); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(phpinfo); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(phpversion); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(phpcredits); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(php_sapi_name); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(php_uname); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(php_ini_scanned_files); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(php_ini_loaded_file); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(iptcembed); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(iptcparse); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(levenshtein); -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(readlink); #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(linkinfo); #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(symlink); #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FUNCTION(link); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(mail); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(abs); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(ceil); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(floor); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(round); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(sin); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(cos); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(tan); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(asin); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(acos); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(atan); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(atanh); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(atan2); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(sinh); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(cosh); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(tanh); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(asinh); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(acosh); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(expm1); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(log1p); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(pi); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_finite); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_nan); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(intdiv); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_infinite); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(pow); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(exp); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(log); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(log10); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(sqrt); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(hypot); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(deg2rad); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(rad2deg); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(bindec); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(hexdec); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(octdec); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(decbin); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(decoct); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(dechex); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(base_convert); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(number_format); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(fmod); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(fdiv); -#endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(microtime); #endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(gettimeofday); #endif -#if defined(HAVE_UTIME) && defined(HAVE_GETRUSAGE) +#if defined(HAVE_GETRUSAGE) ZEND_FUNCTION(getrusage); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(pack); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(unpack); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(password_get_info); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(password_hash); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(password_needs_rehash); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(password_verify); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(password_algos); -#endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_open); #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_close); #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_terminate); #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FUNCTION(proc_get_status); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(quoted_printable_decode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(quoted_printable_encode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(mt_srand); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(rand); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(mt_rand); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(mt_getrandmax); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(random_bytes); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(random_int); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(soundex); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_select); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_create); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_set_params); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_get_params); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_set_option); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_get_options); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_get_default); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_context_set_default); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_prepend); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_append); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_remove); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_client); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_server); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_accept); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_get_name); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_recvfrom); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_sendto); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_socket_enable_crypto); -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SHUTDOWN) +#if defined(HAVE_SHUTDOWN) ZEND_FUNCTION(stream_socket_shutdown); #endif -#if defined(HAVE_UTIME) && defined(HAVE_SOCKETPAIR) +#if defined(HAVE_SOCKETPAIR) ZEND_FUNCTION(stream_socket_pair); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_copy_to_stream); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_contents); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_supports_lock); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_write_buffer); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_read_buffer); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_blocking); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_meta_data); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_line); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_resolve_include_path); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_wrappers); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_transports); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_is_local); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_isatty); -#endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_vt100_support); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_set_chunk_size); -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FUNCTION(stream_set_timeout); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(gettype); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(get_debug_type); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(settype); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(intval); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(floatval); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(boolval); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(strval); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_null); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_resource); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_bool); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_int); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_float); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_numeric); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_string); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_array); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_object); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_scalar); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_callable); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_iterable); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(is_countable); -#endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_FUNCTION(uniqid); #endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(parse_url); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(urlencode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(urldecode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(rawurlencode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(rawurldecode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(get_headers); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_make_writeable); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_prepend); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_append); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_bucket_new); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_get_filters); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(stream_filter_register); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(convert_uuencode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(convert_uudecode); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(var_dump); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(var_export); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(debug_zval_dump); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(serialize); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(unserialize); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(memory_get_usage); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(memory_get_peak_usage); -#endif -#if defined(HAVE_UTIME) ZEND_FUNCTION(version_compare); -#endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_set); #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_get); #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_conv); #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_is_utf8); #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_set_ctrl_handler); #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_generate_ctrl_event); #endif @@ -3934,586 +3258,244 @@ static const zend_function_entry ext_functions[] = { #if defined(HAVE_UTIME) ZEND_FE(touch, arginfo_touch) #endif -#if defined(HAVE_UTIME) ZEND_FE(clearstatcache, arginfo_clearstatcache) -#endif -#if defined(HAVE_UTIME) ZEND_FE(disk_total_space, arginfo_disk_total_space) -#endif -#if defined(HAVE_UTIME) ZEND_FE(disk_free_space, arginfo_disk_free_space) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(diskfreespace, disk_free_space, arginfo_diskfreespace) -#endif -#if defined(HAVE_UTIME) ZEND_FE(realpath_cache_get, arginfo_realpath_cache_get) -#endif -#if defined(HAVE_UTIME) ZEND_FE(realpath_cache_size, arginfo_realpath_cache_size) -#endif -#if defined(HAVE_UTIME) ZEND_FE(sprintf, arginfo_sprintf) -#endif -#if defined(HAVE_UTIME) ZEND_FE(printf, arginfo_printf) -#endif -#if defined(HAVE_UTIME) ZEND_FE(vprintf, arginfo_vprintf) -#endif -#if defined(HAVE_UTIME) ZEND_FE(vsprintf, arginfo_vsprintf) -#endif -#if defined(HAVE_UTIME) ZEND_FE(fprintf, arginfo_fprintf) -#endif -#if defined(HAVE_UTIME) ZEND_FE(vfprintf, arginfo_vfprintf) -#endif -#if defined(HAVE_UTIME) ZEND_FE(fsockopen, arginfo_fsockopen) -#endif -#if defined(HAVE_UTIME) ZEND_FE(pfsockopen, arginfo_pfsockopen) -#endif -#if defined(HAVE_UTIME) ZEND_FE(http_build_query, arginfo_http_build_query) -#endif -#if defined(HAVE_UTIME) ZEND_FE(image_type_to_mime_type, arginfo_image_type_to_mime_type) -#endif -#if defined(HAVE_UTIME) ZEND_FE(image_type_to_extension, arginfo_image_type_to_extension) -#endif -#if defined(HAVE_UTIME) ZEND_FE(getimagesize, arginfo_getimagesize) -#endif -#if defined(HAVE_UTIME) ZEND_FE(getimagesizefromstring, arginfo_getimagesizefromstring) -#endif -#if defined(HAVE_UTIME) ZEND_FE(phpinfo, arginfo_phpinfo) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(phpversion, arginfo_phpversion) -#endif -#if defined(HAVE_UTIME) ZEND_FE(phpcredits, arginfo_phpcredits) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_sapi_name, arginfo_php_sapi_name) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(php_uname, arginfo_php_uname) -#endif -#if defined(HAVE_UTIME) ZEND_FE(php_ini_scanned_files, arginfo_php_ini_scanned_files) -#endif -#if defined(HAVE_UTIME) ZEND_FE(php_ini_loaded_file, arginfo_php_ini_loaded_file) -#endif -#if defined(HAVE_UTIME) ZEND_FE(iptcembed, arginfo_iptcembed) -#endif -#if defined(HAVE_UTIME) ZEND_FE(iptcparse, arginfo_iptcparse) -#endif -#if defined(HAVE_UTIME) ZEND_FE(levenshtein, arginfo_levenshtein) -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(readlink, arginfo_readlink) #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(linkinfo, arginfo_linkinfo) #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(symlink, arginfo_symlink) #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) ZEND_FE(link, arginfo_link) #endif -#if defined(HAVE_UTIME) ZEND_FE(mail, arginfo_mail) -#endif -#if defined(HAVE_UTIME) ZEND_FE(abs, arginfo_abs) -#endif -#if defined(HAVE_UTIME) ZEND_FE(ceil, arginfo_ceil) -#endif -#if defined(HAVE_UTIME) ZEND_FE(floor, arginfo_floor) -#endif -#if defined(HAVE_UTIME) ZEND_FE(round, arginfo_round) -#endif -#if defined(HAVE_UTIME) ZEND_FE(sin, arginfo_sin) -#endif -#if defined(HAVE_UTIME) ZEND_FE(cos, arginfo_cos) -#endif -#if defined(HAVE_UTIME) ZEND_FE(tan, arginfo_tan) -#endif -#if defined(HAVE_UTIME) ZEND_FE(asin, arginfo_asin) -#endif -#if defined(HAVE_UTIME) ZEND_FE(acos, arginfo_acos) -#endif -#if defined(HAVE_UTIME) ZEND_FE(atan, arginfo_atan) -#endif -#if defined(HAVE_UTIME) ZEND_FE(atanh, arginfo_atanh) -#endif -#if defined(HAVE_UTIME) ZEND_FE(atan2, arginfo_atan2) -#endif -#if defined(HAVE_UTIME) ZEND_FE(sinh, arginfo_sinh) -#endif -#if defined(HAVE_UTIME) ZEND_FE(cosh, arginfo_cosh) -#endif -#if defined(HAVE_UTIME) ZEND_FE(tanh, arginfo_tanh) -#endif -#if defined(HAVE_UTIME) ZEND_FE(asinh, arginfo_asinh) -#endif -#if defined(HAVE_UTIME) ZEND_FE(acosh, arginfo_acosh) -#endif -#if defined(HAVE_UTIME) ZEND_FE(expm1, arginfo_expm1) -#endif -#if defined(HAVE_UTIME) ZEND_FE(log1p, arginfo_log1p) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pi, arginfo_pi) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_finite, arginfo_is_finite) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_nan, arginfo_is_nan) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(intdiv, arginfo_intdiv) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(is_infinite, arginfo_is_infinite) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(pow, arginfo_pow) -#endif -#if defined(HAVE_UTIME) ZEND_FE(exp, arginfo_exp) -#endif -#if defined(HAVE_UTIME) ZEND_FE(log, arginfo_log) -#endif -#if defined(HAVE_UTIME) ZEND_FE(log10, arginfo_log10) -#endif -#if defined(HAVE_UTIME) ZEND_FE(sqrt, arginfo_sqrt) -#endif -#if defined(HAVE_UTIME) ZEND_FE(hypot, arginfo_hypot) -#endif -#if defined(HAVE_UTIME) ZEND_FE(deg2rad, arginfo_deg2rad) -#endif -#if defined(HAVE_UTIME) ZEND_FE(rad2deg, arginfo_rad2deg) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(bindec, arginfo_bindec) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(hexdec, arginfo_hexdec) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(octdec, arginfo_octdec) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decbin, arginfo_decbin) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(decoct, arginfo_decoct) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(dechex, arginfo_dechex) -#endif -#if defined(HAVE_UTIME) ZEND_FE(base_convert, arginfo_base_convert) -#endif -#if defined(HAVE_UTIME) ZEND_FE(number_format, arginfo_number_format) -#endif -#if defined(HAVE_UTIME) ZEND_FE(fmod, arginfo_fmod) -#endif -#if defined(HAVE_UTIME) ZEND_FE(fdiv, arginfo_fdiv) -#endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_FE(microtime, arginfo_microtime) #endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_FE(gettimeofday, arginfo_gettimeofday) #endif -#if defined(HAVE_UTIME) && defined(HAVE_GETRUSAGE) +#if defined(HAVE_GETRUSAGE) ZEND_FE(getrusage, arginfo_getrusage) #endif -#if defined(HAVE_UTIME) ZEND_FE(pack, arginfo_pack) -#endif -#if defined(HAVE_UTIME) ZEND_FE(unpack, arginfo_unpack) -#endif -#if defined(HAVE_UTIME) ZEND_FE(password_get_info, arginfo_password_get_info) -#endif -#if defined(HAVE_UTIME) ZEND_FE(password_hash, arginfo_password_hash) -#endif -#if defined(HAVE_UTIME) ZEND_FE(password_needs_rehash, arginfo_password_needs_rehash) -#endif -#if defined(HAVE_UTIME) ZEND_FE(password_verify, arginfo_password_verify) -#endif -#if defined(HAVE_UTIME) ZEND_FE(password_algos, arginfo_password_algos) -#endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_open, arginfo_proc_open) #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_close, arginfo_proc_close) #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_terminate, arginfo_proc_terminate) #endif -#if defined(HAVE_UTIME) && defined(PHP_CAN_SUPPORT_PROC_OPEN) +#if defined(PHP_CAN_SUPPORT_PROC_OPEN) ZEND_FE(proc_get_status, arginfo_proc_get_status) #endif -#if defined(HAVE_UTIME) ZEND_FE(quoted_printable_decode, arginfo_quoted_printable_decode) -#endif -#if defined(HAVE_UTIME) ZEND_FE(quoted_printable_encode, arginfo_quoted_printable_encode) -#endif -#if defined(HAVE_UTIME) ZEND_FE(mt_srand, arginfo_mt_srand) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(srand, mt_srand, arginfo_srand) -#endif -#if defined(HAVE_UTIME) ZEND_FE(rand, arginfo_rand) -#endif -#if defined(HAVE_UTIME) ZEND_FE(mt_rand, arginfo_mt_rand) -#endif -#if defined(HAVE_UTIME) ZEND_FE(mt_getrandmax, arginfo_mt_getrandmax) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(getrandmax, mt_getrandmax, arginfo_getrandmax) -#endif -#if defined(HAVE_UTIME) ZEND_FE(random_bytes, arginfo_random_bytes) -#endif -#if defined(HAVE_UTIME) ZEND_FE(random_int, arginfo_random_int) -#endif -#if defined(HAVE_UTIME) ZEND_FE(soundex, arginfo_soundex) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_select, arginfo_stream_select) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_create, arginfo_stream_context_create) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_set_params, arginfo_stream_context_set_params) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_get_params, arginfo_stream_context_get_params) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_set_option, arginfo_stream_context_set_option) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_get_options, arginfo_stream_context_get_options) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_get_default, arginfo_stream_context_get_default) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_context_set_default, arginfo_stream_context_set_default) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_filter_prepend, arginfo_stream_filter_prepend) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_filter_append, arginfo_stream_filter_append) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_filter_remove, arginfo_stream_filter_remove) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_client, arginfo_stream_socket_client) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_server, arginfo_stream_socket_server) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_accept, arginfo_stream_socket_accept) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_get_name, arginfo_stream_socket_get_name) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_recvfrom, arginfo_stream_socket_recvfrom) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_sendto, arginfo_stream_socket_sendto) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_socket_enable_crypto, arginfo_stream_socket_enable_crypto) -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SHUTDOWN) +#if defined(HAVE_SHUTDOWN) ZEND_FE(stream_socket_shutdown, arginfo_stream_socket_shutdown) #endif -#if defined(HAVE_UTIME) && defined(HAVE_SOCKETPAIR) +#if defined(HAVE_SOCKETPAIR) ZEND_FE(stream_socket_pair, arginfo_stream_socket_pair) #endif -#if defined(HAVE_UTIME) ZEND_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_get_contents, arginfo_stream_get_contents) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_supports_lock, arginfo_stream_supports_lock) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_set_write_buffer, arginfo_stream_set_write_buffer) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(set_file_buffer, stream_set_write_buffer, arginfo_set_file_buffer) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_set_read_buffer, arginfo_stream_set_read_buffer) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_set_blocking, arginfo_stream_set_blocking) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(socket_set_blocking, stream_set_blocking, arginfo_socket_set_blocking) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_get_meta_data, arginfo_stream_get_meta_data) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(socket_get_status, stream_get_meta_data, arginfo_socket_get_status) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_get_line, arginfo_stream_get_line) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_get_wrappers, arginfo_stream_get_wrappers) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_get_transports, arginfo_stream_get_transports) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_is_local, arginfo_stream_is_local) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_isatty, arginfo_stream_isatty) -#endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_vt100_support, arginfo_sapi_windows_vt100_support) #endif -#if defined(HAVE_UTIME) ZEND_FE(stream_set_chunk_size, arginfo_stream_set_chunk_size) -#endif -#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FE(stream_set_timeout, arginfo_stream_set_timeout) #endif -#if defined(HAVE_UTIME) && defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) ZEND_FALIAS(socket_set_timeout, stream_set_timeout, arginfo_socket_set_timeout) #endif -#if defined(HAVE_UTIME) ZEND_FE(gettype, arginfo_gettype) -#endif -#if defined(HAVE_UTIME) ZEND_FE(get_debug_type, arginfo_get_debug_type) -#endif -#if defined(HAVE_UTIME) ZEND_FE(settype, arginfo_settype) -#endif -#if defined(HAVE_UTIME) ZEND_FE(intval, arginfo_intval) -#endif -#if defined(HAVE_UTIME) ZEND_FE(floatval, arginfo_floatval) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(doubleval, floatval, arginfo_doubleval) -#endif -#if defined(HAVE_UTIME) ZEND_FE(boolval, arginfo_boolval) -#endif -#if defined(HAVE_UTIME) ZEND_FE(strval, arginfo_strval) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_null, arginfo_is_null) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_resource, arginfo_is_resource) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_bool, arginfo_is_bool) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_int, arginfo_is_int) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(is_integer, is_int, arginfo_is_integer) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(is_long, is_int, arginfo_is_long) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_float, arginfo_is_float) -#endif -#if defined(HAVE_UTIME) ZEND_FALIAS(is_double, is_float, arginfo_is_double) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_numeric, arginfo_is_numeric) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_string, arginfo_is_string) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_array, arginfo_is_array) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_object, arginfo_is_object) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_scalar, arginfo_is_scalar) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_callable, arginfo_is_callable) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_iterable, arginfo_is_iterable) -#endif -#if defined(HAVE_UTIME) ZEND_FE(is_countable, arginfo_is_countable) -#endif -#if defined(HAVE_UTIME) && defined(HAVE_GETTIMEOFDAY) +#if defined(HAVE_GETTIMEOFDAY) ZEND_FE(uniqid, arginfo_uniqid) #endif -#if defined(HAVE_UTIME) ZEND_FE(parse_url, arginfo_parse_url) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urlencode, arginfo_urlencode) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(urldecode, arginfo_urldecode) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurlencode, arginfo_rawurlencode) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(rawurldecode, arginfo_rawurldecode) -#endif -#if defined(HAVE_UTIME) ZEND_FE(get_headers, arginfo_get_headers) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_make_writeable, arginfo_stream_bucket_make_writeable) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_prepend, arginfo_stream_bucket_prepend) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_append, arginfo_stream_bucket_append) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_bucket_new, arginfo_stream_bucket_new) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_get_filters, arginfo_stream_get_filters) -#endif -#if defined(HAVE_UTIME) ZEND_FE(stream_filter_register, arginfo_stream_filter_register) -#endif -#if defined(HAVE_UTIME) ZEND_FE(convert_uuencode, arginfo_convert_uuencode) -#endif -#if defined(HAVE_UTIME) ZEND_FE(convert_uudecode, arginfo_convert_uudecode) -#endif -#if defined(HAVE_UTIME) ZEND_FE(var_dump, arginfo_var_dump) -#endif -#if defined(HAVE_UTIME) ZEND_FE(var_export, arginfo_var_export) -#endif -#if defined(HAVE_UTIME) ZEND_FE(debug_zval_dump, arginfo_debug_zval_dump) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(serialize, arginfo_serialize) -#endif -#if defined(HAVE_UTIME) ZEND_FE(unserialize, arginfo_unserialize) -#endif -#if defined(HAVE_UTIME) ZEND_FE(memory_get_usage, arginfo_memory_get_usage) -#endif -#if defined(HAVE_UTIME) ZEND_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage) -#endif -#if defined(HAVE_UTIME) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(version_compare, arginfo_version_compare) -#endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set) #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_get, arginfo_sapi_windows_cp_get) #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_conv, arginfo_sapi_windows_cp_conv) #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_is_utf8, arginfo_sapi_windows_cp_is_utf8) #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_set_ctrl_handler, arginfo_sapi_windows_set_ctrl_handler) #endif -#if defined(HAVE_UTIME) && defined(PHP_WIN32) +#if defined(PHP_WIN32) ZEND_FE(sapi_windows_generate_ctrl_event, arginfo_sapi_windows_generate_ctrl_event) #endif ZEND_FE_END From 53c6619bdaa3bc46b9f89fc9a0e52ed3b9b7a1e4 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 1 Apr 2022 18:11:36 +0200 Subject: [PATCH 0409/1346] Restore memory_reset_peak_usage() declaration Cf. . --- ext/standard/basic_functions.stub.php | 2 ++ ext/standard/basic_functions_arginfo.h | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 972963430c694..8239b6d14dba3 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2057,6 +2057,8 @@ function memory_get_usage(bool $real_usage = false): int {} function memory_get_peak_usage(bool $real_usage = false): int {} +function memory_reset_peak_usage(): void {} + /* versioning.c */ /** @compile-time-eval */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index b3ea9968461d4..b912e503bbe44 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: e53bcb20eb22fd198019ca24ebbf10a0decde13a */ + * Stub hash: bbcebdb57572133d5f442f220f1e98a1320ed0f6 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2175,6 +2175,8 @@ ZEND_END_ARG_INFO() #define arginfo_memory_get_peak_usage arginfo_memory_get_usage +#define arginfo_memory_reset_peak_usage arginfo_flush + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_version_compare, 0, 2, MAY_BE_LONG|MAY_BE_BOOL) ZEND_ARG_TYPE_INFO(0, version1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, version2, IS_STRING, 0) @@ -2824,6 +2826,7 @@ ZEND_FUNCTION(serialize); ZEND_FUNCTION(unserialize); ZEND_FUNCTION(memory_get_usage); ZEND_FUNCTION(memory_get_peak_usage); +ZEND_FUNCTION(memory_reset_peak_usage); ZEND_FUNCTION(version_compare); #if defined(PHP_WIN32) ZEND_FUNCTION(sapi_windows_cp_set); @@ -3479,6 +3482,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(unserialize, arginfo_unserialize) ZEND_FE(memory_get_usage, arginfo_memory_get_usage) ZEND_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage) + ZEND_FE(memory_reset_peak_usage, arginfo_memory_reset_peak_usage) ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(version_compare, arginfo_version_compare) #if defined(PHP_WIN32) ZEND_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set) From 8620788c2afd1ff2fb165b3eb178a350eb89b6a1 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 30 Mar 2022 16:02:57 +0200 Subject: [PATCH 0410/1346] Zend/zend_execute: remove duplicate deinitialization code This code duplication was introduced by commit 85f35a8fc1e ("Separate unspecializeble code of INCLIDE_OR_EVAL into helper functions") for no obvious reason. --- Zend/zend_execute.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c176696f3f236..436a5a2fd2a94 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -4516,11 +4516,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_include_or_eval(zval } if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path)) { - zend_op_array *op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE)); - zend_destroy_file_handle(&file_handle); - zend_string_release_ex(resolved_path, 0); - zend_tmp_string_release(tmp_inc_filename); - return op_array; + new_op_array = zend_compile_file(&file_handle, (type==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE)); } else { new_op_array = ZEND_FAKE_OP_ARRAY; } From 2874e5fa052d54affd31ed5eaf3e0d53c9116c93 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 19 Mar 2022 15:16:07 +0000 Subject: [PATCH 0411/1346] FPM: Emit error for invalid port setting --- NEWS | 3 +++ sapi/fpm/fpm/fpm_sockets.c | 2 +- sapi/fpm/tests/log-invalid-port.phpt | 36 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 sapi/fpm/tests/log-invalid-port.phpt diff --git a/NEWS b/NEWS index 75e3600f5480a..c06858ea657e6 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) +- FPM: + . Emit error for invalid port setting. (David Carlier) + - Intl: . Update all grandfathered language tags with preferred values . Fixed GH-7939 (Cannot unserialize IntlTimeZone objects). (cmb) diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 9514979ac1ce2..003c62b7d05df 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -334,7 +334,7 @@ static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* port_str = dup_address; } - if (port == 0) { + if (port < 1 || port > 65535) { zlog(ZLOG_ERROR, "invalid port value '%s'", port_str); free(dup_address); return -1; diff --git a/sapi/fpm/tests/log-invalid-port.phpt b/sapi/fpm/tests/log-invalid-port.phpt new file mode 100644 index 0000000000000..361700378eb1a --- /dev/null +++ b/sapi/fpm/tests/log-invalid-port.phpt @@ -0,0 +1,36 @@ +--TEST-- +FPM: test invalid port value +--SKIPIF-- + +--FILE-- +start(); +$tester->expectLogError("invalid port value '69002'"); +$tester->terminate(); +$tester->close(); + +?> +Done +--EXPECT-- +Done +--CLEAN-- + From afd8f84c1a17ad4735af2b68a4a8b5f6add998de Mon Sep 17 00:00:00 2001 From: Paragon Initiative Enterprises Date: Wed, 30 Mar 2022 03:45:47 -0400 Subject: [PATCH 0412/1346] Add sodium_crypto_stream_xchacha20_xor_ic() There are many use-cases where a PHP user is currently using sodium_compat's implementation of this low-level XChaCha20 API. For example, multi-part message processing (in low-memory settings) for a ciphertext that was encrypted with XChaCha20-Poly1305 (rather than the secretstream API). Adding this function to ext/sodium offers better performance and lowers users' memory usage with the polyfill, and ensures that users coming from other languages that provide libsodium bindings have a more consistent experience with our bindings. This is a win-win. This patch follows the libsodium precedent of adding functions instead of optional parameters to existing functions. The parameter order is also consistent with the C API. https://doc.libsodium.org/advanced/stream_ciphers/xchacha20#usage Closes GH-8276. --- NEWS | 3 ++ UPGRADING | 3 ++ ext/sodium/libsodium.c | 43 +++++++++++++++++++ ext/sodium/libsodium.stub.php | 2 + ext/sodium/libsodium_arginfo.h | 15 +++++++ ext/sodium/tests/crypto_stream_xchacha20.phpt | 18 ++++++++ 6 files changed, 84 insertions(+) diff --git a/NEWS b/NEWS index c06858ea657e6..906b9c1fa5c4d 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,9 @@ PHP NEWS . Fixed bug #80909 (crash with persistent connections in PDO_ODBC). (Calvin Buckley) +- Sodium: + . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) + - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) diff --git a/UPGRADING b/UPGRADING index b91229ec627ea..b99bb790445c3 100644 --- a/UPGRADING +++ b/UPGRADING @@ -114,6 +114,9 @@ PHP 8.2 UPGRADE NOTES 6. New Functions ======================================== +- Sodium: + . sodium_crypto_stream_xchacha20_xor_ic() + - Standard: . The peak memory usage can now be reset to the current usage thanks to memory_reset_peak_usage(). diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c index 53d7f116652de..54d687cd736c0 100644 --- a/ext/sodium/libsodium.c +++ b/ext/sodium/libsodium.c @@ -1578,6 +1578,49 @@ PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor) RETURN_NEW_STR(ciphertext); } + +PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor_ic) +{ + zend_string *ciphertext; + unsigned char *key; + unsigned char *msg; + unsigned char *nonce; + zend_long *ic; + + size_t ciphertext_len; + size_t key_len; + size_t msg_len; + size_t nonce_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssls", + &msg, &msg_len, + &nonce, &nonce_len, + &ic, + &key, &key_len) == FAILURE) { + sodium_remove_param_values_from_backtrace(EG(exception)); + RETURN_THROWS(); + } + if (nonce_len != crypto_stream_xchacha20_NONCEBYTES) { + zend_argument_error(sodium_exception_ce, 2, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES bytes long"); + RETURN_THROWS(); + } + if (key_len != crypto_stream_xchacha20_KEYBYTES) { + zend_argument_error(sodium_exception_ce, 3, "must be SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES bytes long"); + RETURN_THROWS(); + } + ciphertext_len = msg_len; + ciphertext = zend_string_checked_alloc((size_t) ciphertext_len, 0); + if (crypto_stream_xchacha20_xor_ic((unsigned char *) ZSTR_VAL(ciphertext), msg, + (unsigned long long) msg_len, nonce, + (unsigned long long) ic, key) != 0) { + zend_string_free(ciphertext); + zend_throw_exception(sodium_exception_ce, "internal error", 0); + RETURN_THROWS(); + } + ZSTR_VAL(ciphertext)[ciphertext_len] = 0; + + RETURN_NEW_STR(ciphertext); +} #endif #ifdef crypto_pwhash_SALTBYTES diff --git a/ext/sodium/libsodium.stub.php b/ext/sodium/libsodium.stub.php index af859c58fe963..55d3e0a5161bc 100644 --- a/ext/sodium/libsodium.stub.php +++ b/ext/sodium/libsodium.stub.php @@ -205,6 +205,8 @@ function sodium_crypto_stream_xchacha20(int $length, string $nonce, string $key) function sodium_crypto_stream_xchacha20_keygen(): string {} function sodium_crypto_stream_xchacha20_xor(string $message, string $nonce, string $key): string {} + +function sodium_crypto_stream_xchacha20_xor_ic(string $message, string $nonce, int $counter, string $key): string {} #endif function sodium_add(string &$string1, string $string2): void {} diff --git a/ext/sodium/libsodium_arginfo.h b/ext/sodium/libsodium_arginfo.h index f0e7aed85e258..a45bd5f59ea03 100644 --- a/ext/sodium/libsodium_arginfo.h +++ b/ext/sodium/libsodium_arginfo.h @@ -445,6 +445,15 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_stream_xchacha20_x ZEND_END_ARG_INFO() #endif +#if defined(crypto_stream_xchacha20_KEYBYTES) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_stream_xchacha20_xor_ic, 0, 4, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, nonce, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, counter, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) +ZEND_END_ARG_INFO() +#endif + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_add, 0, 2, IS_VOID, 0) ZEND_ARG_TYPE_INFO(1, string1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string2, IS_STRING, 0) @@ -662,6 +671,9 @@ ZEND_FUNCTION(sodium_crypto_stream_xchacha20_keygen); #if defined(crypto_stream_xchacha20_KEYBYTES) ZEND_FUNCTION(sodium_crypto_stream_xchacha20_xor); #endif +#if defined(crypto_stream_xchacha20_KEYBYTES) +ZEND_FUNCTION(sodium_crypto_stream_xchacha20_xor_ic); +#endif ZEND_FUNCTION(sodium_add); ZEND_FUNCTION(sodium_compare); ZEND_FUNCTION(sodium_increment); @@ -844,6 +856,9 @@ static const zend_function_entry ext_functions[] = { #endif #if defined(crypto_stream_xchacha20_KEYBYTES) ZEND_FE(sodium_crypto_stream_xchacha20_xor, arginfo_sodium_crypto_stream_xchacha20_xor) +#endif +#if defined(crypto_stream_xchacha20_KEYBYTES) + ZEND_FE(sodium_crypto_stream_xchacha20_xor_ic, arginfo_sodium_crypto_stream_xchacha20_xor_ic) #endif ZEND_FE(sodium_add, arginfo_sodium_add) ZEND_FE(sodium_compare, arginfo_sodium_compare) diff --git a/ext/sodium/tests/crypto_stream_xchacha20.phpt b/ext/sodium/tests/crypto_stream_xchacha20.phpt index 275e195a29281..466734853d705 100644 --- a/ext/sodium/tests/crypto_stream_xchacha20.phpt +++ b/ext/sodium/tests/crypto_stream_xchacha20.phpt @@ -34,6 +34,22 @@ $stream6 = sodium_crypto_stream_xchacha20_xor($stream5, $nonce, $key); var_dump($stream6 === $stream); +// New test (with Initial Counter feature): +$n2 = random_bytes(SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES); +$left = str_repeat("\x01", 64); +$right = str_repeat("\xfe", 64); + +// All at once: +$stream7_unified = sodium_crypto_stream_xchacha20_xor($left . $right, $n2, $key); + +// Piecewise, with initial counter: +$stream7_left = sodium_crypto_stream_xchacha20_xor_ic($left, $n2, 0, $key); +$stream7_right = sodium_crypto_stream_xchacha20_xor_ic($right, $n2, 1, $key); +$stream7_concat = $stream7_left . $stream7_right; + +var_dump(strlen($stream7_concat)); +var_dump($stream7_unified === $stream7_concat); + try { sodium_crypto_stream_xchacha20(-1, $nonce, $key); } catch (SodiumException $ex) { @@ -71,6 +87,8 @@ bool(true) bool(true) bool(true) bool(true) +int(128) +bool(true) sodium_crypto_stream_xchacha20(): Argument #1 ($length) must be greater than 0 sodium_crypto_stream_xchacha20(): Argument #2 ($nonce) must be SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES bytes long sodium_crypto_stream_xchacha20(): Argument #3 ($key) must be SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES bytes long From df0c8aaee99bf7361420bca85db67d3f434bdccc Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 4 Apr 2022 16:36:25 +0300 Subject: [PATCH 0413/1346] JIT: Fix array clobbering by user error handler Fixes oss-fuzz #46336 --- Zend/zend_vm_def.h | 13 +- Zend/zend_vm_execute.h | 368 +++++++++++++++++++++- ext/opcache/tests/jit/assign_dim_015.phpt | 19 ++ 3 files changed, 391 insertions(+), 9 deletions(-) create mode 100644 ext/opcache/tests/jit/assign_dim_015.phpt diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 5207a09d34dea..bbba2ca0dfc97 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2548,7 +2548,18 @@ ZEND_VM_HANDLER(23, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(O ZEND_VM_C_LABEL(try_assign_dim_array): SEPARATE_ARRAY(object_ptr); if (OP2_TYPE == IS_UNUSED) { - value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + value = GET_OP_DATA_ZVAL_PTR_UNDEF(BP_VAR_R); + if (OP_DATA_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + ZEND_VM_C_GOTO(assign_dim_error); + } + } if (OP_DATA_TYPE == IS_CV || OP_DATA_TYPE == IS_VAR) { ZVAL_DEREF(value); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index cb9654688e919..1b27785470062 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23443,6 +23443,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -23580,6 +23591,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -23718,6 +23740,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -23855,7 +23888,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -26098,6 +26142,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -26235,6 +26290,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -26373,6 +26439,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -26510,7 +26587,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -27585,6 +27673,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -27722,6 +27821,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -27860,6 +27970,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -27997,7 +28118,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -30217,6 +30349,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -30354,6 +30497,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -30492,6 +30646,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -30629,7 +30794,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -41262,6 +41438,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -41399,6 +41586,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -41537,6 +41735,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -41674,7 +41883,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CONST == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -45002,6 +45222,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -45139,6 +45370,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -45277,6 +45519,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -45414,7 +45667,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -46936,6 +47200,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -47073,6 +47348,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -47211,6 +47497,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -47348,7 +47645,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_UNUSED == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } @@ -50237,6 +50545,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = RT_CONSTANT((opline+1), (opline+1)->op1); + if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CONST == IS_CV || IS_CONST == IS_VAR) { ZVAL_DEREF(value); } @@ -50374,6 +50693,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_tmp((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -50512,6 +50842,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { value = _get_zval_ptr_var((opline+1)->op1.var EXECUTE_DATA_CC); + if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_VAR == IS_CV || IS_VAR == IS_VAR) { ZVAL_DEREF(value); } @@ -50649,7 +50990,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ try_assign_dim_array: SEPARATE_ARRAY(object_ptr); if (IS_CV == IS_UNUSED) { - value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + value = EX_VAR((opline+1)->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) { + HashTable *ht = Z_ARRVAL_P(object_ptr); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE)) { + GC_ADDREF(ht); + } + value = zval_undefined_cv((opline+1)->op1.var EXECUTE_DATA_CC); + if (!(GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) && !GC_DELREF(ht)) { + zend_array_destroy(ht); + goto assign_dim_error; + } + } if (IS_CV == IS_CV || IS_CV == IS_VAR) { ZVAL_DEREF(value); } diff --git a/ext/opcache/tests/jit/assign_dim_015.phpt b/ext/opcache/tests/jit/assign_dim_015.phpt new file mode 100644 index 0000000000000..fd37d84764d0a --- /dev/null +++ b/ext/opcache/tests/jit/assign_dim_015.phpt @@ -0,0 +1,19 @@ +--TEST-- +JIT ASSIGN_DIM: 015 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +--FILE-- + +DONE +--EXPECT-- +Error: Undefined variable $y +DONE From 2fe35cf8078cbb2da3e57200b007588988dbdd2a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 5 Apr 2022 13:35:59 +0100 Subject: [PATCH 0414/1346] Regenerate optimized func infos Using the --generate-optimizer-info option for ./build/gen_stubs.php --- Zend/Optimizer/zend_func_infos.h | 14 +++++++------- ext/sodium/libsodium_arginfo.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/Optimizer/zend_func_infos.h b/Zend/Optimizer/zend_func_infos.h index d0d54989dc71d..ff89312fb3f4b 100644 --- a/Zend/Optimizer/zend_func_infos.h +++ b/Zend/Optimizer/zend_func_infos.h @@ -508,7 +508,7 @@ static const func_info_t func_infos[] = { F1("long2ip", MAY_BE_STRING|MAY_BE_FALSE), F1("getenv", MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), F1("getopt", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_FALSE|MAY_BE_FALSE), -#if HAVE_NANOSLEEP +#if defined(HAVE_NANOSLEEP) F1("time_nanosleep", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_BOOL), #endif F1("get_current_user", MAY_BE_STRING), @@ -522,10 +522,10 @@ static const func_info_t func_infos[] = { F1("set_include_path", MAY_BE_STRING|MAY_BE_FALSE), F1("get_include_path", MAY_BE_STRING|MAY_BE_FALSE), F1("print_r", MAY_BE_STRING|MAY_BE_BOOL), -#if HAVE_GETSERVBYPORT +#if defined(HAVE_GETSERVBYPORT) F1("getservbyport", MAY_BE_STRING|MAY_BE_FALSE), #endif -#if HAVE_GETPROTOBYNUMBER +#if defined(HAVE_GETPROTOBYNUMBER) F1("getprotobynumber", MAY_BE_STRING|MAY_BE_FALSE), #endif F1("parse_ini_file", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_FALSE|MAY_BE_ARRAY_OF_TRUE|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_DOUBLE|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_ARRAY_OF_NULL|MAY_BE_FALSE), @@ -538,7 +538,7 @@ static const func_info_t func_infos[] = { #endif F1("get_browser", MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_ANY|MAY_BE_FALSE), F1("crypt", MAY_BE_STRING), -#if HAVE_STRPTIME +#if defined(HAVE_STRPTIME) F1("strptime", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), #endif #if defined(HAVE_GETHOSTNAME) @@ -547,7 +547,7 @@ static const func_info_t func_infos[] = { F1("gethostbyaddr", MAY_BE_STRING|MAY_BE_FALSE), F1("gethostbyname", MAY_BE_STRING), F1("gethostbynamel", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC +#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) F1("dns_get_record", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE), #endif F1("md5", MAY_BE_STRING), @@ -573,7 +573,7 @@ static const func_info_t func_infos[] = { F1("get_html_translation_table", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING), F1("bin2hex", MAY_BE_STRING), F1("hex2bin", MAY_BE_STRING|MAY_BE_FALSE), -#if HAVE_NL_LANGINFO +#if defined(HAVE_NL_LANGINFO) F1("nl_langinfo", MAY_BE_STRING|MAY_BE_FALSE), #endif F1("wordwrap", MAY_BE_STRING), @@ -701,7 +701,7 @@ static const func_info_t func_infos[] = { F1("stream_socket_server", MAY_BE_RESOURCE|MAY_BE_FALSE), F1("stream_socket_accept", MAY_BE_RESOURCE|MAY_BE_FALSE), F1("stream_socket_recvfrom", MAY_BE_STRING|MAY_BE_FALSE), -#if HAVE_SOCKETPAIR +#if defined(HAVE_SOCKETPAIR) F1("stream_socket_pair", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_FALSE), #endif F1("stream_get_contents", MAY_BE_STRING|MAY_BE_FALSE), diff --git a/ext/sodium/libsodium_arginfo.h b/ext/sodium/libsodium_arginfo.h index a45bd5f59ea03..a7351c9bef165 100644 --- a/ext/sodium/libsodium_arginfo.h +++ b/ext/sodium/libsodium_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: e172b900040a9d9ac98207c638fdeb3a0c6a13e6 */ + * Stub hash: 7ccd5115d292690c0cfcfeeb2ff5adf7ac7a616a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_sodium_crypto_aead_aes256gcm_is_available, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() From d03a94a0a6f81c8255b012e9e8f1226467ea3b53 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 5 Apr 2022 14:56:49 +0200 Subject: [PATCH 0415/1346] Use proper types in sodium_crypto_stream_xchacha20_xor_ic() Most importantly, `ic` needs to be of type `zend_long`, not `zend_long*`. Closes GH-8302. --- ext/sodium/libsodium.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/sodium/libsodium.c b/ext/sodium/libsodium.c index 54d687cd736c0..edd807cbe9864 100644 --- a/ext/sodium/libsodium.c +++ b/ext/sodium/libsodium.c @@ -1585,7 +1585,7 @@ PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor_ic) unsigned char *key; unsigned char *msg; unsigned char *nonce; - zend_long *ic; + zend_long ic; size_t ciphertext_len; size_t key_len; @@ -1612,7 +1612,7 @@ PHP_FUNCTION(sodium_crypto_stream_xchacha20_xor_ic) ciphertext = zend_string_checked_alloc((size_t) ciphertext_len, 0); if (crypto_stream_xchacha20_xor_ic((unsigned char *) ZSTR_VAL(ciphertext), msg, (unsigned long long) msg_len, nonce, - (unsigned long long) ic, key) != 0) { + (uint64_t) ic, key) != 0) { zend_string_free(ciphertext); zend_throw_exception(sodium_exception_ce, "internal error", 0); RETURN_THROWS(); From 8093ed61683e50bc0d9e2e854c6e8327a259461b Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 1 Apr 2022 16:43:35 +0100 Subject: [PATCH 0416/1346] Implemented FR #51634: Can't post multiple fields with the same name This PR allows for multiple values with the same field name to be sent to an HTTP server. This server can't be PHP, because PHP's POST processing does not allow for two the same field names. But sending multiple fields with the same name is required for some operations by RFC 7578. This PR allows you to attach an array of values to a field name, and each of these will then be sent as its own distinct multipart/form-data field. --- ext/curl/interface.c | 85 ++++++++++++++++------- ext/curl/tests/curl_postfields_array.phpt | 63 +++++++++++++++++ 2 files changed, 121 insertions(+), 27 deletions(-) create mode 100644 ext/curl/tests/curl_postfields_array.phpt diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 3292458d63554..0062586c64ec9 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1991,6 +1991,54 @@ static void free_cb(void *arg) /* {{{ */ /* }}} */ #endif +static inline CURLcode add_simple_field(curl_mime *mime, zend_string *string_key, zval *current) +{ + CURLcode error = CURLE_OK; +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ + curl_mimepart *part; + CURLcode form_error; +#else + struct HttpPost *first = NULL; + struct HttpPost *last = NULL; + CURLFORMcode form_error; +#endif + zend_string *postval, *tmp_postval; + + postval = zval_get_tmp_string(current, &tmp_postval); + +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ + part = curl_mime_addpart(mime); + if (part == NULL) { + zend_tmp_string_release(tmp_postval); + zend_string_release_ex(string_key, 0); + return CURLE_OUT_OF_MEMORY; + } + if ((form_error = curl_mime_name(part, ZSTR_VAL(string_key))) != CURLE_OK + || (form_error = curl_mime_data(part, ZSTR_VAL(postval), ZSTR_LEN(postval))) != CURLE_OK) { + error = form_error; + } +#else + /* The arguments after _NAMELENGTH and _CONTENTSLENGTH + * must be explicitly cast to long in curl_formadd + * use since curl needs a long not an int. */ + form_error = curl_formadd(&first, &last, + CURLFORM_COPYNAME, ZSTR_VAL(string_key), + CURLFORM_NAMELENGTH, ZSTR_LEN(string_key), + CURLFORM_COPYCONTENTS, ZSTR_VAL(postval), + CURLFORM_CONTENTSLENGTH, ZSTR_LEN(postval), + CURLFORM_END + ); + + if (form_error != CURL_FORMADD_OK) { + /* Not nice to convert between enums but we only have place for one error type */ + error = (CURLcode)form_error; + } +#endif + zend_tmp_string_release(tmp_postval); + + return error; +} + static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpostfields) /* {{{ */ { HashTable *postfields = Z_ARRVAL_P(zpostfields); @@ -2018,7 +2066,7 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo #endif ZEND_HASH_FOREACH_KEY_VAL(postfields, num_key, string_key, current) { - zend_string *postval, *tmp_postval; + zend_string *postval; /* Pretend we have a string_key here */ if (!string_key) { string_key = zend_long_to_str(num_key); @@ -2181,36 +2229,19 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo continue; } - postval = zval_get_tmp_string(current, &tmp_postval); + if (Z_TYPE_P(current) == IS_ARRAY) { + zval *current_element; + + ZEND_HASH_FOREACH_VAL(HASH_OF(current), current_element) { + add_simple_field(mime, string_key, current_element); + } ZEND_HASH_FOREACH_END(); -#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ - part = curl_mime_addpart(mime); - if (part == NULL) { - zend_tmp_string_release(tmp_postval); zend_string_release_ex(string_key, 0); - return FAILURE; - } - if ((form_error = curl_mime_name(part, ZSTR_VAL(string_key))) != CURLE_OK - || (form_error = curl_mime_data(part, ZSTR_VAL(postval), ZSTR_LEN(postval))) != CURLE_OK) { - error = form_error; + continue; } -#else - /* The arguments after _NAMELENGTH and _CONTENTSLENGTH - * must be explicitly cast to long in curl_formadd - * use since curl needs a long not an int. */ - form_error = curl_formadd(&first, &last, - CURLFORM_COPYNAME, ZSTR_VAL(string_key), - CURLFORM_NAMELENGTH, ZSTR_LEN(string_key), - CURLFORM_COPYCONTENTS, ZSTR_VAL(postval), - CURLFORM_CONTENTSLENGTH, ZSTR_LEN(postval), - CURLFORM_END); - if (form_error != CURL_FORMADD_OK) { - /* Not nice to convert between enums but we only have place for one error type */ - error = (CURLcode)form_error; - } -#endif - zend_tmp_string_release(tmp_postval); + add_simple_field(mime, string_key, current); + zend_string_release_ex(string_key, 0); } ZEND_HASH_FOREACH_END(); diff --git a/ext/curl/tests/curl_postfields_array.phpt b/ext/curl/tests/curl_postfields_array.phpt new file mode 100644 index 0000000000000..079675cf08f78 --- /dev/null +++ b/ext/curl/tests/curl_postfields_array.phpt @@ -0,0 +1,63 @@ +--TEST-- +CURLOPT_POSTFIELDS with multi-value fields +--EXTENSIONS-- +sockets +--FILE-- +\n"; + return; +} + +$url = "http://127.0.0.1:29999/get.inc?test=raw"; + +$fields = [ + 'single' => 'SingleValue', + 'multi' => [ + 'Multi1', + 'Multi2', + ] +]; + +$options = [ + CURLOPT_POST => 1, + CURLOPT_HEADER => 0, + CURLOPT_URL => $url, + CURLOPT_FRESH_CONNECT => 1, + CURLOPT_RETURNTRANSFER => 1, + CURLOPT_FORBID_REUSE => 1, + CURLOPT_TIMEOUT => 1, + CURLOPT_POSTFIELDS => $fields, +]; + +$ch = curl_init(); +curl_setopt_array($ch, $options); + +$curl_content = curl_exec($ch); +curl_close($ch); + +$conn = stream_socket_accept($socket); +echo stream_get_contents($conn); +?> +--EXPECTF-- +POST /get.inc?test=raw HTTP/1.1 +Host: %s +Accept: */* +Content-Length: %d +Content-Type: multipart/form-data; boundary=------------------------%s + +--------------------------%s +Content-Disposition: form-data; name="single" + +SingleValue +--------------------------%s +Content-Disposition: form-data; name="multi" + +Multi1 +--------------------------%s +Content-Disposition: form-data; name="multi" + +Multi2 +--------------------------%s-- From a4f4b96c9177d712b86e3aa6da1b0e91a91e5275 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 7 Apr 2022 10:45:21 +0100 Subject: [PATCH 0417/1346] Updated to version 2022.1 (2022a) --- ext/date/lib/timezonedb.h | 2136 +++++++++++++++++++------------------ 1 file changed, 1072 insertions(+), 1064 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index 411ef5b44254e..60cc4b3ab6cc9 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -270,340 +270,340 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Asia/Dushanbe" , 0x0247C2 }, { "Asia/Famagusta" , 0x02493C }, { "Asia/Gaza" , 0x024D03 }, - { "Asia/Harbin" , 0x0251E7 }, - { "Asia/Hebron" , 0x02537C }, - { "Asia/Ho_Chi_Minh" , 0x025871 }, - { "Asia/Hong_Kong" , 0x025969 }, - { "Asia/Hovd" , 0x025C7C }, - { "Asia/Irkutsk" , 0x025F05 }, - { "Asia/Istanbul" , 0x026223 }, - { "Asia/Jakarta" , 0x0266DF }, - { "Asia/Jayapura" , 0x0267F0 }, - { "Asia/Jerusalem" , 0x0268DD }, - { "Asia/Kabul" , 0x026D1B }, - { "Asia/Kamchatka" , 0x026DC6 }, - { "Asia/Karachi" , 0x0270BB }, - { "Asia/Kashgar" , 0x0271D1 }, - { "Asia/Kathmandu" , 0x027262 }, - { "Asia/Katmandu" , 0x02730F }, - { "Asia/Khandyga" , 0x0273BC }, - { "Asia/Kolkata" , 0x0276ED }, - { "Asia/Krasnoyarsk" , 0x0277D5 }, - { "Asia/Kuala_Lumpur" , 0x027ADF }, - { "Asia/Kuching" , 0x027BFF }, - { "Asia/Kuwait" , 0x027D59 }, - { "Asia/Macao" , 0x027DEA }, - { "Asia/Macau" , 0x02810D }, - { "Asia/Magadan" , 0x028430 }, - { "Asia/Makassar" , 0x02873B }, - { "Asia/Manila" , 0x02884E }, - { "Asia/Muscat" , 0x028948 }, - { "Asia/Nicosia" , 0x0289D9 }, - { "Asia/Novokuznetsk" , 0x028C4D }, - { "Asia/Novosibirsk" , 0x028F40 }, - { "Asia/Omsk" , 0x029251 }, - { "Asia/Oral" , 0x02954F }, - { "Asia/Phnom_Penh" , 0x0297DB }, - { "Asia/Pontianak" , 0x02987F }, - { "Asia/Pyongyang" , 0x029998 }, - { "Asia/Qatar" , 0x029A5B }, - { "Asia/Qostanay" , 0x029AFF }, - { "Asia/Qyzylorda" , 0x029D8C }, - { "Asia/Rangoon" , 0x02A025 }, - { "Asia/Riyadh" , 0x02A0EC }, - { "Asia/Saigon" , 0x02A17D }, - { "Asia/Sakhalin" , 0x02A275 }, - { "Asia/Samarkand" , 0x02A58C }, - { "Asia/Seoul" , 0x02A717 }, - { "Asia/Shanghai" , 0x02A8C2 }, - { "Asia/Singapore" , 0x02AA63 }, - { "Asia/Srednekolymsk" , 0x02AB6F }, - { "Asia/Taipei" , 0x02AE83 }, - { "Asia/Tashkent" , 0x02B08E }, - { "Asia/Tbilisi" , 0x02B219 }, - { "Asia/Tehran" , 0x02B49A }, - { "Asia/Tel_Aviv" , 0x02BC7A }, - { "Asia/Thimbu" , 0x02C0B8 }, - { "Asia/Thimphu" , 0x02C15E }, - { "Asia/Tokyo" , 0x02C204 }, - { "Asia/Tomsk" , 0x02C2E5 }, - { "Asia/Ujung_Pandang" , 0x02C5F0 }, - { "Asia/Ulaanbaatar" , 0x02C6BA }, - { "Asia/Ulan_Bator" , 0x02C92D }, - { "Asia/Urumqi" , 0x02CB8B }, - { "Asia/Ust-Nera" , 0x02CC29 }, - { "Asia/Vientiane" , 0x02CF4C }, - { "Asia/Vladivostok" , 0x02CFF0 }, - { "Asia/Yakutsk" , 0x02D2F5 }, - { "Asia/Yangon" , 0x02D5F9 }, - { "Asia/Yekaterinburg" , 0x02D6C0 }, - { "Asia/Yerevan" , 0x02D9D2 }, - { "Atlantic/Azores" , 0x02DCA2 }, - { "Atlantic/Bermuda" , 0x02E261 }, - { "Atlantic/Canary" , 0x02E66D }, - { "Atlantic/Cape_Verde" , 0x02E865 }, - { "Atlantic/Faeroe" , 0x02E920 }, - { "Atlantic/Faroe" , 0x02EAE5 }, - { "Atlantic/Jan_Mayen" , 0x02ECAA }, - { "Atlantic/Madeira" , 0x02EF5A }, - { "Atlantic/Reykjavik" , 0x02F522 }, - { "Atlantic/South_Georgia" , 0x02F81F }, - { "Atlantic/St_Helena" , 0x02F8AF }, - { "Atlantic/Stanley" , 0x02F93D }, - { "Australia/ACT" , 0x02FC5E }, - { "Australia/Adelaide" , 0x02FFF2 }, - { "Australia/Brisbane" , 0x0303A6 }, - { "Australia/Broken_Hill" , 0x0304EA }, - { "Australia/Canberra" , 0x0308BF }, - { "Australia/Currie" , 0x030C53 }, - { "Australia/Darwin" , 0x03104A }, - { "Australia/Eucla" , 0x031152 }, - { "Australia/Hobart" , 0x0312B1 }, - { "Australia/LHI" , 0x0316B0 }, - { "Australia/Lindeman" , 0x031970 }, - { "Australia/Lord_Howe" , 0x031AE0 }, - { "Australia/Melbourne" , 0x031DB0 }, - { "Australia/North" , 0x03214C }, - { "Australia/NSW" , 0x032242 }, - { "Australia/Perth" , 0x0325D6 }, - { "Australia/Queensland" , 0x032732 }, - { "Australia/South" , 0x03285F }, - { "Australia/Sydney" , 0x032C04 }, - { "Australia/Tasmania" , 0x032FB4 }, - { "Australia/Victoria" , 0x0333AB }, - { "Australia/West" , 0x03373F }, - { "Australia/Yancowinna" , 0x03387D }, - { "Brazil/Acre" , 0x033C36 }, - { "Brazil/DeNoronha" , 0x033DE4 }, - { "Brazil/East" , 0x033FD4 }, - { "Brazil/West" , 0x034398 }, - { "Canada/Atlantic" , 0x034540 }, - { "Canada/Central" , 0x034BD4 }, - { "Canada/Eastern" , 0x0350EE }, - { "Canada/Mountain" , 0x0357AF }, - { "Canada/Newfoundland" , 0x035B85 }, - { "Canada/Pacific" , 0x0362E7 }, - { "Canada/Saskatchewan" , 0x036825 }, - { "Canada/Yukon" , 0x036AAF }, - { "CET" , 0x036EC0 }, - { "Chile/Continental" , 0x037139 }, - { "Chile/EasterIsland" , 0x037647 }, - { "CST6CDT" , 0x037AA1 }, - { "Cuba" , 0x037E64 }, - { "EET" , 0x0382CD }, - { "Egypt" , 0x0384CA }, - { "Eire" , 0x0389D2 }, - { "EST" , 0x038FB6 }, - { "EST5EDT" , 0x039031 }, - { "Etc/GMT" , 0x0393F4 }, - { "Etc/GMT+0" , 0x03946F }, - { "Etc/GMT+1" , 0x0394EA }, - { "Etc/GMT+10" , 0x039567 }, - { "Etc/GMT+11" , 0x0395E5 }, - { "Etc/GMT+12" , 0x039663 }, - { "Etc/GMT+2" , 0x0396E1 }, - { "Etc/GMT+3" , 0x03975E }, - { "Etc/GMT+4" , 0x0397DB }, - { "Etc/GMT+5" , 0x039858 }, - { "Etc/GMT+6" , 0x0398D5 }, - { "Etc/GMT+7" , 0x039952 }, - { "Etc/GMT+8" , 0x0399CF }, - { "Etc/GMT+9" , 0x039A4C }, - { "Etc/GMT-0" , 0x039AC9 }, - { "Etc/GMT-1" , 0x039B44 }, - { "Etc/GMT-10" , 0x039BC2 }, - { "Etc/GMT-11" , 0x039C41 }, - { "Etc/GMT-12" , 0x039CC0 }, - { "Etc/GMT-13" , 0x039D3F }, - { "Etc/GMT-14" , 0x039DBE }, - { "Etc/GMT-2" , 0x039E3D }, - { "Etc/GMT-3" , 0x039EBB }, - { "Etc/GMT-4" , 0x039F39 }, - { "Etc/GMT-5" , 0x039FB7 }, - { "Etc/GMT-6" , 0x03A035 }, - { "Etc/GMT-7" , 0x03A0B3 }, - { "Etc/GMT-8" , 0x03A131 }, - { "Etc/GMT-9" , 0x03A1AF }, - { "Etc/GMT0" , 0x03A22D }, - { "Etc/Greenwich" , 0x03A2A8 }, - { "Etc/UCT" , 0x03A323 }, - { "Etc/Universal" , 0x03A39E }, - { "Etc/UTC" , 0x03A419 }, - { "Etc/Zulu" , 0x03A494 }, - { "Europe/Amsterdam" , 0x03A50F }, - { "Europe/Andorra" , 0x03A94A }, - { "Europe/Astrakhan" , 0x03AADB }, - { "Europe/Athens" , 0x03ADCF }, - { "Europe/Belfast" , 0x03B085 }, - { "Europe/Belgrade" , 0x03B6D0 }, - { "Europe/Berlin" , 0x03B8BA }, - { "Europe/Bratislava" , 0x03BB9B }, - { "Europe/Brussels" , 0x03BE7A }, - { "Europe/Bucharest" , 0x03C2D5 }, - { "Europe/Budapest" , 0x03C576 }, - { "Europe/Busingen" , 0x03C880 }, - { "Europe/Chisinau" , 0x03CA85 }, - { "Europe/Copenhagen" , 0x03CD84 }, - { "Europe/Dublin" , 0x03CFFF }, - { "Europe/Gibraltar" , 0x03D5E3 }, - { "Europe/Guernsey" , 0x03DAB3 }, - { "Europe/Helsinki" , 0x03E0FE }, - { "Europe/Isle_of_Man" , 0x03E2EB }, - { "Europe/Istanbul" , 0x03E936 }, - { "Europe/Jersey" , 0x03EDF2 }, - { "Europe/Kaliningrad" , 0x03F43D }, - { "Europe/Kiev" , 0x03F7E5 }, - { "Europe/Kirov" , 0x03FA2A }, - { "Europe/Lisbon" , 0x03FD11 }, - { "Europe/Ljubljana" , 0x0402DE }, - { "Europe/London" , 0x0404C8 }, - { "Europe/Luxembourg" , 0x040B13 }, - { "Europe/Madrid" , 0x040F5E }, - { "Europe/Malta" , 0x0412FB }, - { "Europe/Mariehamn" , 0x0416A7 }, - { "Europe/Minsk" , 0x041894 }, - { "Europe/Monaco" , 0x041BC8 }, - { "Europe/Moscow" , 0x04202E }, - { "Europe/Nicosia" , 0x0423DA }, - { "Europe/Oslo" , 0x04263B }, - { "Europe/Paris" , 0x0428EB }, - { "Europe/Podgorica" , 0x042D48 }, - { "Europe/Prague" , 0x042F32 }, - { "Europe/Riga" , 0x043211 }, - { "Europe/Rome" , 0x0434D3 }, - { "Europe/Samara" , 0x043892 }, - { "Europe/San_Marino" , 0x043B93 }, - { "Europe/Sarajevo" , 0x043F52 }, - { "Europe/Saratov" , 0x04413C }, - { "Europe/Simferopol" , 0x04442E }, - { "Europe/Skopje" , 0x0447A1 }, - { "Europe/Sofia" , 0x04498B }, - { "Europe/Stockholm" , 0x044BE7 }, - { "Europe/Tallinn" , 0x044DE4 }, - { "Europe/Tirane" , 0x045093 }, - { "Europe/Tiraspol" , 0x0452FB }, - { "Europe/Ulyanovsk" , 0x0455FA }, - { "Europe/Uzhgorod" , 0x045910 }, - { "Europe/Vaduz" , 0x045B3C }, - { "Europe/Vatican" , 0x045D39 }, - { "Europe/Vienna" , 0x0460F8 }, - { "Europe/Vilnius" , 0x046396 }, - { "Europe/Volgograd" , 0x046646 }, - { "Europe/Warsaw" , 0x046943 }, - { "Europe/Zagreb" , 0x046CEA }, - { "Europe/Zaporozhye" , 0x046ED4 }, - { "Europe/Zurich" , 0x04712B }, - { "Factory" , 0x047328 }, - { "GB" , 0x0473A5 }, - { "GB-Eire" , 0x0479F0 }, - { "GMT" , 0x04803B }, - { "GMT+0" , 0x0480B6 }, - { "GMT-0" , 0x048131 }, - { "GMT0" , 0x0481AC }, - { "Greenwich" , 0x048227 }, - { "Hongkong" , 0x0482A2 }, - { "HST" , 0x0485B5 }, - { "Iceland" , 0x048631 }, - { "Indian/Antananarivo" , 0x04892E }, - { "Indian/Chagos" , 0x0489F9 }, - { "Indian/Christmas" , 0x048A9D }, - { "Indian/Cocos" , 0x048B2E }, - { "Indian/Comoro" , 0x048BC6 }, - { "Indian/Kerguelen" , 0x048C91 }, - { "Indian/Mahe" , 0x048D22 }, - { "Indian/Maldives" , 0x048DB3 }, - { "Indian/Mauritius" , 0x048E57 }, - { "Indian/Mayotte" , 0x048F16 }, - { "Indian/Reunion" , 0x048FE1 }, - { "Iran" , 0x049072 }, - { "Israel" , 0x049852 }, - { "Jamaica" , 0x049C90 }, - { "Japan" , 0x049DEF }, - { "Kwajalein" , 0x049ED0 }, - { "Libya" , 0x049FB7 }, - { "MET" , 0x04A172 }, - { "Mexico/BajaNorte" , 0x04A3EB }, - { "Mexico/BajaSur" , 0x04A7F8 }, - { "Mexico/General" , 0x04A973 }, - { "MST" , 0x04AB1B }, - { "MST7MDT" , 0x04AB96 }, - { "Navajo" , 0x04AF59 }, - { "NZ" , 0x04B377 }, - { "NZ-CHAT" , 0x04B796 }, - { "Pacific/Apia" , 0x04BACA }, - { "Pacific/Auckland" , 0x04BC6D }, - { "Pacific/Bougainville" , 0x04C0A4 }, - { "Pacific/Chatham" , 0x04C185 }, - { "Pacific/Chuuk" , 0x04C4C8 }, - { "Pacific/Easter" , 0x04C5A6 }, - { "Pacific/Efate" , 0x04CA0D }, - { "Pacific/Enderbury" , 0x04CB6F }, - { "Pacific/Fakaofo" , 0x04CC27 }, - { "Pacific/Fiji" , 0x04CCCC }, - { "Pacific/Funafuti" , 0x04CE84 }, - { "Pacific/Galapagos" , 0x04CF16 }, - { "Pacific/Gambier" , 0x04CFE2 }, - { "Pacific/Guadalcanal" , 0x04D081 }, - { "Pacific/Guam" , 0x04D113 }, - { "Pacific/Honolulu" , 0x04D27D }, - { "Pacific/Johnston" , 0x04D36C }, - { "Pacific/Kanton" , 0x04D455 }, - { "Pacific/Kiritimati" , 0x04D51C }, - { "Pacific/Kosrae" , 0x04D5E2 }, - { "Pacific/Kwajalein" , 0x04D6E6 }, - { "Pacific/Majuro" , 0x04D7D6 }, - { "Pacific/Marquesas" , 0x04D8D9 }, - { "Pacific/Midway" , 0x04D981 }, - { "Pacific/Nauru" , 0x04DA2D }, - { "Pacific/Niue" , 0x04DAF0 }, - { "Pacific/Norfolk" , 0x04DB96 }, - { "Pacific/Noumea" , 0x04DC99 }, - { "Pacific/Pago_Pago" , 0x04DD6B }, - { "Pacific/Palau" , 0x04DE09 }, - { "Pacific/Pitcairn" , 0x04DEA9 }, - { "Pacific/Pohnpei" , 0x04DF4E }, - { "Pacific/Ponape" , 0x04E03E }, - { "Pacific/Port_Moresby" , 0x04E120 }, - { "Pacific/Rarotonga" , 0x04E1E3 }, - { "Pacific/Saipan" , 0x04E385 }, - { "Pacific/Samoa" , 0x04E4EF }, - { "Pacific/Tahiti" , 0x04E58D }, - { "Pacific/Tarawa" , 0x04E62D }, - { "Pacific/Tongatapu" , 0x04E6CE }, - { "Pacific/Truk" , 0x04E7C7 }, - { "Pacific/Wake" , 0x04E896 }, - { "Pacific/Wallis" , 0x04E933 }, - { "Pacific/Yap" , 0x04E9C5 }, - { "Poland" , 0x04EA94 }, - { "Portugal" , 0x04EE3B }, - { "PRC" , 0x04F3F5 }, - { "PST8PDT" , 0x04F58A }, - { "ROC" , 0x04F94D }, - { "ROK" , 0x04FB58 }, - { "Singapore" , 0x04FD03 }, - { "Turkey" , 0x04FE0F }, - { "UCT" , 0x0502CB }, - { "Universal" , 0x050346 }, - { "US/Alaska" , 0x0503C1 }, - { "US/Aleutian" , 0x05079E }, - { "US/Arizona" , 0x050B73 }, - { "US/Central" , 0x050C6F }, - { "US/East-Indiana" , 0x051355 }, - { "US/Eastern" , 0x051574 }, - { "US/Hawaii" , 0x051C50 }, - { "US/Indiana-Starke" , 0x051D39 }, - { "US/Michigan" , 0x05213D }, - { "US/Mountain" , 0x0524CC }, - { "US/Pacific" , 0x0528EA }, - { "US/Samoa" , 0x052E04 }, - { "UTC" , 0x052EA2 }, - { "W-SU" , 0x052F1D }, - { "WET" , 0x0532B5 }, - { "Zulu" , 0x0534AF }, + { "Asia/Harbin" , 0x0251F1 }, + { "Asia/Hebron" , 0x025386 }, + { "Asia/Ho_Chi_Minh" , 0x025885 }, + { "Asia/Hong_Kong" , 0x02597D }, + { "Asia/Hovd" , 0x025C90 }, + { "Asia/Irkutsk" , 0x025F19 }, + { "Asia/Istanbul" , 0x026237 }, + { "Asia/Jakarta" , 0x0266F3 }, + { "Asia/Jayapura" , 0x026804 }, + { "Asia/Jerusalem" , 0x0268F1 }, + { "Asia/Kabul" , 0x026D2F }, + { "Asia/Kamchatka" , 0x026DDA }, + { "Asia/Karachi" , 0x0270CF }, + { "Asia/Kashgar" , 0x0271E5 }, + { "Asia/Kathmandu" , 0x027276 }, + { "Asia/Katmandu" , 0x027323 }, + { "Asia/Khandyga" , 0x0273D0 }, + { "Asia/Kolkata" , 0x027701 }, + { "Asia/Krasnoyarsk" , 0x0277E9 }, + { "Asia/Kuala_Lumpur" , 0x027AF3 }, + { "Asia/Kuching" , 0x027C13 }, + { "Asia/Kuwait" , 0x027D6D }, + { "Asia/Macao" , 0x027DFE }, + { "Asia/Macau" , 0x028121 }, + { "Asia/Magadan" , 0x028444 }, + { "Asia/Makassar" , 0x02874F }, + { "Asia/Manila" , 0x028862 }, + { "Asia/Muscat" , 0x02895C }, + { "Asia/Nicosia" , 0x0289ED }, + { "Asia/Novokuznetsk" , 0x028C61 }, + { "Asia/Novosibirsk" , 0x028F54 }, + { "Asia/Omsk" , 0x029265 }, + { "Asia/Oral" , 0x029563 }, + { "Asia/Phnom_Penh" , 0x0297EF }, + { "Asia/Pontianak" , 0x029893 }, + { "Asia/Pyongyang" , 0x0299AC }, + { "Asia/Qatar" , 0x029A6F }, + { "Asia/Qostanay" , 0x029B13 }, + { "Asia/Qyzylorda" , 0x029DA0 }, + { "Asia/Rangoon" , 0x02A039 }, + { "Asia/Riyadh" , 0x02A100 }, + { "Asia/Saigon" , 0x02A191 }, + { "Asia/Sakhalin" , 0x02A289 }, + { "Asia/Samarkand" , 0x02A5A0 }, + { "Asia/Seoul" , 0x02A72B }, + { "Asia/Shanghai" , 0x02A8D6 }, + { "Asia/Singapore" , 0x02AA77 }, + { "Asia/Srednekolymsk" , 0x02AB83 }, + { "Asia/Taipei" , 0x02AE97 }, + { "Asia/Tashkent" , 0x02B0A2 }, + { "Asia/Tbilisi" , 0x02B22D }, + { "Asia/Tehran" , 0x02B4AE }, + { "Asia/Tel_Aviv" , 0x02BC8E }, + { "Asia/Thimbu" , 0x02C0CC }, + { "Asia/Thimphu" , 0x02C172 }, + { "Asia/Tokyo" , 0x02C218 }, + { "Asia/Tomsk" , 0x02C2F9 }, + { "Asia/Ujung_Pandang" , 0x02C604 }, + { "Asia/Ulaanbaatar" , 0x02C6CE }, + { "Asia/Ulan_Bator" , 0x02C941 }, + { "Asia/Urumqi" , 0x02CB9F }, + { "Asia/Ust-Nera" , 0x02CC3D }, + { "Asia/Vientiane" , 0x02CF60 }, + { "Asia/Vladivostok" , 0x02D004 }, + { "Asia/Yakutsk" , 0x02D309 }, + { "Asia/Yangon" , 0x02D60D }, + { "Asia/Yekaterinburg" , 0x02D6D4 }, + { "Asia/Yerevan" , 0x02D9E6 }, + { "Atlantic/Azores" , 0x02DCB6 }, + { "Atlantic/Bermuda" , 0x02E275 }, + { "Atlantic/Canary" , 0x02E681 }, + { "Atlantic/Cape_Verde" , 0x02E879 }, + { "Atlantic/Faeroe" , 0x02E934 }, + { "Atlantic/Faroe" , 0x02EAF9 }, + { "Atlantic/Jan_Mayen" , 0x02ECBE }, + { "Atlantic/Madeira" , 0x02EF6E }, + { "Atlantic/Reykjavik" , 0x02F536 }, + { "Atlantic/South_Georgia" , 0x02F833 }, + { "Atlantic/St_Helena" , 0x02F8C3 }, + { "Atlantic/Stanley" , 0x02F951 }, + { "Australia/ACT" , 0x02FC72 }, + { "Australia/Adelaide" , 0x030006 }, + { "Australia/Brisbane" , 0x0303BA }, + { "Australia/Broken_Hill" , 0x0304FE }, + { "Australia/Canberra" , 0x0308D3 }, + { "Australia/Currie" , 0x030C67 }, + { "Australia/Darwin" , 0x03105E }, + { "Australia/Eucla" , 0x031166 }, + { "Australia/Hobart" , 0x0312C5 }, + { "Australia/LHI" , 0x0316C4 }, + { "Australia/Lindeman" , 0x031984 }, + { "Australia/Lord_Howe" , 0x031AF4 }, + { "Australia/Melbourne" , 0x031DC4 }, + { "Australia/North" , 0x032160 }, + { "Australia/NSW" , 0x032256 }, + { "Australia/Perth" , 0x0325EA }, + { "Australia/Queensland" , 0x032746 }, + { "Australia/South" , 0x032873 }, + { "Australia/Sydney" , 0x032C18 }, + { "Australia/Tasmania" , 0x032FC8 }, + { "Australia/Victoria" , 0x0333BF }, + { "Australia/West" , 0x033753 }, + { "Australia/Yancowinna" , 0x033891 }, + { "Brazil/Acre" , 0x033C4A }, + { "Brazil/DeNoronha" , 0x033DF8 }, + { "Brazil/East" , 0x033FE8 }, + { "Brazil/West" , 0x0343AC }, + { "Canada/Atlantic" , 0x034554 }, + { "Canada/Central" , 0x034BE8 }, + { "Canada/Eastern" , 0x035102 }, + { "Canada/Mountain" , 0x0357C3 }, + { "Canada/Newfoundland" , 0x035B99 }, + { "Canada/Pacific" , 0x0362FB }, + { "Canada/Saskatchewan" , 0x036839 }, + { "Canada/Yukon" , 0x036AC3 }, + { "CET" , 0x036ED4 }, + { "Chile/Continental" , 0x03714D }, + { "Chile/EasterIsland" , 0x03765B }, + { "CST6CDT" , 0x037AB5 }, + { "Cuba" , 0x037E78 }, + { "EET" , 0x0382E1 }, + { "Egypt" , 0x0384DE }, + { "Eire" , 0x0389E6 }, + { "EST" , 0x038FCA }, + { "EST5EDT" , 0x039045 }, + { "Etc/GMT" , 0x039408 }, + { "Etc/GMT+0" , 0x039483 }, + { "Etc/GMT+1" , 0x0394FE }, + { "Etc/GMT+10" , 0x03957B }, + { "Etc/GMT+11" , 0x0395F9 }, + { "Etc/GMT+12" , 0x039677 }, + { "Etc/GMT+2" , 0x0396F5 }, + { "Etc/GMT+3" , 0x039772 }, + { "Etc/GMT+4" , 0x0397EF }, + { "Etc/GMT+5" , 0x03986C }, + { "Etc/GMT+6" , 0x0398E9 }, + { "Etc/GMT+7" , 0x039966 }, + { "Etc/GMT+8" , 0x0399E3 }, + { "Etc/GMT+9" , 0x039A60 }, + { "Etc/GMT-0" , 0x039ADD }, + { "Etc/GMT-1" , 0x039B58 }, + { "Etc/GMT-10" , 0x039BD6 }, + { "Etc/GMT-11" , 0x039C55 }, + { "Etc/GMT-12" , 0x039CD4 }, + { "Etc/GMT-13" , 0x039D53 }, + { "Etc/GMT-14" , 0x039DD2 }, + { "Etc/GMT-2" , 0x039E51 }, + { "Etc/GMT-3" , 0x039ECF }, + { "Etc/GMT-4" , 0x039F4D }, + { "Etc/GMT-5" , 0x039FCB }, + { "Etc/GMT-6" , 0x03A049 }, + { "Etc/GMT-7" , 0x03A0C7 }, + { "Etc/GMT-8" , 0x03A145 }, + { "Etc/GMT-9" , 0x03A1C3 }, + { "Etc/GMT0" , 0x03A241 }, + { "Etc/Greenwich" , 0x03A2BC }, + { "Etc/UCT" , 0x03A337 }, + { "Etc/Universal" , 0x03A3B2 }, + { "Etc/UTC" , 0x03A42D }, + { "Etc/Zulu" , 0x03A4A8 }, + { "Europe/Amsterdam" , 0x03A523 }, + { "Europe/Andorra" , 0x03A95E }, + { "Europe/Astrakhan" , 0x03AAEF }, + { "Europe/Athens" , 0x03ADE3 }, + { "Europe/Belfast" , 0x03B099 }, + { "Europe/Belgrade" , 0x03B6E4 }, + { "Europe/Berlin" , 0x03B8CE }, + { "Europe/Bratislava" , 0x03BBAF }, + { "Europe/Brussels" , 0x03BE8E }, + { "Europe/Bucharest" , 0x03C2E9 }, + { "Europe/Budapest" , 0x03C58A }, + { "Europe/Busingen" , 0x03C894 }, + { "Europe/Chisinau" , 0x03CA99 }, + { "Europe/Copenhagen" , 0x03CD98 }, + { "Europe/Dublin" , 0x03D013 }, + { "Europe/Gibraltar" , 0x03D5F7 }, + { "Europe/Guernsey" , 0x03DAC7 }, + { "Europe/Helsinki" , 0x03E112 }, + { "Europe/Isle_of_Man" , 0x03E2FF }, + { "Europe/Istanbul" , 0x03E94A }, + { "Europe/Jersey" , 0x03EE06 }, + { "Europe/Kaliningrad" , 0x03F451 }, + { "Europe/Kiev" , 0x03F7F9 }, + { "Europe/Kirov" , 0x03FA47 }, + { "Europe/Lisbon" , 0x03FD2E }, + { "Europe/Ljubljana" , 0x0402FB }, + { "Europe/London" , 0x0404E5 }, + { "Europe/Luxembourg" , 0x040B30 }, + { "Europe/Madrid" , 0x040F7B }, + { "Europe/Malta" , 0x041318 }, + { "Europe/Mariehamn" , 0x0416C4 }, + { "Europe/Minsk" , 0x0418B1 }, + { "Europe/Monaco" , 0x041BE5 }, + { "Europe/Moscow" , 0x04204B }, + { "Europe/Nicosia" , 0x0423F7 }, + { "Europe/Oslo" , 0x042658 }, + { "Europe/Paris" , 0x042908 }, + { "Europe/Podgorica" , 0x042D65 }, + { "Europe/Prague" , 0x042F4F }, + { "Europe/Riga" , 0x04322E }, + { "Europe/Rome" , 0x0434F0 }, + { "Europe/Samara" , 0x0438AF }, + { "Europe/San_Marino" , 0x043BB0 }, + { "Europe/Sarajevo" , 0x043F6F }, + { "Europe/Saratov" , 0x044159 }, + { "Europe/Simferopol" , 0x04444B }, + { "Europe/Skopje" , 0x0447BE }, + { "Europe/Sofia" , 0x0449A8 }, + { "Europe/Stockholm" , 0x044C04 }, + { "Europe/Tallinn" , 0x044E01 }, + { "Europe/Tirane" , 0x0450B0 }, + { "Europe/Tiraspol" , 0x045318 }, + { "Europe/Ulyanovsk" , 0x045617 }, + { "Europe/Uzhgorod" , 0x04592D }, + { "Europe/Vaduz" , 0x045B62 }, + { "Europe/Vatican" , 0x045D5F }, + { "Europe/Vienna" , 0x04611E }, + { "Europe/Vilnius" , 0x0463BC }, + { "Europe/Volgograd" , 0x04666C }, + { "Europe/Warsaw" , 0x046969 }, + { "Europe/Zagreb" , 0x046D10 }, + { "Europe/Zaporozhye" , 0x046EFA }, + { "Europe/Zurich" , 0x04715A }, + { "Factory" , 0x047357 }, + { "GB" , 0x0473D4 }, + { "GB-Eire" , 0x047A1F }, + { "GMT" , 0x04806A }, + { "GMT+0" , 0x0480E5 }, + { "GMT-0" , 0x048160 }, + { "GMT0" , 0x0481DB }, + { "Greenwich" , 0x048256 }, + { "Hongkong" , 0x0482D1 }, + { "HST" , 0x0485E4 }, + { "Iceland" , 0x048660 }, + { "Indian/Antananarivo" , 0x04895D }, + { "Indian/Chagos" , 0x048A28 }, + { "Indian/Christmas" , 0x048ACC }, + { "Indian/Cocos" , 0x048B5D }, + { "Indian/Comoro" , 0x048BF5 }, + { "Indian/Kerguelen" , 0x048CC0 }, + { "Indian/Mahe" , 0x048D51 }, + { "Indian/Maldives" , 0x048DE2 }, + { "Indian/Mauritius" , 0x048E86 }, + { "Indian/Mayotte" , 0x048F45 }, + { "Indian/Reunion" , 0x049010 }, + { "Iran" , 0x0490A1 }, + { "Israel" , 0x049881 }, + { "Jamaica" , 0x049CBF }, + { "Japan" , 0x049E1E }, + { "Kwajalein" , 0x049EFF }, + { "Libya" , 0x049FE6 }, + { "MET" , 0x04A1A1 }, + { "Mexico/BajaNorte" , 0x04A41A }, + { "Mexico/BajaSur" , 0x04A827 }, + { "Mexico/General" , 0x04A9A2 }, + { "MST" , 0x04AB4A }, + { "MST7MDT" , 0x04ABC5 }, + { "Navajo" , 0x04AF88 }, + { "NZ" , 0x04B3A6 }, + { "NZ-CHAT" , 0x04B7C5 }, + { "Pacific/Apia" , 0x04BAF9 }, + { "Pacific/Auckland" , 0x04BC9C }, + { "Pacific/Bougainville" , 0x04C0D3 }, + { "Pacific/Chatham" , 0x04C1B4 }, + { "Pacific/Chuuk" , 0x04C4F7 }, + { "Pacific/Easter" , 0x04C5D5 }, + { "Pacific/Efate" , 0x04CA3C }, + { "Pacific/Enderbury" , 0x04CB9E }, + { "Pacific/Fakaofo" , 0x04CC56 }, + { "Pacific/Fiji" , 0x04CCFB }, + { "Pacific/Funafuti" , 0x04CEB3 }, + { "Pacific/Galapagos" , 0x04CF45 }, + { "Pacific/Gambier" , 0x04D011 }, + { "Pacific/Guadalcanal" , 0x04D0B0 }, + { "Pacific/Guam" , 0x04D142 }, + { "Pacific/Honolulu" , 0x04D2AC }, + { "Pacific/Johnston" , 0x04D39B }, + { "Pacific/Kanton" , 0x04D484 }, + { "Pacific/Kiritimati" , 0x04D54B }, + { "Pacific/Kosrae" , 0x04D611 }, + { "Pacific/Kwajalein" , 0x04D715 }, + { "Pacific/Majuro" , 0x04D805 }, + { "Pacific/Marquesas" , 0x04D908 }, + { "Pacific/Midway" , 0x04D9B0 }, + { "Pacific/Nauru" , 0x04DA5C }, + { "Pacific/Niue" , 0x04DB1F }, + { "Pacific/Norfolk" , 0x04DBC5 }, + { "Pacific/Noumea" , 0x04DCC8 }, + { "Pacific/Pago_Pago" , 0x04DD9A }, + { "Pacific/Palau" , 0x04DE38 }, + { "Pacific/Pitcairn" , 0x04DED8 }, + { "Pacific/Pohnpei" , 0x04DF7D }, + { "Pacific/Ponape" , 0x04E06D }, + { "Pacific/Port_Moresby" , 0x04E14F }, + { "Pacific/Rarotonga" , 0x04E212 }, + { "Pacific/Saipan" , 0x04E3B4 }, + { "Pacific/Samoa" , 0x04E51E }, + { "Pacific/Tahiti" , 0x04E5BC }, + { "Pacific/Tarawa" , 0x04E65C }, + { "Pacific/Tongatapu" , 0x04E6FD }, + { "Pacific/Truk" , 0x04E7F6 }, + { "Pacific/Wake" , 0x04E8C5 }, + { "Pacific/Wallis" , 0x04E962 }, + { "Pacific/Yap" , 0x04E9F4 }, + { "Poland" , 0x04EAC3 }, + { "Portugal" , 0x04EE6A }, + { "PRC" , 0x04F424 }, + { "PST8PDT" , 0x04F5B9 }, + { "ROC" , 0x04F97C }, + { "ROK" , 0x04FB87 }, + { "Singapore" , 0x04FD32 }, + { "Turkey" , 0x04FE3E }, + { "UCT" , 0x0502FA }, + { "Universal" , 0x050375 }, + { "US/Alaska" , 0x0503F0 }, + { "US/Aleutian" , 0x0507CD }, + { "US/Arizona" , 0x050BA2 }, + { "US/Central" , 0x050C9E }, + { "US/East-Indiana" , 0x051384 }, + { "US/Eastern" , 0x0515A3 }, + { "US/Hawaii" , 0x051C7F }, + { "US/Indiana-Starke" , 0x051D68 }, + { "US/Michigan" , 0x05216C }, + { "US/Mountain" , 0x0524FB }, + { "US/Pacific" , 0x052919 }, + { "US/Samoa" , 0x052E33 }, + { "UTC" , 0x052ED1 }, + { "W-SU" , 0x052F4C }, + { "WET" , 0x0532E4 }, + { "Zulu" , 0x0534DE }, }; -const unsigned char timelib_timezone_db_data_builtin[341290] = { +const unsigned char timelib_timezone_db_data_builtin[341337] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7531,9 +7531,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, @@ -7596,7 +7596,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, -0x03, 0x05, 0x06, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, +0x03, 0x05, 0x06, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, @@ -8018,9 +8018,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, @@ -8086,8 +8086,8 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, -0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x00, 0xFF, -0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, +0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x00, 0xFF, +0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x39, @@ -10702,7 +10702,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xBD, 0x4A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x59, 0xCF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xFA, 0xA6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x38, 0x9C, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE5, 0xEB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xAC, 0xFE, 0x00, 0xFF, @@ -10761,21 +10761,21 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x5A, 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, -0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x20, 0x50, -0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, -0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, -0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, -0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, -0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xB9, -0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, -0x74, 0x72, 0x69, 0x70, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, +0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, +0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, 0x31, 0x30, +0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x32, 0x35, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, +0x00, 0x00, 0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, /* Asia/Harbin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -10811,7 +10811,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x7D, 0xBD, 0x4A, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x59, 0xCF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xFA, 0xA6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x38, 0x9C, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE5, 0xEB, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xAC, 0xFE, 0x00, 0xFF, @@ -10871,21 +10871,21 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x5A, 0xB5, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, -0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, -0x20, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, -0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, -0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, -0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, 0x0A, -0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, 0x74, -0x20, 0x42, 0x61, 0x6E, 0x6B, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x20, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, +0x00, 0x1C, 0x20, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, +0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, +0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, +0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x32, 0x35, 0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, +0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, 0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -15680,9 +15680,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, @@ -15748,8 +15748,8 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, -0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x00, 0xFF, -0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, +0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x00, 0xFF, +0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x39, @@ -17987,7 +17987,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCD, 0x2E, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, @@ -18002,23 +18002,23 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x20, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x01, -0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, -0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, -0x07, 0x02, 0x07, 0x02, 0x07, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, -0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, -0x00, 0x2A, 0x30, 0x01, 0x1D, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, -0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, -0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD6, 0x48, 0xC5, 0x01, 0x41, 0x39, 0x12, 0x00, 0x00, 0x00, -0x14, 0x55, 0x6B, 0x72, 0x61, 0x69, 0x6E, 0x65, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, -0x72, 0x65, 0x61, 0x73, 0x29, +0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, +0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x01, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, +0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, +0x03, 0x06, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x00, 0x00, +0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, +0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x4C, 0x4D, +0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, +0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, +0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, +0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD6, +0x48, 0xC5, 0x01, 0x41, 0x39, 0x12, 0x00, 0x00, 0x00, 0x14, 0x55, 0x6B, 0x72, 0x61, 0x69, 0x6E, +0x65, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, /* Europe/Kirov */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -19279,9 +19279,9 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, @@ -19617,7 +19617,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0xEE, 0xB0, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, @@ -19632,21 +19632,22 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x01, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x00, 0x00, 0x14, 0xE8, -0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, -0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, -0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, -0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, -0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, -0x34, 0x0A, 0x00, 0xD3, 0x83, 0x22, 0x01, 0x34, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x54, 0x72, -0x61, 0x6E, 0x73, 0x63, 0x61, 0x72, 0x70, 0x61, 0x74, 0x68, 0x69, 0x61, +0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x01, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, +0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x11, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x4C, +0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, +0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, +0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, +0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD3, 0x83, 0x22, 0x01, +0x34, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x63, 0x61, 0x72, 0x70, +0x61, 0x74, 0x68, 0x69, 0x61, /* Europe/Vaduz */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -19984,7 +19985,7 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC3, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xAA, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, @@ -20000,23 +20001,24 @@ const unsigned char timelib_timezone_db_data_builtin[341290] = { 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x01, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, -0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, -0x03, 0x06, 0x03, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x00, 0x00, -0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, -0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, -0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, -0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, -0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, -0x00, 0xD2, 0x51, 0x25, 0x01, 0x48, 0x51, 0x7A, 0x00, 0x00, 0x00, 0x1B, 0x5A, 0x61, 0x70, 0x6F, -0x72, 0x6F, 0x7A, 0x68, 0x79, 0x65, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x65, 0x61, 0x73, 0x74, 0x20, -0x4C, 0x75, 0x67, 0x61, 0x6E, 0x73, 0x6B, +0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x01, +0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, +0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x06, 0x03, 0x07, 0x02, 0x07, 0x02, 0x07, +0x02, 0x07, 0x02, 0x07, 0x02, 0x07, 0x02, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, +0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, +0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, +0x1B, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, 0x30, +0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, +0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, +0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, +0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD2, 0x51, 0x25, 0x01, 0x48, 0x51, +0x7A, 0x00, 0x00, 0x00, 0x1B, 0x5A, 0x61, 0x70, 0x6F, 0x72, 0x6F, 0x7A, 0x68, 0x79, 0x65, 0x20, +0x61, 0x6E, 0x64, 0x20, 0x65, 0x61, 0x73, 0x74, 0x20, 0x4C, 0x75, 0x67, 0x61, 0x6E, 0x73, 0x6B, + /* Europe/Zurich */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -23690,340 +23692,340 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[595] = { { "Asia/Dushanbe" , 0x0476ED }, { "Asia/Famagusta" , 0x047948 }, { "Asia/Gaza" , 0x04814F }, - { "Asia/Harbin" , 0x048ADA }, - { "Asia/Hebron" , 0x048D17 }, - { "Asia/Ho_Chi_Minh" , 0x0496BD }, - { "Asia/Hong_Kong" , 0x049828 }, - { "Asia/Hovd" , 0x049CE7 }, - { "Asia/Irkutsk" , 0x04A099 }, - { "Asia/Istanbul" , 0x04A59A }, - { "Asia/Jakarta" , 0x04AD41 }, - { "Asia/Jayapura" , 0x04AEBD }, - { "Asia/Jerusalem" , 0x04AFDC }, - { "Asia/Kabul" , 0x04B93C }, - { "Asia/Kamchatka" , 0x04BA18 }, - { "Asia/Karachi" , 0x04BEC4 }, - { "Asia/Kashgar" , 0x04C04B }, - { "Asia/Kathmandu" , 0x04C0FC }, - { "Asia/Katmandu" , 0x04C1DC }, - { "Asia/Khandyga" , 0x04C2BC }, - { "Asia/Kolkata" , 0x04C7DD }, - { "Asia/Krasnoyarsk" , 0x04C906 }, - { "Asia/Kuala_Lumpur" , 0x04CDE2 }, - { "Asia/Kuching" , 0x04CF81 }, - { "Asia/Kuwait" , 0x04D17E }, - { "Asia/Macao" , 0x04D22F }, - { "Asia/Macau" , 0x04D706 }, - { "Asia/Magadan" , 0x04DBDD }, - { "Asia/Makassar" , 0x04E0BF }, - { "Asia/Manila" , 0x04E212 }, - { "Asia/Muscat" , 0x04E366 }, - { "Asia/Nicosia" , 0x04E417 }, - { "Asia/Novokuznetsk" , 0x04EC08 }, - { "Asia/Novosibirsk" , 0x04F0B2 }, - { "Asia/Omsk" , 0x04F597 }, - { "Asia/Oral" , 0x04FA67 }, - { "Asia/Phnom_Penh" , 0x04FE6F }, - { "Asia/Pontianak" , 0x04FF42 }, - { "Asia/Pyongyang" , 0x0500C5 }, - { "Asia/Qatar" , 0x0501BE }, - { "Asia/Qostanay" , 0x050291 }, - { "Asia/Qyzylorda" , 0x0506AA }, - { "Asia/Rangoon" , 0x050AD4 }, - { "Asia/Riyadh" , 0x050BEC }, - { "Asia/Saigon" , 0x050C9D }, - { "Asia/Sakhalin" , 0x050E08 }, - { "Asia/Samarkand" , 0x0512DE }, - { "Asia/Seoul" , 0x05153C }, - { "Asia/Shanghai" , 0x0517B1 }, - { "Asia/Singapore" , 0x0519FA }, - { "Asia/Srednekolymsk" , 0x051B85 }, - { "Asia/Taipei" , 0x05206B }, - { "Asia/Tashkent" , 0x052370 }, - { "Asia/Tbilisi" , 0x0525DC }, - { "Asia/Tehran" , 0x0529F3 }, - { "Asia/Tel_Aviv" , 0x053415 }, - { "Asia/Thimbu" , 0x053D75 }, - { "Asia/Thimphu" , 0x053E4C }, - { "Asia/Tokyo" , 0x053F23 }, - { "Asia/Tomsk" , 0x054064 }, - { "Asia/Ujung_Pandang" , 0x054543 }, - { "Asia/Ulaanbaatar" , 0x05464D }, - { "Asia/Ulan_Bator" , 0x0549E9 }, - { "Asia/Urumqi" , 0x054D70 }, - { "Asia/Ust-Nera" , 0x054E2E }, - { "Asia/Vientiane" , 0x055332 }, - { "Asia/Vladivostok" , 0x055405 }, - { "Asia/Yakutsk" , 0x0558DC }, - { "Asia/Yangon" , 0x055DB2 }, - { "Asia/Yekaterinburg" , 0x055ECA }, - { "Asia/Yerevan" , 0x0563BF }, - { "Atlantic/Azores" , 0x05684A }, - { "Atlantic/Bermuda" , 0x057614 }, - { "Atlantic/Canary" , 0x057F7C }, - { "Atlantic/Cape_Verde" , 0x0586FF }, - { "Atlantic/Faeroe" , 0x058819 }, - { "Atlantic/Faroe" , 0x058F3C }, - { "Atlantic/Jan_Mayen" , 0x05965F }, - { "Atlantic/Madeira" , 0x059F1F }, - { "Atlantic/Reykjavik" , 0x05ACE9 }, - { "Atlantic/South_Georgia" , 0x05B17F }, - { "Atlantic/St_Helena" , 0x05B22F }, - { "Atlantic/Stanley" , 0x05B2CF }, - { "Australia/ACT" , 0x05B799 }, - { "Australia/Adelaide" , 0x05C033 }, - { "Australia/Brisbane" , 0x05C8EE }, - { "Australia/Broken_Hill" , 0x05CAB4 }, - { "Australia/Canberra" , 0x05D391 }, - { "Australia/Currie" , 0x05DC2B }, - { "Australia/Darwin" , 0x05E56D }, - { "Australia/Eucla" , 0x05E6D0 }, - { "Australia/Hobart" , 0x05E8CB }, - { "Australia/LHI" , 0x05F215 }, - { "Australia/Lindeman" , 0x05F965 }, - { "Australia/Lord_Howe" , 0x05FB6B }, - { "Australia/Melbourne" , 0x0602CB }, - { "Australia/North" , 0x060B6D }, - { "Australia/NSW" , 0x060CBE }, - { "Australia/Perth" , 0x061558 }, - { "Australia/Queensland" , 0x061740 }, - { "Australia/South" , 0x0618EF }, - { "Australia/Sydney" , 0x06219B }, - { "Australia/Tasmania" , 0x062A51 }, - { "Australia/Victoria" , 0x063393 }, - { "Australia/West" , 0x063C2D }, - { "Australia/Yancowinna" , 0x063DF7 }, - { "Brazil/Acre" , 0x0646B8 }, - { "Brazil/DeNoronha" , 0x064938 }, - { "Brazil/East" , 0x064C10 }, - { "Brazil/West" , 0x0651C0 }, - { "Canada/Atlantic" , 0x065428 }, - { "Canada/Central" , 0x066194 }, - { "Canada/Eastern" , 0x066CD4 }, - { "Canada/Mountain" , 0x067A86 }, - { "Canada/Newfoundland" , 0x0683AE }, - { "Canada/Pacific" , 0x069201 }, - { "Canada/Saskatchewan" , 0x069D59 }, - { "Canada/Yukon" , 0x06A139 }, - { "CET" , 0x06A793 }, - { "Chile/Continental" , 0x06AFCD }, - { "Chile/EasterIsland" , 0x06B9BA }, - { "CST6CDT" , 0x06C27F }, - { "Cuba" , 0x06CB91 }, - { "EET" , 0x06D50D }, - { "Egypt" , 0x06DC8D }, - { "Eire" , 0x06E43C }, - { "EST" , 0x06F1EC }, - { "EST5EDT" , 0x06F26A }, - { "Etc/GMT" , 0x06FB7C }, - { "Etc/GMT+0" , 0x06FBFA }, - { "Etc/GMT+1" , 0x06FC78 }, - { "Etc/GMT+10" , 0x06FCF8 }, - { "Etc/GMT+11" , 0x06FD79 }, - { "Etc/GMT+12" , 0x06FDFA }, - { "Etc/GMT+2" , 0x06FE7B }, - { "Etc/GMT+3" , 0x06FEFB }, - { "Etc/GMT+4" , 0x06FF7B }, - { "Etc/GMT+5" , 0x06FFFB }, - { "Etc/GMT+6" , 0x07007B }, - { "Etc/GMT+7" , 0x0700FB }, - { "Etc/GMT+8" , 0x07017B }, - { "Etc/GMT+9" , 0x0701FB }, - { "Etc/GMT-0" , 0x07027B }, - { "Etc/GMT-1" , 0x0702F9 }, - { "Etc/GMT-10" , 0x07037A }, - { "Etc/GMT-11" , 0x0703FC }, - { "Etc/GMT-12" , 0x07047E }, - { "Etc/GMT-13" , 0x070500 }, - { "Etc/GMT-14" , 0x070582 }, - { "Etc/GMT-2" , 0x070604 }, - { "Etc/GMT-3" , 0x070685 }, - { "Etc/GMT-4" , 0x070706 }, - { "Etc/GMT-5" , 0x070787 }, - { "Etc/GMT-6" , 0x070808 }, - { "Etc/GMT-7" , 0x070889 }, - { "Etc/GMT-8" , 0x07090A }, - { "Etc/GMT-9" , 0x07098B }, - { "Etc/GMT0" , 0x070A0C }, - { "Etc/Greenwich" , 0x070A8A }, - { "Etc/UCT" , 0x070B08 }, - { "Etc/Universal" , 0x070B86 }, - { "Etc/UTC" , 0x070C04 }, - { "Etc/Zulu" , 0x070C82 }, - { "Europe/Amsterdam" , 0x070D00 }, - { "Europe/Andorra" , 0x07186A }, - { "Europe/Astrakhan" , 0x071F44 }, - { "Europe/Athens" , 0x0723EF }, - { "Europe/Belfast" , 0x072CD1 }, - { "Europe/Belgrade" , 0x073B1D }, - { "Europe/Berlin" , 0x0742A9 }, - { "Europe/Bratislava" , 0x074BC3 }, - { "Europe/Brussels" , 0x0754CC }, - { "Europe/Bucharest" , 0x07604D }, - { "Europe/Budapest" , 0x0768E1 }, - { "Europe/Busingen" , 0x07722D }, - { "Europe/Chisinau" , 0x0779B6 }, - { "Europe/Copenhagen" , 0x078318 }, - { "Europe/Dublin" , 0x078B7D }, - { "Europe/Gibraltar" , 0x07992D }, - { "Europe/Guernsey" , 0x07A525 }, - { "Europe/Helsinki" , 0x07B371 }, - { "Europe/Isle_of_Man" , 0x07BAE9 }, - { "Europe/Istanbul" , 0x07C935 }, - { "Europe/Jersey" , 0x07D0DC }, - { "Europe/Kaliningrad" , 0x07DF28 }, - { "Europe/Kiev" , 0x07E51D }, - { "Europe/Kirov" , 0x07ED65 }, - { "Europe/Lisbon" , 0x07F200 }, - { "Europe/Ljubljana" , 0x07FFC8 }, - { "Europe/London" , 0x080754 }, - { "Europe/Luxembourg" , 0x0815A0 }, - { "Europe/Madrid" , 0x08212E }, - { "Europe/Malta" , 0x082B80 }, - { "Europe/Mariehamn" , 0x0835C8 }, - { "Europe/Minsk" , 0x083D40 }, - { "Europe/Monaco" , 0x084275 }, - { "Europe/Moscow" , 0x084E01 }, - { "Europe/Nicosia" , 0x085420 }, - { "Europe/Oslo" , 0x085BFE }, - { "Europe/Paris" , 0x0864BE }, - { "Europe/Podgorica" , 0x08705C }, - { "Europe/Prague" , 0x0877E8 }, - { "Europe/Riga" , 0x0880F1 }, - { "Europe/Rome" , 0x088993 }, - { "Europe/Samara" , 0x0893F0 }, - { "Europe/San_Marino" , 0x0898D4 }, - { "Europe/Sarajevo" , 0x08A331 }, - { "Europe/Saratov" , 0x08AABD }, - { "Europe/Simferopol" , 0x08AF78 }, - { "Europe/Skopje" , 0x08B537 }, - { "Europe/Sofia" , 0x08BCC3 }, - { "Europe/Stockholm" , 0x08C4EC }, - { "Europe/Tallinn" , 0x08CC6D }, - { "Europe/Tirane" , 0x08D4DD }, - { "Europe/Tiraspol" , 0x08DD0D }, - { "Europe/Ulyanovsk" , 0x08E66F }, - { "Europe/Uzhgorod" , 0x08EB80 }, - { "Europe/Vaduz" , 0x08F39C }, - { "Europe/Vatican" , 0x08FB1D }, - { "Europe/Vienna" , 0x09057A }, - { "Europe/Vilnius" , 0x090E1E }, - { "Europe/Volgograd" , 0x09169C }, - { "Europe/Warsaw" , 0x091B47 }, - { "Europe/Zagreb" , 0x0925B1 }, - { "Europe/Zaporozhye" , 0x092D3D }, - { "Europe/Zurich" , 0x09359E }, - { "Factory" , 0x093D1F }, - { "GB" , 0x093D9F }, - { "GB-Eire" , 0x094BEB }, - { "GMT" , 0x095A37 }, - { "GMT+0" , 0x095AB5 }, - { "GMT-0" , 0x095B33 }, - { "GMT0" , 0x095BB1 }, - { "Greenwich" , 0x095C2F }, - { "Hongkong" , 0x095CAD }, - { "HST" , 0x09616C }, - { "Iceland" , 0x0961EB }, - { "Indian/Antananarivo" , 0x096681 }, - { "Indian/Chagos" , 0x096796 }, - { "Indian/Christmas" , 0x096869 }, - { "Indian/Cocos" , 0x09691A }, - { "Indian/Comoro" , 0x0969D4 }, - { "Indian/Kerguelen" , 0x096AE9 }, - { "Indian/Mahe" , 0x096B9A }, - { "Indian/Maldives" , 0x096C4B }, - { "Indian/Mauritius" , 0x096D1E }, - { "Indian/Mayotte" , 0x096E1B }, - { "Indian/Reunion" , 0x096F30 }, - { "Iran" , 0x096FE1 }, - { "Israel" , 0x097A03 }, - { "Jamaica" , 0x098363 }, - { "Japan" , 0x098551 }, - { "Kwajalein" , 0x098692 }, - { "Libya" , 0x0987DA }, - { "MET" , 0x098A57 }, - { "Mexico/BajaNorte" , 0x099291 }, - { "Mexico/BajaSur" , 0x099BC3 }, - { "Mexico/General" , 0x09A1C5 }, - { "MST" , 0x09A801 }, - { "MST7MDT" , 0x09A87F }, - { "Navajo" , 0x09B191 }, - { "NZ" , 0x09BB29 }, - { "NZ-CHAT" , 0x09C4BA }, - { "Pacific/Apia" , 0x09CCDA }, - { "Pacific/Auckland" , 0x09CF4A }, - { "Pacific/Bougainville" , 0x09D8F3 }, - { "Pacific/Chatham" , 0x09DA17 }, - { "Pacific/Chuuk" , 0x09E246 }, - { "Pacific/Easter" , 0x09E36E }, - { "Pacific/Efate" , 0x09EC40 }, - { "Pacific/Enderbury" , 0x09EE66 }, - { "Pacific/Fakaofo" , 0x09EF5C }, - { "Pacific/Fiji" , 0x09F030 }, - { "Pacific/Funafuti" , 0x09F455 }, - { "Pacific/Galapagos" , 0x09F507 }, - { "Pacific/Gambier" , 0x09F612 }, - { "Pacific/Guadalcanal" , 0x09F6D1 }, - { "Pacific/Guam" , 0x09F783 }, - { "Pacific/Honolulu" , 0x09F97D }, - { "Pacific/Johnston" , 0x09FAD8 }, - { "Pacific/Kanton" , 0x09FC2D }, - { "Pacific/Kiritimati" , 0x09FD32 }, - { "Pacific/Kosrae" , 0x09FE38 }, - { "Pacific/Kwajalein" , 0x09FFA9 }, - { "Pacific/Majuro" , 0x0A00FA }, - { "Pacific/Marquesas" , 0x0A0259 }, - { "Pacific/Midway" , 0x0A0323 }, - { "Pacific/Nauru" , 0x0A03EC }, - { "Pacific/Niue" , 0x0A04F4 }, - { "Pacific/Norfolk" , 0x0A05CB }, - { "Pacific/Noumea" , 0x0A0947 }, - { "Pacific/Pago_Pago" , 0x0A0A83 }, - { "Pacific/Palau" , 0x0A0B3E }, - { "Pacific/Pitcairn" , 0x0A0BFE }, - { "Pacific/Pohnpei" , 0x0A0CD4 }, - { "Pacific/Ponape" , 0x0A0E1D }, - { "Pacific/Port_Moresby" , 0x0A0F58 }, - { "Pacific/Rarotonga" , 0x0A103B }, - { "Pacific/Saipan" , 0x0A12A2 }, - { "Pacific/Samoa" , 0x0A149C }, - { "Pacific/Tahiti" , 0x0A1557 }, - { "Pacific/Tarawa" , 0x0A1617 }, - { "Pacific/Tongatapu" , 0x0A16D8 }, - { "Pacific/Truk" , 0x0A1858 }, - { "Pacific/Wake" , 0x0A1971 }, - { "Pacific/Wallis" , 0x0A1A2E }, - { "Pacific/Yap" , 0x0A1AE0 }, - { "Poland" , 0x0A1BF9 }, - { "Portugal" , 0x0A2663 }, - { "PRC" , 0x0A3418 }, - { "PST8PDT" , 0x0A3655 }, - { "ROC" , 0x0A3F67 }, - { "ROK" , 0x0A426C }, - { "Singapore" , 0x0A44E1 }, - { "Turkey" , 0x0A466C }, - { "UCT" , 0x0A4E13 }, - { "Universal" , 0x0A4E91 }, - { "US/Alaska" , 0x0A4F0F }, - { "US/Aleutian" , 0x0A585E }, - { "US/Arizona" , 0x0A619E }, - { "US/Central" , 0x0A62F2 }, - { "US/East-Indiana" , 0x0A70F6 }, - { "US/Eastern" , 0x0A7784 }, - { "US/Hawaii" , 0x0A8560 }, - { "US/Indiana-Starke" , 0x0A86B5 }, - { "US/Michigan" , 0x0A903D }, - { "US/Mountain" , 0x0A98FF }, - { "US/Pacific" , 0x0AA297 }, - { "US/Samoa" , 0x0AADB7 }, - { "UTC" , 0x0AAE72 }, - { "W-SU" , 0x0AAEF0 }, - { "WET" , 0x0AB4FB }, - { "Zulu" , 0x0ABC78 }, + { "Asia/Harbin" , 0x048ADB }, + { "Asia/Hebron" , 0x048D18 }, + { "Asia/Ho_Chi_Minh" , 0x0496BF }, + { "Asia/Hong_Kong" , 0x04982A }, + { "Asia/Hovd" , 0x049CE9 }, + { "Asia/Irkutsk" , 0x04A09B }, + { "Asia/Istanbul" , 0x04A59C }, + { "Asia/Jakarta" , 0x04AD43 }, + { "Asia/Jayapura" , 0x04AEBF }, + { "Asia/Jerusalem" , 0x04AFDE }, + { "Asia/Kabul" , 0x04B93E }, + { "Asia/Kamchatka" , 0x04BA1A }, + { "Asia/Karachi" , 0x04BEC6 }, + { "Asia/Kashgar" , 0x04C04D }, + { "Asia/Kathmandu" , 0x04C0FE }, + { "Asia/Katmandu" , 0x04C1DE }, + { "Asia/Khandyga" , 0x04C2BE }, + { "Asia/Kolkata" , 0x04C7DF }, + { "Asia/Krasnoyarsk" , 0x04C908 }, + { "Asia/Kuala_Lumpur" , 0x04CDE4 }, + { "Asia/Kuching" , 0x04CF83 }, + { "Asia/Kuwait" , 0x04D180 }, + { "Asia/Macao" , 0x04D231 }, + { "Asia/Macau" , 0x04D708 }, + { "Asia/Magadan" , 0x04DBDF }, + { "Asia/Makassar" , 0x04E0C1 }, + { "Asia/Manila" , 0x04E214 }, + { "Asia/Muscat" , 0x04E368 }, + { "Asia/Nicosia" , 0x04E419 }, + { "Asia/Novokuznetsk" , 0x04EC0A }, + { "Asia/Novosibirsk" , 0x04F0B4 }, + { "Asia/Omsk" , 0x04F599 }, + { "Asia/Oral" , 0x04FA69 }, + { "Asia/Phnom_Penh" , 0x04FE71 }, + { "Asia/Pontianak" , 0x04FF44 }, + { "Asia/Pyongyang" , 0x0500C7 }, + { "Asia/Qatar" , 0x0501C0 }, + { "Asia/Qostanay" , 0x050293 }, + { "Asia/Qyzylorda" , 0x0506AC }, + { "Asia/Rangoon" , 0x050AD6 }, + { "Asia/Riyadh" , 0x050BEE }, + { "Asia/Saigon" , 0x050C9F }, + { "Asia/Sakhalin" , 0x050E0A }, + { "Asia/Samarkand" , 0x0512E0 }, + { "Asia/Seoul" , 0x05153E }, + { "Asia/Shanghai" , 0x0517B3 }, + { "Asia/Singapore" , 0x0519FC }, + { "Asia/Srednekolymsk" , 0x051B87 }, + { "Asia/Taipei" , 0x05206D }, + { "Asia/Tashkent" , 0x052372 }, + { "Asia/Tbilisi" , 0x0525DE }, + { "Asia/Tehran" , 0x0529F5 }, + { "Asia/Tel_Aviv" , 0x053417 }, + { "Asia/Thimbu" , 0x053D77 }, + { "Asia/Thimphu" , 0x053E4E }, + { "Asia/Tokyo" , 0x053F25 }, + { "Asia/Tomsk" , 0x054066 }, + { "Asia/Ujung_Pandang" , 0x054545 }, + { "Asia/Ulaanbaatar" , 0x05464F }, + { "Asia/Ulan_Bator" , 0x0549EB }, + { "Asia/Urumqi" , 0x054D72 }, + { "Asia/Ust-Nera" , 0x054E30 }, + { "Asia/Vientiane" , 0x055334 }, + { "Asia/Vladivostok" , 0x055407 }, + { "Asia/Yakutsk" , 0x0558DE }, + { "Asia/Yangon" , 0x055DB4 }, + { "Asia/Yekaterinburg" , 0x055ECC }, + { "Asia/Yerevan" , 0x0563C1 }, + { "Atlantic/Azores" , 0x05684C }, + { "Atlantic/Bermuda" , 0x057616 }, + { "Atlantic/Canary" , 0x057F7E }, + { "Atlantic/Cape_Verde" , 0x058701 }, + { "Atlantic/Faeroe" , 0x05881B }, + { "Atlantic/Faroe" , 0x058F3E }, + { "Atlantic/Jan_Mayen" , 0x059661 }, + { "Atlantic/Madeira" , 0x059F21 }, + { "Atlantic/Reykjavik" , 0x05ACEB }, + { "Atlantic/South_Georgia" , 0x05B181 }, + { "Atlantic/St_Helena" , 0x05B231 }, + { "Atlantic/Stanley" , 0x05B2D1 }, + { "Australia/ACT" , 0x05B79B }, + { "Australia/Adelaide" , 0x05C035 }, + { "Australia/Brisbane" , 0x05C8F0 }, + { "Australia/Broken_Hill" , 0x05CAB6 }, + { "Australia/Canberra" , 0x05D393 }, + { "Australia/Currie" , 0x05DC2D }, + { "Australia/Darwin" , 0x05E56F }, + { "Australia/Eucla" , 0x05E6D2 }, + { "Australia/Hobart" , 0x05E8CD }, + { "Australia/LHI" , 0x05F217 }, + { "Australia/Lindeman" , 0x05F967 }, + { "Australia/Lord_Howe" , 0x05FB6D }, + { "Australia/Melbourne" , 0x0602CD }, + { "Australia/North" , 0x060B6F }, + { "Australia/NSW" , 0x060CC0 }, + { "Australia/Perth" , 0x06155A }, + { "Australia/Queensland" , 0x061742 }, + { "Australia/South" , 0x0618F1 }, + { "Australia/Sydney" , 0x06219D }, + { "Australia/Tasmania" , 0x062A53 }, + { "Australia/Victoria" , 0x063395 }, + { "Australia/West" , 0x063C2F }, + { "Australia/Yancowinna" , 0x063DF9 }, + { "Brazil/Acre" , 0x0646BA }, + { "Brazil/DeNoronha" , 0x06493A }, + { "Brazil/East" , 0x064C12 }, + { "Brazil/West" , 0x0651C2 }, + { "Canada/Atlantic" , 0x06542A }, + { "Canada/Central" , 0x066196 }, + { "Canada/Eastern" , 0x066CD6 }, + { "Canada/Mountain" , 0x067A88 }, + { "Canada/Newfoundland" , 0x0683B0 }, + { "Canada/Pacific" , 0x069203 }, + { "Canada/Saskatchewan" , 0x069D5B }, + { "Canada/Yukon" , 0x06A13B }, + { "CET" , 0x06A795 }, + { "Chile/Continental" , 0x06AFCF }, + { "Chile/EasterIsland" , 0x06B9BC }, + { "CST6CDT" , 0x06C281 }, + { "Cuba" , 0x06CB93 }, + { "EET" , 0x06D50F }, + { "Egypt" , 0x06DC8F }, + { "Eire" , 0x06E43E }, + { "EST" , 0x06F1EE }, + { "EST5EDT" , 0x06F26C }, + { "Etc/GMT" , 0x06FB7E }, + { "Etc/GMT+0" , 0x06FBFC }, + { "Etc/GMT+1" , 0x06FC7A }, + { "Etc/GMT+10" , 0x06FCFA }, + { "Etc/GMT+11" , 0x06FD7B }, + { "Etc/GMT+12" , 0x06FDFC }, + { "Etc/GMT+2" , 0x06FE7D }, + { "Etc/GMT+3" , 0x06FEFD }, + { "Etc/GMT+4" , 0x06FF7D }, + { "Etc/GMT+5" , 0x06FFFD }, + { "Etc/GMT+6" , 0x07007D }, + { "Etc/GMT+7" , 0x0700FD }, + { "Etc/GMT+8" , 0x07017D }, + { "Etc/GMT+9" , 0x0701FD }, + { "Etc/GMT-0" , 0x07027D }, + { "Etc/GMT-1" , 0x0702FB }, + { "Etc/GMT-10" , 0x07037C }, + { "Etc/GMT-11" , 0x0703FE }, + { "Etc/GMT-12" , 0x070480 }, + { "Etc/GMT-13" , 0x070502 }, + { "Etc/GMT-14" , 0x070584 }, + { "Etc/GMT-2" , 0x070606 }, + { "Etc/GMT-3" , 0x070687 }, + { "Etc/GMT-4" , 0x070708 }, + { "Etc/GMT-5" , 0x070789 }, + { "Etc/GMT-6" , 0x07080A }, + { "Etc/GMT-7" , 0x07088B }, + { "Etc/GMT-8" , 0x07090C }, + { "Etc/GMT-9" , 0x07098D }, + { "Etc/GMT0" , 0x070A0E }, + { "Etc/Greenwich" , 0x070A8C }, + { "Etc/UCT" , 0x070B0A }, + { "Etc/Universal" , 0x070B88 }, + { "Etc/UTC" , 0x070C06 }, + { "Etc/Zulu" , 0x070C84 }, + { "Europe/Amsterdam" , 0x070D02 }, + { "Europe/Andorra" , 0x07186C }, + { "Europe/Astrakhan" , 0x071F46 }, + { "Europe/Athens" , 0x0723F1 }, + { "Europe/Belfast" , 0x072CD3 }, + { "Europe/Belgrade" , 0x073B1F }, + { "Europe/Berlin" , 0x0742AB }, + { "Europe/Bratislava" , 0x074BC5 }, + { "Europe/Brussels" , 0x0754CE }, + { "Europe/Bucharest" , 0x07604F }, + { "Europe/Budapest" , 0x0768E3 }, + { "Europe/Busingen" , 0x07722F }, + { "Europe/Chisinau" , 0x0779B8 }, + { "Europe/Copenhagen" , 0x07831A }, + { "Europe/Dublin" , 0x078B7F }, + { "Europe/Gibraltar" , 0x07992F }, + { "Europe/Guernsey" , 0x07A527 }, + { "Europe/Helsinki" , 0x07B373 }, + { "Europe/Isle_of_Man" , 0x07BAEB }, + { "Europe/Istanbul" , 0x07C937 }, + { "Europe/Jersey" , 0x07D0DE }, + { "Europe/Kaliningrad" , 0x07DF2A }, + { "Europe/Kiev" , 0x07E51F }, + { "Europe/Kirov" , 0x07ED87 }, + { "Europe/Lisbon" , 0x07F222 }, + { "Europe/Ljubljana" , 0x07FFEA }, + { "Europe/London" , 0x080776 }, + { "Europe/Luxembourg" , 0x0815C2 }, + { "Europe/Madrid" , 0x082150 }, + { "Europe/Malta" , 0x082BA2 }, + { "Europe/Mariehamn" , 0x0835EA }, + { "Europe/Minsk" , 0x083D62 }, + { "Europe/Monaco" , 0x084297 }, + { "Europe/Moscow" , 0x084E23 }, + { "Europe/Nicosia" , 0x085442 }, + { "Europe/Oslo" , 0x085C20 }, + { "Europe/Paris" , 0x0864E0 }, + { "Europe/Podgorica" , 0x08707E }, + { "Europe/Prague" , 0x08780A }, + { "Europe/Riga" , 0x088113 }, + { "Europe/Rome" , 0x0889B5 }, + { "Europe/Samara" , 0x089412 }, + { "Europe/San_Marino" , 0x0898F6 }, + { "Europe/Sarajevo" , 0x08A353 }, + { "Europe/Saratov" , 0x08AADF }, + { "Europe/Simferopol" , 0x08AF9A }, + { "Europe/Skopje" , 0x08B569 }, + { "Europe/Sofia" , 0x08BCF5 }, + { "Europe/Stockholm" , 0x08C51E }, + { "Europe/Tallinn" , 0x08CC9F }, + { "Europe/Tirane" , 0x08D50F }, + { "Europe/Tiraspol" , 0x08DD3F }, + { "Europe/Ulyanovsk" , 0x08E6A1 }, + { "Europe/Uzhgorod" , 0x08EBB2 }, + { "Europe/Vaduz" , 0x08F3DE }, + { "Europe/Vatican" , 0x08FB5F }, + { "Europe/Vienna" , 0x0905BC }, + { "Europe/Vilnius" , 0x090E60 }, + { "Europe/Volgograd" , 0x0916DE }, + { "Europe/Warsaw" , 0x091B89 }, + { "Europe/Zagreb" , 0x0925F3 }, + { "Europe/Zaporozhye" , 0x092D7F }, + { "Europe/Zurich" , 0x093600 }, + { "Factory" , 0x093D81 }, + { "GB" , 0x093E01 }, + { "GB-Eire" , 0x094C4D }, + { "GMT" , 0x095A99 }, + { "GMT+0" , 0x095B17 }, + { "GMT-0" , 0x095B95 }, + { "GMT0" , 0x095C13 }, + { "Greenwich" , 0x095C91 }, + { "Hongkong" , 0x095D0F }, + { "HST" , 0x0961CE }, + { "Iceland" , 0x09624D }, + { "Indian/Antananarivo" , 0x0966E3 }, + { "Indian/Chagos" , 0x0967F8 }, + { "Indian/Christmas" , 0x0968CB }, + { "Indian/Cocos" , 0x09697C }, + { "Indian/Comoro" , 0x096A36 }, + { "Indian/Kerguelen" , 0x096B4B }, + { "Indian/Mahe" , 0x096BFC }, + { "Indian/Maldives" , 0x096CAD }, + { "Indian/Mauritius" , 0x096D80 }, + { "Indian/Mayotte" , 0x096E7D }, + { "Indian/Reunion" , 0x096F92 }, + { "Iran" , 0x097043 }, + { "Israel" , 0x097A65 }, + { "Jamaica" , 0x0983C5 }, + { "Japan" , 0x0985B3 }, + { "Kwajalein" , 0x0986F4 }, + { "Libya" , 0x09883C }, + { "MET" , 0x098AB9 }, + { "Mexico/BajaNorte" , 0x0992F3 }, + { "Mexico/BajaSur" , 0x099C25 }, + { "Mexico/General" , 0x09A227 }, + { "MST" , 0x09A863 }, + { "MST7MDT" , 0x09A8E1 }, + { "Navajo" , 0x09B1F3 }, + { "NZ" , 0x09BB8B }, + { "NZ-CHAT" , 0x09C51C }, + { "Pacific/Apia" , 0x09CD3C }, + { "Pacific/Auckland" , 0x09CFAC }, + { "Pacific/Bougainville" , 0x09D955 }, + { "Pacific/Chatham" , 0x09DA79 }, + { "Pacific/Chuuk" , 0x09E2A8 }, + { "Pacific/Easter" , 0x09E3D0 }, + { "Pacific/Efate" , 0x09ECA2 }, + { "Pacific/Enderbury" , 0x09EEC8 }, + { "Pacific/Fakaofo" , 0x09EFBE }, + { "Pacific/Fiji" , 0x09F092 }, + { "Pacific/Funafuti" , 0x09F4B7 }, + { "Pacific/Galapagos" , 0x09F569 }, + { "Pacific/Gambier" , 0x09F674 }, + { "Pacific/Guadalcanal" , 0x09F733 }, + { "Pacific/Guam" , 0x09F7E5 }, + { "Pacific/Honolulu" , 0x09F9DF }, + { "Pacific/Johnston" , 0x09FB3A }, + { "Pacific/Kanton" , 0x09FC8F }, + { "Pacific/Kiritimati" , 0x09FD94 }, + { "Pacific/Kosrae" , 0x09FE9A }, + { "Pacific/Kwajalein" , 0x0A000B }, + { "Pacific/Majuro" , 0x0A015C }, + { "Pacific/Marquesas" , 0x0A02BB }, + { "Pacific/Midway" , 0x0A0385 }, + { "Pacific/Nauru" , 0x0A044E }, + { "Pacific/Niue" , 0x0A0556 }, + { "Pacific/Norfolk" , 0x0A062D }, + { "Pacific/Noumea" , 0x0A09A9 }, + { "Pacific/Pago_Pago" , 0x0A0AE5 }, + { "Pacific/Palau" , 0x0A0BA0 }, + { "Pacific/Pitcairn" , 0x0A0C60 }, + { "Pacific/Pohnpei" , 0x0A0D36 }, + { "Pacific/Ponape" , 0x0A0E7F }, + { "Pacific/Port_Moresby" , 0x0A0FBA }, + { "Pacific/Rarotonga" , 0x0A109D }, + { "Pacific/Saipan" , 0x0A1304 }, + { "Pacific/Samoa" , 0x0A14FE }, + { "Pacific/Tahiti" , 0x0A15B9 }, + { "Pacific/Tarawa" , 0x0A1679 }, + { "Pacific/Tongatapu" , 0x0A173A }, + { "Pacific/Truk" , 0x0A18BA }, + { "Pacific/Wake" , 0x0A19D3 }, + { "Pacific/Wallis" , 0x0A1A90 }, + { "Pacific/Yap" , 0x0A1B42 }, + { "Poland" , 0x0A1C5B }, + { "Portugal" , 0x0A26C5 }, + { "PRC" , 0x0A347A }, + { "PST8PDT" , 0x0A36B7 }, + { "ROC" , 0x0A3FC9 }, + { "ROK" , 0x0A42CE }, + { "Singapore" , 0x0A4543 }, + { "Turkey" , 0x0A46CE }, + { "UCT" , 0x0A4E75 }, + { "Universal" , 0x0A4EF3 }, + { "US/Alaska" , 0x0A4F71 }, + { "US/Aleutian" , 0x0A58C0 }, + { "US/Arizona" , 0x0A6200 }, + { "US/Central" , 0x0A6354 }, + { "US/East-Indiana" , 0x0A7158 }, + { "US/Eastern" , 0x0A77E6 }, + { "US/Hawaii" , 0x0A85C2 }, + { "US/Indiana-Starke" , 0x0A8717 }, + { "US/Michigan" , 0x0A909F }, + { "US/Mountain" , 0x0A9961 }, + { "US/Pacific" , 0x0AA2F9 }, + { "US/Samoa" , 0x0AAE19 }, + { "UTC" , 0x0AAED4 }, + { "W-SU" , 0x0AAF52 }, + { "WET" , 0x0AB55D }, + { "Zulu" , 0x0ABCDA }, }; -const unsigned char timelib_timezone_db_data_builtin[703734] = { +const unsigned char timelib_timezone_db_data_builtin[703832] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -37134,8 +37136,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x30, 0x47, 0x46, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, -0xB0, 0x5E, 0x77, 0xC6, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, +0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, +0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD5, 0x33, 0x55, 0xC0, 0xD5, 0x76, 0x92, 0x40, 0xFD, 0xD1, 0x3C, 0x40, @@ -37170,7 +37172,7 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, +0x05, 0x06, 0x05, 0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, @@ -37179,9 +37181,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, -0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, -0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xD7, 0xC0, 0xFF, 0xFF, 0xFF, @@ -37244,7 +37246,7 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, +0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, @@ -38062,8 +38064,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x30, 0x47, 0x46, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, -0xB0, 0x5E, 0x77, 0xC6, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, +0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, +0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD3, 0xDC, 0x8F, 0xC0, 0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x33, 0x55, 0xC0, @@ -38111,8 +38113,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -38120,9 +38122,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, -0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, -0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, +0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, +0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, +0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, @@ -38209,8 +38211,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -43205,15 +43207,15 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x56, 0x29, 0x5C, 0x60, 0x56, 0xF5, 0xC2, 0xF0, 0x58, 0x13, 0xCA, 0x60, 0x58, 0xD5, 0xA4, 0xF0, 0x59, 0xF3, 0xAC, 0x60, 0x5A, 0xB5, 0x86, 0xF0, 0x5B, 0xD3, 0x8E, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB3, 0x62, 0x50, 0x5E, 0x7E, 0x77, 0x60, 0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, -0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3E, 0x3B, 0x60, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1E, 0x1D, 0x60, -0x65, 0x3A, 0xE1, 0x60, 0x66, 0x07, 0x39, 0xE0, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE7, 0x1B, 0xE0, -0x69, 0x03, 0xDF, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, 0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, -0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x86, 0xC1, 0xE0, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x66, 0xA3, 0xE0, -0x70, 0x83, 0x67, 0xE0, 0x71, 0x4F, 0xC0, 0x60, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x2F, 0xA2, 0x60, -0x74, 0x4C, 0x66, 0x60, 0x75, 0x0F, 0x84, 0x60, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xEF, 0x66, 0x60, -0x78, 0x0C, 0x2A, 0x60, 0x78, 0xCF, 0x48, 0x60, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xAF, 0x2A, 0x60, -0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x98, 0x46, 0xE0, 0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x78, 0x28, 0xE0, -0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3F, 0x8C, 0xE0, 0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1F, 0x6E, 0xE0, +0x65, 0x3A, 0xE1, 0x60, 0x66, 0x08, 0x8B, 0x60, 0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE8, 0x6D, 0x60, +0x68, 0xFA, 0xA5, 0x60, 0x69, 0xC8, 0x4F, 0x60, 0x6A, 0xDA, 0x87, 0x60, 0x6B, 0xA8, 0x31, 0x60, +0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x88, 0x13, 0x60, 0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x67, 0xF5, 0x60, +0x70, 0x83, 0x67, 0xE0, 0x71, 0x51, 0x11, 0xE0, 0x72, 0x63, 0x49, 0xE0, 0x73, 0x30, 0xF3, 0xE0, +0x74, 0x43, 0x2B, 0xE0, 0x75, 0x10, 0xD5, 0xE0, 0x76, 0x2C, 0x48, 0x60, 0x76, 0xF0, 0xB7, 0xE0, +0x78, 0x0C, 0x2A, 0x60, 0x78, 0xD0, 0x99, 0xE0, 0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB0, 0x7B, 0xE0, +0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x99, 0x98, 0x60, 0x7D, 0xAB, 0xD0, 0x60, 0x7E, 0x79, 0x7A, 0x60, +0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, @@ -43291,22 +43293,22 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, -0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, -0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, -0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, -0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, -0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, -0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, -0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, -0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, -0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, -0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, -0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, -0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, -0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, -0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, -0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, +0x3F, 0x8C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, +0x1F, 0x6E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, +0x08, 0x8B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, +0xE8, 0x6D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFA, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, +0xC8, 0x4F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDA, 0x87, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, +0xA8, 0x31, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, +0x88, 0x13, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x67, 0xF5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, +0x51, 0x11, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, +0x30, 0xF3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x43, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x75, +0x10, 0xD5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, +0xF0, 0xB7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, +0xD0, 0x99, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, +0xB0, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x99, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAB, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, +0x79, 0x7A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, @@ -43323,9 +43325,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, -0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x35, 0x2F, 0x31, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, 0x00, -0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, +0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, +0x2E, 0x34, 0x2F, 0x32, 0x35, 0x0A, 0x00, 0xB9, 0x64, 0xF0, 0x01, 0x47, 0x40, 0x0A, 0x00, 0x00, +0x00, 0x0A, 0x47, 0x61, 0x7A, 0x61, 0x20, 0x53, 0x74, 0x72, 0x69, 0x70, /* Asia/Harbin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43398,15 +43400,15 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x49, 0x6C, 0x50, 0x55, 0x15, 0xD2, 0xE0, 0x56, 0x29, 0x5C, 0x60, 0x56, 0xF5, 0xC2, 0xF0, 0x58, 0x13, 0xCA, 0x60, 0x58, 0xD5, 0xA4, 0xF0, 0x59, 0xF3, 0xAC, 0x60, 0x5A, 0xB5, 0x86, 0xF0, 0x5B, 0xD3, 0x8E, 0x60, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB3, 0x62, 0x50, 0x5E, 0x7E, 0x77, 0x60, -0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, 0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3E, 0x3B, 0x60, -0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1E, 0x1D, 0x60, 0x65, 0x3A, 0xE1, 0x60, 0x66, 0x07, 0x39, 0xE0, -0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE7, 0x1B, 0xE0, 0x69, 0x03, 0xDF, 0xE0, 0x69, 0xC6, 0xFD, 0xE0, -0x6A, 0xE3, 0xC1, 0xE0, 0x6B, 0xA6, 0xDF, 0xE0, 0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x86, 0xC1, 0xE0, -0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x66, 0xA3, 0xE0, 0x70, 0x83, 0x67, 0xE0, 0x71, 0x4F, 0xC0, 0x60, -0x72, 0x63, 0x49, 0xE0, 0x73, 0x2F, 0xA2, 0x60, 0x74, 0x4C, 0x66, 0x60, 0x75, 0x0F, 0x84, 0x60, -0x76, 0x2C, 0x48, 0x60, 0x76, 0xEF, 0x66, 0x60, 0x78, 0x0C, 0x2A, 0x60, 0x78, 0xCF, 0x48, 0x60, -0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xAF, 0x2A, 0x60, 0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x98, 0x46, 0xE0, -0x7D, 0xB5, 0x0A, 0xE0, 0x7E, 0x78, 0x28, 0xE0, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, +0x5F, 0x93, 0x52, 0x60, 0x60, 0x5E, 0x59, 0x60, 0x61, 0x7B, 0x1D, 0x60, 0x62, 0x3F, 0x8C, 0xE0, +0x63, 0x5A, 0xFF, 0x60, 0x64, 0x1F, 0x6E, 0xE0, 0x65, 0x3A, 0xE1, 0x60, 0x66, 0x08, 0x8B, 0x60, +0x67, 0x1A, 0xC3, 0x60, 0x67, 0xE8, 0x6D, 0x60, 0x68, 0xFA, 0xA5, 0x60, 0x69, 0xC8, 0x4F, 0x60, +0x6A, 0xDA, 0x87, 0x60, 0x6B, 0xA8, 0x31, 0x60, 0x6C, 0xC3, 0xA3, 0xE0, 0x6D, 0x88, 0x13, 0x60, +0x6E, 0xA3, 0x85, 0xE0, 0x6F, 0x67, 0xF5, 0x60, 0x70, 0x83, 0x67, 0xE0, 0x71, 0x51, 0x11, 0xE0, +0x72, 0x63, 0x49, 0xE0, 0x73, 0x30, 0xF3, 0xE0, 0x74, 0x43, 0x2B, 0xE0, 0x75, 0x10, 0xD5, 0xE0, +0x76, 0x2C, 0x48, 0x60, 0x76, 0xF0, 0xB7, 0xE0, 0x78, 0x0C, 0x2A, 0x60, 0x78, 0xD0, 0x99, 0xE0, +0x79, 0xEC, 0x0C, 0x60, 0x7A, 0xB0, 0x7B, 0xE0, 0x7B, 0xCB, 0xEE, 0x60, 0x7C, 0x99, 0x98, 0x60, +0x7D, 0xAB, 0xD0, 0x60, 0x7E, 0x79, 0x7A, 0x60, 0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, @@ -43485,23 +43487,23 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x5B, 0xD3, 0x8E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB3, 0x62, 0x50, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7E, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x93, 0x52, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5E, 0x59, 0x60, 0x00, 0x00, 0x00, -0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3E, 0x3B, 0x60, 0x00, 0x00, 0x00, -0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1E, 0x1D, 0x60, 0x00, 0x00, 0x00, -0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x07, 0x39, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE7, 0x1B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x69, 0x03, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC6, 0xFD, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6A, 0xE3, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA6, 0xDF, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x86, 0xC1, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x66, 0xA3, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x4F, 0xC0, 0x60, 0x00, 0x00, 0x00, -0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x2F, 0xA2, 0x60, 0x00, 0x00, 0x00, -0x00, 0x74, 0x4C, 0x66, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0F, 0x84, 0x60, 0x00, 0x00, 0x00, -0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xEF, 0x66, 0x60, 0x00, 0x00, 0x00, -0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xCF, 0x48, 0x60, 0x00, 0x00, 0x00, -0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xAF, 0x2A, 0x60, 0x00, 0x00, 0x00, -0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x98, 0x46, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7D, 0xB5, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x78, 0x28, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7F, 0x94, 0xEC, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0x8C, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x63, 0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x6E, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x65, 0x3A, 0xE1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0x8B, 0x60, 0x00, 0x00, 0x00, +0x00, 0x67, 0x1A, 0xC3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x6D, 0x60, 0x00, 0x00, 0x00, +0x00, 0x68, 0xFA, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x4F, 0x60, 0x00, 0x00, 0x00, +0x00, 0x6A, 0xDA, 0x87, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x31, 0x60, 0x00, 0x00, 0x00, +0x00, 0x6C, 0xC3, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x13, 0x60, 0x00, 0x00, 0x00, +0x00, 0x6E, 0xA3, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x67, 0xF5, 0x60, 0x00, 0x00, 0x00, +0x00, 0x70, 0x83, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x11, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x72, 0x63, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x30, 0xF3, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x74, 0x43, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x10, 0xD5, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x76, 0x2C, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xB7, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x78, 0x0C, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0x99, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x79, 0xEC, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0x7B, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x7B, 0xCB, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0x98, 0x60, 0x00, 0x00, 0x00, +0x00, 0x7D, 0xAB, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0x7A, 0x60, 0x00, 0x00, 0x00, +0x00, 0x7F, 0x8B, 0xB2, 0x60, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x08, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, @@ -43518,9 +43520,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x49, 0x44, 0x54, 0x00, 0x49, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, -0x34, 0x2E, 0x34, 0x2F, 0x34, 0x38, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x35, 0x2F, 0x31, -0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, 0x73, -0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, +0x34, 0x2E, 0x34, 0x2F, 0x37, 0x32, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x34, 0x2E, 0x34, 0x2F, 0x32, +0x35, 0x0A, 0x00, 0xB9, 0x71, 0xF5, 0x01, 0x48, 0x35, 0x7C, 0x00, 0x00, 0x00, 0x09, 0x57, 0x65, +0x73, 0x74, 0x20, 0x42, 0x61, 0x6E, 0x6B, /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -52415,8 +52417,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x30, 0x47, 0x46, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC6, 0xA1, 0x00, 0x71, 0xC0, -0xB0, 0x5E, 0x77, 0xC6, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, +0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, +0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, 0xB7, 0xE4, 0x9B, 0x50, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xC7, 0x20, 0x50, 0xCC, 0x1C, 0x6E, 0x40, 0xCC, 0x6C, 0xE7, 0xD0, 0xD3, 0xDC, 0x8F, 0xC0, 0xD4, 0x1B, 0xC9, 0xB0, 0xD5, 0x33, 0x55, 0xC0, @@ -52464,8 +52466,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -52473,9 +52475,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x69, 0x87, 0x1D, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x46, 0xFF, 0xFF, 0xFF, 0xFF, -0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, -0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, +0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, +0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, +0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, @@ -52562,8 +52564,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBA, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBA, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, +0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, @@ -57536,8 +57538,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Kiev */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xA7, 0x64, 0xB5, 0xA4, 0x19, 0x60, 0xCA, 0xCD, 0x2E, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCE, 0xCD, 0xA8, 0x70, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, @@ -57545,9 +57547,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, 0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x0B, 0xFB, 0xF0, 0x26, 0x8D, 0x20, 0xE0, 0x28, 0xE5, 0x17, 0x80, -0x29, 0xD4, 0xEC, 0x60, 0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, 0x2C, 0xA4, 0xB1, 0x50, -0x2D, 0x94, 0xB0, 0x60, 0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, -0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, +0x29, 0xD5, 0x08, 0x80, 0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, 0x2C, 0xA4, 0xDB, 0x80, +0x2D, 0x94, 0xCC, 0x80, 0x2E, 0x84, 0xBD, 0x80, 0x2F, 0x74, 0xAE, 0x80, 0x30, 0x64, 0x9F, 0x80, +0x31, 0x5D, 0xCB, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, @@ -57569,24 +57571,25 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0A, 0x02, 0x0A, 0x02, 0x0A, -0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, +0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, -0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x2A, 0x30, 0x01, -0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, -0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, -0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, +0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x1D, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, +0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, +0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, +0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x22, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA7, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCD, 0x2E, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, @@ -57601,11 +57604,11 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x20, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, +0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, @@ -57649,20 +57652,21 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x1D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x4B, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, -0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x4D, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD6, 0x48, 0xC5, 0x01, 0x41, 0x39, 0x12, @@ -60829,16 +60833,16 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Simferopol */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x22, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xA4, 0x20, 0xB5, 0xA4, 0x19, 0x60, 0xCB, 0x04, 0x8D, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xCF, 0x9F, 0x38, 0xE0, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, 0x19, 0xDB, 0x43, 0x40, 0x1A, 0xCC, 0x93, 0xD0, 0x1B, 0xBC, 0xA0, 0xF0, 0x1C, 0xAC, 0x91, 0xF0, 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, -0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x29, 0xD4, 0xEC, 0x60, -0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, 0x2C, 0xA4, 0xB1, 0x50, 0x2D, 0x94, 0xB0, 0x60, +0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x29, 0xD5, 0x08, 0x80, +0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, 0x2C, 0xA4, 0xDB, 0x80, 0x2D, 0x94, 0xCC, 0x80, 0x2D, 0xC2, 0xC6, 0xD0, 0x2E, 0x84, 0x85, 0x40, 0x2F, 0x74, 0x84, 0x50, 0x30, 0x64, 0x67, 0x40, 0x31, 0x5D, 0xA0, 0xD0, 0x32, 0x72, 0xA6, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, @@ -60851,73 +60855,74 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x5E, 0x80, 0x54, 0x4C, 0x1D, 0x60, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0D, 0x08, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x00, +0x08, 0x09, 0x08, 0x02, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, 0x0C, +0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, +0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, +0x0D, 0x0E, 0x08, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, -0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, -0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, -0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x4B, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC4, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA4, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, -0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x04, 0x8D, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x9F, 0x38, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, -0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, -0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, -0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, -0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, -0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, -0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, -0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, -0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, -0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, -0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, -0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, -0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, -0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, -0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, -0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, -0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, -0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, -0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, -0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, -0x60, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, -0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x02, 0x0A, 0x02, 0x0A, -0x02, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0D, 0x08, 0x00, 0x00, 0x1F, 0xF8, -0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, -0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, -0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, -0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, -0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, +0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, +0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, +0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC4, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA4, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x04, 0x8D, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x9F, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, +0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, +0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, +0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xC2, 0xC6, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, +0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, +0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, +0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, +0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, +0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, +0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, +0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, +0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, +0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, +0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, +0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, +0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, +0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, +0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x02, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x07, 0x03, 0x07, 0x03, 0x09, 0x08, +0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, +0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, 0x0C, 0x0D, +0x0C, 0x0D, 0x0E, 0x08, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, +0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, +0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, +0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, +0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, +0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, +0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0A, 0x4D, 0x53, 0x4B, 0x2D, 0x33, 0x0A, 0x00, 0xCD, 0xEA, 0xD7, 0x01, 0x46, 0xB0, 0xD0, 0x00, 0x00, 0x00, 0x06, 0x43, 0x72, 0x69, 0x6D, 0x65, 0x61, @@ -61811,17 +61816,17 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Uzhgorod */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, 0xC8, 0x09, 0x71, 0x90, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xD0, 0xA1, 0x9E, 0xE0, 0xD1, 0xE5, 0xFD, 0xF0, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, 0x19, 0xDB, 0x43, 0x40, 0x1A, 0xCC, 0x93, 0xD0, 0x1B, 0xBC, 0xA0, 0xF0, 0x1C, 0xAC, 0x91, 0xF0, 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, 0x24, 0x2C, 0x19, 0xF0, -0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x27, 0xF5, 0x42, 0xA0, 0x29, 0xD4, 0xEC, 0x60, -0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, 0x2C, 0xA4, 0xB1, 0x50, 0x2D, 0x94, 0xB0, 0x60, -0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, +0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x8D, 0x2E, 0xF0, 0x27, 0xF5, 0x42, 0xA0, 0x29, 0xD5, 0x08, 0x80, +0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, 0x2C, 0xA4, 0xDB, 0x80, 0x2D, 0x94, 0xCC, 0x80, +0x2E, 0x84, 0xBD, 0x80, 0x2F, 0x74, 0xAE, 0x80, 0x30, 0x64, 0x9F, 0x80, 0x31, 0x5D, 0xCB, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, @@ -61844,98 +61849,99 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x01, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x08, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, +0x09, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x4C, 0x4D, 0x54, 0x00, +0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, +0x01, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, +0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, +0x00, 0x0D, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0xEE, 0xB0, 0x18, 0xFF, 0xFF, +0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, +0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, +0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA1, 0x9E, 0xE0, 0xFF, 0xFF, +0xFF, 0xFF, 0xD1, 0xE5, 0xFD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, +0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, +0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, +0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, +0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, +0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, +0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, +0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, +0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, +0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, +0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, +0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, +0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, +0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, +0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, +0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, +0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, +0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, +0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, +0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, +0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, +0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, +0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, +0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, +0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, +0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, +0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, +0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, +0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, +0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, +0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, +0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, +0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, +0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, +0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, +0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x01, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x01, 0x08, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0A, 0x09, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x00, 0x00, +0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, +0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, +0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, -0xFF, 0xFF, 0x6A, 0xEE, 0xB0, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD0, 0xA1, 0x9E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0xE5, 0xFD, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, -0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, -0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x26, 0x8D, 0x2E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, -0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, -0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, -0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, -0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, -0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, -0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, -0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, -0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, -0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, -0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, -0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, -0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, -0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, -0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, -0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, -0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, -0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, -0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, -0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, -0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, -0x03, 0x02, 0x03, 0x02, 0x01, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, -0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x00, 0x00, 0x14, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, -0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x08, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x04, 0x00, 0x00, -0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, -0x00, 0x00, 0x38, 0x40, 0x01, 0x0D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x19, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x15, 0x4C, 0x4D, -0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x4D, -0x53, 0x4B, 0x00, 0x45, 0x45, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, -0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD3, 0x83, 0x22, 0x01, 0x34, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x0E, 0x54, 0x72, @@ -62882,8 +62888,8 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { /* Europe/Zaporozhye */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xA3, 0x30, 0xB5, 0xA4, 0x19, 0x60, 0xCA, 0xAA, 0xE7, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCE, 0xBD, 0xD6, 0x70, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xEA, 0x0E, 0xD0, @@ -62891,9 +62897,9 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x1D, 0x9C, 0x82, 0xF0, 0x1E, 0x8C, 0x73, 0xF0, 0x1F, 0x7C, 0x64, 0xF0, 0x20, 0x6C, 0x55, 0xF0, 0x21, 0x5C, 0x46, 0xF0, 0x22, 0x4C, 0x37, 0xF0, 0x23, 0x3C, 0x28, 0xF0, 0x24, 0x2C, 0x19, 0xF0, 0x25, 0x1C, 0x0A, 0xF0, 0x26, 0x0B, 0xFB, 0xF0, 0x27, 0x05, 0x27, 0x70, 0x27, 0xF5, 0x18, 0x70, -0x28, 0xE4, 0xED, 0x50, 0x29, 0xD4, 0xEC, 0x60, 0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xCE, 0x60, -0x2C, 0xA4, 0xB1, 0x50, 0x2D, 0x94, 0xB0, 0x60, 0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0xBC, 0x90, -0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, +0x28, 0xE4, 0xED, 0x50, 0x29, 0xD5, 0x08, 0x80, 0x2A, 0xC4, 0xF9, 0x80, 0x2B, 0xB4, 0xEA, 0x80, +0x2C, 0xA4, 0xDB, 0x80, 0x2D, 0x94, 0xCC, 0x80, 0x2E, 0x84, 0xBD, 0x80, 0x2F, 0x74, 0xAE, 0x80, +0x30, 0x64, 0x9F, 0x80, 0x31, 0x5D, 0xCB, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, @@ -62916,24 +62922,25 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x00, 0x00, +0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, -0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x1C, 0x20, +0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, +0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, -0x00, 0x0D, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC3, 0x08, 0xFF, 0xFF, +0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, +0x00, 0x0F, 0x00, 0x00, 0x00, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC3, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xA3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xAA, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, @@ -62948,11 +62955,11 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, +0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, +0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, @@ -62996,20 +63003,21 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, -0x09, 0x08, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, -0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x09, 0x08, 0x0A, 0x02, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, +0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0D, 0x00, 0x00, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x12, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x16, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x40, 0x01, 0x1B, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x1F, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, -0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, +0x01, 0x1F, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1F, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x32, 0x32, 0x30, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, +0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x45, 0x45, 0x54, 0x2D, 0x32, 0x45, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x34, 0x0A, 0x00, 0xD2, 0x51, 0x25, 0x01, 0x48, @@ -69555,4 +69563,4 @@ const unsigned char timelib_timezone_db_data_builtin[703734] = { }; #endif -const timelib_tzdb timezonedb_builtin = { "2021.5", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2022.1", 595, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From 6828f9d1af7faa18a563d370d84a0182460f5605 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 7 Apr 2022 11:59:29 +0200 Subject: [PATCH 0418/1346] Fix newly introduced test We need to tell the test runner that ext/curl is required to run the test. --- ext/curl/tests/curl_postfields_array.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/curl/tests/curl_postfields_array.phpt b/ext/curl/tests/curl_postfields_array.phpt index 079675cf08f78..05aa91a3f06df 100644 --- a/ext/curl/tests/curl_postfields_array.phpt +++ b/ext/curl/tests/curl_postfields_array.phpt @@ -1,6 +1,7 @@ --TEST-- CURLOPT_POSTFIELDS with multi-value fields --EXTENSIONS-- +curl sockets --FILE-- Date: Thu, 7 Apr 2022 15:12:40 +0100 Subject: [PATCH 0419/1346] Minor refactoring of spl_directory.c Using more appropriate types Fix comments Early returns --- ext/spl/spl_directory.c | 114 ++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 58 deletions(-) diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index f752593c92351..f3d4fa2b92f7a 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -209,7 +209,7 @@ PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_ return intern->path ? ZSTR_VAL(intern->path) : NULL; } /* }}} */ -static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */ +static inline zend_result spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */ { if (intern->file_name) { /* already known */ @@ -248,7 +248,8 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int return SUCCESS; } /* }}} */ -static int spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */ +/* TODO Make void or have callers check return value */ +static bool spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */ { if (intern->file_name) { /* invalidate */ @@ -266,7 +267,7 @@ static int spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */ #define IS_SLASH_AT(zs, pos) (IS_SLASH(zs[pos])) -static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */ +static inline bool spl_filesystem_is_dot(const char * d_name) /* {{{ */ { return !strcmp(d_name, ".") || !strcmp(d_name, ".."); } @@ -277,7 +278,7 @@ static inline int spl_filesystem_is_dot(const char * d_name) /* {{{ */ * Can emit an E_WARNING as it reports errors from php_stream_opendir() */ static void spl_filesystem_dir_open(spl_filesystem_object* intern, zend_string *path) { - int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); + bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); intern->type = SPL_FS_DIR; intern->u.dir.dirp = php_stream_opendir(ZSTR_VAL(path), REPORT_ERRORS, FG(default_context)); @@ -375,7 +376,6 @@ static zend_object *spl_filesystem_object_clone(zend_object *old_object) zend_object *new_object; spl_filesystem_object *intern; spl_filesystem_object *source; - int index, skip_dots; source = spl_filesystem_from_obj(old_object); new_object = spl_filesystem_object_new_ex(old_object->ce); @@ -392,17 +392,19 @@ static zend_object *spl_filesystem_object_clone(zend_object *old_object) intern->file_name = zend_string_copy(source->file_name); } break; - case SPL_FS_DIR: + case SPL_FS_DIR: { spl_filesystem_dir_open(intern, source->path); /* read until we hit the position in which we were before */ - skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS); - for(index = 0; index < source->u.dir.index; ++index) { + bool skip_dots = SPL_HAS_FLAG(source->flags, SPL_FILE_DIR_SKIPDOTS); + int index; + for (index = 0; index < source->u.dir.index; ++index) { do { spl_filesystem_dir_read(intern); } while (skip_dots && spl_filesystem_is_dot(intern->u.dir.entry.d_name)); } intern->u.dir.index = index; break; + } case SPL_FS_FILE: ZEND_UNREACHABLE(); } @@ -503,7 +505,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce)); RETVAL_OBJ(&intern->std); - if (spl_filesystem_object_get_file_name(source) != SUCCESS) { + if (spl_filesystem_object_get_file_name(source) == FAILURE) { return NULL; } @@ -540,7 +542,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce)); RETVAL_OBJ(&intern->std); - if (spl_filesystem_object_get_file_name(source) != SUCCESS) { + if (spl_filesystem_object_get_file_name(source) == FAILURE) { return NULL; } @@ -584,7 +586,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp return NULL; } /* }}} */ -static int spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */ +static bool spl_filesystem_is_invalid_or_dot(const char * d_name) /* {{{ */ { return d_name[0] == '\0' || spl_filesystem_is_dot(d_name); } @@ -709,7 +711,7 @@ void spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAMETERS, zend_long cto { spl_filesystem_object *intern; zend_string *path; - int parsed; + zend_result parsed; zend_long flags = (ctor_flags & ~DIT_CTOR_FLAGS); zend_error_handling error_handling; @@ -809,7 +811,7 @@ PHP_METHOD(DirectoryIterator, current) PHP_METHOD(DirectoryIterator, next) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); + bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -845,7 +847,7 @@ PHP_METHOD(DirectoryIterator, seek) } while (intern->u.dir.index < pos) { - int valid = 0; + bool valid = 0; zend_call_method_with_0_params(Z_OBJ_P(ZEND_THIS), Z_OBJCE_P(ZEND_THIS), &intern->u.dir.func_valid, "valid", &retval); valid = zend_is_true(&retval); zval_ptr_dtor(&retval); @@ -1048,7 +1050,7 @@ PHP_METHOD(DirectoryIterator, getBasename) CHECK_DIRECTORY_ITERATOR_IS_INITIALIZED(intern); fname = php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), suffix, slen); - RETVAL_STR(fname); + RETURN_STR(fname); } /* }}} */ @@ -1082,7 +1084,7 @@ PHP_METHOD(FilesystemIterator, key) if (SPL_FILE_DIR_KEY(intern, SPL_FILE_DIR_KEY_AS_FILENAME)) { RETURN_STRING(intern->u.dir.entry.d_name); } else { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } RETURN_STR_COPY(intern->file_name); @@ -1100,12 +1102,12 @@ PHP_METHOD(FilesystemIterator, current) } if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } RETURN_STR_COPY(intern->file_name); } else if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, return_value); @@ -1129,7 +1131,7 @@ PHP_METHOD(DirectoryIterator, isDot) } /* }}} */ -/* {{{ Cronstructs a new SplFileInfo from a path. */ +/* {{{ Constructs a new SplFileInfo from a path. */ /* When the constructor gets called the object is already created by the engine, so we must only call 'additional' initializations. */ @@ -1159,7 +1161,7 @@ PHP_METHOD(SplFileInfo, func_name) \ if (zend_parse_parameters_none() == FAILURE) { \ RETURN_THROWS(); \ } \ - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { \ + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { \ RETURN_THROWS(); \ } \ zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling);\ @@ -1240,7 +1242,7 @@ PHP_METHOD(SplFileInfo, getLinkTarget) } if (intern->file_name == NULL) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } } @@ -1287,7 +1289,7 @@ PHP_METHOD(SplFileInfo, getRealPath) } if (intern->type == SPL_FS_DIR && !intern->file_name && intern->u.dir.entry.d_name[0]) { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } } @@ -1302,12 +1304,12 @@ PHP_METHOD(SplFileInfo, getRealPath) if (filename && VCWD_REALPATH(filename, buff)) { #ifdef ZTS if (VCWD_ACCESS(buff, F_OK)) { - RETVAL_FALSE; + RETURN_FALSE; } else #endif - RETVAL_STRING(buff); + RETURN_STRING(buff); } else { - RETVAL_FALSE; + RETURN_FALSE; } } /* }}} */ @@ -1388,7 +1390,7 @@ PHP_METHOD(SplFileInfo, getPathInfo) PHP_METHOD(SplFileInfo, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_filesystem_object_get_debug_info(Z_OBJ_P(ZEND_THIS))); @@ -1401,7 +1403,7 @@ PHP_METHOD(SplFileInfo, _bad_state_ex) } /* }}} */ -/* {{{ Cronstructs a new dir iterator from a path. */ +/* {{{ Constructs a new dir iterator from a path. */ PHP_METHOD(FilesystemIterator, __construct) { spl_filesystem_object_construct(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIT_CTOR_FLAGS | SPL_FILE_DIR_SKIPDOTS); @@ -1412,7 +1414,7 @@ PHP_METHOD(FilesystemIterator, __construct) PHP_METHOD(FilesystemIterator, rewind) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); - int skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); + bool skip_dots = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_SKIPDOTS); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1468,7 +1470,7 @@ PHP_METHOD(RecursiveDirectoryIterator, hasChildren) if (spl_filesystem_is_invalid_or_dot(intern->u.dir.entry.d_name)) { RETURN_FALSE; } else { - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } php_stat(intern->file_name, FS_LPERMS, return_value); @@ -1499,7 +1501,7 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren) RETURN_THROWS(); } - if (spl_filesystem_object_get_file_name(intern) != SUCCESS) { + if (spl_filesystem_object_get_file_name(intern) == FAILURE) { RETURN_THROWS(); } @@ -1720,7 +1722,7 @@ static zval *spl_filesystem_tree_it_current_data(zend_object_iterator *iter) if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_PATHNAME)) { if (Z_ISUNDEF(iterator->current)) { - if (spl_filesystem_object_get_file_name(object) != SUCCESS) { + if (spl_filesystem_object_get_file_name(object) == FAILURE) { return NULL; } ZVAL_STR_COPY(&iterator->current, object->file_name); @@ -1728,7 +1730,7 @@ static zval *spl_filesystem_tree_it_current_data(zend_object_iterator *iter) return &iterator->current; } else if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) { if (Z_ISUNDEF(iterator->current)) { - if (spl_filesystem_object_get_file_name(object) != SUCCESS) { + if (spl_filesystem_object_get_file_name(object) == FAILURE) { return NULL; } spl_filesystem_object_create_type(0, object, SPL_FS_INFO, NULL, &iterator->current); @@ -1748,7 +1750,7 @@ static void spl_filesystem_tree_it_current_key(zend_object_iterator *iter, zval if (SPL_FILE_DIR_KEY(object, SPL_FILE_DIR_KEY_AS_FILENAME)) { ZVAL_STRING(key, object->u.dir.entry.d_name); } else { - if (spl_filesystem_object_get_file_name(object) != SUCCESS) { + if (spl_filesystem_object_get_file_name(object) == FAILURE) { return; } ZVAL_STR_COPY(key, object->file_name); @@ -1860,7 +1862,7 @@ static int spl_filesystem_object_cast(zend_object *readobj, zval *writeobj, int } /* }}} */ -static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent) /* {{{ */ +static zend_result spl_filesystem_file_read(spl_filesystem_object *intern, bool silent) /* {{{ */ { char *buf; size_t line_len = 0; @@ -1909,10 +1911,10 @@ static int spl_filesystem_file_read(spl_filesystem_object *intern, int silent) / return SUCCESS; } /* }}} */ -static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char delimiter, char enclosure, int escape, zval *return_value) /* {{{ */ +static zend_result spl_filesystem_file_read_csv(spl_filesystem_object *intern, char delimiter, char enclosure, int escape, zval *return_value) /* {{{ */ { do { - int ret = spl_filesystem_file_read(intern, 1); + zend_result ret = spl_filesystem_file_read(intern, 1); if (ret != SUCCESS) { return ret; } @@ -1934,7 +1936,7 @@ static int spl_filesystem_file_read_csv(spl_filesystem_object *intern, char deli } /* }}} */ -static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ +static zend_result spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ { zval retval; @@ -1977,7 +1979,7 @@ static int spl_filesystem_file_read_line_ex(zval * this_ptr, spl_filesystem_obje } } /* }}} */ -static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* {{{ */ +static bool spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* {{{ */ { if (intern->u.file.current_line) { return intern->u.file.current_line_len == 0; @@ -2016,9 +2018,9 @@ static int spl_filesystem_file_is_empty_line(spl_filesystem_object *intern) /* { } /* }}} */ -static int spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ +static zend_result spl_filesystem_file_read_line(zval * this_ptr, spl_filesystem_object *intern, int silent) /* {{{ */ { - int ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent); + zend_result ret = spl_filesystem_file_read_line_ex(this_ptr, intern, silent); while (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_SKIP_EMPTY) && ret == SUCCESS && spl_filesystem_file_is_empty_line(intern)) { spl_filesystem_file_free_line(intern); @@ -2160,12 +2162,11 @@ PHP_METHOD(SplFileObject, valid) if (SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) { RETURN_BOOL(intern->u.file.current_line || !Z_ISUNDEF(intern->u.file.current_zval)); - } else { - if(!intern->u.file.stream) { - RETURN_FALSE; - } - RETVAL_BOOL(!php_stream_eof(intern->u.file.stream)); } + if (!intern->u.file.stream) { + RETURN_FALSE; + } + RETURN_BOOL(!php_stream_eof(intern->u.file.stream)); } /* }}} */ /* {{{ Return next line from file */ @@ -2568,16 +2569,15 @@ PHP_METHOD(SplFileObject, fgetc) result = php_stream_getc(intern->u.file.stream); if (result == EOF) { - RETVAL_FALSE; - } else { - if (result == '\n') { - intern->u.file.current_line_num++; - } - buf[0] = result; - buf[1] = '\0'; - - RETURN_STRINGL(buf, 1); + RETURN_FALSE; + } + if (result == '\n') { + intern->u.file.current_line_num++; } + buf[0] = result; + buf[1] = '\0'; + + RETURN_STRINGL(buf, 1); } /* }}} */ /* {{{ Output all remaining data from a file pointer */ @@ -2734,11 +2734,9 @@ PHP_METHOD(SplFileObject, seek) return; } } - if (line_pos > 0) { - if (!SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) { + if (line_pos > 0 && !SPL_HAS_FLAG(intern->flags, SPL_FILE_OBJECT_READ_AHEAD)) { intern->u.file.current_line_num++; - spl_filesystem_file_free_line(intern); - } + spl_filesystem_file_free_line(intern); } } /* }}} */ From c68591fa1681dd63b34a429a3378c37f4a657d8d Mon Sep 17 00:00:00 2001 From: Levi Morrison Date: Thu, 7 Apr 2022 14:49:24 -0600 Subject: [PATCH 0420/1346] Use AS_ECHO([]) instead of obsolete $as_echo (#8321) --- build/php.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php.m4 b/build/php.m4 index 94e824f6cc263..fb28f462396fc 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -2152,7 +2152,7 @@ EOF else break fi - $as_echo "$CURRENT_ARG \\" >>$1 + AS_ECHO(["$CURRENT_ARG \\"]) >>$1 CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS $CURRENT_ARG" done echo '"[$]@"' >> $1 From 90851977348cbb8c65fce19a1670868422414fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 21 Dec 2021 12:21:24 +0100 Subject: [PATCH 0421/1346] Implement the "Redacting parameters in back traces" RFC https://wiki.php.net/rfc/redact_parameters_in_back_traces --- UPGRADING | 5 + .../sensitive_parameter.phpt | 51 ++++++++ .../sensitive_parameter_arrow_function.phpt | 28 +++++ .../sensitive_parameter_closure.phpt | 51 ++++++++ ...parameter_correctly_captures_original.phpt | 70 +++++++++++ .../sensitive_parameter_eval_call.phpt | 72 +++++++++++ .../sensitive_parameter_eval_define.phpt | 53 ++++++++ .../sensitive_parameter_extra_arguments.phpt | 62 ++++++++++ ...ensitive_parameter_multiple_arguments.phpt | 65 ++++++++++ .../sensitive_parameter_named_arguments.phpt | 65 ++++++++++ .../sensitive_parameter_nested_calls.phpt | 115 ++++++++++++++++++ .../sensitive_parameter_value.phpt | 43 +++++++ .../sensitive_parameter_value_clone.phpt | 15 +++ ...ve_parameter_value_keeps_object_alive.phpt | 74 +++++++++++ ...e_parameter_value_no_dynamic_property.phpt | 15 +++ .../sensitive_parameter_value_reflection.phpt | 15 +++ .../sensitive_parameter_value_serialize.phpt | 16 +++ .../sensitive_parameter_value_to_string.phpt | 15 +++ ...ensitive_parameter_variadic_arguments.phpt | 65 ++++++++++ Zend/zend_attributes.c | 62 ++++++++++ Zend/zend_attributes.h | 2 + Zend/zend_attributes.stub.php | 23 ++++ Zend/zend_attributes_arginfo.h | 60 ++++++++- Zend/zend_builtin_functions.c | 81 ++++++++++-- 24 files changed, 1113 insertions(+), 10 deletions(-) create mode 100644 Zend/tests/function_arguments/sensitive_parameter.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_closure.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt create mode 100644 Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt diff --git a/UPGRADING b/UPGRADING index b99bb790445c3..159858c997e86 100644 --- a/UPGRADING +++ b/UPGRADING @@ -31,6 +31,11 @@ PHP 8.2 UPGRADE NOTES 2. New Features ======================================== +- Core: + . Added the #\[\SensitiveParameter] attribute to redact sensitive data in + backtraces. + RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces + - Curl: . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective HTTP method in curl_getinfo() return value. diff --git a/Zend/tests/function_arguments/sensitive_parameter.phpt b/Zend/tests/function_arguments/sensitive_parameter.phpt new file mode 100644 index 0000000000000..8a76db6626de0 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter.phpt @@ -0,0 +1,51 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument. +--FILE-- +getTrace()); +} + +test('sensitive'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter.php(10): test(Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter.php" + ["line"]=> + int(10) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter.php" + ["line"]=> + int(10) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt b/Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt new file mode 100644 index 0000000000000..da57bc55e7f46 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_arrow_function.phpt @@ -0,0 +1,28 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument for arrow functions. +--FILE-- + (new Exception)->getTrace(); + +var_dump($test('sensitive')); + +?> +--EXPECTF-- +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_arrow_function.php" + ["line"]=> + int(5) + ["function"]=> + string(9) "{closure}" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_closure.phpt b/Zend/tests/function_arguments/sensitive_parameter_closure.phpt new file mode 100644 index 0000000000000..f2b038ceab953 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_closure.phpt @@ -0,0 +1,51 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument for closures. +--FILE-- +getTrace()); +}; + +$test('sensitive'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_closure.php(10): {closure}(Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_closure.php" + ["line"]=> + int(10) + ["function"]=> + string(9) "{closure}" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_closure.php" + ["line"]=> + int(10) + ["function"]=> + string(9) "{closure}" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt b/Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt new file mode 100644 index 0000000000000..1a6dc97dd2e43 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_correctly_captures_original.phpt @@ -0,0 +1,70 @@ +--TEST-- +The SensitiveParameterValue replacement value correctly captures the original value. +--FILE-- +getMessage(), PHP_EOL; + $testFrame = $e->getTrace()[0]; + var_dump($testFrame['function']); + var_dump(count($testFrame['args'])); + var_dump($testFrame['args'][0]); + assert($testFrame['args'][1] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][1]->getValue()); + var_dump($testFrame['args'][2]); + echo "Success", PHP_EOL; +} + +function test2( + $foo, + #[SensitiveParameter] ...$variadic, +) { + throw new Exception('Error 2'); +} + +try { + test2('foo', 'variadic1', 'variadic2', 'variadic3'); + echo 'Not reached'; +} catch (Exception $e) { + echo $e->getMessage(), PHP_EOL; + $testFrame = $e->getTrace()[0]; + var_dump($testFrame['function']); + var_dump(count($testFrame['args'])); + var_dump($testFrame['args'][0]); + assert($testFrame['args'][1] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][1]->getValue()); + assert($testFrame['args'][2] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][2]->getValue()); + assert($testFrame['args'][3] instanceof SensitiveParameterValue); + var_dump($testFrame['args'][3]->getValue()); + echo "Success", PHP_EOL; +} + +?> +--EXPECTF-- +Error +string(4) "test" +int(3) +string(3) "foo" +string(3) "bar" +string(3) "baz" +Success +Error 2 +string(5) "test2" +int(4) +string(3) "foo" +string(9) "variadic1" +string(9) "variadic2" +string(9) "variadic3" +Success diff --git a/Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt b/Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt new file mode 100644 index 0000000000000..8bb8bc736f477 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_eval_call.phpt @@ -0,0 +1,72 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument in a function called in eval(). +--FILE-- +getTrace()); +} + +eval(<<<'EOT' +test('sensitive'); +EOT); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_eval_call.php(11) : eval()'d code(1): test(Object(SensitiveParameterValue)) +#1 %ssensitive_parameter_eval_call.php(11): eval() +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php(11) : eval()'d code" + ["line"]=> + int(1) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(3) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php" + ["line"]=> + int(11) + ["function"]=> + string(4) "eval" + } +} +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php(11) : eval()'d code" + ["line"]=> + int(1) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(3) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_call.php" + ["line"]=> + int(11) + ["function"]=> + string(4) "eval" + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt b/Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt new file mode 100644 index 0000000000000..29fdbc95a9ca9 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_eval_define.phpt @@ -0,0 +1,53 @@ +--TEST-- +The SensitiveParameter attribute suppresses the single sensitive argument in a function created in eval(). +--FILE-- +getTrace()); +} +EOT); + +test('sensitive'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_eval_define.php(12): test(Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_define.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_eval_define.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(1) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt new file mode 100644 index 0000000000000..823e13f2ea790 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_extra_arguments.phpt @@ -0,0 +1,62 @@ +--TEST-- +The SensitiveParameter attribute does not suppress superfluous arguments if the last parameter is sensitive. +--FILE-- +getTrace()); +} + +test('foo', 'bar', 'baz'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_extra_arguments.php(13): test('foo', Object(SensitiveParameterValue), 'baz') +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_extra_arguments.php" + ["line"]=> + int(13) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + string(3) "baz" + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_extra_arguments.php" + ["line"]=> + int(13) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + string(3) "baz" + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt new file mode 100644 index 0000000000000..f0962d88829f8 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_multiple_arguments.phpt @@ -0,0 +1,65 @@ +--TEST-- +The SensitiveParameter attribute suppresses the correct sensitive arguments. +--FILE-- +getTrace()); +} + +test('sensitive1', 'non_sensitive', 'sensitive2'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_multiple_arguments.php(14): test(Object(SensitiveParameterValue), 'non_sensitive', Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_multiple_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_multiple_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt new file mode 100644 index 0000000000000..24e2268e8d956 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_named_arguments.phpt @@ -0,0 +1,65 @@ +--TEST-- +The SensitiveParameter attribute handles named arguments. +--FILE-- +getTrace()); +} + +test(non_sensitive: 'non_sensitive', sensitive2: 'sensitive2'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_named_arguments.php(14): test(Object(SensitiveParameterValue), 'non_sensitive', Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_named_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_named_arguments.php" + ["line"]=> + int(14) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(13) "non_sensitive" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt b/Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt new file mode 100644 index 0000000000000..6f481b72cbe71 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_nested_calls.phpt @@ -0,0 +1,115 @@ +--TEST-- +The SensitiveParameter attribute handles nested function calls correctly. +--FILE-- +getTrace()); +} + +function wrapper( + $non_sensitive = null, + #[SensitiveParameter] $sensitive1 = null, + #[SensitiveParameter] $sensitive2 = null, +) +{ + test($non_sensitive, $sensitive1, $sensitive2); +} + +wrapper('foo', 'bar', 'baz'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_nested_calls.php(20): test(Object(SensitiveParameterValue), 'bar', Object(SensitiveParameterValue)) +#1 %ssensitive_parameter_nested_calls.php(23): wrapper('foo', Object(SensitiveParameterValue), Object(SensitiveParameterValue)) +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(20) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(3) "bar" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(23) + ["function"]=> + string(7) "wrapper" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(2) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(20) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + string(3) "bar" + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } + [1]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_nested_calls.php" + ["line"]=> + int(23) + ["function"]=> + string(7) "wrapper" + ["args"]=> + array(3) { + [0]=> + string(3) "foo" + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/tests/function_arguments/sensitive_parameter_value.phpt b/Zend/tests/function_arguments/sensitive_parameter_value.phpt new file mode 100644 index 0000000000000..2949b0b18de61 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value.phpt @@ -0,0 +1,43 @@ +--TEST-- +A SensitiveParameterValue keeps the inner value secret. +--FILE-- +getValue()", PHP_EOL; +var_dump($v->getValue()); + +?> +--EXPECTF-- +# var_dump() / debug_zval_dump() +object(SensitiveParameterValue)#%d (0) { +} +object(SensitiveParameterValue)#%d (%d) refcount(%d){ +} + +# var_export() +SensitiveParameterValue::__set_state(array( +)) + +# (array) / json_encode() +array(0) { +} +string(2) "{}" + +# ->getValue() +string(6) "secret" diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt new file mode 100644 index 0000000000000..5170e62ebe3d4 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_clone.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue is clonable. +--FILE-- +getValue()); +var_dump($v2->getValue()); + +?> +--EXPECTF-- +string(6) "secret" +string(6) "secret" diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt new file mode 100644 index 0000000000000..e7b0de51b969e --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_keeps_object_alive.phpt @@ -0,0 +1,74 @@ +--TEST-- +A SensitiveParameterValue keeps inner objects alive. +--FILE-- +id, PHP_EOL; + } + + public function __destruct() + { + echo __METHOD__, " - ", $this->id, PHP_EOL; + } + + public function getId(): int + { + return $this->id; + } +} + +function test(#[SensitiveParameter] CustomDestructor $o, bool $throw) +{ + if ($throw) { + throw new Exception('Error'); + } +} + +function wrapper(int $id, bool $throw) +{ + $o = new CustomDestructor($id); + test($o, $throw); +} + +function main(): SensitiveParameterValue +{ + try { + echo "Before 1", PHP_EOL; + wrapper(1, false); + echo "After 1", PHP_EOL; + echo "Before 2", PHP_EOL; + wrapper(2, true); + echo "Not Reached: After 2", PHP_EOL; + } catch (Exception $e) { + echo "catch", PHP_EOL; + return $e->getTrace()[0]['args'][0]; + } +} + +$v = main(); + +var_dump($v->getValue()->getId()); + +echo "Before unset", PHP_EOL; + +unset($v); + +echo "After unset", PHP_EOL; + +?> +--EXPECT-- +Before 1 +CustomDestructor::__construct - 1 +CustomDestructor::__destruct - 1 +After 1 +Before 2 +CustomDestructor::__construct - 2 +catch +int(2) +Before unset +CustomDestructor::__destruct - 2 +After unset diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt new file mode 100644 index 0000000000000..86cbc2a1ae3e5 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_no_dynamic_property.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue does not allow dynamic properties. +--FILE-- +foo = 'bar'; + +?> +--EXPECTF-- +Fatal error: Uncaught Error: Cannot create dynamic property SensitiveParameterValue::$foo in %ssensitive_parameter_value_no_dynamic_property.php:5 +Stack trace: +#0 {main} + thrown in %ssensitive_parameter_value_no_dynamic_property.php on line 5 diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt new file mode 100644 index 0000000000000..020cbef38d269 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_reflection.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue's value is accessible using reflection. +--FILE-- +getProperty('value'); + +var_dump($p->getValue($v)); + +?> +--EXPECTF-- +string(6) "secret" diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt new file mode 100644 index 0000000000000..79a2e359cd8cb --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_serialize.phpt @@ -0,0 +1,16 @@ +--TEST-- +A SensitiveParameterValue may not be serialized. +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Exception: Serialization of 'SensitiveParameterValue' is not allowed in %ssensitive_parameter_value_serialize.php:5 +Stack trace: +#0 %ssensitive_parameter_value_serialize.php(5): serialize(Object(SensitiveParameterValue)) +#1 {main} + thrown in %ssensitive_parameter_value_serialize.php on line 5 diff --git a/Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt b/Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt new file mode 100644 index 0000000000000..5945259224ab8 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_value_to_string.phpt @@ -0,0 +1,15 @@ +--TEST-- +A SensitiveParameterValue may not be converted to a string. +--FILE-- + +--EXPECTF-- +Fatal error: Uncaught Error: Object of class SensitiveParameterValue could not be converted to string in %ssensitive_parameter_value_to_string.php:5 +Stack trace: +#0 {main} + thrown in %ssensitive_parameter_value_to_string.php on line 5 diff --git a/Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt b/Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt new file mode 100644 index 0000000000000..3d9bf20a978c2 --- /dev/null +++ b/Zend/tests/function_arguments/sensitive_parameter_variadic_arguments.phpt @@ -0,0 +1,65 @@ +--TEST-- +The SensitiveParameter attribute suppresses all variadic arguments. +--FILE-- +getTrace()); +} + +test('foo', 'bar', 'baz'); + +?> +--EXPECTF-- +#0 %ssensitive_parameter_variadic_arguments.php(12): test(Object(SensitiveParameterValue), Object(SensitiveParameterValue), Object(SensitiveParameterValue)) +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_variadic_arguments.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} +array(1) { + [0]=> + array(4) { + ["file"]=> + string(%d) "%ssensitive_parameter_variadic_arguments.php" + ["line"]=> + int(12) + ["function"]=> + string(4) "test" + ["args"]=> + array(3) { + [0]=> + object(SensitiveParameterValue)#%d (0) { + } + [1]=> + object(SensitiveParameterValue)#%d (0) { + } + [2]=> + object(SensitiveParameterValue)#%d (0) { + } + } + } +} diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index 0d27d1bcaa216..9f7b8f01448b5 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -21,11 +21,16 @@ #include "zend_API.h" #include "zend_attributes.h" #include "zend_attributes_arginfo.h" +#include "zend_exceptions.h" #include "zend_smart_str.h" ZEND_API zend_class_entry *zend_ce_attribute; ZEND_API zend_class_entry *zend_ce_return_type_will_change_attribute; ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties; +ZEND_API zend_class_entry *zend_ce_sensitive_parameter; +ZEND_API zend_class_entry *zend_ce_sensitive_parameter_value; + +static zend_object_handlers attributes_object_handlers_sensitive_parameter_value; static HashTable internal_attributes; @@ -91,6 +96,53 @@ ZEND_METHOD(AllowDynamicProperties, __construct) ZEND_PARSE_PARAMETERS_NONE(); } +ZEND_METHOD(SensitiveParameter, __construct) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + +ZEND_METHOD(SensitiveParameterValue, __construct) +{ + zval *value; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ZVAL(value) + ZEND_PARSE_PARAMETERS_END(); + + ZVAL_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), value); +} + +ZEND_METHOD(SensitiveParameterValue, getValue) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + ZVAL_COPY(return_value, OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0)); +} + +ZEND_METHOD(SensitiveParameterValue, __debugInfo) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + RETURN_EMPTY_ARRAY(); +} + +static zend_object *attributes_sensitive_parameter_value_new(zend_class_entry *ce) +{ + zend_object *object; + + object = zend_objects_new(ce); + object->handlers = &attributes_object_handlers_sensitive_parameter_value; + + object_properties_init(object, ce); + + return object; +} + +static HashTable *attributes_sensitive_parameter_value_get_properties_for(zend_object *zobj, zend_prop_purpose purpose) +{ + return NULL; +} + static zend_attribute *get_attribute(HashTable *attributes, zend_string *lcname, uint32_t offset) { if (attributes) { @@ -313,6 +365,16 @@ void zend_register_attribute_ce(void) zend_ce_allow_dynamic_properties = register_class_AllowDynamicProperties(); attr = zend_internal_attribute_register(zend_ce_allow_dynamic_properties, ZEND_ATTRIBUTE_TARGET_CLASS); attr->validator = validate_allow_dynamic_properties; + + zend_ce_sensitive_parameter = register_class_SensitiveParameter(); + attr = zend_internal_attribute_register(zend_ce_sensitive_parameter, ZEND_ATTRIBUTE_TARGET_PARAMETER); + + memcpy(&attributes_object_handlers_sensitive_parameter_value, &std_object_handlers, sizeof(zend_object_handlers)); + attributes_object_handlers_sensitive_parameter_value.get_properties_for = attributes_sensitive_parameter_value_get_properties_for; + + /* This is not an actual attribute, thus the zend_internal_attribute_register() call is missing. */ + zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue(); + zend_ce_sensitive_parameter_value->create_object = attributes_sensitive_parameter_value_new; } void zend_attributes_shutdown(void) diff --git a/Zend/zend_attributes.h b/Zend/zend_attributes.h index a55dc562450d2..7b6c919527d34 100644 --- a/Zend/zend_attributes.h +++ b/Zend/zend_attributes.h @@ -41,6 +41,8 @@ BEGIN_EXTERN_C() extern ZEND_API zend_class_entry *zend_ce_attribute; extern ZEND_API zend_class_entry *zend_ce_allow_dynamic_properties; +extern ZEND_API zend_class_entry *zend_ce_sensitive_parameter; +extern ZEND_API zend_class_entry *zend_ce_sensitive_parameter_value; typedef struct { zend_string *name; diff --git a/Zend/zend_attributes.stub.php b/Zend/zend_attributes.stub.php index 0469016704b16..842ed9229cd6e 100644 --- a/Zend/zend_attributes.stub.php +++ b/Zend/zend_attributes.stub.php @@ -18,3 +18,26 @@ final class AllowDynamicProperties { public function __construct() {} } + +/** + * @strict-properties + */ +final class SensitiveParameter +{ + public function __construct() {} +} + +/** + * @strict-properties + * @not-serializable + */ +final class SensitiveParameterValue +{ + private readonly mixed $value; + + public function __construct(mixed $value) {} + + public function getValue(): mixed {} + + public function __debugInfo(): array {} +} diff --git a/Zend/zend_attributes_arginfo.h b/Zend/zend_attributes_arginfo.h index 657ab924c745a..7c624949bf24b 100644 --- a/Zend/zend_attributes_arginfo.h +++ b/Zend/zend_attributes_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 024e849a9dfa8789f13dd1d2ac222a48e4b017f1 */ + * Stub hash: 5d9a092c1f0da5f32d9a161cc5166ed794ffe8e9 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Attribute___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "Attribute::TARGET_ALL") @@ -10,10 +10,26 @@ ZEND_END_ARG_INFO() #define arginfo_class_AllowDynamicProperties___construct arginfo_class_ReturnTypeWillChange___construct +#define arginfo_class_SensitiveParameter___construct arginfo_class_ReturnTypeWillChange___construct + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SensitiveParameterValue___construct, 0, 0, 1) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SensitiveParameterValue_getValue, 0, 0, IS_MIXED, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SensitiveParameterValue___debugInfo, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + ZEND_METHOD(Attribute, __construct); ZEND_METHOD(ReturnTypeWillChange, __construct); ZEND_METHOD(AllowDynamicProperties, __construct); +ZEND_METHOD(SensitiveParameter, __construct); +ZEND_METHOD(SensitiveParameterValue, __construct); +ZEND_METHOD(SensitiveParameterValue, getValue); +ZEND_METHOD(SensitiveParameterValue, __debugInfo); static const zend_function_entry class_Attribute_methods[] = { @@ -33,6 +49,20 @@ static const zend_function_entry class_AllowDynamicProperties_methods[] = { ZEND_FE_END }; + +static const zend_function_entry class_SensitiveParameter_methods[] = { + ZEND_ME(SensitiveParameter, __construct, arginfo_class_SensitiveParameter___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + + +static const zend_function_entry class_SensitiveParameterValue_methods[] = { + ZEND_ME(SensitiveParameterValue, __construct, arginfo_class_SensitiveParameterValue___construct, ZEND_ACC_PUBLIC) + ZEND_ME(SensitiveParameterValue, getValue, arginfo_class_SensitiveParameterValue_getValue, ZEND_ACC_PUBLIC) + ZEND_ME(SensitiveParameterValue, __debugInfo, arginfo_class_SensitiveParameterValue___debugInfo, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + static zend_class_entry *register_class_Attribute(void) { zend_class_entry ce, *class_entry; @@ -71,3 +101,31 @@ static zend_class_entry *register_class_AllowDynamicProperties(void) return class_entry; } + +static zend_class_entry *register_class_SensitiveParameter(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SensitiveParameter", class_SensitiveParameter_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES; + + return class_entry; +} + +static zend_class_entry *register_class_SensitiveParameterValue(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "SensitiveParameterValue", class_SensitiveParameterValue_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES|ZEND_ACC_NOT_SERIALIZABLE; + + 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); + + return class_entry; +} diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 529ade072aa24..963332e0f7ed8 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -24,6 +24,7 @@ #include "zend_builtin_functions.h" #include "zend_constants.h" #include "zend_ini.h" +#include "zend_interfaces.h" #include "zend_exceptions.h" #include "zend_extensions.h" #include "zend_closures.h" @@ -1557,27 +1558,66 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / */ while (i < first_extra_arg) { zend_string *arg_name = call->func->op_array.vars[i]; + zval original_arg; zval *arg = zend_hash_find_ex_ind(call->symbol_table, arg_name, 1); + zend_attribute *attribute = zend_get_parameter_attribute_str( + call->func->common.attributes, + "sensitiveparameter", + sizeof("sensitiveparameter") - 1, + i + ); + + bool is_sensitive = attribute != NULL; + if (arg) { ZVAL_DEREF(arg); - Z_TRY_ADDREF_P(arg); - ZEND_HASH_FILL_SET(arg); + ZVAL_COPY_VALUE(&original_arg, arg); + } else { + ZVAL_NULL(&original_arg); + } + + if (is_sensitive) { + zval redacted_arg; + object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value); + zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, &original_arg); + ZEND_HASH_FILL_SET(&redacted_arg); } else { - ZEND_HASH_FILL_SET_NULL(); + Z_TRY_ADDREF_P(&original_arg); + ZEND_HASH_FILL_SET(&original_arg); } + ZEND_HASH_FILL_NEXT(); i++; } } else { while (i < first_extra_arg) { + zval original_arg; + zend_attribute *attribute = zend_get_parameter_attribute_str( + call->func->common.attributes, + "sensitiveparameter", + sizeof("sensitiveparameter") - 1, + i + ); + bool is_sensitive = attribute != NULL; + if (EXPECTED(Z_TYPE_INFO_P(p) != IS_UNDEF)) { zval *arg = p; ZVAL_DEREF(arg); - Z_TRY_ADDREF_P(arg); - ZEND_HASH_FILL_SET(arg); + ZVAL_COPY_VALUE(&original_arg, arg); + } else { + ZVAL_NULL(&original_arg); + } + + if (is_sensitive) { + zval redacted_arg; + object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value); + zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, &original_arg); + ZEND_HASH_FILL_SET(&redacted_arg); } else { - ZEND_HASH_FILL_SET_NULL(); + Z_TRY_ADDREF_P(&original_arg); + ZEND_HASH_FILL_SET(&original_arg); } + ZEND_HASH_FILL_NEXT(); p++; i++; @@ -1587,14 +1627,37 @@ static void debug_backtrace_get_args(zend_execute_data *call, zval *arg_array) / } while (i < num_args) { + zval original_arg; + bool is_sensitive = 0; + + if (i < call->func->common.num_args || call->func->common.fn_flags & ZEND_ACC_VARIADIC) { + zend_attribute *attribute = zend_get_parameter_attribute_str( + call->func->common.attributes, + "sensitiveparameter", + sizeof("sensitiveparameter") - 1, + MIN(i, call->func->common.num_args) + ); + is_sensitive = attribute != NULL; + } + if (EXPECTED(Z_TYPE_INFO_P(p) != IS_UNDEF)) { zval *arg = p; ZVAL_DEREF(arg); - Z_TRY_ADDREF_P(arg); - ZEND_HASH_FILL_SET(arg); + ZVAL_COPY_VALUE(&original_arg, arg); } else { - ZEND_HASH_FILL_SET_NULL(); + ZVAL_NULL(&original_arg); } + + if (is_sensitive) { + zval redacted_arg; + object_init_ex(&redacted_arg, zend_ce_sensitive_parameter_value); + zend_call_method_with_1_params(Z_OBJ_P(&redacted_arg), zend_ce_sensitive_parameter_value, &zend_ce_sensitive_parameter_value->constructor, "__construct", NULL, &original_arg); + ZEND_HASH_FILL_SET(&redacted_arg); + } else { + Z_TRY_ADDREF_P(&original_arg); + ZEND_HASH_FILL_SET(&original_arg); + } + ZEND_HASH_FILL_NEXT(); p++; i++; From 72fb511d0c30bbd7925c0efd3cbe49cb1d5baf98 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 1 Apr 2022 17:11:33 +0200 Subject: [PATCH 0422/1346] Stop including php_pcre.h from spl_iterators.h This fixes GH-7774. spl_iterators.h was including php_pcre.h so that one object intern struct could reference a pcre_cache_entry. These object interns should not be public, so they can be moved out of the header file. This change moves the object interns ouf of spl_iterators.h so that php_pcre.h doesn't need to be included from there. --- ext/spl/spl_iterators.c | 54 +++++++++++++++++++++++++++++++++++++++++ ext/spl/spl_iterators.h | 54 ----------------------------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 3b1da6d98c536..217f3aa19c038 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -23,6 +23,7 @@ #include "ext/standard/info.h" #include "zend_exceptions.h" #include "zend_interfaces.h" +#include "ext/pcre/php_pcre.h" #include "php_spl.h" #include "spl_functions.h" @@ -113,6 +114,53 @@ typedef struct _spl_recursive_it_iterator { zend_object_iterator intern; } spl_recursive_it_iterator; +typedef struct _spl_cbfilter_it_intern { + zend_fcall_info fci; + zend_fcall_info_cache fcc; + zend_object *object; +} _spl_cbfilter_it_intern; + +typedef struct _spl_dual_it_object { + struct { + zval zobject; + zend_class_entry *ce; + zend_object *object; + zend_object_iterator *iterator; + } inner; + struct { + zval data; + zval key; + zend_long pos; + } current; + dual_it_type dit_type; + union { + struct { + zend_long offset; + zend_long count; + } limit; + struct { + zend_long flags; /* CIT_* */ + zend_string *zstr; + zval zchildren; + zval zcache; + } caching; + struct { + zval zarrayit; + zend_object_iterator *iterator; + } append; + struct { + zend_long flags; + zend_long preg_flags; + pcre_cache_entry *pce; + zend_string *regex; + regex_mode mode; + int use_flags; + } regex; + _spl_cbfilter_it_intern *cbfilter; + } u; + zend_object std; +} spl_dual_it_object; + static zend_object_handlers spl_handlers_rec_it_it; static zend_object_handlers spl_handlers_dual_it; @@ -123,6 +171,12 @@ static inline spl_recursive_it_object *spl_recursive_it_from_obj(zend_object *ob #define Z_SPLRECURSIVE_IT_P(zv) spl_recursive_it_from_obj(Z_OBJ_P((zv))) +static inline spl_dual_it_object *spl_dual_it_from_obj(zend_object *obj) /* {{{ */ { + return (spl_dual_it_object*)((char*)(obj) - XtOffsetOf(spl_dual_it_object, std)); +} /* }}} */ + +#define Z_SPLDUAL_IT_P(zv) spl_dual_it_from_obj(Z_OBJ_P((zv))) + #define SPL_FETCH_AND_CHECK_DUAL_IT(var, objzval) \ do { \ spl_dual_it_object *it = Z_SPLDUAL_IT_P(objzval); \ diff --git a/ext/spl/spl_iterators.h b/ext/spl/spl_iterators.h index 1f42201b769cf..61e899de34f2b 100644 --- a/ext/spl/spl_iterators.h +++ b/ext/spl/spl_iterators.h @@ -19,7 +19,6 @@ #include "php.h" #include "php_spl.h" -#include "ext/pcre/php_pcre.h" extern PHPAPI zend_class_entry *spl_ce_AppendIterator; extern PHPAPI zend_class_entry *spl_ce_CachingIterator; @@ -99,59 +98,6 @@ typedef enum { REGIT_MODE_MAX } regex_mode; -typedef struct _spl_cbfilter_it_intern { - zend_fcall_info fci; - zend_fcall_info_cache fcc; - zend_object *object; -} _spl_cbfilter_it_intern; - -typedef struct _spl_dual_it_object { - struct { - zval zobject; - zend_class_entry *ce; - zend_object *object; - zend_object_iterator *iterator; - } inner; - struct { - zval data; - zval key; - zend_long pos; - } current; - dual_it_type dit_type; - union { - struct { - zend_long offset; - zend_long count; - } limit; - struct { - zend_long flags; /* CIT_* */ - zend_string *zstr; - zval zchildren; - zval zcache; - } caching; - struct { - zval zarrayit; - zend_object_iterator *iterator; - } append; - struct { - zend_long flags; - zend_long preg_flags; - pcre_cache_entry *pce; - zend_string *regex; - regex_mode mode; - int use_flags; - } regex; - _spl_cbfilter_it_intern *cbfilter; - } u; - zend_object std; -} spl_dual_it_object; - -static inline spl_dual_it_object *spl_dual_it_from_obj(zend_object *obj) /* {{{ */ { - return (spl_dual_it_object*)((char*)(obj) - XtOffsetOf(spl_dual_it_object, std)); -} /* }}} */ - -#define Z_SPLDUAL_IT_P(zv) spl_dual_it_from_obj(Z_OBJ_P((zv))) - typedef int (*spl_iterator_apply_func_t)(zend_object_iterator *iter, void *puser); PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser); From cdf7240f7547b093aaee52e4fd0a2336f77e3374 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Fri, 8 Apr 2022 11:00:28 +0200 Subject: [PATCH 0423/1346] [skip ci] Remove superfluous backslash in UPGRADING --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index 159858c997e86..2d76009808b07 100644 --- a/UPGRADING +++ b/UPGRADING @@ -32,7 +32,7 @@ PHP 8.2 UPGRADE NOTES ======================================== - Core: - . Added the #\[\SensitiveParameter] attribute to redact sensitive data in + . Added the #[\SensitiveParameter] attribute to redact sensitive data in backtraces. RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces From 7bb2a9ff38b739d2143134b6ce0d9cc3dd9b78fe Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 12 Nov 2021 18:38:55 +0000 Subject: [PATCH 0424/1346] Add extra check for FPM proc dumpable on SELinux based systems The deny_ptrace is a OS runtime setting and is off by default, at least on workstations flavors (fedora) however it might be different on production servers. --- NEWS | 2 ++ sapi/fpm/config.m4 | 14 ++++++++++++++ sapi/fpm/fpm/fpm_unix.c | 17 +++++++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 906b9c1fa5c4d..4178005c7b733 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,8 @@ PHP NEWS - FPM: . Emit error for invalid port setting. (David Carlier) + . Added extra check for FPM proc dumpable on SELinux based systems. + (David Carlier) - Intl: . Update all grandfathered language tags with preferred values diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index e2e4d3660be42..4e3815ffc2543 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -563,6 +563,12 @@ if test "$PHP_FPM" != "no"; then [no], [no]) + PHP_ARG_WITH([fpm-selinux],, + [AS_HELP_STRING([--with-fpm-selinux], + [Support SELinux policy library])], + [no], + [no]) + if test "$PHP_FPM_SYSTEMD" != "no" ; then PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 209]) @@ -605,6 +611,14 @@ if test "$PHP_FPM" != "no"; then ]) fi + if test "x$PHP_FPM_SELINUX" != "xno" ; then + AC_CHECK_HEADERS([selinux/selinux.h]) + AC_CHECK_LIB(selinux, security_setenforce, [ + PHP_ADD_LIBRARY(selinux) + AC_DEFINE(HAVE_SELINUX, 1, [ SElinux available ]) + ],[]) + fi + PHP_SUBST_OLD(php_fpm_systemd) AC_DEFINE_UNQUOTED(PHP_FPM_SYSTEMD, "$php_fpm_systemd", [fpm systemd service type]) diff --git a/sapi/fpm/fpm/fpm_unix.c b/sapi/fpm/fpm/fpm_unix.c index 2f6eef339c493..9c94fa1eae038 100644 --- a/sapi/fpm/fpm/fpm_unix.c +++ b/sapi/fpm/fpm/fpm_unix.c @@ -31,6 +31,10 @@ #include #endif +#ifdef HAVE_SELINUX +#include +#endif + #include "fpm.h" #include "fpm_conf.h" #include "fpm_cleanup.h" @@ -412,8 +416,17 @@ int fpm_unix_init_child(struct fpm_worker_pool_s *wp) /* {{{ */ } #ifdef HAVE_PRCTL - if (wp->config->process_dumpable && 0 > prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)) { - zlog(ZLOG_SYSERROR, "[pool %s] failed to prctl(PR_SET_DUMPABLE)", wp->config->name); + if (wp->config->process_dumpable) { + int dumpable = 1; +#ifdef HAVE_SELINUX + if (security_get_boolean_active("deny_ptrace") == 1) { + zlog(ZLOG_SYSERROR, "[pool %s] ptrace is denied", wp->config->name); + dumpable = 0; + } +#endif + if (dumpable && 0 > prctl(PR_SET_DUMPABLE, 1, 0, 0, 0)) { + zlog(ZLOG_SYSERROR, "[pool %s] failed to prctl(PR_SET_DUMPABLE)", wp->config->name); + } } #endif From 6039c07a3afd64a42c9b9f1ed994ca971db67a1e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 8 Apr 2022 17:23:52 +0100 Subject: [PATCH 0425/1346] Allow ``null`` and ``false`` as standalone types (#7546) RFC: https://wiki.php.net/rfc/null-standalone-type Also a drive-by consistency fix for error messages. --- .../type_declarations/standalone_null.phpt | 14 +++++++++ .../typed_properties_110.phpt | 20 +++++++++++++ .../typed_properties_111.phpt | 20 +++++++++++++ ...typed_return_null_false_without_value.phpt | 14 +++++++++ .../typed_return_null_without_value.phpt | 14 +++++++++ .../union_types/null_false_union.phpt | 12 ++++++++ .../redundant_types/nullable_null.phpt | 2 +- .../union_types/standalone_false.phpt | 7 +++-- ...standalone_false_implicit_nullability.phpt | 11 +++++++ .../union_types/standalone_null.phpt | 7 +++-- .../standalone_nullable_false.phpt | 7 +++-- Zend/zend_compile.c | 30 ++++++++----------- ext/reflection/php_reflection.c | 3 +- .../tests/ReflectionType_possible_types.phpt | 4 +++ ext/reflection/tests/union_types.phpt | 19 ++++++++++++ 15 files changed, 156 insertions(+), 28 deletions(-) create mode 100644 Zend/tests/type_declarations/standalone_null.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_110.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_111.phpt create mode 100644 Zend/tests/type_declarations/typed_return_null_false_without_value.phpt create mode 100644 Zend/tests/type_declarations/typed_return_null_without_value.phpt create mode 100644 Zend/tests/type_declarations/union_types/null_false_union.phpt create mode 100644 Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt diff --git a/Zend/tests/type_declarations/standalone_null.phpt b/Zend/tests/type_declarations/standalone_null.phpt new file mode 100644 index 0000000000000..d96a1f471e483 --- /dev/null +++ b/Zend/tests/type_declarations/standalone_null.phpt @@ -0,0 +1,14 @@ +--TEST-- +Null can be used as a standalone type +--FILE-- + +--EXPECT-- +NULL diff --git a/Zend/tests/type_declarations/typed_properties_110.phpt b/Zend/tests/type_declarations/typed_properties_110.phpt new file mode 100644 index 0000000000000..6a108b4529c66 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_110.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties allow null +--FILE-- +value = null; + +try { + $foo->value = 1; +} catch (\TypeError $e) { + echo $e->getMessage(); +} + +?> +--EXPECT-- +Cannot assign int to property Foo::$value of type null diff --git a/Zend/tests/type_declarations/typed_properties_111.phpt b/Zend/tests/type_declarations/typed_properties_111.phpt new file mode 100644 index 0000000000000..c23fb72e5d657 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_111.phpt @@ -0,0 +1,20 @@ +--TEST-- +Test typed properties allow false +--FILE-- +value = false; + +try { + $foo->value = true; +} catch (\TypeError $e) { + echo $e->getMessage(); +} + +?> +--EXPECT-- +Cannot assign bool to property Foo::$value of type false diff --git a/Zend/tests/type_declarations/typed_return_null_false_without_value.phpt b/Zend/tests/type_declarations/typed_return_null_false_without_value.phpt new file mode 100644 index 0000000000000..ae785c9a126d3 --- /dev/null +++ b/Zend/tests/type_declarations/typed_return_null_false_without_value.phpt @@ -0,0 +1,14 @@ +--TEST-- +Typed null|false return without value generates compile-time error +--FILE-- + +--EXPECTF-- +Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) in %s on line %d diff --git a/Zend/tests/type_declarations/typed_return_null_without_value.phpt b/Zend/tests/type_declarations/typed_return_null_without_value.phpt new file mode 100644 index 0000000000000..9152622a4a338 --- /dev/null +++ b/Zend/tests/type_declarations/typed_return_null_without_value.phpt @@ -0,0 +1,14 @@ +--TEST-- +Typed null return without value generates compile-time error +--FILE-- + +--EXPECTF-- +Fatal error: A function with return type must return a value (did you mean "return null;" instead of "return;"?) in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/null_false_union.phpt b/Zend/tests/type_declarations/union_types/null_false_union.phpt new file mode 100644 index 0000000000000..1cf6b46066189 --- /dev/null +++ b/Zend/tests/type_declarations/union_types/null_false_union.phpt @@ -0,0 +1,12 @@ +--TEST-- +Null and false can be used in a union type +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt b/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt index 0e0e915bdd223..9c35978576237 100644 --- a/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt +++ b/Zend/tests/type_declarations/union_types/redundant_types/nullable_null.phpt @@ -8,4 +8,4 @@ function test(): ?null { ?> --EXPECTF-- -Fatal error: Null cannot be used as a standalone type in %s on line %d +Fatal error: null cannot be marked as nullable in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/standalone_false.phpt b/Zend/tests/type_declarations/union_types/standalone_false.phpt index 76d8c9b7a1ede..1a31e23d22988 100644 --- a/Zend/tests/type_declarations/union_types/standalone_false.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_false.phpt @@ -1,10 +1,11 @@ --TEST-- -False cannot be used as a standalone type +False can be used as a standalone type --FILE-- ---EXPECTF-- -Fatal error: False cannot be used as a standalone type in %s on line %d +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt b/Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt new file mode 100644 index 0000000000000..3baac82f7e905 --- /dev/null +++ b/Zend/tests/type_declarations/union_types/standalone_false_implicit_nullability.phpt @@ -0,0 +1,11 @@ +--TEST-- +False can be used as a standalone type even with implicit nullability +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/standalone_null.phpt b/Zend/tests/type_declarations/union_types/standalone_null.phpt index d66f27c117a75..a18375d68cb4e 100644 --- a/Zend/tests/type_declarations/union_types/standalone_null.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_null.phpt @@ -1,10 +1,11 @@ --TEST-- -Null cannot be used as a standalone type +Null can be used as a standalone type --FILE-- ---EXPECTF-- -Fatal error: Null cannot be used as a standalone type in %s on line %d +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt b/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt index aa1bf34db1eb9..b4a3f88451ae0 100644 --- a/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt +++ b/Zend/tests/type_declarations/union_types/standalone_nullable_false.phpt @@ -1,10 +1,11 @@ --TEST-- -Nullable false cannot be used as a standalone type +Nullable false can be used as a standalone type --FILE-- ---EXPECTF-- -Fatal error: False cannot be used as a standalone type in %s on line %d +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index cfe44d3f3766f..444dee5b0d7d4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6186,11 +6186,11 @@ static bool zend_type_contains_traversable(zend_type type) { static zend_type zend_compile_typename( zend_ast *ast, bool force_allow_null) /* {{{ */ { - bool allow_null = force_allow_null; + bool is_marked_nullable = ast->attr & ZEND_TYPE_NULLABLE; zend_ast_attr orig_ast_attr = ast->attr; zend_type type = ZEND_TYPE_INIT_NONE(0); - if (ast->attr & ZEND_TYPE_NULLABLE) { - allow_null = 1; + + if (is_marked_nullable) { ast->attr &= ~ZEND_TYPE_NULLABLE; } @@ -6314,10 +6314,6 @@ static zend_type zend_compile_typename( type = zend_compile_single_typename(ast); } - if (allow_null) { - ZEND_TYPE_FULL_MASK(type) |= MAY_BE_NULL; - } - uint32_t type_mask = ZEND_TYPE_PURE_MASK(type); if ((type_mask & (MAY_BE_ARRAY|MAY_BE_ITERABLE)) == (MAY_BE_ARRAY|MAY_BE_ITERABLE)) { zend_string *type_str = zend_type_to_string(type); @@ -6332,7 +6328,7 @@ static zend_type zend_compile_typename( ZSTR_VAL(type_str)); } - if (type_mask == MAY_BE_ANY && (orig_ast_attr & ZEND_TYPE_NULLABLE)) { + if (type_mask == MAY_BE_ANY && is_marked_nullable) { zend_error_noreturn(E_COMPILE_ERROR, "Type mixed cannot be marked as nullable since mixed already includes null"); } @@ -6343,6 +6339,15 @@ static zend_type zend_compile_typename( ZSTR_VAL(type_str)); } + if ((type_mask & MAY_BE_NULL) && is_marked_nullable) { + zend_error_noreturn(E_COMPILE_ERROR, "null cannot be marked as nullable"); + } + + if (is_marked_nullable || force_allow_null) { + ZEND_TYPE_FULL_MASK(type) |= MAY_BE_NULL; + type_mask = ZEND_TYPE_PURE_MASK(type); + } + if ((type_mask & MAY_BE_VOID) && (ZEND_TYPE_IS_COMPLEX(type) || type_mask != MAY_BE_VOID)) { zend_error_noreturn(E_COMPILE_ERROR, "Void can only be used as a standalone type"); } @@ -6351,15 +6356,6 @@ static zend_type zend_compile_typename( zend_error_noreturn(E_COMPILE_ERROR, "never can only be used as a standalone type"); } - if ((type_mask & (MAY_BE_NULL|MAY_BE_FALSE)) - && !ZEND_TYPE_IS_COMPLEX(type) && !(type_mask & ~(MAY_BE_NULL|MAY_BE_FALSE))) { - if (type_mask == MAY_BE_NULL) { - zend_error_noreturn(E_COMPILE_ERROR, "Null cannot be used as a standalone type"); - } else { - zend_error_noreturn(E_COMPILE_ERROR, "False cannot be used as a standalone type"); - } - } - ast->attr = orig_ast_attr; return type; } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 84ef8bdfbb450..4f30cc2fca700 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1356,6 +1356,7 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be type_reference *reference; reflection_type_kind type_kind = get_type_kind(type); bool is_mixed = ZEND_TYPE_PURE_MASK(type) == MAY_BE_ANY; + bool is_only_null = (ZEND_TYPE_PURE_MASK(type) == MAY_BE_NULL && !ZEND_TYPE_IS_COMPLEX(type)); switch (type_kind) { case INTERSECTION_TYPE: @@ -1373,7 +1374,7 @@ static void reflection_type_factory(zend_type type, zval *object, bool legacy_be intern = Z_REFLECTION_P(object); reference = (type_reference*) emalloc(sizeof(type_reference)); reference->type = type; - reference->legacy_behavior = legacy_behavior && type_kind == NAMED_TYPE && !is_mixed; + reference->legacy_behavior = legacy_behavior && type_kind == NAMED_TYPE && !is_mixed && !is_only_null; intern->ptr = reference; intern->ref_type = REF_TYPE_TYPE; diff --git a/ext/reflection/tests/ReflectionType_possible_types.phpt b/ext/reflection/tests/ReflectionType_possible_types.phpt index ccb87254663d3..dd6d39300b590 100644 --- a/ext/reflection/tests/ReflectionType_possible_types.phpt +++ b/ext/reflection/tests/ReflectionType_possible_types.phpt @@ -12,6 +12,8 @@ $functions = [ function(): array {}, function(): callable {}, function(): iterable {}, + function(): null {}, + function(): false {}, function(): StdClass {} ]; @@ -30,4 +32,6 @@ string(4) "bool" string(5) "array" string(8) "callable" string(8) "iterable" +string(4) "null" +string(5) "false" string(8) "StdClass" diff --git a/ext/reflection/tests/union_types.phpt b/ext/reflection/tests/union_types.phpt index 8dbbbdab854a3..a3ac53b54ab29 100644 --- a/ext/reflection/tests/union_types.phpt +++ b/ext/reflection/tests/union_types.phpt @@ -13,8 +13,17 @@ function dumpType(ReflectionUnionType $rt) { } } +function dumpBCType(ReflectionNamedType $rt) { + echo "Type $rt:\n"; + echo " Name: " . $rt->getName() . "\n"; + echo " String: " . (string) $rt . "\n"; + echo " Allows Null: " . ($rt->allowsNull() ? "true" : "false") . "\n"; +} + function test1(): X|Y|int|float|false|null { } function test2(): X|iterable|bool { } +function test3(): null|false { } +function test4(): ?false { } class Test { public X|Y|int $prop; @@ -22,6 +31,8 @@ class Test { dumpType((new ReflectionFunction('test1'))->getReturnType()); dumpType((new ReflectionFunction('test2'))->getReturnType()); +dumpBCType((new ReflectionFunction('test3'))->getReturnType()); +dumpBCType((new ReflectionFunction('test4'))->getReturnType()); $rc = new ReflectionClass(Test::class); $rp = $rc->getProperty('prop'); @@ -75,6 +86,14 @@ Allows null: false Name: bool String: bool Allows Null: false +Type ?false: + Name: false + String: ?false + Allows Null: true +Type ?false: + Name: false + String: ?false + Allows Null: true Type X|Y|int: Allows null: false Name: X From 3931d726c436e2f72184cbe1ad315d4cc46bb20a Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 8 Apr 2022 17:58:10 +0100 Subject: [PATCH 0426/1346] Add missing ZPP checks in SPL Directory (#8325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Máté Kocsis --- UPGRADING | 9 +++++++++ ext/spl/spl_directory.c | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/UPGRADING b/UPGRADING index 2d76009808b07..12cffeb9127e5 100644 --- a/UPGRADING +++ b/UPGRADING @@ -27,6 +27,15 @@ PHP 8.2 UPGRADE NOTES array_change_key_case and sorting with SORT_FLAG_CASE use ASCII case conversion. +- SPL: + . The following methods now enforce their signature: + * SplFileInfo::_bad_state_ex() + * SplFileObject::getCsvControl() + * SplFileObject::fflush() + * SplFileObject::ftell() + * SplFileObject::fgetc() + * SplFileObject::fpassthru() + ======================================== 2. New Features ======================================== diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index f3d4fa2b92f7a..396440aeab57c 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -1399,6 +1399,9 @@ PHP_METHOD(SplFileInfo, __debugInfo) /* {{{ */ PHP_METHOD(SplFileInfo, _bad_state_ex) { + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } zend_throw_error(NULL, "The parent constructor was not called: the object is in an invalid state"); } /* }}} */ @@ -2476,6 +2479,10 @@ PHP_METHOD(SplFileObject, getCsvControl) spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); char delimiter[2], enclosure[2], escape[2]; + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + array_init(return_value); delimiter[0] = intern->u.file.delimiter; @@ -2517,6 +2524,10 @@ PHP_METHOD(SplFileObject, fflush) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); RETURN_BOOL(!php_stream_flush(intern->u.file.stream)); @@ -2528,6 +2539,10 @@ PHP_METHOD(SplFileObject, ftell) spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); zend_long ret; + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); ret = php_stream_tell(intern->u.file.stream); @@ -2562,6 +2577,10 @@ PHP_METHOD(SplFileObject, fgetc) char buf[2]; int result; + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); spl_filesystem_file_free_line(intern); @@ -2585,6 +2604,10 @@ PHP_METHOD(SplFileObject, fpassthru) { spl_filesystem_object *intern = Z_SPLFILESYSTEM_P(ZEND_THIS); + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); RETURN_LONG(php_stream_passthru(intern->u.file.stream)); From 2ac5948f5cbaf3351fe18ab1068422487c9c215f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 8 Apr 2022 20:16:26 +0100 Subject: [PATCH 0427/1346] Refactor SplFileObject CSV methods (#8317) Use early returns, which fixes ValueError order of arguments and flattens the code --- ext/spl/spl_directory.c | 171 ++++++++---------- .../SplFileObject_fputcsv_variation14.phpt | 6 + 2 files changed, 84 insertions(+), 93 deletions(-) diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 396440aeab57c..8e89b86048750 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2331,35 +2331,32 @@ PHP_METHOD(SplFileObject, fgetcsv) CHECK_SPL_FILE_OBJECT_IS_INITIALIZED(intern); - switch (ZEND_NUM_ARGS()) { - case 3: - if (esc_len > 1) { - zend_argument_value_error(3, "must be empty or a single character"); + if (delim) { + if (d_len != 1) { + zend_argument_value_error(1, "must be a single character"); RETURN_THROWS(); } - if (esc_len == 0) { - escape = PHP_CSV_NO_ESCAPE; - } else { - escape = (unsigned char) esc[0]; - } - ZEND_FALLTHROUGH; - case 2: + delimiter = delim[0]; + } + if (enclo) { if (e_len != 1) { zend_argument_value_error(2, "must be a single character"); RETURN_THROWS(); } enclosure = enclo[0]; - ZEND_FALLTHROUGH; - case 1: - if (d_len != 1) { - zend_argument_value_error(1, "must be a single character"); + } + if (esc) { + if (esc_len > 1) { + zend_argument_value_error(3, "must be empty or a single character"); RETURN_THROWS(); } - delimiter = delim[0]; - ZEND_FALLTHROUGH; - case 0: - break; + if (esc_len == 0) { + escape = PHP_CSV_NO_ESCAPE; + } else { + escape = (unsigned char) esc[0]; + } } + if (spl_filesystem_file_read_csv(intern, delimiter, enclosure, escape, return_value) == FAILURE) { RETURN_FALSE; } @@ -2378,49 +2375,41 @@ PHP_METHOD(SplFileObject, fputcsv) zval *fields = 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) == SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|sssS", &fields, &delim, &d_len, &enclo, &e_len, &esc, &esc_len, &eol) == FAILURE) { + RETURN_THROWS(); + } - switch(ZEND_NUM_ARGS()) - { - case 5: - case 4: - switch (esc_len) { - case 0: - escape = PHP_CSV_NO_ESCAPE; - break; - case 1: - escape = (unsigned char) esc[0]; - break; - default: - zend_argument_value_error(4, "must be empty or a single character"); - RETURN_THROWS(); - } - ZEND_FALLTHROUGH; - case 3: - if (e_len != 1) { - zend_argument_value_error(3, "must be a single character"); - RETURN_THROWS(); - } - enclosure = enclo[0]; - ZEND_FALLTHROUGH; - case 2: - if (d_len != 1) { - zend_argument_value_error(2, "must be a single character"); - RETURN_THROWS(); - } - delimiter = delim[0]; - ZEND_FALLTHROUGH; - case 1: - case 0: - break; + if (delim) { + if (d_len != 1) { + zend_argument_value_error(2, "must be a single character"); + RETURN_THROWS(); } - - ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape, eol); - if (ret < 0) { - RETURN_FALSE; + delimiter = delim[0]; + } + if (enclo) { + if (e_len != 1) { + zend_argument_value_error(3, "must be a single character"); + RETURN_THROWS(); } - RETURN_LONG(ret); + 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 { + escape = (unsigned char) esc[0]; + } + } + + ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape, eol); + if (ret < 0) { + RETURN_FALSE; + } + RETURN_LONG(ret); } /* }}} */ @@ -2433,43 +2422,39 @@ PHP_METHOD(SplFileObject, setCsvControl) char *delim = NULL, *enclo = NULL, *esc = NULL; size_t d_len = 0, e_len = 0, esc_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == SUCCESS) { - switch(ZEND_NUM_ARGS()) - { - case 3: - switch (esc_len) { - case 0: - escape = PHP_CSV_NO_ESCAPE; - break; - case 1: - escape = (unsigned char) esc[0]; - break; - default: - zend_argument_value_error(3, "must be empty or a single character"); - RETURN_THROWS(); - } - ZEND_FALLTHROUGH; - case 2: - if (e_len != 1) { - zend_argument_value_error(2, "must be a single character"); - RETURN_THROWS(); - } - enclosure = enclo[0]; - ZEND_FALLTHROUGH; - case 1: - if (d_len != 1) { - zend_argument_value_error(1, "must be a single character"); - RETURN_THROWS(); - } - delimiter = delim[0]; - ZEND_FALLTHROUGH; - case 0: - break; + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == FAILURE) { + RETURN_THROWS(); + } + + if (delim) { + if (d_len != 1) { + zend_argument_value_error(1, "must be a single character"); + RETURN_THROWS(); } - intern->u.file.delimiter = delimiter; - intern->u.file.enclosure = enclosure; - intern->u.file.escape = escape; + delimiter = delim[0]; } + if (enclo) { + if (e_len != 1) { + zend_argument_value_error(2, "must be a single character"); + RETURN_THROWS(); + } + 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 { + escape = (unsigned char) esc[0]; + } + } + + intern->u.file.delimiter = delimiter; + intern->u.file.enclosure = enclosure; + intern->u.file.escape = escape; } /* }}} */ diff --git a/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt b/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt index 60efae632dae2..c660d217acb55 100644 --- a/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt +++ b/ext/spl/tests/SplFileObject_fputcsv_variation14.phpt @@ -15,6 +15,11 @@ try { } catch (ValueError $e) { echo $e->getMessage(), "\n"; } +try { + var_dump($fo->fputcsv(array('water', 'fruit'), ',', '""')); +} catch (ValueError $e) { + echo $e->getMessage(), "\n"; +} unset($fo); @@ -27,5 +32,6 @@ unlink($file); ?> --EXPECT-- *** Testing fputcsv() : with enclosure & delimiter of two chars and file opened in read mode *** +SplFileObject::fputcsv(): Argument #2 ($separator) must be a single character SplFileObject::fputcsv(): Argument #3 ($enclosure) must be a single character Done From 8e58828e89d3978773544085999f6aaab2d41e46 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 10 Apr 2022 10:45:52 +0200 Subject: [PATCH 0428/1346] Add debug assertion on type narrowing This ensures that this will show up as a fuzzing failure. --- Zend/Optimizer/zend_inference.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 3cc5e3f505fc7..a498926f41d2c 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -1862,6 +1862,9 @@ static void emit_type_narrowing_warning(const zend_op_array *op_array, zend_ssa zend_error_at( E_WARNING, op_array->filename, lineno, "Narrowing occurred during type inference of %s. Please file a bug report on https://github.com/php/php-src/issues", def_op_name); +#if ZEND_DEBUG + ZEND_ASSERT(0 && "Narrowing during type inference"); +#endif } ZEND_API uint32_t ZEND_FASTCALL zend_array_type_info(const zval *zv) From dcd5e8220e626b0cf7df0d6c7d605b975e3e1334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 11 Apr 2022 13:30:29 +0200 Subject: [PATCH 0429/1346] Add `print_r()` to `function_arguments/sensitive_parameter_value.phpt` (#8340) see 90851977348cbb8c65fce19a1670868422414fae see #7921 --- .../tests/function_arguments/sensitive_parameter_value.phpt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Zend/tests/function_arguments/sensitive_parameter_value.phpt b/Zend/tests/function_arguments/sensitive_parameter_value.phpt index 2949b0b18de61..2ae68e8ee62e9 100644 --- a/Zend/tests/function_arguments/sensitive_parameter_value.phpt +++ b/Zend/tests/function_arguments/sensitive_parameter_value.phpt @@ -5,9 +5,10 @@ A SensitiveParameterValue keeps the inner value secret. $v = new SensitiveParameterValue('secret'); -echo "# var_dump() / debug_zval_dump()", PHP_EOL; +echo "# var_dump() / debug_zval_dump() / print_r()", PHP_EOL; var_dump($v); debug_zval_dump($v); +print_r($v); echo PHP_EOL; echo "# var_export()", PHP_EOL; @@ -24,11 +25,12 @@ var_dump($v->getValue()); ?> --EXPECTF-- -# var_dump() / debug_zval_dump() +# var_dump() / debug_zval_dump() / print_r() object(SensitiveParameterValue)#%d (0) { } object(SensitiveParameterValue)#%d (%d) refcount(%d){ } +SensitiveParameterValue Object # var_export() SensitiveParameterValue::__set_state(array( From c4a9d1e668dbba18accde817bc1b0fab95805140 Mon Sep 17 00:00:00 2001 From: Steven Wang Date: Thu, 31 Mar 2022 05:02:46 +0000 Subject: [PATCH 0430/1346] Makefile: Clean up .gcda files in prof-gen. The .gcda files generated by "$(MAKE) PROF_FLAGS=-fprofile-generate all" should be removed. Otherwise, the profile data in them would be combined with the profile data of user's workload.Then, they would be used by "make prof-use" later. Closes GH-8284. --- build/Makefile.global | 1 + 1 file changed, 1 insertion(+) diff --git a/build/Makefile.global b/build/Makefile.global index 3c44a52693ae2..4909699018ba1 100644 --- a/build/Makefile.global +++ b/build/Makefile.global @@ -134,6 +134,7 @@ distclean: clean prof-gen: CCACHE_DISABLE=1 $(MAKE) PROF_FLAGS=-fprofile-generate all + find . -name \*.gcda | xargs rm -f prof-clean: find . -name \*.lo -o -name \*.o | xargs rm -f From c12da039b563e354041187ec673d09159f81abee Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 11 Apr 2022 12:35:49 +0100 Subject: [PATCH 0431/1346] Add null and false support to gen_stubs --- build/gen_stub.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/gen_stub.php b/build/gen_stub.php index 6856b5610e92c..14cf99e6f73b3 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -286,6 +286,10 @@ public function toTypeCode(): string { return "IS_STATIC"; case "never": return "IS_NEVER"; + case "null": + return "IS_NULL"; + case "false": + return "IS_FALSE"; default: throw new Exception("Not implemented: $this->name"); } From 8dbfb15f7c74cf9f67b21541d6b16f736e0f0aa5 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 11 Apr 2022 13:21:40 +0100 Subject: [PATCH 0432/1346] Use more specific return types in SPL --- ext/spl/spl_directory.stub.php | 4 ++-- ext/spl/spl_directory_arginfo.h | 7 +++--- ext/spl/spl_iterators.stub.php | 2 +- ext/spl/spl_iterators_arginfo.h | 41 +++++++++++++++++---------------- ext/spl/tests/iterator_009.phpt | 2 +- 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/ext/spl/spl_directory.stub.php b/ext/spl/spl_directory.stub.php index ceb4b7124b5df..c9a7f9ff9777b 100644 --- a/ext/spl/spl_directory.stub.php +++ b/ext/spl/spl_directory.stub.php @@ -279,10 +279,10 @@ public function setMaxLineLen(int $maxLength): void {} public function getMaxLineLen(): int {} /** @tentative-return-type */ - public function hasChildren(): bool {} + public function hasChildren(): false {} /** @tentative-return-type */ - public function getChildren(): ?RecursiveIterator {} + public function getChildren(): null {} /** @tentative-return-type */ public function seek(int $line): void {} diff --git a/ext/spl/spl_directory_arginfo.h b/ext/spl/spl_directory_arginfo.h index bcdb51ea54254..30d54346d2af5 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: 3f2caf1c46760d8ef629ccb2e94ab0dba09f713b */ + * Stub hash: 3ada856cfa2e50708b43125f819706176b1953f7 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFileInfo___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -254,9 +254,10 @@ ZEND_END_ARG_INFO() #define arginfo_class_SplFileObject_getMaxLineLen arginfo_class_FilesystemIterator_getFlags -#define arginfo_class_SplFileObject_hasChildren arginfo_class_SplFileInfo_isWritable +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileObject_hasChildren, 0, 0, IS_FALSE, 0) +ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_SplFileObject_getChildren, 0, 0, RecursiveIterator, 1) +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_MASK_EX(arginfo_class_SplFileObject_getChildren, 0, 0, MAY_BE_NULL) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileObject_seek, 0, 1, IS_VOID, 0) diff --git a/ext/spl/spl_iterators.stub.php b/ext/spl/spl_iterators.stub.php index 9d80717f85d8f..4235ed100baec 100644 --- a/ext/spl/spl_iterators.stub.php +++ b/ext/spl/spl_iterators.stub.php @@ -14,7 +14,7 @@ public function next(): void {} public function key(): never {} /** @tentative-return-type */ - public function valid(): bool {} + public function valid(): false {} /** @tentative-return-type */ public function rewind(): void {} diff --git a/ext/spl/spl_iterators_arginfo.h b/ext/spl/spl_iterators_arginfo.h index 5b29dc293f186..91735b58d8dd4 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: 889a6eed2d62fbb6af168146840189d37765dbaa */ + * Stub hash: ca94fd0da2a2ed5ddd7e0a40b377ff18dd9e2ced */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_EmptyIterator_current, 0, 0, IS_NEVER, 0) ZEND_END_ARG_INFO() @@ -9,7 +9,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_EmptyIterator_key arginfo_class_EmptyIterator_current -ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_EmptyIterator_valid, 0, 0, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_EmptyIterator_valid, 0, 0, IS_FALSE, 0) ZEND_END_ARG_INFO() #define arginfo_class_EmptyIterator_rewind arginfo_class_EmptyIterator_next @@ -19,19 +19,20 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_CallbackFilterIterator___construct, 0, 0, 2 ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) ZEND_END_ARG_INFO() -#define arginfo_class_CallbackFilterIterator_accept arginfo_class_EmptyIterator_valid +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_CallbackFilterIterator_accept, 0, 0, _IS_BOOL, 0) +ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RecursiveCallbackFilterIterator___construct, 0, 0, 2) ZEND_ARG_OBJ_INFO(0, iterator, RecursiveIterator, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) ZEND_END_ARG_INFO() -#define arginfo_class_RecursiveCallbackFilterIterator_hasChildren arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveCallbackFilterIterator_hasChildren arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_RecursiveCallbackFilterIterator_getChildren, 0, 0, RecursiveCallbackFilterIterator, 0) ZEND_END_ARG_INFO() -#define arginfo_class_RecursiveIterator_hasChildren arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveIterator_hasChildren arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_RecursiveIterator_getChildren, 0, 0, RecursiveIterator, 1) ZEND_END_ARG_INFO() @@ -44,7 +45,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_RecursiveIteratorIterator_rewind arginfo_class_EmptyIterator_next -#define arginfo_class_RecursiveIteratorIterator_valid arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveIteratorIterator_valid arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_RecursiveIteratorIterator_key, 0, 0, IS_MIXED, 0) ZEND_END_ARG_INFO() @@ -67,7 +68,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_RecursiveIteratorIterator_endIteration arginfo_class_EmptyIterator_next -#define arginfo_class_RecursiveIteratorIterator_callHasChildren arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveIteratorIterator_callHasChildren arginfo_class_CallbackFilterIterator_accept #define arginfo_class_RecursiveIteratorIterator_callGetChildren arginfo_class_RecursiveIterator_getChildren @@ -96,7 +97,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_IteratorIterator_rewind arginfo_class_EmptyIterator_next -#define arginfo_class_IteratorIterator_valid arginfo_class_EmptyIterator_valid +#define arginfo_class_IteratorIterator_valid arginfo_class_CallbackFilterIterator_accept #define arginfo_class_IteratorIterator_key arginfo_class_RecursiveIteratorIterator_key @@ -104,7 +105,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_IteratorIterator_next arginfo_class_EmptyIterator_next -#define arginfo_class_FilterIterator_accept arginfo_class_EmptyIterator_valid +#define arginfo_class_FilterIterator_accept arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FilterIterator___construct, 0, 0, 1) ZEND_ARG_OBJ_INFO(0, iterator, Iterator, 0) @@ -118,14 +119,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RecursiveFilterIterator___construct, 0, 0, ZEND_ARG_OBJ_INFO(0, iterator, RecursiveIterator, 0) ZEND_END_ARG_INFO() -#define arginfo_class_RecursiveFilterIterator_hasChildren arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveFilterIterator_hasChildren arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_RecursiveFilterIterator_getChildren, 0, 0, RecursiveFilterIterator, 1) ZEND_END_ARG_INFO() #define arginfo_class_ParentIterator___construct arginfo_class_RecursiveFilterIterator___construct -#define arginfo_class_ParentIterator_accept arginfo_class_EmptyIterator_valid +#define arginfo_class_ParentIterator_accept arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SeekableIterator_seek, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, offset, IS_LONG, 0) @@ -139,7 +140,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_LimitIterator_rewind arginfo_class_EmptyIterator_next -#define arginfo_class_LimitIterator_valid arginfo_class_EmptyIterator_valid +#define arginfo_class_LimitIterator_valid arginfo_class_CallbackFilterIterator_accept #define arginfo_class_LimitIterator_next arginfo_class_EmptyIterator_next @@ -156,11 +157,11 @@ ZEND_END_ARG_INFO() #define arginfo_class_CachingIterator_rewind arginfo_class_EmptyIterator_next -#define arginfo_class_CachingIterator_valid arginfo_class_EmptyIterator_valid +#define arginfo_class_CachingIterator_valid arginfo_class_CallbackFilterIterator_accept #define arginfo_class_CachingIterator_next arginfo_class_EmptyIterator_next -#define arginfo_class_CachingIterator_hasNext arginfo_class_EmptyIterator_valid +#define arginfo_class_CachingIterator_hasNext arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_CachingIterator___toString, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -198,7 +199,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RecursiveCachingIterator___construct, 0, 0, ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "RecursiveCachingIterator::CALL_TOSTRING") ZEND_END_ARG_INFO() -#define arginfo_class_RecursiveCachingIterator_hasChildren arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveCachingIterator_hasChildren arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_RecursiveCachingIterator_getChildren, 0, 0, RecursiveCachingIterator, 1) ZEND_END_ARG_INFO() @@ -207,7 +208,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_NoRewindIterator_rewind arginfo_class_EmptyIterator_next -#define arginfo_class_NoRewindIterator_valid arginfo_class_EmptyIterator_valid +#define arginfo_class_NoRewindIterator_valid arginfo_class_CallbackFilterIterator_accept #define arginfo_class_NoRewindIterator_key arginfo_class_RecursiveIteratorIterator_key @@ -224,7 +225,7 @@ ZEND_END_ARG_INFO() #define arginfo_class_AppendIterator_rewind arginfo_class_EmptyIterator_next -#define arginfo_class_AppendIterator_valid arginfo_class_EmptyIterator_valid +#define arginfo_class_AppendIterator_valid arginfo_class_CallbackFilterIterator_accept #define arginfo_class_AppendIterator_current arginfo_class_RecursiveIteratorIterator_key @@ -248,7 +249,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RegexIterator___construct, 0, 0, 2) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pregFlags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -#define arginfo_class_RegexIterator_accept arginfo_class_EmptyIterator_valid +#define arginfo_class_RegexIterator_accept arginfo_class_CallbackFilterIterator_accept #define arginfo_class_RegexIterator_getMode arginfo_class_RecursiveIteratorIterator_getDepth @@ -277,9 +278,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RecursiveRegexIterator___construct, 0, 0, 2 ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pregFlags, IS_LONG, 0, "0") ZEND_END_ARG_INFO() -#define arginfo_class_RecursiveRegexIterator_accept arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveRegexIterator_accept arginfo_class_CallbackFilterIterator_accept -#define arginfo_class_RecursiveRegexIterator_hasChildren arginfo_class_EmptyIterator_valid +#define arginfo_class_RecursiveRegexIterator_hasChildren arginfo_class_CallbackFilterIterator_accept ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_RecursiveRegexIterator_getChildren, 0, 0, RecursiveRegexIterator, 0) ZEND_END_ARG_INFO() diff --git a/ext/spl/tests/iterator_009.phpt b/ext/spl/tests/iterator_009.phpt index bd8eb99c4d0db..6fa9c440e1bc8 100644 --- a/ext/spl/tests/iterator_009.phpt +++ b/ext/spl/tests/iterator_009.phpt @@ -10,7 +10,7 @@ class EmptyIteratorEx extends EmptyIterator echo __METHOD__ . "\n"; parent::rewind(); } - function valid(): bool + function valid(): false { echo __METHOD__ . "\n"; return parent::valid(); From 2973b9f02a2e6532b178ae83525e17a4ed4f48b6 Mon Sep 17 00:00:00 2001 From: bohwaz Date: Mon, 14 Mar 2022 20:09:20 +0100 Subject: [PATCH 0433/1346] Allow user to change SQLITE_DEFENSIVE if needed Closes GH-8200. --- NEWS | 3 +++ UPGRADING | 3 +++ ext/sqlite3/sqlite3.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 4178005c7b733..f6c2e34f3cda3 100644 --- a/NEWS +++ b/NEWS @@ -31,6 +31,9 @@ PHP NEWS - Sodium: . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) +- SQLite3: + . Changed sqlite3.defensive from PHP_INI_SYSTEM to PHP_INI_USER. (bohwaz) + - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) diff --git a/UPGRADING b/UPGRADING index 12cffeb9127e5..3be20e6558323 100644 --- a/UPGRADING +++ b/UPGRADING @@ -158,6 +158,9 @@ PHP 8.2 UPGRADE NOTES - OCI8: . The minimum Oracle Client library version required is now 11.2. +- SQLite3: + . sqlite3.defensive is now PHP_INI_USER. + - Standard: . getimagesize() now reports the actual image dimensions, bits and channels of AVIF images. Previously, the dimensions have been reported as 0x0, and diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index 55ebf911e94d4..f06d373c56f09 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -76,7 +76,7 @@ static void php_sqlite3_error(php_sqlite3_db_object *db_obj, char *format, ...) PHP_INI_BEGIN() STD_PHP_INI_ENTRY("sqlite3.extension_dir", NULL, PHP_INI_SYSTEM, OnUpdateString, extension_dir, zend_sqlite3_globals, sqlite3_globals) #if SQLITE_VERSION_NUMBER >= 3026000 - STD_PHP_INI_BOOLEAN("sqlite3.defensive", "1", PHP_INI_SYSTEM, OnUpdateBool, dbconfig_defensive, zend_sqlite3_globals, sqlite3_globals) + STD_PHP_INI_BOOLEAN("sqlite3.defensive", "1", PHP_INI_USER, OnUpdateBool, dbconfig_defensive, zend_sqlite3_globals, sqlite3_globals) #endif PHP_INI_END() /* }}} */ From 7daa8b77a6ec04f40d14f9d60936756125478c54 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 11 Apr 2022 14:15:52 +0100 Subject: [PATCH 0434/1346] BZ2: Use EMPTY_SWITCH_DEFAULT_CASE This adds an assertion that this case indeed never happens --- ext/bz2/bz2.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c index 3af382dee4243..8e55bf92bed76 100644 --- a/ext/bz2/bz2.c +++ b/ext/bz2/bz2.c @@ -393,9 +393,7 @@ PHP_FUNCTION(bzopen) RETURN_FALSE; } break; - default: - /* not reachable */ - break; + EMPTY_SWITCH_DEFAULT_CASE(); } if (FAILURE == php_stream_cast(stream, PHP_STREAM_AS_FD, (void *) &fd, REPORT_ERRORS)) { From 7710f9946b1172721916b2b0982e19cc1dd17c13 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 11 Apr 2022 16:57:05 +0100 Subject: [PATCH 0435/1346] Fix generation of arginfo if type is just null --- build/gen_stub.php | 4 ++++ ext/spl/spl_directory_arginfo.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index 14cf99e6f73b3..c3233485728d9 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -510,6 +510,10 @@ function(SimpleType $type) { public function tryToSimpleType(): ?SimpleType { $withoutNull = $this->getWithoutNull(); + /* type has only null */ + if (count($withoutNull->types) === 0) { + return $this->types[0]; + } if (count($withoutNull->types) === 1) { return $withoutNull->types[0]; } diff --git a/ext/spl/spl_directory_arginfo.h b/ext/spl/spl_directory_arginfo.h index 30d54346d2af5..338bd27c19b84 100644 --- a/ext/spl/spl_directory_arginfo.h +++ b/ext/spl/spl_directory_arginfo.h @@ -257,7 +257,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileObject_hasChildren, 0, 0, IS_FALSE, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_MASK_EX(arginfo_class_SplFileObject_getChildren, 0, 0, MAY_BE_NULL) +ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileObject_getChildren, 0, 0, IS_NULL, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileObject_seek, 0, 1, IS_VOID, 0) From ddf7e35f716092080c7ac1e6f7e0b56256bfa0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 12 Apr 2022 21:08:02 +0200 Subject: [PATCH 0436/1346] Configure diff drivers for `php`, `phpt`, `c` and `h` in `.gitattributes` (#8343) --- .gitattributes | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitattributes b/.gitattributes index 5bee19d08d632..514999ffccfeb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,7 +13,8 @@ /UPGRADING merge=NEWS /UPGRADING.INTERNALS merge=NEWS -# Enable commit diffs for binary PHP test files. Some PHP test files include -# special characters, such as ASCII control characters. Git recognizes these as -# binary and wouldn't generate diffs. -*.phpt diff +# Configure proper diff drivers to improve the context lines in the output +# of git diff and to improve token splitting for --word-diff. +*.phpt diff=php +*.php diff=php +*.[ch] diff=cpp From c345b6ee7232df3ce88bfe3521ce00643ae66c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Wed, 13 Apr 2022 09:24:08 +0200 Subject: [PATCH 0437/1346] Remove unused variable from gen_stub.php --- build/gen_stub.php | 1 - 1 file changed, 1 deletion(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index c3233485728d9..4ebe961d8b774 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -404,7 +404,6 @@ public function toEscapedName(): string { } public function toVarEscapedName(): string { - $name = str_replace('_', '__', $this->name); return str_replace('\\', '_', $this->name); } From cfc38a6014b1438fc31909b0774732fabfc591fd Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 13 Apr 2022 20:34:23 +0100 Subject: [PATCH 0438/1346] SPL: minor refactoring (#8341) Use more appropriate types and return macros --- ext/spl/spl_array.c | 10 +++++----- ext/spl/spl_dllist.c | 2 +- ext/spl/spl_fixedarray.c | 2 +- ext/spl/spl_functions.c | 18 +++++------------- ext/spl/spl_functions.h | 4 ++-- ext/spl/spl_heap.c | 4 ++-- ext/spl/spl_iterators.c | 2 +- ext/spl/spl_observer.c | 14 +++++++------- 8 files changed, 24 insertions(+), 32 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index f6a11e7231da1..e5d971416840c 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1304,7 +1304,7 @@ PHP_METHOD(ArrayObject, count) RETURN_LONG(spl_array_object_count_elements_helper(intern)); } /* }}} */ -static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, int fname_len, int use_arg) /* {{{ */ +static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, size_t fname_len, int use_arg) /* {{{ */ { spl_array_object *intern = Z_SPLARRAY_P(ZEND_THIS); HashTable **ht_ptr = spl_array_get_hash_table_ptr(intern); @@ -1393,12 +1393,12 @@ PHP_METHOD(ArrayIterator, current) } if ((entry = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, intern))) == NULL) { - return; + RETURN_NULL(); } if (Z_TYPE_P(entry) == IS_INDIRECT) { entry = Z_INDIRECT_P(entry); if (Z_TYPE_P(entry) == IS_UNDEF) { - return; + RETURN_NULL(); } } RETURN_COPY_DEREF(entry); @@ -1490,7 +1490,7 @@ PHP_METHOD(RecursiveArrayIterator, getChildren) } if ((entry = zend_hash_get_current_data_ex(aht, spl_array_get_pos_ptr(aht, intern))) == NULL) { - return; + RETURN_NULL(); } if (Z_TYPE_P(entry) == IS_INDIRECT) { @@ -1500,7 +1500,7 @@ PHP_METHOD(RecursiveArrayIterator, getChildren) ZVAL_DEREF(entry); if (Z_TYPE_P(entry) == IS_OBJECT) { if ((intern->ar_flags & SPL_ARRAY_CHILD_ARRAYS_ONLY) != 0) { - return; + RETURN_NULL(); } if (instanceof_function(Z_OBJCE_P(entry), Z_OBJCE_P(ZEND_THIS))) { RETURN_OBJ_COPY(Z_OBJ_P(entry)); diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 0daf486e40b60..5fd3830014a3d 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -1215,7 +1215,7 @@ PHP_METHOD(SplDoublyLinkedList, add) PHP_METHOD(SplDoublyLinkedList, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_dllist_object_get_debug_info(Z_OBJ_P(ZEND_THIS))); diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 9fdbc34cb7fe5..5f8dca8dd1812 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -781,7 +781,7 @@ PHP_METHOD(SplFixedArray, offsetUnset) PHP_METHOD(SplFixedArray, getIterator) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } zend_create_internal_iterator_zval(return_value, ZEND_THIS); diff --git a/ext/spl/spl_functions.c b/ext/spl/spl_functions.c index 0f46c2e8b18fb..0fcf389667355 100644 --- a/ext/spl/spl_functions.c +++ b/ext/spl/spl_functions.c @@ -19,8 +19,6 @@ #endif #include "php.h" -#include "php_ini.h" -#include "ext/standard/info.h" #include "php_spl.h" /* {{{ spl_add_class_name */ @@ -41,11 +39,9 @@ void spl_add_class_name(zval *list, zend_class_entry *pce, int allow, int ce_fla /* {{{ spl_add_interfaces */ void spl_add_interfaces(zval *list, zend_class_entry * pce, int allow, int ce_flags) { - uint32_t num_interfaces; - if (pce->num_interfaces) { ZEND_ASSERT(pce->ce_flags & ZEND_ACC_LINKED); - for (num_interfaces = 0; num_interfaces < pce->num_interfaces; num_interfaces++) { + for (uint32_t num_interfaces = 0; num_interfaces < pce->num_interfaces; num_interfaces++) { spl_add_class_name(list, pce->interfaces[num_interfaces], allow, ce_flags); } } @@ -55,10 +51,9 @@ void spl_add_interfaces(zval *list, zend_class_entry * pce, int allow, int ce_fl /* {{{ spl_add_traits */ void spl_add_traits(zval *list, zend_class_entry * pce, int allow, int ce_flags) { - uint32_t num_traits; zend_class_entry *trait; - for (num_traits = 0; num_traits < pce->num_traits; num_traits++) { + for (uint32_t num_traits = 0; num_traits < pce->num_traits; num_traits++) { trait = zend_fetch_class_by_name(pce->trait_names[num_traits].name, pce->trait_names[num_traits].lc_name, ZEND_FETCH_CLASS_TRAIT); ZEND_ASSERT(trait); @@ -69,11 +64,9 @@ void spl_add_traits(zval *list, zend_class_entry * pce, int allow, int ce_flags) /* {{{ spl_add_classes */ -int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int ce_flags) +void spl_add_classes(zend_class_entry *pce, zval *list, bool sub, int allow, int ce_flags) { - if (!pce) { - return 0; - } + ZEND_ASSERT(pce); spl_add_class_name(list, pce, allow, ce_flags); if (sub) { spl_add_interfaces(list, pce, allow, ce_flags); @@ -82,11 +75,10 @@ int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int c spl_add_classes(pce, list, sub, allow, ce_flags); } } - return 0; } /* }}} */ -zend_string * spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len) /* {{{ */ +zend_string * spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, size_t prop_len) /* {{{ */ { return zend_mangle_property_name(ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), prop_name, prop_len, 0); } diff --git a/ext/spl/spl_functions.h b/ext/spl/spl_functions.h index e6c3171c34fd9..20eb323c5fec0 100644 --- a/ext/spl/spl_functions.h +++ b/ext/spl/spl_functions.h @@ -32,9 +32,9 @@ typedef zend_object* (*create_object_func_t)(zend_class_entry *class_type); void spl_add_class_name(zval * list, zend_class_entry * pce, int allow, int ce_flags); void spl_add_interfaces(zval * list, zend_class_entry * pce, int allow, int ce_flags); void spl_add_traits(zval * list, zend_class_entry * pce, int allow, int ce_flags); -int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int ce_flags); +void spl_add_classes(zend_class_entry *pce, zval *list, bool sub, int allow, int ce_flags); /* caller must efree(return) */ -zend_string *spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len); +zend_string *spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, size_t prop_len); #endif /* PHP_FUNCTIONS_H */ diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index bb874e47dc828..3112666e33651 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -1053,7 +1053,7 @@ PHP_METHOD(SplPriorityQueue, current) PHP_METHOD(SplHeap, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_heap_object_get_debug_info(spl_ce_SplHeap, Z_OBJ_P(ZEND_THIS))); @@ -1063,7 +1063,7 @@ PHP_METHOD(SplHeap, __debugInfo) PHP_METHOD(SplPriorityQueue, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_heap_object_get_debug_info(spl_ce_SplPriorityQueue, Z_OBJ_P(ZEND_THIS))); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 217f3aa19c038..fee682a945a70 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -870,7 +870,7 @@ PHP_METHOD(RecursiveIteratorIterator, callGetChildren) zobject = &object->iterators[object->level].zobject; if (Z_TYPE_P(zobject) == IS_UNDEF) { - return; + RETURN_NULL(); } else { zend_call_method_with_0_params(Z_OBJ_P(zobject), ce, &object->iterators[object->level].getchildren, "getchildren", return_value); if (Z_TYPE_P(return_value) == IS_UNDEF) { diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 3ac375c5cd6b5..4c6cef6cb0604 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -82,7 +82,7 @@ void spl_SplObjectStorage_free_storage(zend_object *object) /* {{{ */ zend_hash_destroy(&intern->storage); } /* }}} */ -static int spl_object_storage_get_hash(zend_hash_key *key, spl_SplObjectStorage *intern, zend_object *obj) { +static zend_result spl_object_storage_get_hash(zend_hash_key *key, spl_SplObjectStorage *intern, zend_object *obj) { if (UNEXPECTED(intern->fptr_get_hash)) { zval param; zval rv; @@ -218,12 +218,12 @@ spl_SplObjectStorageElement *spl_object_storage_attach(spl_SplObjectStorage *int return pelement; } /* }}} */ -static int spl_object_storage_detach(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */ +static zend_result spl_object_storage_detach(spl_SplObjectStorage *intern, zend_object *obj) /* {{{ */ { if (EXPECTED(!(intern->flags & SOS_OVERRIDDEN_UNSET_DIMENSION))) { return zend_hash_index_del(&intern->storage, obj->handle); } - int ret = FAILURE; + zend_result ret = FAILURE; zend_hash_key key; if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) { return ret; @@ -544,7 +544,7 @@ PHP_METHOD(SplObjectStorage, offsetGet) ZEND_PARSE_PARAMETERS_END(); if (spl_object_storage_get_hash(&key, intern, obj) == FAILURE) { - return; + RETURN_NULL(); } element = spl_object_storage_get(intern, &key); @@ -723,7 +723,7 @@ PHP_METHOD(SplObjectStorage, getInfo) } if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) { - return; + RETURN_NULL(); } ZVAL_COPY(return_value, &element->inf); } /* }}} */ @@ -740,7 +740,7 @@ PHP_METHOD(SplObjectStorage, setInfo) } if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) { - return; + RETURN_NULL(); } zval_ptr_dtor(&element->inf); ZVAL_COPY(&element->inf, inf); @@ -1008,7 +1008,7 @@ PHP_METHOD(SplObjectStorage, __unserialize) PHP_METHOD(SplObjectStorage, __debugInfo) { if (zend_parse_parameters_none() == FAILURE) { - return; + RETURN_THROWS(); } RETURN_ARR(spl_object_storage_debug_info(Z_OBJ_P(ZEND_THIS))); From 83610987046d5a5ffea2777853d4a4f2d3313387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Wed, 13 Apr 2022 21:39:40 +0200 Subject: [PATCH 0439/1346] Use `zend_update_property` to set `SensitiveParameterValue::$value` (#8365) see https://github.com/php/php-src/issues/8351#issuecomment-1098284745 --- Zend/zend_attributes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index 9f7b8f01448b5..433586f55f08c 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -109,7 +109,7 @@ ZEND_METHOD(SensitiveParameterValue, __construct) Z_PARAM_ZVAL(value) ZEND_PARSE_PARAMETERS_END(); - ZVAL_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), value); + zend_update_property(zend_ce_sensitive_parameter_value, Z_OBJ_P(ZEND_THIS), "value", strlen("value"), value); } ZEND_METHOD(SensitiveParameterValue, getValue) From 8649cb8a9657f37ee4ea59b0b4c45dc120728333 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Thu, 14 Apr 2022 18:38:00 +0100 Subject: [PATCH 0440/1346] Improve and fix stub return types (#8368) --- Zend/Optimizer/zend_func_infos.h | 3 --- ext/gd/gd.stub.php | 3 +-- ext/gd/gd_arginfo.h | 4 ++-- ext/standard/basic_functions.stub.php | 10 +++------- ext/standard/basic_functions_arginfo.h | 6 +++--- 5 files changed, 9 insertions(+), 17 deletions(-) diff --git a/Zend/Optimizer/zend_func_infos.h b/Zend/Optimizer/zend_func_infos.h index ff89312fb3f4b..a2b4fb392bcaf 100644 --- a/Zend/Optimizer/zend_func_infos.h +++ b/Zend/Optimizer/zend_func_infos.h @@ -134,7 +134,6 @@ static const func_info_t func_infos[] = { #if defined(HAVE_GD_BMP) F1("imagecreatefrombmp", MAY_BE_OBJECT|MAY_BE_FALSE), #endif - F0("imagecolorset", MAY_BE_FALSE|MAY_BE_NULL), F1("imagecolorsforindex", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG), F1("imagegetclip", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_LONG), #if defined(HAVE_GD_FREETYPE) @@ -514,7 +513,6 @@ static const func_info_t func_infos[] = { F1("get_current_user", MAY_BE_STRING), FN("get_cfg_var", MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE), F1("error_get_last", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_NULL), - F0("register_shutdown_function", MAY_BE_FALSE|MAY_BE_NULL), F1("highlight_file", MAY_BE_STRING|MAY_BE_BOOL), F1("php_strip_whitespace", MAY_BE_STRING), F1("highlight_string", MAY_BE_STRING|MAY_BE_BOOL), @@ -619,7 +617,6 @@ static const func_info_t func_infos[] = { #endif F1("exec", MAY_BE_STRING|MAY_BE_FALSE), F1("system", MAY_BE_STRING|MAY_BE_FALSE), - F0("passthru", MAY_BE_FALSE|MAY_BE_NULL), F1("escapeshellcmd", MAY_BE_STRING), F1("escapeshellarg", MAY_BE_STRING), F1("shell_exec", MAY_BE_STRING|MAY_BE_FALSE|MAY_BE_NULL), diff --git a/ext/gd/gd.stub.php b/ext/gd/gd.stub.php index 5b48af2376129..ec4a9ea3ae028 100644 --- a/ext/gd/gd.stub.php +++ b/ext/gd/gd.stub.php @@ -190,8 +190,7 @@ function imagecolorresolve(GdImage $image, int $red, int $green, int $blue): int function imagecolorexact(GdImage $image, int $red, int $green, int $blue): int {} -/** @return false|null */ -function imagecolorset(GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): ?bool {} +function imagecolorset(GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): false|null {} /** * @return array diff --git a/ext/gd/gd_arginfo.h b/ext/gd/gd_arginfo.h index 19b12eddb7897..b0f22ace5e679 100644 --- a/ext/gd/gd_arginfo.h +++ b/ext/gd/gd_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 4de3d369fad259705acc5bf5de0e935b7e142ec7 */ + * Stub hash: a60454e502813da9aba42100fdbfd619c8da54d2 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gd_info, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -315,7 +315,7 @@ ZEND_END_ARG_INFO() #define arginfo_imagecolorexact arginfo_imagecolorclosest -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolorset, 0, 5, _IS_BOOL, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imagecolorset, 0, 5, IS_FALSE, 1) ZEND_ARG_OBJ_INFO(0, image, GdImage, 0) ZEND_ARG_TYPE_INFO(0, color, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, red, IS_LONG, 0) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 8239b6d14dba3..540d88722c15c 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -464,8 +464,7 @@ function forward_static_call(callable $callback, mixed ...$args): mixed {} function forward_static_call_array(callable $callback, array $args): mixed {} -/** @return false|null */ -function register_shutdown_function(callable $callback, mixed ...$args): ?bool {} +function register_shutdown_function(callable $callback, mixed ...$args): void {} /** @refcount 1 */ function highlight_file(string $filename, bool $return = false): string|bool {} @@ -1087,11 +1086,8 @@ function exec(string $command, &$output = null, &$result_code = null): string|fa */ function system(string $command, &$result_code = null): string|false {} -/** - * @param int $result_code - * @return false|null - */ -function passthru(string $command, &$result_code = null): ?bool {} +/** @param int $result_code */ +function passthru(string $command, &$result_code = null): false|null {} /** @refcount 1 */ function escapeshellcmd(string $command): string {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index b912e503bbe44..8b573cbe2dff3 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: bbcebdb57572133d5f442f220f1e98a1320ed0f6 */ + * Stub hash: b1c51fabe59bba6706500365f3eb7d9676d625f6 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -459,7 +459,7 @@ ZEND_END_ARG_INFO() #define arginfo_forward_static_call_array arginfo_call_user_func_array -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, _IS_BOOL, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_shutdown_function, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() @@ -1151,7 +1151,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_system, 0, 1, MAY_BE_STRING|MAY_ ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, result_code, "null") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_passthru, 0, 1, _IS_BOOL, 1) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_passthru, 0, 1, IS_FALSE, 1) ZEND_ARG_TYPE_INFO(0, command, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, result_code, "null") ZEND_END_ARG_INFO() From 8de75fa754d6a970eb9102ae623be42bf46abb84 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Fri, 15 Apr 2022 14:41:32 +0200 Subject: [PATCH 0441/1346] fileinfo: Re-add Apple flag It is not supported for all kinds of data, but it is definitely usable. Signed-off-by: Anatol Belski --- ext/fileinfo/fileinfo.c | 3 --- ext/fileinfo/tests/finfo_apple_flag.phpt | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 ext/fileinfo/tests/finfo_apple_flag.phpt diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c index 90919e706e83e..9a0e21545756c 100644 --- a/ext/fileinfo/fileinfo.c +++ b/ext/fileinfo/fileinfo.c @@ -129,10 +129,7 @@ PHP_MINIT_FUNCTION(finfo) #ifdef MAGIC_RAW REGISTER_LONG_CONSTANT("FILEINFO_RAW", MAGIC_RAW, CONST_CS|CONST_PERSISTENT); #endif -#if 0 - /* seems not usable yet. */ REGISTER_LONG_CONSTANT("FILEINFO_APPLE", MAGIC_APPLE, CONST_CS|CONST_PERSISTENT); -#endif REGISTER_LONG_CONSTANT("FILEINFO_EXTENSION", MAGIC_EXTENSION, CONST_CS|CONST_PERSISTENT); return SUCCESS; diff --git a/ext/fileinfo/tests/finfo_apple_flag.phpt b/ext/fileinfo/tests/finfo_apple_flag.phpt new file mode 100644 index 0000000000000..7f037c149594b --- /dev/null +++ b/ext/fileinfo/tests/finfo_apple_flag.phpt @@ -0,0 +1,17 @@ +--TEST-- +Test FILEINFO_APPLE flag +--EXTENSIONS-- +fileinfo +--FILE-- +file(__DIR__ . "/resources/test.jpg", FILEINFO_APPLE)); +var_dump($f->file(__DIR__ . "/resources/test.gif", FILEINFO_APPLE)); +var_dump($f->file(__DIR__ . "/resources/test.ppt", FILEINFO_APPLE)); + +?> +--EXPECT-- +string(8) "8BIMJPEG" +string(8) "8BIMGIFf" +string(8) "????PPT3" From 7be195caa7589560d5e1a019e389850fdb5c8a1e Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sat, 9 Apr 2022 15:08:41 +0100 Subject: [PATCH 0442/1346] Support fpm_get_socket_listening_queue on macOS Using TCP_CONNECTION_INFO socket option. --- NEWS | 1 + sapi/fpm/config.m4 | 13 +++++++++++++ sapi/fpm/fpm/fpm_config.h | 2 +- sapi/fpm/fpm/fpm_sockets.c | 24 ++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index f6c2e34f3cda3..b1d63069e281b 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ PHP NEWS . Emit error for invalid port setting. (David Carlier) . Added extra check for FPM proc dumpable on SELinux based systems. (David Carlier) + . Added support for listening queue on macOS. (David Carlier) - Intl: . Update all grandfathered language tags with preferred values diff --git a/sapi/fpm/config.m4 b/sapi/fpm/config.m4 index 4e3815ffc2543..0fede79c23f4a 100644 --- a/sapi/fpm/config.m4 +++ b/sapi/fpm/config.m4 @@ -343,6 +343,19 @@ AC_DEFUN([AC_FPM_LQ], AC_DEFINE([HAVE_LQ_TCP_INFO], 1, [do we have TCP_INFO?]) fi + AC_MSG_CHECKING([for TCP_CONNECTION_INFO]) + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[struct tcp_connection_info ti; int x = TCP_CONNECTION_INFO;]])], [ + have_lq=tcp_connection_info + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + ]) + + if test "$have_lq" = "tcp_connection_info"; then + AC_DEFINE([HAVE_LQ_TCP_CONNECTION_INFO], 1, [do we have TCP_CONNECTION_INFO?]) + fi + if test "$have_lq" = "no" ; then AC_MSG_CHECKING([for SO_LISTENQLEN]) diff --git a/sapi/fpm/fpm/fpm_config.h b/sapi/fpm/fpm/fpm_config.h index 548202fe3a522..d34f686a6fbd1 100644 --- a/sapi/fpm/fpm/fpm_config.h +++ b/sapi/fpm/fpm/fpm_config.h @@ -70,7 +70,7 @@ # define HAVE_FPM_TRACE 0 #endif -#if defined(HAVE_LQ_TCP_INFO) || defined(HAVE_LQ_SO_LISTENQ) +#if defined(HAVE_LQ_TCP_INFO) || defined(HAVE_LQ_TCP_CONNECTION_INFO) || defined(HAVE_LQ_SO_LISTENQ) # define HAVE_FPM_LQ 1 #else # define HAVE_FPM_LQ 0 diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index 003c62b7d05df..e4b89f84565e4 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -524,6 +524,30 @@ int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq) return 0; } +#elif defined(HAVE_LQ_TCP_CONNECTION_INFO) + +#include + +int fpm_socket_get_listening_queue(int sock, unsigned *cur_lq, unsigned *max_lq) +{ + struct tcp_connection_info info; + socklen_t len = sizeof(info); + + if (0 > getsockopt(sock, IPPROTO_TCP, TCP_CONNECTION_INFO, &info, &len)) { + zlog(ZLOG_SYSERROR, "failed to retrieve TCP_CONNECTION_INFO for socket"); + return -1; + } + + if (cur_lq) { + *cur_lq = info.tcpi_tfo_syn_data_acked; + } + + if (max_lq) { + *max_lq = 0; + } + + return 0; +} #endif #ifdef HAVE_LQ_SO_LISTENQ From 4bd7f4e0ada4f5003aa9e495997306128b7a91ba Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Apr 2022 22:20:04 +0200 Subject: [PATCH 0443/1346] Check that MAY_BE_REF variables cannot have a ce --- Zend/Optimizer/ssa_integrity.c | 3 +++ Zend/Optimizer/zend_inference.c | 1 + 2 files changed, 4 insertions(+) diff --git a/Zend/Optimizer/ssa_integrity.c b/Zend/Optimizer/ssa_integrity.c index d4ffbd1e7cd27..779edd2934843 100644 --- a/Zend/Optimizer/ssa_integrity.c +++ b/Zend/Optimizer/ssa_integrity.c @@ -176,6 +176,9 @@ void ssa_verify_integrity(zend_op_array *op_array, zend_ssa *ssa, const char *ex if ((type & MAY_BE_ARRAY_OF_ANY) && !(type & MAY_BE_ARRAY_KEY_ANY)) { FAIL("var " VARFMT " has array value type but not key type\n", VAR(i)); } + if ((type & MAY_BE_REF) && ssa->var_info[i].ce) { + FAIL("var " VARFMT " may be ref but has ce\n", VAR(i)); + } } /* Instructions */ diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 79e4d52c56ac8..46f81011678cc 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3411,6 +3411,7 @@ static zend_always_inline zend_result _zend_update_type_info( tmp |= zend_fetch_prop_type(script, prop_info, &ce); if (opline->result_type == IS_VAR) { tmp |= MAY_BE_REF | MAY_BE_INDIRECT; + ce = NULL; } else if (!(opline->op1_type & (IS_VAR|IS_TMP_VAR)) || !(t1 & MAY_BE_RC1)) { zend_class_entry *ce = NULL; From df4c27642efb2ee986ad7fb744f76ab380cf5a4c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 16 Apr 2022 22:42:20 +0200 Subject: [PATCH 0444/1346] Check opcode rather than result_type for R/IS type inference We may sometimes create FETCH_*_R opcodes with VAR type (e.g. if a FUNC_ARG opcode is converted to BP_VAR_R fetch kind). Make sure we don't infer overly conservative types in that case. --- Zend/Optimizer/zend_inference.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 46f81011678cc..cdf960aa7b955 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3368,7 +3368,8 @@ static zend_always_inline zend_result _zend_update_type_info( tmp = zend_array_element_type( opline->opcode != ZEND_FETCH_LIST_R ? t1 : ((t1 & ~MAY_BE_STRING) | MAY_BE_NULL), opline->op1_type, - opline->result_type == IS_VAR, + opline->opcode != ZEND_FETCH_DIM_R && opline->opcode != ZEND_FETCH_DIM_IS + && opline->opcode != ZEND_FETCH_LIST_R, opline->op2_type == IS_UNUSED); if (opline->opcode == ZEND_FETCH_DIM_IS && (t1 & MAY_BE_STRING)) { tmp |= MAY_BE_NULL; @@ -3409,7 +3410,7 @@ static zend_always_inline zend_result _zend_update_type_info( if (opline->op1_type == IS_UNUSED || (t1 & MAY_BE_OBJECT)) { zend_property_info *prop_info = zend_fetch_prop_info(op_array, ssa, opline, ssa_op); tmp |= zend_fetch_prop_type(script, prop_info, &ce); - if (opline->result_type == IS_VAR) { + if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { tmp |= MAY_BE_REF | MAY_BE_INDIRECT; ce = NULL; } else if (!(opline->op1_type & (IS_VAR|IS_TMP_VAR)) || !(t1 & MAY_BE_RC1)) { @@ -3451,7 +3452,8 @@ static zend_always_inline zend_result _zend_update_type_info( case ZEND_FETCH_STATIC_PROP_FUNC_ARG: tmp = zend_fetch_prop_type(script, zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce); - if (opline->result_type == IS_VAR) { + if (opline->opcode != ZEND_FETCH_STATIC_PROP_R + && opline->opcode != ZEND_FETCH_STATIC_PROP_IS) { tmp |= MAY_BE_REF | MAY_BE_INDIRECT; } else { if (!result_may_be_separated(ssa, ssa_op)) { From 74c0edefe7dfa24c40d6f1b1405013413f473e55 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 17 Apr 2022 18:07:52 +0200 Subject: [PATCH 0445/1346] Remove unnecessary abstract function check in zend_get_call_op() Abstract functions are now handled in the INIT stage, they do not affect DO opcodes anymore. Also add a check for another precondition, namely that the function is not a trampoline. --- Zend/zend_compile.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 444dee5b0d7d4..a2098a4decc56 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3589,16 +3589,17 @@ static uint32_t zend_compile_args( ZEND_API zend_uchar zend_get_call_op(const zend_op *init_op, zend_function *fbc) /* {{{ */ { if (fbc) { + ZEND_ASSERT(!(fbc->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)); if (fbc->type == ZEND_INTERNAL_FUNCTION && !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS)) { if (init_op->opcode == ZEND_INIT_FCALL && !zend_execute_internal) { - if (!(fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED))) { + if (!(fbc->common.fn_flags & ZEND_ACC_DEPRECATED)) { return ZEND_DO_ICALL; } else { return ZEND_DO_FCALL_BY_NAME; } } } else if (!(CG(compiler_options) & ZEND_COMPILE_IGNORE_USER_FUNCTIONS)){ - if (zend_execute_ex == execute_ex && !(fbc->common.fn_flags & ZEND_ACC_ABSTRACT)) { + if (zend_execute_ex == execute_ex) { return ZEND_DO_UCALL; } } From fbb73939976222bb8e9a3bd8a589381360a38621 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 17 Apr 2022 22:55:23 +0200 Subject: [PATCH 0446/1346] Handle other DO_FCALL opcodes in NEW live range calculation Make this robust against the case where NEW is terminated by something other than DO_FCALL, e.g. DO_UCALL. This can't currently happen. --- Zend/zend_opcode.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 9e27c2fea142b..2fee1693ff969 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -751,31 +751,29 @@ static void emit_live_range( while (def_opline + 1 < use_opline) { def_opline++; start++; - if (def_opline->opcode == ZEND_DO_FCALL) { - if (level == 0) { + switch (def_opline->opcode) { + case ZEND_INIT_FCALL: + case ZEND_INIT_FCALL_BY_NAME: + case ZEND_INIT_NS_FCALL_BY_NAME: + case ZEND_INIT_DYNAMIC_CALL: + case ZEND_INIT_USER_CALL: + case ZEND_INIT_METHOD_CALL: + case ZEND_INIT_STATIC_METHOD_CALL: + case ZEND_NEW: + level++; + break; + case ZEND_DO_FCALL: + case ZEND_DO_FCALL_BY_NAME: + case ZEND_DO_ICALL: + case ZEND_DO_UCALL: + if (level == 0) { + goto done; + } + level--; break; - } - level--; - } else { - switch (def_opline->opcode) { - case ZEND_INIT_FCALL: - case ZEND_INIT_FCALL_BY_NAME: - case ZEND_INIT_NS_FCALL_BY_NAME: - case ZEND_INIT_DYNAMIC_CALL: - case ZEND_INIT_USER_CALL: - case ZEND_INIT_METHOD_CALL: - case ZEND_INIT_STATIC_METHOD_CALL: - case ZEND_NEW: - level++; - break; - case ZEND_DO_ICALL: - case ZEND_DO_UCALL: - case ZEND_DO_FCALL_BY_NAME: - level--; - break; - } } } +done: emit_live_range_raw(op_array, var_num, ZEND_LIVE_NEW, orig_start + 1, start + 1); if (start + 1 == end) { /* Trivial live-range, no need to store it. */ From 6ed3b57e67cd9c6314b8c34efd1cd2314ff81208 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 18 Apr 2022 10:33:52 +0300 Subject: [PATCH 0447/1346] Fix incorrect constant propagation for VERIFY_RETURN_TYPE Fixes oss-fuzz #46616 --- Zend/Optimizer/sccp.c | 4 ++++ ext/opcache/tests/opt/sccp_039.phpt | 15 +++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 ext/opcache/tests/opt/sccp_039.phpt diff --git a/Zend/Optimizer/sccp.c b/Zend/Optimizer/sccp.c index 17af8bd62bd39..3ac97e0f89533 100644 --- a/Zend/Optimizer/sccp.c +++ b/Zend/Optimizer/sccp.c @@ -1721,6 +1721,10 @@ static zval *value_from_type_and_range(sccp_ctx *ctx, int var_num, zval *tmp) { } if (!(info->type & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_NULL))) { + if (ssa->vars[var_num].definition >= 0 + && ctx->scdf.op_array->opcodes[ssa->vars[var_num].definition].opcode == ZEND_VERIFY_RETURN_TYPE) { + return NULL; + } ZVAL_NULL(tmp); return tmp; } diff --git a/ext/opcache/tests/opt/sccp_039.phpt b/ext/opcache/tests/opt/sccp_039.phpt new file mode 100644 index 0000000000000..f4e7933b2a712 --- /dev/null +++ b/ext/opcache/tests/opt/sccp_039.phpt @@ -0,0 +1,15 @@ +--TEST-- +SCCP 039: Incorrect constant propagation for VERIFY_RETURN_TYPE +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- + +DONE +--EXPECT-- +DONE From 462dc9da6a6178a84d385fd694067b6440622060 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 18 Apr 2022 10:44:36 +0200 Subject: [PATCH 0448/1346] Don't specify ce for MAY_BE_REF STATIC_PROP_FETCH This is unlikely to matter in practice (due to the short lifetime), but we should not specify a CE for a potential ref result. Fixes oss-fuzz #46810. --- Zend/Optimizer/zend_inference.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index cdf960aa7b955..6e3918b2e6093 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -3455,6 +3455,7 @@ static zend_always_inline zend_result _zend_update_type_info( if (opline->opcode != ZEND_FETCH_STATIC_PROP_R && opline->opcode != ZEND_FETCH_STATIC_PROP_IS) { tmp |= MAY_BE_REF | MAY_BE_INDIRECT; + ce = NULL; } else { if (!result_may_be_separated(ssa, ssa_op)) { tmp &= ~MAY_BE_RC1; From d87ba95acd00539b5db9008ff8c0edb1275dc737 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 22 Mar 2022 21:15:58 +0100 Subject: [PATCH 0449/1346] sapi/*: move duplicate "--define" code to library --- configure.ac | 1 + main/php_ini_builder.c | 82 +++++++++++++++++++++++++++++++++++ main/php_ini_builder.h | 95 +++++++++++++++++++++++++++++++++++++++++ sapi/cgi/cgi_main.c | 42 ++++-------------- sapi/cli/php_cli.c | 55 +++++------------------- sapi/fpm/fpm/fpm_main.c | 42 ++++-------------- sapi/phpdbg/phpdbg.c | 70 ++++++------------------------ win32/build/config.w32 | 1 + 8 files changed, 220 insertions(+), 168 deletions(-) create mode 100644 main/php_ini_builder.c create mode 100644 main/php_ini_builder.h diff --git a/configure.ac b/configure.ac index c2886439afa6b..9516b53f4771c 100644 --- a/configure.ac +++ b/configure.ac @@ -1610,6 +1610,7 @@ PHP_ADD_SOURCES(TSRM, TSRM.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c \ fopen_wrappers.c alloca.c php_scandir.c \ + php_ini_builder.c \ php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ strlcat.c explicit_bzero.c reentrancy.c php_variables.c php_ticks.c \ network.c php_open_temporary_file.c \ diff --git a/main/php_ini_builder.c b/main/php_ini_builder.c new file mode 100644 index 0000000000000..d214a340343fd --- /dev/null +++ b/main/php_ini_builder.c @@ -0,0 +1,82 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | https://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Max Kellermann | + +----------------------------------------------------------------------+ +*/ + +#include "php_ini_builder.h" + +#include +#include + +PHPAPI void php_ini_builder_prepend(struct php_ini_builder *b, const char *src, size_t length) +{ + php_ini_builder_realloc(b, length); + if (b->length > 0) + memmove(b->value + length, b->value, b->length); + memcpy(b->value, src, length); + b->length += length; +} + +PHPAPI void php_ini_builder_unquoted(struct php_ini_builder *b, const char *name, size_t name_length, const char *value, size_t value_length) +{ + php_ini_builder_realloc(b, name_length + 1 + value_length + 1); + + memcpy(b->value + b->length, name, name_length); + b->length += name_length; + + b->value[b->length++] = '='; + + memcpy(b->value + b->length, value, value_length); + b->length += value_length; + + b->value[b->length++] = '\n'; +} + +PHPAPI void php_ini_builder_quoted(struct php_ini_builder *b, const char *name, size_t name_length, const char *value, size_t value_length) +{ + php_ini_builder_realloc(b, name_length + 2 + value_length + 2); + + memcpy(b->value + b->length, name, name_length); + b->length += name_length; + + b->value[b->length++] = '='; + b->value[b->length++] = '"'; + + memcpy(b->value + b->length, value, value_length); + b->length += value_length; + + b->value[b->length++] = '"'; + b->value[b->length++] = '\n'; +} + +PHPAPI void php_ini_builder_define(struct php_ini_builder *b, const char *arg) +{ + const size_t len = strlen(arg); + const char *val = strchr(arg, '='); + + if (val != NULL) { + val++; + if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { + php_ini_builder_quoted(b, arg, val - arg - 1, val, arg + len - val); + } else { + php_ini_builder_realloc(b, len + strlen("\n")); + memcpy(b->value + b->length, arg, len); + b->length += len; + b->value[b->length++] = '\n'; + } + } else { + php_ini_builder_unquoted(b, arg, len, "1", 1); + } +} + diff --git a/main/php_ini_builder.h b/main/php_ini_builder.h new file mode 100644 index 0000000000000..7f5be81c10ac7 --- /dev/null +++ b/main/php_ini_builder.h @@ -0,0 +1,95 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | https://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Max Kellermann | + +----------------------------------------------------------------------+ +*/ + +#ifndef PHP_INI_BUILDER_H +#define PHP_INI_BUILDER_H + +#include "php.h" + +/** + * A class which helps with constructing INI entries from the command + * line. + */ +struct php_ini_builder { + char *value; + size_t length; +}; + +BEGIN_EXTERN_C() + +static inline void php_ini_builder_init(struct php_ini_builder *b) +{ + b->value = NULL; + b->length = 0; +} + +static inline void php_ini_builder_deinit(struct php_ini_builder *b) +{ + free(b->value); +} + +/** + * Null-terminate the buffer and return it. + */ +static inline char *php_ini_builder_finish(struct php_ini_builder *b) +{ + if (b->value != NULL) { + /* null-terminate the string */ + b->value[b->length] = '\0'; + } + + return b->value; +} + +/** + * Make room for more data. + * + * @param delta the number of bytes to be appended + */ +static inline void php_ini_builder_realloc(struct php_ini_builder *b, size_t delta) +{ + /* reserve enough space for the null terminator */ + b->value = realloc(b->value, b->length + delta + 1); +} + +/** + * Prepend a string. + * + * @param src the source string + * @param length the size of the source string + */ +PHPAPI void php_ini_builder_prepend(struct php_ini_builder *b, const char *src, size_t length); + +#define php_ini_builder_prepend_literal(b, l) php_ini_builder_prepend(b, l, strlen(l)) + +/** + * Append an unquoted name/value pair. + */ +PHPAPI void php_ini_builder_unquoted(struct php_ini_builder *b, const char *name, size_t name_length, const char *value, size_t value_length); + +/** + * Append a quoted name/value pair. + */ +PHPAPI void php_ini_builder_quoted(struct php_ini_builder *b, const char *name, size_t name_length, const char *value, size_t value_length); + +/** + * Parse an INI entry from the command-line option "--define". + */ +PHPAPI void php_ini_builder_define(struct php_ini_builder *b, const char *arg); + +END_EXTERN_C() + +#endif diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 7d5f444d1c54a..ef6a62be73c8a 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -22,6 +22,7 @@ #include "php.h" #include "php_globals.h" #include "php_variables.h" +#include "php_ini_builder.h" #include "zend_modules.h" #include "SAPI.h" @@ -1727,7 +1728,7 @@ int main(int argc, char *argv[]) int orig_optind = php_optind; char *orig_optarg = php_optarg; char *script_file = NULL; - size_t ini_entries_len = 0; + struct php_ini_builder ini_builder; /* end of temporary locals */ int max_requests = 500; @@ -1812,6 +1813,8 @@ int main(int argc, char *argv[]) free(decoded_query_string); } + php_ini_builder_init(&ini_builder); + while (!skip_getopt && (c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (c) { case 'c': @@ -1823,37 +1826,10 @@ int main(int argc, char *argv[]) case 'n': cgi_sapi_module.php_ini_ignore = 1; break; - case 'd': { + case 'd': /* define ini entries on command line */ - size_t len = strlen(php_optarg); - char *val; - - if ((val = strchr(php_optarg, '='))) { - val++; - if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { - cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("\"\"\n\0")); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, (val - php_optarg)); - ini_entries_len += (val - php_optarg); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, "\"", 1); - ini_entries_len++; - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, val, len - (val - php_optarg)); - ini_entries_len += len - (val - php_optarg); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); - ini_entries_len += sizeof("\n\0\"") - 2; - } else { - cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("\n\0")); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); - ini_entries_len += len + sizeof("\n\0") - 2; - } - } else { - cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("=1\n\0")); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); - ini_entries_len += len + sizeof("=1\n\0") - 2; - } + php_ini_builder_define(&ini_builder, php_optarg); break; - } /* if we're started on command line, check to see if * we are being started as an 'external' fastcgi * server by accepting a bindpath parameter. */ @@ -1870,6 +1846,8 @@ int main(int argc, char *argv[]) php_optind = orig_optind; php_optarg = orig_optarg; + cgi_sapi_module.ini_entries = php_ini_builder_finish(&ini_builder); + if (fastcgi || bindpath) { /* Override SAPI callbacks */ cgi_sapi_module.ub_write = sapi_fcgi_ub_write; @@ -2619,9 +2597,7 @@ consult the installation file that came with this distribution, or visit \n\ if (cgi_sapi_module.php_ini_path_override) { free(cgi_sapi_module.php_ini_path_override); } - if (cgi_sapi_module.ini_entries) { - free(cgi_sapi_module.ini_entries); - } + php_ini_builder_deinit(&ini_builder); } zend_catch { exit_status = 255; } zend_end_try(); diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index fdd604cec53b0..97955eadd1f1b 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -21,6 +21,7 @@ #include "php.h" #include "php_globals.h" #include "php_variables.h" +#include "php_ini_builder.h" #include "zend_hash.h" #include "zend_modules.h" #include "zend_interfaces.h" @@ -131,7 +132,7 @@ const char HARDCODED_INI[] = "implicit_flush=1\n" "output_buffering=0\n" "max_execution_time=0\n" - "max_input_time=-1\n\0"; + "max_input_time=-1\n"; const opt_struct OPTIONS[] = { @@ -1176,8 +1177,7 @@ int main(int argc, char *argv[]) char *php_optarg = NULL; int php_optind = 1, use_extended_info = 0; char *ini_path_override = NULL; - char *ini_entries = NULL; - size_t ini_entries_len = 0; + struct php_ini_builder ini_builder; int ini_ignore = 0; sapi_module_struct *sapi_module = &cli_sapi_module; @@ -1239,6 +1239,8 @@ int main(int argc, char *argv[]) setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */ #endif + php_ini_builder_init(&ini_builder); + while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 1, 2))!=-1) { switch (c) { case 'c': @@ -1250,37 +1252,10 @@ int main(int argc, char *argv[]) case 'n': ini_ignore = 1; break; - case 'd': { + case 'd': /* define ini entries on command line */ - size_t len = strlen(php_optarg); - char *val; - - if ((val = strchr(php_optarg, '='))) { - val++; - if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { - ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\"\"\n\0")); - memcpy(ini_entries + ini_entries_len, php_optarg, (val - php_optarg)); - ini_entries_len += (val - php_optarg); - memcpy(ini_entries + ini_entries_len, "\"", 1); - ini_entries_len++; - memcpy(ini_entries + ini_entries_len, val, len - (val - php_optarg)); - ini_entries_len += len - (val - php_optarg); - memcpy(ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); - ini_entries_len += sizeof("\n\0\"") - 2; - } else { - ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\n\0")); - memcpy(ini_entries + ini_entries_len, php_optarg, len); - memcpy(ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); - ini_entries_len += len + sizeof("\n\0") - 2; - } - } else { - ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("=1\n\0")); - memcpy(ini_entries + ini_entries_len, php_optarg, len); - memcpy(ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); - ini_entries_len += len + sizeof("=1\n\0") - 2; - } + php_ini_builder_define(&ini_builder, php_optarg); break; - } #ifndef PHP_CLI_WIN32_NO_CONSOLE case 'S': sapi_module = &cli_server_sapi_module; @@ -1317,18 +1292,10 @@ int main(int argc, char *argv[]) sapi_module->executable_location = argv[0]; if (sapi_module == &cli_sapi_module) { - if (ini_entries) { - ini_entries = realloc(ini_entries, ini_entries_len + sizeof(HARDCODED_INI)); - memmove(ini_entries + sizeof(HARDCODED_INI) - 2, ini_entries, ini_entries_len + 1); - memcpy(ini_entries, HARDCODED_INI, sizeof(HARDCODED_INI) - 2); - } else { - ini_entries = malloc(sizeof(HARDCODED_INI)); - memcpy(ini_entries, HARDCODED_INI, sizeof(HARDCODED_INI)); - } - ini_entries_len += sizeof(HARDCODED_INI) - 2; + php_ini_builder_prepend_literal(&ini_builder, HARDCODED_INI); } - sapi_module->ini_entries = ini_entries; + sapi_module->ini_entries = php_ini_builder_finish(&ini_builder); /* startup after we get the above ini override se we get things right */ if (sapi_module->startup(sapi_module) == FAILURE) { @@ -1375,9 +1342,7 @@ int main(int argc, char *argv[]) if (ini_path_override) { free(ini_path_override); } - if (ini_entries) { - free(ini_entries); - } + php_ini_builder_deinit(&ini_builder); if (module_started) { php_module_shutdown(); } diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index 657ff72b673a1..fe8195d1a8d66 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -22,6 +22,7 @@ #include "php.h" #include "php_globals.h" #include "php_variables.h" +#include "php_ini_builder.h" #include "zend_modules.h" #include "php.h" #include "zend_ini_scanner.h" @@ -1517,7 +1518,7 @@ int main(int argc, char *argv[]) /* temporary locals */ int orig_optind = php_optind; char *orig_optarg = php_optarg; - int ini_entries_len = 0; + struct php_ini_builder ini_builder; /* end of temporary locals */ int max_requests = 0; @@ -1567,6 +1568,8 @@ int main(int argc, char *argv[]) fcgi_init(); + php_ini_builder_init(&ini_builder); + while ((c = php_getopt(argc, argv, OPTIONS, &php_optarg, &php_optind, 0, 2)) != -1) { switch (c) { case 'c': @@ -1580,37 +1583,10 @@ int main(int argc, char *argv[]) cgi_sapi_module.php_ini_ignore = 1; break; - case 'd': { + case 'd': /* define ini entries on command line */ - int len = strlen(php_optarg); - char *val; - - if ((val = strchr(php_optarg, '='))) { - val++; - if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { - cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("\"\"\n\0")); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, (val - php_optarg)); - ini_entries_len += (val - php_optarg); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, "\"", 1); - ini_entries_len++; - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, val, len - (val - php_optarg)); - ini_entries_len += len - (val - php_optarg); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); - ini_entries_len += sizeof("\n\0\"") - 2; - } else { - cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("\n\0")); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); - ini_entries_len += len + sizeof("\n\0") - 2; - } - } else { - cgi_sapi_module.ini_entries = realloc(cgi_sapi_module.ini_entries, ini_entries_len + len + sizeof("=1\n\0")); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len, php_optarg, len); - memcpy(cgi_sapi_module.ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); - ini_entries_len += len + sizeof("=1\n\0") - 2; - } + php_ini_builder_define(&ini_builder, php_optarg); break; - } case 'y': fpm_config = php_optarg; @@ -1703,6 +1679,8 @@ int main(int argc, char *argv[]) } } + cgi_sapi_module.ini_entries = php_ini_builder_finish(&ini_builder); + if (php_information) { cgi_sapi_module.phpinfo_as_text = 1; cgi_sapi_module.startup(&cgi_sapi_module); @@ -1957,9 +1935,7 @@ consult the installation file that came with this distribution, or visit \n\ if (cgi_sapi_module.php_ini_path_override) { free(cgi_sapi_module.php_ini_path_override); } - if (cgi_sapi_module.ini_entries) { - free(cgi_sapi_module.ini_entries); - } + php_ini_builder_deinit(&ini_builder); } zend_catch { exit_status = FPM_EXIT_SOFTWARE; } zend_end_try(); diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index 42a2a9c036432..e8d796771f9b5 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -29,6 +29,7 @@ #include "phpdbg_help.h" #include "phpdbg_arginfo.h" #include "zend_vm.h" +#include "php_ini_builder.h" #include "ext/standard/basic_functions.h" @@ -995,7 +996,7 @@ const char phpdbg_ini_hardcoded[] = "max_execution_time=0\n" "max_input_time=-1\n" "error_log=\n" -"output_buffering=off\n\0"; +"output_buffering=off\n"; static void phpdbg_welcome(bool cleaning) /* {{{ */ { @@ -1122,8 +1123,7 @@ int main(int argc, char **argv) /* {{{ */ { sapi_module_struct *phpdbg = &phpdbg_sapi_module; char *sapi_name; - char *ini_entries; - int ini_entries_len; + struct php_ini_builder ini_builder; char **zend_extensions = NULL; zend_ulong zend_extensions_len = 0L; bool ini_ignore; @@ -1174,8 +1174,7 @@ int main(int argc, char **argv) /* {{{ */ zend_signal_startup(); - ini_entries = NULL; - ini_entries_len = 0; + php_ini_builder_init(&ini_builder); ini_ignore = 0; ini_override = NULL; zend_extensions = NULL; @@ -1210,35 +1209,10 @@ int main(int argc, char **argv) /* {{{ */ } ini_override = strdup(php_optarg); break; - case 'd': { - int len = strlen(php_optarg); - char *val; - - if ((val = strchr(php_optarg, '='))) { - val++; - if (!isalnum(*val) && *val != '"' && *val != '\'' && *val != '\0') { - ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\"\"\n\0")); - memcpy(ini_entries + ini_entries_len, php_optarg, (val - php_optarg)); - ini_entries_len += (val - php_optarg); - memcpy(ini_entries + ini_entries_len, "\"", 1); - ini_entries_len++; - memcpy(ini_entries + ini_entries_len, val, len - (val - php_optarg)); - ini_entries_len += len - (val - php_optarg); - memcpy(ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); - ini_entries_len += sizeof("\n\0\"") - 2; - } else { - ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("\n\0")); - memcpy(ini_entries + ini_entries_len, php_optarg, len); - memcpy(ini_entries + ini_entries_len + len, "\n\0", sizeof("\n\0")); - ini_entries_len += len + sizeof("\n\0") - 2; - } - } else { - ini_entries = realloc(ini_entries, ini_entries_len + len + sizeof("=1\n\0")); - memcpy(ini_entries + ini_entries_len, php_optarg, len); - memcpy(ini_entries + ini_entries_len + len, "=1\n\0", sizeof("=1\n\0")); - ini_entries_len += len + sizeof("=1\n\0") - 2; - } - } break; + case 'd': + /* define ini entries on command line */ + php_ini_builder_define(&ini_builder, php_optarg); + break; case 'z': zend_extensions_len++; @@ -1339,15 +1313,7 @@ int main(int argc, char **argv) /* {{{ */ phpdbg->php_ini_ignore = ini_ignore; phpdbg->php_ini_path_override = ini_override; - if (ini_entries) { - ini_entries = realloc(ini_entries, ini_entries_len + sizeof(phpdbg_ini_hardcoded)); - memmove(ini_entries + sizeof(phpdbg_ini_hardcoded) - 2, ini_entries, ini_entries_len + 1); - memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded) - 2); - } else { - ini_entries = malloc(sizeof(phpdbg_ini_hardcoded)); - memcpy(ini_entries, phpdbg_ini_hardcoded, sizeof(phpdbg_ini_hardcoded)); - } - ini_entries_len += sizeof(phpdbg_ini_hardcoded) - 2; + php_ini_builder_prepend_literal(&ini_builder, phpdbg_ini_hardcoded); if (zend_extensions_len) { zend_ulong zend_extension = 0L; @@ -1356,13 +1322,7 @@ int main(int argc, char **argv) /* {{{ */ const char *ze = zend_extensions[zend_extension]; size_t ze_len = strlen(ze); - ini_entries = realloc( - ini_entries, ini_entries_len + (ze_len + (sizeof("zend_extension=\n")))); - memcpy(&ini_entries[ini_entries_len], "zend_extension=", (sizeof("zend_extension=\n")-1)); - ini_entries_len += (sizeof("zend_extension=")-1); - memcpy(&ini_entries[ini_entries_len], ze, ze_len); - ini_entries_len += ze_len; - memcpy(&ini_entries[ini_entries_len], "\n", (sizeof("\n") - 1)); + php_ini_builder_unquoted(&ini_builder, "zend_extension", strlen("zend_extension"), ze, ze_len); free(zend_extensions[zend_extension]); zend_extension++; @@ -1371,7 +1331,7 @@ int main(int argc, char **argv) /* {{{ */ free(zend_extensions); } - phpdbg->ini_entries = ini_entries; + phpdbg->ini_entries = php_ini_builder_finish(&ini_builder); ZEND_INIT_MODULE_GLOBALS(phpdbg, php_phpdbg_globals_ctor, NULL); @@ -1421,9 +1381,7 @@ int main(int argc, char **argv) /* {{{ */ } sapi_deactivate(); sapi_shutdown(); - if (ini_entries) { - free(ini_entries); - } + php_ini_builder_deinit(&ini_builder); if (ini_override) { free(ini_override); } @@ -1698,9 +1656,7 @@ int main(int argc, char **argv) /* {{{ */ efree(SG(request_info).argv); } - if (ini_entries) { - free(ini_entries); - } + php_ini_builder_deinit(&ini_builder); if (ini_override) { free(ini_override); diff --git a/win32/build/config.w32 b/win32/build/config.w32 index b28a97672e3ff..9f281390c43a9 100644 --- a/win32/build/config.w32 +++ b/win32/build/config.w32 @@ -261,6 +261,7 @@ if (VS_TOOLSET && VCVERS >= 1914) { //AC_DEFINE('ZEND_DVAL_TO_LVAL_CAST_OK', 1); ADD_SOURCES("main", "main.c snprintf.c spprintf.c getopt.c fopen_wrappers.c \ + php_ini_builder.c \ php_scandir.c php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ strlcat.c reentrancy.c php_variables.c php_ticks.c network.c \ php_open_temporary_file.c output.c internal_functions.c \ From a8b6aea5a2ae99e4185c606eb95fde015eee4052 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 18 Apr 2022 18:24:52 +0200 Subject: [PATCH 0450/1346] Remove unused macros --- Zend/Optimizer/optimize_func_calls.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Zend/Optimizer/optimize_func_calls.c b/Zend/Optimizer/optimize_func_calls.c index c637dde5d721a..b46b965d2fd87 100644 --- a/Zend/Optimizer/optimize_func_calls.c +++ b/Zend/Optimizer/optimize_func_calls.c @@ -28,13 +28,6 @@ #include "zend_execute.h" #include "zend_vm.h" -#define ZEND_OP1_IS_CONST_STRING(opline) \ - (opline->op1_type == IS_CONST && \ - Z_TYPE(op_array->literals[(opline)->op1.constant]) == IS_STRING) -#define ZEND_OP2_IS_CONST_STRING(opline) \ - (opline->op2_type == IS_CONST && \ - Z_TYPE(op_array->literals[(opline)->op2.constant]) == IS_STRING) - typedef struct _optimizer_call_info { zend_function *func; zend_op *opline; From 8f02d7b7e499490312969cdfa9a3a81b9458595a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 18 Apr 2022 18:30:36 +0200 Subject: [PATCH 0451/1346] Remove unnecessary bailout in fcall optimization Even if we can't optimize the SEND_VAL_EX, there is no reason to skip the INIT_FCALL/DO_FCALL optimizations, those should be entirely orthogonal. --- Zend/Optimizer/optimize_func_calls.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Zend/Optimizer/optimize_func_calls.c b/Zend/Optimizer/optimize_func_calls.c index b46b965d2fd87..200b5a6ff83f4 100644 --- a/Zend/Optimizer/optimize_func_calls.c +++ b/Zend/Optimizer/optimize_func_calls.c @@ -264,10 +264,7 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx) } if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) { - if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) { - /* We won't convert it into_DO_FCALL to emit error at run-time */ - call_stack[call - 1].opline = NULL; - } else { + if (!ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) { opline->opcode = ZEND_SEND_VAL; } } From c2547ab7dc67646e287d430e44798cb9f327cf21 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 20 Apr 2022 15:56:51 +0100 Subject: [PATCH 0452/1346] Add some const qualifiers in zend_string/hash (#8304) Co-authored-by: Levi Morrison --- Zend/zend_hash.c | 29 ++++++++++++++--------------- Zend/zend_hash.h | 2 +- Zend/zend_string.c | 14 +++++++------- Zend/zend_string.h | 8 ++++---- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index eca8812325db8..fe4af53ecbdcc 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -655,21 +655,18 @@ ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosit } } -static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zend_string *key, bool known_hash) +/* Hash must be known and precomputed before */ +static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, const zend_string *key) { - zend_ulong h; + zend_ulong key_hash = ZSTR_H(key); uint32_t nIndex; uint32_t idx; Bucket *p, *arData; - if (known_hash) { - h = ZSTR_H(key); - ZEND_ASSERT(h != 0 && "Hash must be known"); - } else { - h = zend_string_hash_val(key); - } + ZEND_ASSERT(key_hash != 0 && "Hash must be known"); + arData = ht->arData; - nIndex = h | ht->nTableMask; + nIndex = key_hash | ht->nTableMask; idx = HT_HASH_EX(arData, nIndex); if (UNEXPECTED(idx == HT_INVALID_IDX)) { @@ -681,7 +678,7 @@ static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zen } while (1) { - if (p->h == ZSTR_H(key) && + if (p->h == key_hash && EXPECTED(p->key) && zend_string_equal_content(p->key, key)) { return p; @@ -758,7 +755,7 @@ static zend_always_inline zval *_zend_hash_add_or_update_i(HashTable *ht, zend_s zend_hash_packed_to_hash(ht); } } else if ((flag & HASH_ADD_NEW) == 0 || ZEND_DEBUG) { - p = zend_hash_find_bucket(ht, key, 1); + p = zend_hash_find_bucket(ht, key); if (p) { zval *data; @@ -1166,7 +1163,8 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_set_bucket_key(HashTable *ht, Bucket *b, HT_ASSERT_RC1(ht); ZEND_ASSERT(!HT_IS_PACKED(ht)); - p = zend_hash_find_bucket(ht, key, 0); + (void)zend_string_hash_val(key); + p = zend_hash_find_bucket(ht, key); if (UNEXPECTED(p)) { return (p == b) ? &p->val : NULL; } @@ -2526,17 +2524,18 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *ke IS_CONSISTENT(ht); - p = zend_hash_find_bucket(ht, key, 0); + (void)zend_string_hash_val(key); + p = zend_hash_find_bucket(ht, key); return p ? &p->val : NULL; } -ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, zend_string *key) +ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key) { Bucket *p; IS_CONSISTENT(ht); - p = zend_hash_find_bucket(ht, key, 1); + p = zend_hash_find_bucket(ht, key); return p ? &p->val : NULL; } diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index e004439029f6e..02244380da10f 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -179,7 +179,7 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulon ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulong h); /* The same as zend_hash_find(), but hash value of the key must be already calculated. */ -ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, zend_string *key); +ZEND_API zval* ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key); static zend_always_inline zval *zend_hash_find_ex(const HashTable *ht, zend_string *key, bool known_hash) { diff --git a/Zend/zend_string.c b/Zend/zend_string.c index 1284e908a55b1..d34d4b7af9ba9 100644 --- a/Zend/zend_string.c +++ b/Zend/zend_string.c @@ -370,16 +370,16 @@ ZEND_API void zend_interned_strings_switch_storage(bool request) # define I_REPLACE_SONAME_FNNAME_ZU(soname, fnname) _vgr00000ZU_ ## soname ## _ ## fnname #endif -ZEND_API bool ZEND_FASTCALL I_REPLACE_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(zend_string *s1, zend_string *s2) +ZEND_API bool ZEND_FASTCALL I_REPLACE_SONAME_FNNAME_ZU(NONE,zend_string_equal_val)(const zend_string *s1, const zend_string *s2) { return !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1)); } #if defined(__GNUC__) && defined(__i386__) -ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2) +ZEND_API bool ZEND_FASTCALL zend_string_equal_val(const zend_string *s1, const zend_string *s2) { - char *ptr = ZSTR_VAL(s1); - size_t delta = (char*)s2 - (char*)s1; + const char *ptr = ZSTR_VAL(s1); + size_t delta = (const char*)s2 - (const char*)s1; size_t len = ZSTR_LEN(s1); zend_ulong ret; @@ -414,10 +414,10 @@ ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string * } #elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__) -ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2) +ZEND_API bool ZEND_FASTCALL zend_string_equal_val(const zend_string *s1, const zend_string *s2) { - char *ptr = ZSTR_VAL(s1); - size_t delta = (char*)s2 - (char*)s1; + const char *ptr = ZSTR_VAL(s1); + size_t delta = (const char*)s2 - (const char*)s1; size_t len = ZSTR_LEN(s1); zend_ulong ret; diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 06a4edc01ae51..1a1c0cd7a67bf 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -346,21 +346,21 @@ static zend_always_inline bool zend_string_equals_cstr(const zend_string *s1, co #if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__))) BEGIN_EXTERN_C() -ZEND_API bool ZEND_FASTCALL zend_string_equal_val(zend_string *s1, zend_string *s2); +ZEND_API bool ZEND_FASTCALL zend_string_equal_val(const zend_string *s1, const zend_string *s2); END_EXTERN_C() #else -static zend_always_inline bool zend_string_equal_val(zend_string *s1, zend_string *s2) +static zend_always_inline bool zend_string_equal_val(const zend_string *s1, const zend_string *s2) { return !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1)); } #endif -static zend_always_inline bool zend_string_equal_content(zend_string *s1, zend_string *s2) +static zend_always_inline bool zend_string_equal_content(const zend_string *s1, const zend_string *s2) { return ZSTR_LEN(s1) == ZSTR_LEN(s2) && zend_string_equal_val(s1, s2); } -static zend_always_inline bool zend_string_equals(zend_string *s1, zend_string *s2) +static zend_always_inline bool zend_string_equals(const zend_string *s1, const zend_string *s2) { return s1 == s2 || zend_string_equal_content(s1, s2); } From 7061c40f43ad5bd5c6dd4b68bff182a4f35b122e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 20 Apr 2022 17:43:10 +0100 Subject: [PATCH 0453/1346] [skip-ci] update UPGRADING --- UPGRADING | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/UPGRADING b/UPGRADING index 3be20e6558323..b74afffd4539a 100644 --- a/UPGRADING +++ b/UPGRADING @@ -35,6 +35,10 @@ PHP 8.2 UPGRADE NOTES * SplFileObject::ftell() * SplFileObject::fgetc() * SplFileObject::fpassthru() + . SplFileObject::hasChildren() now has a tentative return type of false, + previously it was bool + . SplFileObject::getChildren() now has a tentative return type of null, + previously it was ?RecursiveIterator ======================================== 2. New Features @@ -44,6 +48,8 @@ PHP 8.2 UPGRADE NOTES . Added the #[\SensitiveParameter] attribute to redact sensitive data in backtraces. RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces + . It is now possible to use null and false as standalone types. + RFC: https://wiki.php.net/rfc/null-false-standalone-types - Curl: . Added CURLINFO_EFFECTIVE_METHOD option and returning the effective From 7a45dcfe2e71b71c0bb1f214f3079b9d427d4d46 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 24 Dec 2021 10:14:48 +0000 Subject: [PATCH 0454/1346] Introduce CURLOPT_XFERINFOFUNCTION `CURLOPT_XFERINFOFUNCTION` is available as of cURL 7.32.0, and supersedes `CURLOPT_PROGRESSFUNCTION` which is still supported by latest cURL, though. Closes GH-7823. --- NEWS | 3 + UPGRADING | 3 + ext/curl/curl_private.h | 5 +- ext/curl/interface.c | 104 +++++++++++++++++- ext/curl/sync-constants.php | 3 +- ext/curl/tests/curl_copy_handle_xferinfo.phpt | 27 +++++ 6 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 ext/curl/tests/curl_copy_handle_xferinfo.phpt diff --git a/NEWS b/NEWS index b1d63069e281b..ef271cb59f49d 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,9 @@ PHP NEWS . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) +- Curl: + . Added support for CURLOPT_XFERINFOFUNCTION. (David Carlier) + - FPM: . Emit error for invalid port setting. (David Carlier) . Added extra check for FPM proc dumpable on SELinux based systems. diff --git a/UPGRADING b/UPGRADING index b74afffd4539a..68acde170ec6e 100644 --- a/UPGRADING +++ b/UPGRADING @@ -183,6 +183,9 @@ PHP 8.2 UPGRADE NOTES - COM_DOTNET: . LOCALE_NEUTRAL +- Curl: + . CURLOPT_XFERINFOFUNCTION + - Sockets: . SO_INCOMING_CPU diff --git a/ext/curl/curl_private.h b/ext/curl/curl_private.h index 842ee5fb79c2a..edf19c86f8354 100644 --- a/ext/curl/curl_private.h +++ b/ext/curl/curl_private.h @@ -73,9 +73,10 @@ typedef struct { php_curl_read *read; zval std_err; php_curl_callback *progress; -#if LIBCURL_VERSION_NUM >= 0x071500 /* Available since 7.21.0 */ - php_curl_callback *fnmatch; +#if LIBCURL_VERSION_NUM >= 0x072000 + php_curl_callback *xferinfo; #endif + php_curl_callback *fnmatch; } php_curl_handlers; struct _php_curl_error { diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 0062586c64ec9..7b1599839fa02 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -456,6 +456,9 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURLOPT_VERBOSE); REGISTER_CURL_CONSTANT(CURLOPT_WRITEFUNCTION); REGISTER_CURL_CONSTANT(CURLOPT_WRITEHEADER); +#if LIBCURL_VERSION_NUM >= 0x072000 + REGISTER_CURL_CONSTANT(CURLOPT_XFERINFOFUNCTION); +#endif /* */ REGISTER_CURL_CONSTANT(CURLE_ABORTED_BY_CALLBACK); @@ -1287,11 +1290,15 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n) zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.progress->func_name); } -#if LIBCURL_VERSION_NUM >= 0x071500 +#if LIBCURL_VERSION_NUM >= 0x072000 + if (curl->handlers.xferinfo) { + zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.xferinfo->func_name); + } +#endif + if (curl->handlers.fnmatch) { zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.fnmatch->func_name); } -#endif zend_get_gc_buffer_add_zval(gc_buffer, &curl->handlers.std_err); zend_get_gc_buffer_add_zval(gc_buffer, &curl->private_data); @@ -1496,6 +1503,56 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double } /* }}} */ +#if LIBCURL_VERSION_NUM >= 0x072000 +/* {{{ curl_xferinfo */ +static size_t curl_xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) +{ + php_curl *ch = (php_curl *)clientp; + php_curl_callback *t = ch->handlers.xferinfo; + size_t rval = 0; + +#if PHP_CURL_DEBUG + fprintf(stderr, "curl_xferinfo() called\n"); + fprintf(stderr, "clientp = %x, dltotal = %ld, dlnow = %ld, ultotal = %ld, ulnow = %ld\n", clientp, dltotal, dlnow, ultotal, ulnow); +#endif + + zval argv[5]; + zval retval; + zend_result error; + zend_fcall_info fci; + + GC_ADDREF(&ch->std); + ZVAL_OBJ(&argv[0], &ch->std); + ZVAL_LONG(&argv[1], dltotal); + ZVAL_LONG(&argv[2], dlnow); + ZVAL_LONG(&argv[3], ultotal); + ZVAL_LONG(&argv[4], ulnow); + + fci.size = sizeof(fci); + ZVAL_COPY_VALUE(&fci.function_name, &t->func_name); + fci.object = NULL; + fci.retval = &retval; + fci.param_count = 5; + fci.params = argv; + fci.named_params = NULL; + + ch->in_callback = 1; + error = zend_call_function(&fci, &t->fci_cache); + ch->in_callback = 0; + if (error == FAILURE) { + php_error_docref(NULL, E_WARNING, "Cannot call the CURLOPT_XFERINFOFUNCTION"); + } else if (!Z_ISUNDEF(retval)) { + _php_curl_verify_handlers(ch, /* reporterror */ true); + if (0 != zval_get_long(&retval)) { + rval = 1; + } + } + zval_ptr_dtor(&argv[0]); + return rval; +} +/* }}} */ +#endif + /* {{{ curl_read */ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx) { @@ -1753,6 +1810,9 @@ void init_curl_handle(php_curl *ch) ch->handlers.write_header = ecalloc(1, sizeof(php_curl_write)); ch->handlers.read = ecalloc(1, sizeof(php_curl_read)); ch->handlers.progress = NULL; +#if LIBCURL_VERSION_NUM >= 0x072000 + ch->handlers.xferinfo = NULL; +#endif ch->handlers.fnmatch = NULL; ch->clone = emalloc(sizeof(uint32_t)); *ch->clone = 1; @@ -1925,6 +1985,16 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source) curl_easy_setopt(ch->cp, CURLOPT_PROGRESSDATA, (void *) ch); } +#if LIBCURL_VERSION_NUM >= 0x072000 + if (source->handlers.xferinfo) { + ch->handlers.xferinfo = ecalloc(1, sizeof(php_curl_callback)); + if (!Z_ISUNDEF(source->handlers.xferinfo->func_name)) { + ZVAL_COPY(&ch->handlers.xferinfo->func_name, &source->handlers.xferinfo->func_name); + } + curl_easy_setopt(ch->cp, CURLOPT_XFERINFODATA, (void *) ch); + } +#endif + if (source->handlers.fnmatch) { ch->handlers.fnmatch = ecalloc(1, sizeof(php_curl_callback)); if (!Z_ISUNDEF(source->handlers.fnmatch->func_name)) { @@ -2884,6 +2954,20 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue ch->handlers.write->method = PHP_CURL_USER; break; +#if LIBCURL_VERSION_NUM >= 0x072000 + case CURLOPT_XFERINFOFUNCTION: + curl_easy_setopt(ch->cp, CURLOPT_XFERINFOFUNCTION, curl_xferinfo); + curl_easy_setopt(ch->cp, CURLOPT_XFERINFODATA, ch); + if (ch->handlers.xferinfo == NULL) { + ch->handlers.xferinfo = ecalloc(1, sizeof(php_curl_callback)); + } else if (!Z_ISUNDEF(ch->handlers.xferinfo->func_name)) { + zval_ptr_dtor(&ch->handlers.xferinfo->func_name); + ch->handlers.xferinfo->fci_cache = empty_fcall_info_cache; + } + ZVAL_COPY(&ch->handlers.xferinfo->func_name, zvalue); + break; +#endif + /* Curl off_t options */ case CURLOPT_MAX_RECV_SPEED_LARGE: case CURLOPT_MAX_SEND_SPEED_LARGE: @@ -3521,6 +3605,13 @@ static void curl_free_obj(zend_object *object) efree(ch->handlers.progress); } +#if LIBCURL_VERSION_NUM >= 0x072000 + if (ch->handlers.xferinfo) { + zval_ptr_dtor(&ch->handlers.xferinfo->func_name); + efree(ch->handlers.xferinfo); + } +#endif + if (ch->handlers.fnmatch) { zval_ptr_dtor(&ch->handlers.fnmatch->func_name); efree(ch->handlers.fnmatch); @@ -3593,12 +3684,19 @@ static void _php_curl_reset_handlers(php_curl *ch) ch->handlers.progress = NULL; } +#if LIBCURL_VERSION_NUM >= 0x072000 + if (ch->handlers.xferinfo) { + zval_ptr_dtor(&ch->handlers.xferinfo->func_name); + efree(ch->handlers.xferinfo); + ch->handlers.xferinfo = NULL; + } +#endif + if (ch->handlers.fnmatch) { zval_ptr_dtor(&ch->handlers.fnmatch->func_name); efree(ch->handlers.fnmatch); ch->handlers.fnmatch = NULL; } - } /* }}} */ diff --git a/ext/curl/sync-constants.php b/ext/curl/sync-constants.php index 035dbcf6a237d..2ed2efb18a24d 100755 --- a/ext/curl/sync-constants.php +++ b/ext/curl/sync-constants.php @@ -15,7 +15,8 @@ const MIN_SUPPORTED_CURL_VERSION = '7.29.0'; const IGNORED_CONSTANTS = [ - 'CURLOPT_PROGRESSDATA' + 'CURLOPT_PROGRESSDATA', + 'CURLOPT_XFERINFODATA' ]; const CONSTANTS_REGEX_PATTERN = '~^CURL(?:OPT|_VERSION)_[A-Z0-9_]+$~'; diff --git a/ext/curl/tests/curl_copy_handle_xferinfo.phpt b/ext/curl/tests/curl_copy_handle_xferinfo.phpt new file mode 100644 index 0000000000000..55050551b797e --- /dev/null +++ b/ext/curl/tests/curl_copy_handle_xferinfo.phpt @@ -0,0 +1,27 @@ +--TEST-- +Test curl_copy_handle() with CURLOPT_XFERINFOFUNCTION +--EXTENSIONS-- +curl +--FILE-- + +--EXPECT-- +Download progress! +Hello World! +Hello World! +Hello World! +Hello World! From 25cb9cdb79c5bba65689954ed48db5b507727189 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Mon, 21 Mar 2022 15:13:07 +0100 Subject: [PATCH 0455/1346] Fix GH-8232 - always reference classes in `var_export()` via their FQCN Closes GH-8233 This fix corrects a behavior of `var_export()` that was mostly "hidden" until PHP 8.1 introduced: * properties with object initializers * constants containing object references * default values of class properties containing `enum`s Since `var_export(..., true)` is mostly used in conjunction with code generation, and we cannot make assumptions about the generated code being placed in the root namespace, we must always provide the FQCN of a class in exported code. For example: ```php --EXPECTF-- -Exception::__set_state(array( +\Exception::__set_state(array( 'message' => '', 'string' => 'Exception in %sbug73350.php:%d Stack trace: diff --git a/Zend/tests/enum/enum-in-var-export.phpt b/Zend/tests/enum/enum-in-var-export.phpt new file mode 100644 index 0000000000000..a45567c544933 --- /dev/null +++ b/Zend/tests/enum/enum-in-var-export.phpt @@ -0,0 +1,28 @@ +--TEST-- +Enum in var_export() +--FILE-- + +--EXPECT-- +\Foo::BAR +\A\Foo::BAR +\A\B\Foo::BAR diff --git a/Zend/tests/enum/var_export.phpt b/Zend/tests/enum/var_export.phpt index 7a5a01fc28a23..d45b6d321d8ec 100644 --- a/Zend/tests/enum/var_export.phpt +++ b/Zend/tests/enum/var_export.phpt @@ -14,8 +14,8 @@ echo str_replace(" \n", "\n", var_export([Foo::Bar], true)); ?> --EXPECT-- -Foo::Bar +\Foo::Bar array ( 0 => - Foo::Bar, + \Foo::Bar, ) diff --git a/Zend/tests/function_arguments/sensitive_parameter_value.phpt b/Zend/tests/function_arguments/sensitive_parameter_value.phpt index 2ae68e8ee62e9..accf19338a521 100644 --- a/Zend/tests/function_arguments/sensitive_parameter_value.phpt +++ b/Zend/tests/function_arguments/sensitive_parameter_value.phpt @@ -33,7 +33,7 @@ object(SensitiveParameterValue)#%d (%d) refcount(%d){ SensitiveParameterValue Object # var_export() -SensitiveParameterValue::__set_state(array( +\SensitiveParameterValue::__set_state(array( )) # (array) / json_encode() diff --git a/ext/date/tests/bug52113.phpt b/ext/date/tests/bug52113.phpt index f6d0962625db4..84cd1b5210157 100644 --- a/ext/date/tests/bug52113.phpt +++ b/ext/date/tests/bug52113.phpt @@ -16,7 +16,7 @@ $diff_un = unserialize($diff_s); $p = new DatePeriod($start, $diff_un, 2); var_dump($diff_un, $p); -$unser = DateInterval::__set_state(array( +$unser = \DateInterval::__set_state(array( 'y' => 7, 'm' => 6, 'd' => 5, @@ -68,7 +68,7 @@ object(DateInterval)#%d (16) { int(0) } string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" -DateInterval::__set_state(array( +\DateInterval::__set_state(array( 'y' => 0, 'm' => 0, 'd' => 0, diff --git a/ext/intl/tests/dateformat_format.phpt b/ext/intl/tests/dateformat_format.phpt index a545d909b8f12..98b3d5bb078b5 100644 --- a/ext/intl/tests/dateformat_format.phpt +++ b/ext/intl/tests/dateformat_format.phpt @@ -318,7 +318,7 @@ Formatted localtime_array is : 12/17/95 12:13 AM IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 Formatted localtime_array is : 18951217 12:13 AM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -326,7 +326,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Thursday, December 31, 2009 3:02:03 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -334,7 +334,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : December 31, 2009 3:02:03 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -342,7 +342,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Dec 31, 2009 3:02:03 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -350,7 +350,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 12/31/09 3:02 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -358,7 +358,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 20091231 03:02 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -366,7 +366,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Saturday, December 30, 2000 5:04:05 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -374,7 +374,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : December 30, 2000 5:04:05 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -382,7 +382,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Dec 30, 2000 5:04:05 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -390,7 +390,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 12/30/00 5:04 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', diff --git a/ext/intl/tests/dateformat_format_variant2.phpt b/ext/intl/tests/dateformat_format_variant2.phpt index d70e2312564b9..6053ce07c8f72 100644 --- a/ext/intl/tests/dateformat_format_variant2.phpt +++ b/ext/intl/tests/dateformat_format_variant2.phpt @@ -318,7 +318,7 @@ Formatted localtime_array is : 12/17/95, 12:13 AM IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 Formatted localtime_array is : 18951217 12:13 AM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -326,7 +326,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Thursday, December 31, 2009 at 3:02:03 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -334,7 +334,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : December 31, 2009 at 3:02:03 PM GMT-10 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -342,7 +342,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Dec 31, 2009, 3:02:03 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -350,7 +350,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 12/31/09, 3:02 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -358,7 +358,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 20091231 03:02 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 3, 'timezone' => 'America/Los_Angeles', @@ -366,7 +366,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Saturday, December 30, 2000 at 5:04:05 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 3, 'timezone' => 'America/Los_Angeles', @@ -374,7 +374,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : December 30, 2000 at 5:04:05 PM GMT-10 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 3, 'timezone' => 'America/Los_Angeles', @@ -382,7 +382,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Dec 30, 2000, 5:04:05 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 3, 'timezone' => 'America/Los_Angeles', @@ -390,7 +390,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 12/30/00, 5:04 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 3, 'timezone' => 'America/Los_Angeles', diff --git a/ext/intl/tests/dateformat_format_variant3.phpt b/ext/intl/tests/dateformat_format_variant3.phpt index c8601aadefd88..9d9fab6e92a45 100644 --- a/ext/intl/tests/dateformat_format_variant3.phpt +++ b/ext/intl/tests/dateformat_format_variant3.phpt @@ -318,7 +318,7 @@ Formatted localtime_array is : 12/17/95, 12:13 AM IntlDateFormatter locale= en_US ,datetype = -1 ,timetype =-1 Formatted localtime_array is : 18951217 12:13 AM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -326,7 +326,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Thursday, December 31, 2009 at 3:02:03 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -334,7 +334,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : December 31, 2009 at 3:02:03 PM GMT-10 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -342,7 +342,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Dec 31, 2009, 3:02:03 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -350,7 +350,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 12/31/09, 3:02 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2010-01-01 01:02:03.000000', 'timezone_type' => 3, 'timezone' => 'UTC', @@ -358,7 +358,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 20091231 03:02 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -366,7 +366,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Saturday, December 30, 2000 at 5:04:05 PM GMT-10:00 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -374,7 +374,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : December 30, 2000 at 5:04:05 PM GMT-10 ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -382,7 +382,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : Dec 30, 2000, 5:04:05 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', @@ -390,7 +390,7 @@ Date is: DateTime::__set_state(array( ------------ Formatted DateTime is : 12/30/00, 5:04 PM ------------ -Date is: DateTime::__set_state(array( +Date is: \DateTime::__set_state(array( 'date' => '2000-12-30 19:04:05.000000', 'timezone_type' => 2, 'timezone' => 'PDT', diff --git a/ext/spl/tests/bug65967.phpt b/ext/spl/tests/bug65967.phpt index e3bb6471c6969..abb83ebf1b330 100644 --- a/ext/spl/tests/bug65967.phpt +++ b/ext/spl/tests/bug65967.phpt @@ -10,5 +10,5 @@ gc_collect_cycles(); var_export($objstore); ?> --EXPECT-- -SplObjectStorage::__set_state(array( +\SplObjectStorage::__set_state(array( )) diff --git a/ext/spl/tests/fixedarray_022.phpt b/ext/spl/tests/fixedarray_022.phpt index c1cff1a926582..c45401bfb8384 100644 --- a/ext/spl/tests/fixedarray_022.phpt +++ b/ext/spl/tests/fixedarray_022.phpt @@ -11,7 +11,7 @@ call_user_func(function () { ?> --EXPECTF-- Warning: var_export does not handle circular references in %s on line 5 -SplFixedArray::__set_state(array( +\SplFixedArray::__set_state(array( 0 => NULL, )) object(SplFixedArray)#2 (1) refcount(4){ diff --git a/ext/spl/tests/fixedarray_023.phpt b/ext/spl/tests/fixedarray_023.phpt index 1d60a2ce6d9f7..781685b7891d6 100644 --- a/ext/spl/tests/fixedarray_023.phpt +++ b/ext/spl/tests/fixedarray_023.phpt @@ -18,7 +18,7 @@ call_user_func(function () { Warning: var_export does not handle circular references in %s on line 8 Warning: var_export does not handle circular references in %s on line 8 -SplFixedArray::__set_state(array( +\SplFixedArray::__set_state(array( 0 => NAN, 1 => 0.0, 2 => NULL, diff --git a/ext/standard/tests/array/007.phpt b/ext/standard/tests/array/007.phpt index a1c984a18be14..fcb6326721bb7 100644 --- a/ext/standard/tests/array/007.phpt +++ b/ext/standard/tests/array/007.phpt @@ -248,54 +248,54 @@ array(9) { -=-=-=-=-=-=-=-=- New functionality from 5.0.0 -=-=-=-=-=-=-=- $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), @@ -326,54 +326,54 @@ array(3) { } $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), @@ -404,54 +404,54 @@ array(3) { } $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), @@ -475,54 +475,54 @@ array(2) { } $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), diff --git a/ext/standard/tests/array/array_intersect_1.phpt b/ext/standard/tests/array/array_intersect_1.phpt index 518dfd392f46f..49890b7fee1f3 100644 --- a/ext/standard/tests/array/array_intersect_1.phpt +++ b/ext/standard/tests/array/array_intersect_1.phpt @@ -66,54 +66,54 @@ echo "end ------------ array_uintersect_uassoc() with method --------\n"; begin ------------ array_uintersect() --------------------------- $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), @@ -146,54 +146,54 @@ end ------------ array_uintersect() --------------------------- begin ------------ array_uintersect_assoc() --------------------- $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), @@ -219,54 +219,54 @@ end ------------ array_uintersect_assoc() --------------------- begin ------------ array_uintersect_uassoc() with ordinary func - $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), @@ -292,54 +292,54 @@ end ------------ array_uintersect_uassoc() with ordinary func - begin ------------ array_uintersect_uassoc() with method -------- $a=array ( '0.1' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 12, 'public_member' => 12, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 23, 'public_member' => 23, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), ); $b=array ( '0.2' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 9, 'public_member' => 9, )), '0.5' => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 22, 'public_member' => 22, )), 0 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 3, 'public_member' => 3, )), 1 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => 4, 'public_member' => 4, )), 2 => - cr::__set_state(array( + \cr::__set_state(array( 'priv_member' => -15, 'public_member' => -15, )), diff --git a/ext/standard/tests/array/var_export3.phpt b/ext/standard/tests/array/var_export3.phpt index e7d3c851f27c2..723cc514f149e 100644 --- a/ext/standard/tests/array/var_export3.phpt +++ b/ext/standard/tests/array/var_export3.phpt @@ -18,7 +18,7 @@ $kake = new kake; var_export($kake); ?> --EXPECT-- -kake::__set_state(array( +\kake::__set_state(array( 'mann' => 42, 'kvinne' => 43, )) diff --git a/ext/standard/tests/general_functions/bug47027.phpt b/ext/standard/tests/general_functions/bug47027.phpt index e4f5aae9dd744..b7d6604dbe90a 100644 --- a/ext/standard/tests/general_functions/bug47027.phpt +++ b/ext/standard/tests/general_functions/bug47027.phpt @@ -6,7 +6,7 @@ $ao = new ArrayObject(array (2 => "foo", "bar" => "baz")); var_export ($ao); ?> --EXPECT-- -ArrayObject::__set_state(array( +\ArrayObject::__set_state(array( 2 => 'foo', 'bar' => 'baz', )) diff --git a/ext/standard/tests/general_functions/bug77638_1.phpt b/ext/standard/tests/general_functions/bug77638_1.phpt index e2a99ffd19953..9d75a9a7ce498 100644 --- a/ext/standard/tests/general_functions/bug77638_1.phpt +++ b/ext/standard/tests/general_functions/bug77638_1.phpt @@ -7,5 +7,5 @@ com_dotnet var_export(new COM("Scripting.Dictionary")); ?> --EXPECT-- -com::__set_state(array( +\com::__set_state(array( )) diff --git a/ext/standard/tests/general_functions/bug77638_2.phpt b/ext/standard/tests/general_functions/bug77638_2.phpt index cec76659c608d..589697011aa60 100644 --- a/ext/standard/tests/general_functions/bug77638_2.phpt +++ b/ext/standard/tests/general_functions/bug77638_2.phpt @@ -7,5 +7,5 @@ ffi var_export(FFI::new('int')); ?> --EXPECT-- -FFI\CData::__set_state(array( +\FFI\CData::__set_state(array( )) diff --git a/ext/standard/tests/general_functions/var_export-locale.phpt b/ext/standard/tests/general_functions/var_export-locale.phpt index 0b22a4f4678d3..18fb957871b3f 100644 --- a/ext/standard/tests/general_functions/var_export-locale.phpt +++ b/ext/standard/tests/general_functions/var_export-locale.phpt @@ -914,35 +914,35 @@ string(17) "(object) array( Iteration 2 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 3 -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -string(36) "concreteClass::__set_state(array( +string(37) "\concreteClass::__set_state(array( ))" Iteration 4 -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -string(57) "Value::__set_state(array( +string(58) "\Value::__set_state(array( 'vars' => array ( ), @@ -950,140 +950,140 @@ string(57) "Value::__set_state(array( Iteration 5 -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -string(266) "myClass::__set_state(array( +string(271) "\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), ))" Iteration 6 -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -string(266) "myClass::__set_state(array( +string(271) "\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), ))" Iteration 7 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 8 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 9 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 10 -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -string(57) "Value::__set_state(array( +string(58) "\Value::__set_state(array( 'vars' => array ( ), @@ -1091,11 +1091,11 @@ string(57) "Value::__set_state(array( Iteration 11 -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -string(36) "concreteClass::__set_state(array( +string(37) "\concreteClass::__set_state(array( ))" *** Testing var_export() with valid null values *** diff --git a/ext/standard/tests/general_functions/var_export-locale_32.phpt b/ext/standard/tests/general_functions/var_export-locale_32.phpt index 81ddacb1a358e..2cf6cf341d449 100644 --- a/ext/standard/tests/general_functions/var_export-locale_32.phpt +++ b/ext/standard/tests/general_functions/var_export-locale_32.phpt @@ -914,35 +914,35 @@ string(17) "(object) array( Iteration 2 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 3 -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -string(36) "concreteClass::__set_state(array( +string(37) "\concreteClass::__set_state(array( ))" Iteration 4 -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -string(57) "Value::__set_state(array( +string(58) "\Value::__set_state(array( 'vars' => array ( ), @@ -950,140 +950,140 @@ string(57) "Value::__set_state(array( Iteration 5 -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -string(266) "myClass::__set_state(array( +string(271) "\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), ))" Iteration 6 -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -string(266) "myClass::__set_state(array( +string(271) "\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), ))" Iteration 7 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 8 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 9 -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" Iteration 10 -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -string(57) "Value::__set_state(array( +string(58) "\Value::__set_state(array( 'vars' => array ( ), @@ -1091,11 +1091,11 @@ string(57) "Value::__set_state(array( Iteration 11 -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -string(36) "concreteClass::__set_state(array( +string(37) "\concreteClass::__set_state(array( ))" *** Testing var_export() with valid null values *** diff --git a/ext/standard/tests/general_functions/var_export_basic6.phpt b/ext/standard/tests/general_functions/var_export_basic6.phpt index 3f60e08e9fcc0..42d072bcb3b56 100644 --- a/ext/standard/tests/general_functions/var_export_basic6.phpt +++ b/ext/standard/tests/general_functions/var_export_basic6.phpt @@ -110,35 +110,35 @@ string(17) "(object) array( -- Iteration: new foo -- -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" -- Iteration: new concreteClass -- -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -string(36) "concreteClass::__set_state(array( +string(37) "\concreteClass::__set_state(array( ))" -- Iteration: new Value -- -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -string(57) "Value::__set_state(array( +string(58) "\Value::__set_state(array( 'vars' => array ( ), @@ -146,140 +146,140 @@ string(57) "Value::__set_state(array( -- Iteration: new myClass -- -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -string(266) "myClass::__set_state(array( +string(271) "\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), ))" -- Iteration: myClass_object -- -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -myClass::__set_state(array( +\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), )) -string(266) "myClass::__set_state(array( +string(271) "\myClass::__set_state(array( 'foo_object' => - foo::__set_state(array( + \foo::__set_state(array( )), 'public_var' => 10, 'public_var1' => - foo::__set_state(array( + \foo::__set_state(array( )), 'private_var' => - foo::__set_state(array( + \foo::__set_state(array( )), 'protected_var' => - foo::__set_state(array( + \foo::__set_state(array( )), ))" -- Iteration: myClass_object->foo_object -- -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" -- Iteration: myClass_object->public_var1 -- -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" -- Iteration: foo_object -- -foo::__set_state(array( +\foo::__set_state(array( )) -foo::__set_state(array( +\foo::__set_state(array( )) -string(26) "foo::__set_state(array( +string(27) "\foo::__set_state(array( ))" -- Iteration: Value_object -- -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -Value::__set_state(array( +\Value::__set_state(array( 'vars' => array ( ), )) -string(57) "Value::__set_state(array( +string(58) "\Value::__set_state(array( 'vars' => array ( ), @@ -287,9 +287,9 @@ string(57) "Value::__set_state(array( -- Iteration: concreteClass_object -- -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -concreteClass::__set_state(array( +\concreteClass::__set_state(array( )) -string(36) "concreteClass::__set_state(array( +string(37) "\concreteClass::__set_state(array( ))" diff --git a/ext/standard/var.c b/ext/standard/var.c index dc9f8639b146f..54f8657da80d6 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -575,6 +575,7 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf) /* {{{ */ if (ce == zend_standard_class_def) { smart_str_appendl(buf, "(object) array(\n", 16); } else { + smart_str_appendc(buf, '\\'); smart_str_append(buf, ce->name); if (is_enum) { zend_object *zobj = Z_OBJ_P(struc); From 820f695b05083d958f504484c0dc39e9e8205b1d Mon Sep 17 00:00:00 2001 From: divinity76 Date: Sat, 23 Apr 2022 13:11:26 +0200 Subject: [PATCH 0456/1346] Use bit shift to set bitflags in standard/file.h (#8428) Nitpicking, this makes it practically impossible to accidentally use a number with 2 bits set in the future, it's also my personal preference, its trivial to see "PHP_FILE_NO_DEFAULT_CONTEXT use bit 4" and that "the next unused bit is bit 5" --- ext/standard/file.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/standard/file.h b/ext/standard/file.h index 7fe9c4738faa6..24de0dcf80e71 100644 --- a/ext/standard/file.h +++ b/ext/standard/file.h @@ -53,11 +53,11 @@ PHPAPI ssize_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, cha #define META_DEF_BUFSIZE 8192 -#define PHP_FILE_USE_INCLUDE_PATH 1 -#define PHP_FILE_IGNORE_NEW_LINES 2 -#define PHP_FILE_SKIP_EMPTY_LINES 4 -#define PHP_FILE_APPEND 8 -#define PHP_FILE_NO_DEFAULT_CONTEXT 16 +#define PHP_FILE_USE_INCLUDE_PATH (1 << 0) +#define PHP_FILE_IGNORE_NEW_LINES (1 << 1) +#define PHP_FILE_SKIP_EMPTY_LINES (1 << 2) +#define PHP_FILE_APPEND (1 << 3) +#define PHP_FILE_NO_DEFAULT_CONTEXT (1 << 4) typedef enum _php_meta_tags_token { TOK_EOF = 0, From ef287bfceb9f0b9c697b0d7045b791a9a9a52c63 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 23 Apr 2022 12:15:13 +0100 Subject: [PATCH 0457/1346] Minor refactoring of std string extension (#8196) Mainly using more appropriate types, early returns, and moving the happy path to the primary scope (failure path is guarded by ``UNEXPECTED`` macros. --- ext/standard/php_string.h | 2 +- ext/standard/string.c | 127 ++++++++++++++++++-------------------- ext/standard/strnatcmp.c | 4 +- 3 files changed, 63 insertions(+), 70 deletions(-) diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index d0c40817fa33f..b87601a1241ed 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -33,7 +33,7 @@ PHP_MINIT_FUNCTION(string_intrin); strnatcmp_ex(a, strlen(a), b, strlen(b), 0) #define strnatcasecmp(a, b) \ 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, int fold_case); +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); diff --git a/ext/standard/string.c b/ext/standard/string.c index 59f633fd18587..699bccbae6af9 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -89,8 +89,6 @@ void register_string_constants(INIT_FUNC_ARGS) } /* }}} */ -int php_tag_find(char *tag, size_t len, const char *set); - /* this is read-only, so it's ok */ ZEND_SET_ALIGNED(16, static const char hexconvtab[]) = "0123456789abcdef"; @@ -695,11 +693,11 @@ PHP_FUNCTION(strcoll) * it needs to be incrementing. * Returns: FAILURE/SUCCESS whether the input was correct (i.e. no range errors) */ -static inline int php_charmask(const unsigned char *input, size_t len, char *mask) +static inline zend_result php_charmask(const unsigned char *input, size_t len, char *mask) { const unsigned char *end; unsigned char c; - int result = SUCCESS; + zend_result result = SUCCESS; memset(mask, 0, 256); for (end = input+len; input < end; input++) { @@ -1144,7 +1142,7 @@ PHP_FUNCTION(explode) PHPAPI void php_implode(const zend_string *glue, HashTable *pieces, zval *return_value) { zval *tmp; - int numelems; + uint32_t numelems; zend_string *str; char *cptr; size_t len = 0; @@ -1606,7 +1604,7 @@ PHP_FUNCTION(pathinfo) zval tmp; char *path, *dirname; size_t path_len; - int have_basename; + bool have_basename; zend_long opt = PHP_PATHINFO_ALL; zend_string *ret = NULL; @@ -1744,16 +1742,14 @@ PHP_FUNCTION(stristr) found = php_stristr(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(haystack), ZSTR_LEN(needle)); - if (found) { - found_offset = found - ZSTR_VAL(haystack); - if (part) { - RETVAL_STRINGL(ZSTR_VAL(haystack), found_offset); - } else { - RETVAL_STRINGL(ZSTR_VAL(haystack) + found_offset, ZSTR_LEN(haystack) - found_offset); - } - } else { - RETVAL_FALSE; + if (UNEXPECTED(!found)) { + RETURN_FALSE; + } + found_offset = found - ZSTR_VAL(haystack); + if (part) { + RETURN_STRINGL(ZSTR_VAL(haystack), found_offset); } + RETURN_STRINGL(ZSTR_VAL(haystack) + found_offset, ZSTR_LEN(haystack) - found_offset); } /* }}} */ @@ -1774,15 +1770,14 @@ PHP_FUNCTION(strstr) found = php_memnstr(ZSTR_VAL(haystack), ZSTR_VAL(needle), ZSTR_LEN(needle), ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); - if (found) { - found_offset = found - ZSTR_VAL(haystack); - if (part) { - RETURN_STRINGL(ZSTR_VAL(haystack), found_offset); - } else { - RETURN_STRINGL(found, ZSTR_LEN(haystack) - found_offset); - } + if (UNEXPECTED(!found)) { + RETURN_FALSE; } - RETURN_FALSE; + found_offset = found - ZSTR_VAL(haystack); + if (part) { + RETURN_STRINGL(ZSTR_VAL(haystack), found_offset); + } + RETURN_STRINGL(ZSTR_VAL(haystack) + found_offset, ZSTR_LEN(haystack) - found_offset); } /* }}} */ @@ -1863,11 +1858,10 @@ PHP_FUNCTION(strpos) ZSTR_VAL(needle), ZSTR_LEN(needle), ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); - if (found) { - RETURN_LONG(found - ZSTR_VAL(haystack)); - } else { + if (UNEXPECTED(!found)) { RETURN_FALSE; } + RETURN_LONG(found - ZSTR_VAL(haystack)); } /* }}} */ @@ -1896,11 +1890,10 @@ PHP_FUNCTION(stripos) found = (char*)php_memnistr(ZSTR_VAL(haystack) + offset, ZSTR_VAL(needle), ZSTR_LEN(needle), ZSTR_VAL(haystack) + ZSTR_LEN(haystack)); - if (found) { - RETVAL_LONG(found - ZSTR_VAL(haystack)); - } else { - RETVAL_FALSE; + if (UNEXPECTED(!found)) { + RETURN_FALSE; } + RETURN_LONG(found - ZSTR_VAL(haystack)); } /* }}} */ @@ -1940,11 +1933,12 @@ PHP_FUNCTION(strrpos) } } - if ((found = zend_memnrstr(p, ZSTR_VAL(needle), ZSTR_LEN(needle), e))) { - RETURN_LONG(found - ZSTR_VAL(haystack)); - } + found = zend_memnrstr(p, ZSTR_VAL(needle), ZSTR_LEN(needle), e); - RETURN_FALSE; + if (UNEXPECTED(!found)) { + RETURN_FALSE; + } + RETURN_LONG(found - ZSTR_VAL(haystack)); } /* }}} */ @@ -2043,12 +2037,11 @@ PHP_FUNCTION(strrchr) ZEND_PARSE_PARAMETERS_END(); found = zend_memrchr(ZSTR_VAL(haystack), *ZSTR_VAL(needle), ZSTR_LEN(haystack)); - if (found) { - found_offset = found - ZSTR_VAL(haystack); - RETURN_STRINGL(found, ZSTR_LEN(haystack) - found_offset); - } else { + if (UNEXPECTED(!found)) { RETURN_FALSE; } + found_offset = found - ZSTR_VAL(haystack); + RETURN_STRINGL(found, ZSTR_LEN(haystack) - found_offset); } /* }}} */ @@ -2782,7 +2775,7 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p zend_ulong num_key; zend_string *str_key; size_t len, pos, old_pos; - int num_keys = 0; + bool has_num_keys = false; size_t minlen = 128*1024; size_t maxlen = 0; HashTable str_hash; @@ -2799,10 +2792,10 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p /* check if original array has numeric keys */ ZEND_HASH_FOREACH_STR_KEY(pats, str_key) { if (UNEXPECTED(!str_key)) { - num_keys = 1; + has_num_keys = true; } else { len = ZSTR_LEN(str_key); - if (UNEXPECTED(len < 1)) { + if (UNEXPECTED(len == 0)) { php_error_docref(NULL, E_WARNING, "Ignoring replacement of empty string"); continue; } else if (UNEXPECTED(len > slen)) { @@ -2821,7 +2814,7 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p } } ZEND_HASH_FOREACH_END(); - if (UNEXPECTED(num_keys)) { + if (UNEXPECTED(has_num_keys)) { zend_string *key_used; /* we have to rebuild HashTable with numeric keys */ zend_hash_init(&str_hash, zend_hash_num_elements(pats), NULL, NULL, 0); @@ -2961,7 +2954,7 @@ static zend_always_inline zend_long count_chars(const char *p, zend_long length, /* }}} */ /* {{{ php_char_to_str_ex */ -static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, size_t to_len, int case_sensitivity, zend_long *replace_count) +static zend_string* php_char_to_str_ex(zend_string *str, char from, char *to, size_t to_len, bool case_sensitivity, zend_long *replace_count) { zend_string *result; size_t char_count; @@ -3319,7 +3312,7 @@ PHP_FUNCTION(strtr) ZSTR_VAL(str_key)[0], ZSTR_VAL(replace), ZSTR_LEN(replace), - 1, + /* case_sensitive */ true, NULL)); } else { zend_long dummy; @@ -3455,7 +3448,7 @@ PHP_FUNCTION(similar_text) { zend_string *t1, *t2; zval *percent = NULL; - int ac = ZEND_NUM_ARGS(); + bool compute_percentage = ZEND_NUM_ARGS() >= 3; size_t sim; ZEND_PARSE_PARAMETERS_START(2, 3) @@ -3466,7 +3459,7 @@ PHP_FUNCTION(similar_text) ZEND_PARSE_PARAMETERS_END(); if (ZSTR_LEN(t1) + ZSTR_LEN(t2) == 0) { - if (ac > 2) { + if (compute_percentage) { ZEND_TRY_ASSIGN_REF_DOUBLE(percent, 0); } @@ -3475,7 +3468,7 @@ PHP_FUNCTION(similar_text) sim = php_similar_char(ZSTR_VAL(t1), ZSTR_LEN(t1), ZSTR_VAL(t2), ZSTR_LEN(t2)); - if (ac > 2) { + if (compute_percentage) { ZEND_TRY_ASSIGN_REF_DOUBLE(percent, sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2))); } @@ -3893,8 +3886,7 @@ static zend_always_inline quad_word aarch64_contains_slash_chars(uint8x16_t x) { static zend_always_inline char *aarch64_add_slashes(quad_word res, const char *source, char *target) { - int i = 0; - for (; i < 16; i++) { + for (int i = 0; i < 16; i++) { char s = source[i]; if (res.mem[i] == 0) *target++ = s; @@ -4156,7 +4148,7 @@ PHPAPI void php_stripslashes(zend_string *str) /* {{{ php_str_replace_in_subject */ static zend_long php_str_replace_in_subject( zend_string *search_str, HashTable *search_ht, zend_string *replace_str, HashTable *replace_ht, - zend_string *subject_str, zval *result, int case_sensitivity + zend_string *subject_str, zval *result, bool case_sensitivity ) { zval *search_entry; zend_string *tmp_result; @@ -4317,7 +4309,7 @@ static zend_long php_str_replace_in_subject( /* }}} */ /* {{{ php_str_replace_common */ -static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensitivity) +static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, bool case_sensitivity) { zend_string *search_str; HashTable *search_ht; @@ -4832,10 +4824,11 @@ PHP_FUNCTION(parse_str) * 0 start tag * 1 first non-whitespace char seen */ -int php_tag_find(char *tag, size_t len, const char *set) { +static bool php_tag_find(char *tag, size_t len, const char *set) { char c, *n; const char *t; - int state=0, done=0; + int state = 0; + bool done = 0; char *norm; if (len == 0) { @@ -5387,7 +5380,7 @@ PHP_FUNCTION(count_chars) /* }}} */ /* {{{ php_strnatcmp */ -static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case) +static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, bool is_case_insensitive) { zend_string *s1, *s2; @@ -5398,7 +5391,7 @@ static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case) RETURN_LONG(strnatcmp_ex(ZSTR_VAL(s1), ZSTR_LEN(s1), ZSTR_VAL(s2), ZSTR_LEN(s2), - fold_case)); + is_case_insensitive)); } /* }}} */ @@ -5409,11 +5402,18 @@ PHP_FUNCTION(strnatcmp) } /* }}} */ +/* {{{ Returns the result of case-insensitive string comparison using 'natural' algorithm */ +PHP_FUNCTION(strnatcasecmp) +{ + php_strnatcmp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); +} +/* }}} */ + /* {{{ Returns numeric formatting information based on the current locale */ PHP_FUNCTION(localeconv) { zval grouping, mon_grouping; - int len, i; + size_t len, i; ZEND_PARSE_PARAMETERS_NONE(); @@ -5427,14 +5427,14 @@ PHP_FUNCTION(localeconv) localeconv_r( &currlocdata ); /* Grab the grouping data out of the array */ - len = (int)strlen(currlocdata.grouping); + len = strlen(currlocdata.grouping); for (i = 0; i < len; i++) { add_index_long(&grouping, i, currlocdata.grouping[i]); } /* Grab the monetary grouping data out of the array */ - len = (int)strlen(currlocdata.mon_grouping); + len = strlen(currlocdata.mon_grouping); for (i = 0; i < len; i++) { add_index_long(&mon_grouping, i, currlocdata.mon_grouping[i]); @@ -5463,13 +5463,6 @@ PHP_FUNCTION(localeconv) } /* }}} */ -/* {{{ Returns the result of case-insensitive string comparison using 'natural' algorithm */ -PHP_FUNCTION(strnatcasecmp) -{ - php_strnatcmp(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); -} -/* }}} */ - /* {{{ Returns the number of times a substring occurs in the string */ PHP_FUNCTION(substr_count) { @@ -5741,7 +5734,7 @@ PHP_FUNCTION(str_rot13) } /* }}} */ -static void php_string_shuffle(char *str, zend_long len) /* {{{ */ +static void php_string_shuffle(char *str, size_t len) /* {{{ */ { zend_long n_elems, rnd_idx, n_left; char temp; @@ -5777,7 +5770,7 @@ PHP_FUNCTION(str_shuffle) RETVAL_STRINGL(ZSTR_VAL(arg), ZSTR_LEN(arg)); if (Z_STRLEN_P(return_value) > 1) { - php_string_shuffle(Z_STRVAL_P(return_value), (zend_long) Z_STRLEN_P(return_value)); + php_string_shuffle(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value)); } } /* }}} */ diff --git a/ext/standard/strnatcmp.c b/ext/standard/strnatcmp.c index 8cbc0db1c3f08..3c3f5a99232ff 100644 --- a/ext/standard/strnatcmp.c +++ b/ext/standard/strnatcmp.c @@ -85,7 +85,7 @@ compare_left(char const **a, char const *aend, char const **b, char const *bend) /* }}} */ /* {{{ strnatcmp_ex */ -PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, int fold_case) +PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, bool is_case_insensitive) { unsigned char ca, cb; char const *ap, *bp; @@ -146,7 +146,7 @@ PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len } } - if (fold_case) { + if (is_case_insensitive) { ca = toupper((int)(unsigned char)ca); cb = toupper((int)(unsigned char)cb); } From 1e562683cb995b9903f4d24ba9eb5bb89ae3fbfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= Date: Wed, 20 Apr 2022 16:34:21 +0000 Subject: [PATCH 0458/1346] fpm: listen backlog should default to -1 also on Linux On linux -1 means system administrator choosen default or kernel default, this varies between kernel versions or distributions it used to be 128 now it is 4096. --- sapi/fpm/fpm/fpm_sockets.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index 1e31b84d6e802..34cd6db040ec4 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -14,7 +14,7 @@ /* On FreeBSD and OpenBSD, backlog negative values are truncated to SOMAXCONN */ -#if defined(__FreeBSD__) || defined(__OpenBSD__) +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__linux__) #define FPM_BACKLOG_DEFAULT -1 #else #define FPM_BACKLOG_DEFAULT 511 From 4ec92c6253bad8dcde1eac06a51fac6b05d34fba Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 23 Apr 2022 13:25:08 +0100 Subject: [PATCH 0459/1346] Update NEWS and www.conf with listen.backlog default change --- NEWS | 1 + sapi/fpm/www.conf.in | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index ef271cb59f49d..580b8ba811b07 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ PHP NEWS . Added extra check for FPM proc dumpable on SELinux based systems. (David Carlier) . Added support for listening queue on macOS. (David Carlier) + . Changed default for listen.backlog on Linux to -1. (Cristian Rodríguez) - Intl: . Update all grandfathered language tags with preferred values diff --git a/sapi/fpm/www.conf.in b/sapi/fpm/www.conf.in index d01753283e947..32705b9f3d378 100644 --- a/sapi/fpm/www.conf.in +++ b/sapi/fpm/www.conf.in @@ -36,7 +36,7 @@ group = @php_fpm_group@ listen = 127.0.0.1:9000 ; Set listen(2) backlog. -; Default Value: 511 (-1 on FreeBSD and OpenBSD) +; Default Value: 511 (-1 on Linux, FreeBSD and OpenBSD) ;listen.backlog = 511 ; Set permissions for unix socket, if one is used. In Linux, read/write From fa6d97db5d941451615e491034918cdbaa5164bd Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 23 Apr 2022 14:32:05 +0200 Subject: [PATCH 0460/1346] main/streams/streams: use copy_file_range() on Linux (#8413) copy_file_range() is a Linux-specific system call which allows efficient copying between two file descriptors, eliminating the need to transfer data from the kernel to userspace and back. For networking file systems like NFS and Ceph, it even eliminates copying data to the client, and local filesystems like Btrfs and XFS can create shared extents. --- configure.ac | 1 + .../tests/file/stream_copy_to_stream.phpt | 28 +++++++ .../stream_copy_to_stream_interleaved.phpt | 48 +++++++++++ main/streams/streams.c | 84 +++++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 ext/standard/tests/file/stream_copy_to_stream_interleaved.phpt diff --git a/configure.ac b/configure.ac index 9516b53f4771c..63513b7d800ea 100644 --- a/configure.ac +++ b/configure.ac @@ -364,6 +364,7 @@ PHP_CHECK_FUNC(socketpair, socket, network) PHP_CHECK_FUNC(htonl, socket, network) PHP_CHECK_FUNC(gethostname, nsl, network) PHP_CHECK_FUNC(gethostbyaddr, nsl, network) +PHP_CHECK_FUNC(copy_file_range) PHP_CHECK_FUNC(dlopen, dl, root) PHP_CHECK_FUNC(dlsym, dl, root) if test "$ac_cv_func_dlopen" = "yes"; then diff --git a/ext/standard/tests/file/stream_copy_to_stream.phpt b/ext/standard/tests/file/stream_copy_to_stream.phpt index 1f34b843347ca..c3b00b9ee0027 100644 --- a/ext/standard/tests/file/stream_copy_to_stream.phpt +++ b/ext/standard/tests/file/stream_copy_to_stream.phpt @@ -12,6 +12,8 @@ stream_filter_append($src, "string.rot13", STREAM_FILTER_READ); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest, 0)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); var_dump(file_get_contents($new_file)); @@ -24,6 +26,8 @@ stream_filter_append($src, "string.rot13", STREAM_FILTER_READ); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest, -1)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); if (WIN) { var_dump(str_replace("\r\n","\n", file_get_contents($new_file))); @@ -39,6 +43,8 @@ stream_filter_append($src, "string.rot13", STREAM_FILTER_READ); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); if (WIN) { @@ -54,6 +60,8 @@ $src = fopen($initial_file, 'r'); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); if (WIN) { @@ -69,6 +77,8 @@ $src = fopen($initial_file, 'r'); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest, 1000000)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); if (WIN) { @@ -85,6 +95,8 @@ $src = fopen($initial_file, 'r'); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest, 10)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); if (WIN) { @@ -100,6 +112,8 @@ $src = fopen($initial_file, 'r'); $dest = fopen($new_file, 'w'); var_dump(stream_copy_to_stream($src, $dest, -1)); +var_dump(ftell($src)); +var_dump(ftell($dest)); fclose($src); fclose($dest); if (WIN) { @@ -113,8 +127,12 @@ echo "Done\n"; ?> --EXPECTF-- int(0) +int(0) +int(0) string(0) "" int(%d) +int(134) +int(134) string(134) "Nabgure qnl Jura gur cnvaf bs yvsr jba'g one zl jnl V'yy oernx gurfr punvaf @@ -122,6 +140,8 @@ Gung ubyq zr qbja V'yy grne lbh qbja vagb zl cevingr uryy " int(%d) +int(134) +int(134) string(134) "Nabgure qnl Jura gur cnvaf bs yvsr jba'g one zl jnl V'yy oernx gurfr punvaf @@ -129,6 +149,8 @@ Gung ubyq zr qbja V'yy grne lbh qbja vagb zl cevingr uryy " int(%d) +int(134) +int(134) string(134) "Another day When the pains of life won't bar my way I'll break these chains @@ -136,6 +158,8 @@ That hold me down I'll tear you down into my private hell " int(%d) +int(134) +int(134) string(134) "Another day When the pains of life won't bar my way I'll break these chains @@ -143,8 +167,12 @@ That hold me down I'll tear you down into my private hell " int(%d) +int(10) +int(10) string(10) "Another da" int(%d) +int(134) +int(134) string(134) "Another day When the pains of life won't bar my way I'll break these chains diff --git a/ext/standard/tests/file/stream_copy_to_stream_interleaved.phpt b/ext/standard/tests/file/stream_copy_to_stream_interleaved.phpt new file mode 100644 index 0000000000000..dc0839cd5d1f0 --- /dev/null +++ b/ext/standard/tests/file/stream_copy_to_stream_interleaved.phpt @@ -0,0 +1,48 @@ +--TEST-- +stream_copy_to_stream() tests with interleaved read/write calls +--FILE-- + +--EXPECTF-- +string(10) "Another da" +int(3) +int(10) +int(20) +int(13) +string(10) " pains of " +int(3) +int(10) +int(40) +int(26) +string(26) "fooy +When thebarlife won't" +Done diff --git a/main/streams/streams.c b/main/streams/streams.c index 8a7e328007215..c10af433904bc 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1555,6 +1555,90 @@ PHPAPI zend_result _php_stream_copy_to_stream_ex(php_stream *src, php_stream *de return SUCCESS; } +#ifdef HAVE_COPY_FILE_RANGE + + /* TODO: on FreeBSD, copy_file_range() works only with the + undocumented flag 0x01000000; until the problem is fixed + properly, copy_file_range() is not used on FreeBSD */ +#ifndef __FreeBSD__ + if (php_stream_is(src, PHP_STREAM_IS_STDIO) && + php_stream_is(dest, PHP_STREAM_IS_STDIO) && + src->writepos == src->readpos && + php_stream_can_cast(src, PHP_STREAM_AS_FD) == SUCCESS && + php_stream_can_cast(dest, PHP_STREAM_AS_FD) == SUCCESS) { + /* both php_stream instances are backed by a file + descriptor, are not filtered and the read buffer is + empty: we can use copy_file_range() */ + + int src_fd, dest_fd; + + php_stream_cast(src, PHP_STREAM_AS_FD, (void*)&src_fd, 0); + php_stream_cast(dest, PHP_STREAM_AS_FD, (void*)&dest_fd, 0); + + /* clamp to INT_MAX to avoid EOVERFLOW */ + const size_t cfr_max = MIN(maxlen, (size_t)SSIZE_MAX); + + /* copy_file_range() is a Linux-specific system call + which allows efficient copying between two file + descriptors, eliminating the need to transfer data + from the kernel to userspace and back. For + networking file systems like NFS and Ceph, it even + eliminates copying data to the client, and local + filesystems like Btrfs and XFS can create shared + extents. */ + + ssize_t result = copy_file_range(src_fd, NULL, + dest_fd, NULL, + cfr_max, 0); + if (result > 0) { + size_t nbytes = (size_t)result; + haveread += nbytes; + + src->position += nbytes; + dest->position += nbytes; + + if ((maxlen != PHP_STREAM_COPY_ALL && nbytes == maxlen) || + php_stream_eof(src)) { + /* the whole request was satisfied or + end-of-file reached - done */ + *len = haveread; + return SUCCESS; + } + + /* there may be more data; continue copying + using the fallback code below */ + } else if (result == 0) { + /* end of file */ + *len = haveread; + return SUCCESS; + } else if (result < 0) { + switch (errno) { + case EINVAL: + /* some formal error, e.g. overlapping + file ranges */ + break; + + case EXDEV: + /* pre Linux 5.3 error */ + break; + + case ENOSYS: + /* not implemented by this Linux kernel */ + break; + + default: + /* unexpected I/O error - give up, no + fallback */ + *len = haveread; + return FAILURE; + } + + /* fall back to classic copying */ + } + } +#endif // __FreeBSD__ +#endif // HAVE_COPY_FILE_RANGE + if (maxlen == PHP_STREAM_COPY_ALL) { maxlen = 0; } From 1254aa4f3e55dfc2477d3ac23ed924be9de095df Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 24 Apr 2022 17:35:05 +0200 Subject: [PATCH 0461/1346] Avoid setting ce for ref return_info This is unlikely to matter in practice (due to short lifetime), but necessary to satisfy the SSA integrity check. Fixes oss-fuzz #46980. --- Zend/Optimizer/zend_inference.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 6e3918b2e6093..7662153915311 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -4053,6 +4053,8 @@ uint32_t zend_get_return_info_from_signature_only( if ((func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) && !(func->common.fn_flags & ZEND_ACC_GENERATOR)) { type |= MAY_BE_REF; + *ce = NULL; + *ce_is_instanceof = 0; } return type; } @@ -4136,7 +4138,7 @@ static void zend_func_return_info(const zend_op_array *op_array, tmp |= t1; if (ssa_op && info->ssa.var_info && - ssa_op->op1_use >= 0 && + ssa_op->op1_use >= 0 && !(t1 & MAY_BE_REF) && info->ssa.var_info[ssa_op->op1_use].ce) { arg_ce = info->ssa.var_info[ssa_op->op1_use].ce; arg_is_instanceof = info->ssa.var_info[ssa_op->op1_use].is_instanceof; From 460bbc8ebe70b700a9eb47884dc6a4866db2dd5c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 24 Apr 2022 18:20:46 +0200 Subject: [PATCH 0462/1346] Add clarifying comment for SEND_VAL usage This confused me for a bit, because we're using SEND_VAL here to potentially perform a by-ref SEND, while it is usually used for by-val SENDs. --- Zend/zend_compile.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a2098a4decc56..e0ee212a6b146 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3487,6 +3487,9 @@ static uint32_t zend_compile_args( if (ARG_MUST_BE_SENT_BY_REF(fbc, arg_num)) { opcode = ZEND_SEND_VAR_NO_REF; } else if (ARG_MAY_BE_SENT_BY_REF(fbc, arg_num)) { + /* For IS_VAR operands, SEND_VAL will pass through the operand without + * dereferencing, so it will use a by-ref pass if the call returned by-ref + * and a by-value pass if it returned by-value. */ opcode = ZEND_SEND_VAL; } else { opcode = ZEND_SEND_VAR; From 619f40f14ca2ebb5bbe1c872ee3d53287592b1b4 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Mon, 25 Apr 2022 09:31:51 +0200 Subject: [PATCH 0463/1346] Fix leak introduced by GH-8241 (#8403) Temporarily store result of ini builder in ini_entries to avoid a leak when main() exists prematurely. Technically ini_entries isn't released either but ASAN doesn't consider unreleased memory referenced from globals leaks. --- sapi/fpm/fpm/fpm_main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index fe8195d1a8d66..b04763d62489a 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1586,6 +1586,8 @@ int main(int argc, char *argv[]) case 'd': /* define ini entries on command line */ php_ini_builder_define(&ini_builder, php_optarg); + /* main can terminate without finishing or deiniting the ini builder, call finish each iteration to avoid leaking the buffer */ + cgi_sapi_module.ini_entries = php_ini_builder_finish(&ini_builder); break; case 'y': From a4179e4c92b6365d39e09cb9cd63c476848013af Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 27 Apr 2022 12:37:39 +0200 Subject: [PATCH 0464/1346] Fix test for curl 7.83.0 libcurl 7.83.0 removed some trailing exclamation marks from error messages[1]; we have to cater to that. [1] --- ext/curl/tests/curl_basic_007.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/tests/curl_basic_007.phpt b/ext/curl/tests/curl_basic_007.phpt index 3b53658d6a7e0..3834e4674f827 100644 --- a/ext/curl/tests/curl_basic_007.phpt +++ b/ext/curl/tests/curl_basic_007.phpt @@ -20,5 +20,5 @@ curl_close($ch); ?> --EXPECTF-- -string(%d) "No URL set!%w" +string(%d) "No URL set%A" int(3) From b5db594fd277464104fce814d22f0b2207d6502d Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 27 Apr 2022 23:07:11 +0100 Subject: [PATCH 0465/1346] Refacto php_module_startup() (#8303) It only ever uses at most 1 additional modules --- main/main.c | 29 +++++++---------------------- main/php_main.h | 2 +- sapi/apache2handler/sapi_apache2.c | 5 +---- sapi/cgi/cgi_main.c | 5 +---- sapi/cli/php_cli.c | 5 +---- sapi/cli/php_cli_server.c | 2 +- sapi/embed/php_embed.c | 5 +---- sapi/fpm/fpm/fpm_main.c | 5 +---- sapi/fuzzer/fuzzer-sapi.c | 5 +---- sapi/litespeed/lsapi_main.c | 4 ++-- sapi/phpdbg/phpdbg.c | 2 +- 11 files changed, 18 insertions(+), 51 deletions(-) diff --git a/main/main.c b/main/main.c index dc705fcdbdfe9..512a7a8b7f0ba 100644 --- a/main/main.c +++ b/main/main.c @@ -1960,24 +1960,6 @@ int php_register_extensions(zend_module_entry * const * ptr, int count) return SUCCESS; } -/* A very long time ago php_module_startup() was refactored in a way - * which broke calling it with more than one additional module. - * This alternative to php_register_extensions() works around that - * by walking the shallower structure. - * - * See algo: https://bugs.php.net/bug.php?id=63159 - */ -static int php_register_extensions_bc(zend_module_entry *ptr, int count) -{ - while (count--) { - if (zend_register_internal_module(ptr++) == NULL) { - return FAILURE; - } - } - return SUCCESS; -} -/* }}} */ - #ifdef PHP_WIN32 static _invalid_parameter_handler old_invalid_parameter_handler; @@ -2012,11 +1994,12 @@ void dummy_invalid_parameter_handler( #endif /* {{{ php_module_startup */ -int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint32_t num_additional_modules) +zend_result php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_module) { zend_utility_functions zuf; zend_utility_values zuv; - int retval = SUCCESS, module_number=0; /* for REGISTER_INI_ENTRIES() */ + zend_result retval = SUCCESS; + int module_number = 0; /* for REGISTER_INI_ENTRIES() */ char *php_os; zend_module_entry *module; @@ -2243,7 +2226,9 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod } /* start additional PHP extensions */ - php_register_extensions_bc(additional_modules, num_additional_modules); + if (additional_module && (zend_register_internal_module(additional_module) == NULL)) { + return FAILURE; + } /* load and startup extensions compiled as shared objects (aka DLLs) as requested by php.ini entries @@ -2278,7 +2263,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod module->version = PHP_VERSION; module->info_func = PHP_MINFO(php_core); } - + /* freeze the list of observer fcall_init handlers */ zend_observer_post_startup(); diff --git a/main/php_main.h b/main/php_main.h index 661c88446524f..50351da0e6391 100644 --- a/main/php_main.h +++ b/main/php_main.h @@ -25,7 +25,7 @@ BEGIN_EXTERN_C() PHPAPI int php_request_startup(void); PHPAPI void php_request_shutdown(void *dummy); -PHPAPI int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint32_t num_additional_modules); +PHPAPI zend_result php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_module); PHPAPI void php_module_shutdown(void); PHPAPI int php_module_shutdown_wrapper(sapi_module_struct *sapi_globals); diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c index 7933e6accea38..5238b02bbd625 100644 --- a/sapi/apache2handler/sapi_apache2.c +++ b/sapi/apache2handler/sapi_apache2.c @@ -378,10 +378,7 @@ extern zend_module_entry php_apache_module; static int php_apache2_startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, &php_apache_module, 1)==FAILURE) { - return FAILURE; - } - return SUCCESS; + return php_module_startup(sapi_module, &php_apache_module); } static sapi_module_struct apache2_sapi_module = { diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index ef6a62be73c8a..4f9a71bfac6c5 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -967,10 +967,7 @@ static int sapi_cgi_deactivate(void) static int php_cgi_startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, &cgi_module_entry, 1) == FAILURE) { - return FAILURE; - } - return SUCCESS; + return php_module_startup(sapi_module, &cgi_module_entry); } /* {{{ sapi_module_struct cgi_sapi_module */ diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 97955eadd1f1b..5a161fcb23c40 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -407,10 +407,7 @@ static void sapi_cli_send_header(sapi_header_struct *sapi_header, void *server_c static int php_cli_startup(sapi_module_struct *sapi_module) /* {{{ */ { - if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { - return FAILURE; - } - return SUCCESS; + return php_module_startup(sapi_module, NULL); } /* }}} */ diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 6e7a909b128d0..7a8ec7918e233 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -498,7 +498,7 @@ const zend_function_entry server_additional_functions[] = { static int sapi_cli_server_startup(sapi_module_struct *sapi_module) /* {{{ */ { - return php_module_startup(sapi_module, &cli_server_module_entry, 1); + return php_module_startup(sapi_module, &cli_server_module_entry); } /* }}} */ static size_t sapi_cli_server_ub_write(const char *str, size_t str_length) /* {{{ */ diff --git a/sapi/embed/php_embed.c b/sapi/embed/php_embed.c index 1679246ab9872..4b94bd98e66da 100644 --- a/sapi/embed/php_embed.c +++ b/sapi/embed/php_embed.c @@ -119,10 +119,7 @@ static void php_embed_register_variables(zval *track_vars_array) /* Module initialization (MINIT) */ static int php_embed_startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, NULL, 0) == FAILURE) { - return FAILURE; - } - return SUCCESS; + return php_module_startup(sapi_module, NULL); } EMBED_SAPI_API sapi_module_struct php_embed_module = { diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index b04763d62489a..8ce59a43b4145 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -767,10 +767,7 @@ static int sapi_cgi_deactivate(void) /* {{{ */ static int php_cgi_startup(sapi_module_struct *sapi_module) /* {{{ */ { - if (php_module_startup(sapi_module, &cgi_module_entry, 1) == FAILURE) { - return FAILURE; - } - return SUCCESS; + return php_module_startup(sapi_module, &cgi_module_entry); } /* }}} */ diff --git a/sapi/fuzzer/fuzzer-sapi.c b/sapi/fuzzer/fuzzer-sapi.c index a9d2ce89a8b6e..3a79e273106fa 100644 --- a/sapi/fuzzer/fuzzer-sapi.c +++ b/sapi/fuzzer/fuzzer-sapi.c @@ -62,10 +62,7 @@ const char HARDCODED_INI[] = static int startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { - return FAILURE; - } - return SUCCESS; + return php_module_startup(sapi_module, NULL); } static size_t ub_write(const char *str, size_t str_length) diff --git a/sapi/litespeed/lsapi_main.c b/sapi/litespeed/lsapi_main.c index e034a3fdffa92..b069f6d355b81 100644 --- a/sapi/litespeed/lsapi_main.c +++ b/sapi/litespeed/lsapi_main.c @@ -97,7 +97,7 @@ static void init_sapi_from_env(sapi_module_struct *sapi_module) /* {{{ php_lsapi_startup */ static int php_lsapi_startup(sapi_module_struct *sapi_module) { - if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { + if (php_module_startup(sapi_module, NULL)==FAILURE) { return FAILURE; } argv0 = sapi_module->executable_location; @@ -1518,7 +1518,7 @@ int main( int argc, char * argv[] ) lsapi_sapi_module.ini_defaults = sapi_lsapi_ini_defaults; - if (php_module_startup(&lsapi_sapi_module, &litespeed_module_entry, 1) == FAILURE) { + if (php_module_startup(&lsapi_sapi_module, &litespeed_module_entry) == FAILURE) { #ifdef ZTS tsrm_shutdown(); #endif diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index e8d796771f9b5..de05a6fec60b1 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -706,7 +706,7 @@ static zend_module_entry sapi_phpdbg_module_entry = { static inline int php_sapi_phpdbg_module_startup(sapi_module_struct *module) /* {{{ */ { - if (php_module_startup(module, &sapi_phpdbg_module_entry, 1) == FAILURE) { + if (php_module_startup(module, &sapi_phpdbg_module_entry) == FAILURE) { return FAILURE; } From 3c28be825593c154089f75ebc949394e0163f670 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 26 Apr 2022 14:41:47 +0200 Subject: [PATCH 0466/1346] Close GH-8306: don't use of bitwise '|' with boolean operands The code used bitwise operators to avoid the short-circuiting behavior of the logical operators. We refactor for clarity, and to keep compilers and static analyzers happy. Closes GH-8442. --- sapi/phpdbg/phpdbg.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index de05a6fec60b1..e39a5c7fb4e62 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -864,7 +864,10 @@ static ssize_t phpdbg_stdiop_write(php_stream *stream, const char *buf, size_t c while (data->fd >= 0) { struct stat stat[3]; memset(stat, 0, sizeof(stat)); - if (((fstat(fileno(stderr), &stat[2]) < 0) & (fstat(fileno(stdout), &stat[0]) < 0)) | (fstat(data->fd, &stat[1]) < 0)) { + int stat_stderr = fstat(fileno(stderr), &stat[2]); + int stat_stdout = fstat(fileno(stdout), &stat[0]); + int stat_datafd = fstat(data->fd, &stat[1]); + if ((stat_stderr < 0 && stat_stdout < 0) || stat_datafd < 0) { break; } From 81d4d5dd2b3a923ca096ec6084bef68dbe6aa93c Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 17 Apr 2022 11:08:09 +0100 Subject: [PATCH 0467/1346] strlcpy/strlcat update to last openbsd version. CVS date not changed as in fact the actual version is related to an earier date in reality. They ditched the `uintptr_t`cast finally. While at it updating the C style definitions. Closes GH-8389. --- main/strlcat.c | 5 +---- main/strlcpy.c | 12 ++---------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/main/strlcat.c b/main/strlcat.c index 212948ffaf3a8..b514a7e0d5d5c 100644 --- a/main/strlcat.c +++ b/main/strlcat.c @@ -61,10 +61,7 @@ static const char *rcsid = "$OpenBSD: strlcat.c,v 1.17 2016/10/14 18:19:04 dtuck * Returns strlen(src) + MIN(siz, strlen(initial dst). * If retval >= siz, truncation occurred. */ -PHPAPI size_t php_strlcat(dst, src, siz) - char *dst; - const char *src; - size_t siz; +PHPAPI size_t php_strlcat(char *dst, const char *src, size_t siz) { const char *d = dst; const char *s = src; diff --git a/main/strlcpy.c b/main/strlcpy.c index 7839856592e7b..9ca99311aa424 100644 --- a/main/strlcpy.c +++ b/main/strlcpy.c @@ -59,10 +59,7 @@ static const char *rcsid = "$OpenBSD: strlcpy.c,v 1.15 2016/10/16 17:37:39 dtuck * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. */ -PHPAPI size_t php_strlcpy(dst, src, siz) - char *dst; - const char *src; - size_t siz; +PHPAPI size_t php_strlcpy(char *dst, const char *src, size_t siz) { const char *s = src; size_t n = siz; @@ -83,12 +80,7 @@ PHPAPI size_t php_strlcpy(dst, src, siz) ; } - /* - * Cast pointers to unsigned type before calculation, to avoid signed - * overflow when the string ends where the MSB has changed. - * Return value does not include NUL. - */ - return((uintptr_t)src - (uintptr_t)s - 1); + return(src - s - 1); } #endif /* !HAVE_STRLCPY */ From 8b2ee5388c31e0b77cd8f7e39290eb7be50ac7dd Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 14 Apr 2022 16:34:51 +0100 Subject: [PATCH 0468/1346] Add DateTime/DateTimeImmutable's __serialize and __unserialize methods --- ext/date/php_date.c | 124 +++++++++++++++--- ext/date/php_date.stub.php | 12 ++ ext/date/php_date_arginfo.h | 24 ++++ .../DateTimeImmutable_serialisation.phpt | 118 +++++++++++++++++ ext/date/tests/DateTime_serialisation.phpt | 118 +++++++++++++++++ ext/date/tests/bug55397.phpt | 2 +- ext/date/tests/bug62852.phpt | 2 +- ext/date/tests/bug62852_var2.phpt | 7 +- ext/date/tests/bug62852_var3.phpt | 7 +- ext/date/tests/bug66721.phpt | 4 +- ext/date/tests/bug68942_2.phpt | 2 +- 11 files changed, 387 insertions(+), 33 deletions(-) create mode 100644 ext/date/tests/DateTimeImmutable_serialisation.phpt create mode 100644 ext/date/tests/DateTime_serialisation.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0eb94cae85ae6..02fbdd9c49e64 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1811,28 +1811,9 @@ static HashTable *date_object_get_gc_timezone(zend_object *object, zval **table, return zend_std_get_properties(object); } /* }}} */ -static HashTable *date_object_get_properties_for(zend_object *object, zend_prop_purpose purpose) /* {{{ */ +static void date_object_to_hash(php_date_obj *dateobj, HashTable *props) { - HashTable *props; zval zv; - php_date_obj *dateobj; - - switch (purpose) { - case ZEND_PROP_PURPOSE_DEBUG: - case ZEND_PROP_PURPOSE_SERIALIZE: - case ZEND_PROP_PURPOSE_VAR_EXPORT: - case ZEND_PROP_PURPOSE_JSON: - case ZEND_PROP_PURPOSE_ARRAY_CAST: - break; - default: - return zend_std_get_properties_for(object, purpose); - } - - dateobj = php_date_obj_from_obj(object); - props = zend_array_dup(zend_std_get_properties(object)); - if (!dateobj->time) { - return props; - } /* first we add the date and time in ISO format */ ZVAL_STR(&zv, date_format("Y-m-d H:i:s.u", sizeof("Y-m-d H:i:s.u")-1, dateobj->time, 1)); @@ -1865,6 +1846,31 @@ static HashTable *date_object_get_properties_for(zend_object *object, zend_prop_ } zend_hash_str_update(props, "timezone", sizeof("timezone")-1, &zv); } +} + +static HashTable *date_object_get_properties_for(zend_object *object, zend_prop_purpose purpose) /* {{{ */ +{ + HashTable *props; + php_date_obj *dateobj; + + switch (purpose) { + case ZEND_PROP_PURPOSE_DEBUG: + case ZEND_PROP_PURPOSE_SERIALIZE: + case ZEND_PROP_PURPOSE_VAR_EXPORT: + case ZEND_PROP_PURPOSE_JSON: + case ZEND_PROP_PURPOSE_ARRAY_CAST: + break; + default: + return zend_std_get_properties_for(object, purpose); + } + + dateobj = php_date_obj_from_obj(object); + props = zend_array_dup(zend_std_get_properties(object)); + if (!dateobj->time) { + return props; + } + + date_object_to_hash(dateobj, props); return props; } /* }}} */ @@ -2623,6 +2629,84 @@ PHP_METHOD(DateTimeImmutable, __set_state) } /* }}} */ +/* {{{ */ +PHP_METHOD(DateTime, __serialize) +{ + zval *object = ZEND_THIS; + php_date_obj *dateobj; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_NONE(); + + dateobj = Z_PHPDATE_P(object); + DATE_CHECK_INITIALIZED(dateobj->time, DateTime); + + array_init(return_value); + myht = Z_ARRVAL_P(return_value); + date_object_to_hash(dateobj, myht); +} +/* }}} */ + +/* {{{ */ +PHP_METHOD(DateTimeImmutable, __serialize) +{ + zval *object = ZEND_THIS; + php_date_obj *dateobj; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_NONE(); + + dateobj = Z_PHPDATE_P(object); + DATE_CHECK_INITIALIZED(dateobj->time, DateTimeImmutable); + + array_init(return_value); + myht = Z_ARRVAL_P(return_value); + date_object_to_hash(dateobj, myht); +} +/* }}} */ + +/* {{{ */ +PHP_METHOD(DateTime, __unserialize) +{ + zval *object = ZEND_THIS; + php_date_obj *dateobj; + zval *array; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ARRAY(array) + ZEND_PARSE_PARAMETERS_END(); + + dateobj = Z_PHPDATE_P(object); + myht = Z_ARRVAL_P(array); + + if (!php_date_initialize_from_hash(&dateobj, myht)) { + zend_throw_error(NULL, "Invalid serialization data for DateTime object"); + } +} +/* }}} */ + +/* {{{ */ +PHP_METHOD(DateTimeImmutable, __unserialize) +{ + zval *object = ZEND_THIS; + php_date_obj *dateobj; + zval *array; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ARRAY(array) + ZEND_PARSE_PARAMETERS_END(); + + dateobj = Z_PHPDATE_P(object); + myht = Z_ARRVAL_P(array); + + if (!php_date_initialize_from_hash(&dateobj, myht)) { + zend_throw_error(NULL, "Invalid serialization data for DateTimeImmutable object"); + } +} +/* }}} */ + /* {{{ */ PHP_METHOD(DateTime, __wakeup) { diff --git a/ext/date/php_date.stub.php b/ext/date/php_date.stub.php index 5720ac3f573c1..55d17bd168ab0 100644 --- a/ext/date/php_date.stub.php +++ b/ext/date/php_date.stub.php @@ -205,12 +205,20 @@ public function diff(DateTimeInterface $targetObject, bool $absolute = false): D /** @tentative-return-type */ public function __wakeup(): void; + + public function __serialize(): array; + + public function __unserialize(array $data): void; } class DateTime implements DateTimeInterface { public function __construct(string $datetime = "now", ?DateTimeZone $timezone = null) {} + public function __serialize(): array {} + + public function __unserialize(array $data): void {} + /** @tentative-return-type */ public function __wakeup(): void {} @@ -318,6 +326,10 @@ class DateTimeImmutable implements DateTimeInterface { public function __construct(string $datetime = "now", ?DateTimeZone $timezone = null) {} + public function __serialize(): array {} + + public function __unserialize(array $data): void {} + /** @tentative-return-type */ public function __wakeup(): void {} diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h index 3b8f1578f949a..6cc1b75997f3d 100644 --- a/ext/date/php_date_arginfo.h +++ b/ext/date/php_date_arginfo.h @@ -245,11 +245,21 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_DateTimeInterface___wakeup, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() +#define arginfo_class_DateTimeInterface___serialize arginfo_timezone_abbreviations_list + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_DateTimeInterface___unserialize, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_class_DateTime___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, datetime, IS_STRING, 0, "\"now\"") ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, timezone, DateTimeZone, 1, "null") ZEND_END_ARG_INFO() +#define arginfo_class_DateTime___serialize arginfo_timezone_abbreviations_list + +#define arginfo_class_DateTime___unserialize arginfo_class_DateTimeInterface___unserialize + #define arginfo_class_DateTime___wakeup arginfo_class_DateTimeInterface___wakeup ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_DateTime___set_state, 0, 1, DateTime, 0) @@ -322,6 +332,10 @@ ZEND_END_ARG_INFO() #define arginfo_class_DateTimeImmutable___construct arginfo_class_DateTime___construct +#define arginfo_class_DateTimeImmutable___serialize arginfo_timezone_abbreviations_list + +#define arginfo_class_DateTimeImmutable___unserialize arginfo_class_DateTimeInterface___unserialize + #define arginfo_class_DateTimeImmutable___wakeup arginfo_class_DateTimeInterface___wakeup ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_DateTimeImmutable___set_state, 0, 1, DateTimeImmutable, 0) @@ -517,11 +531,15 @@ ZEND_FUNCTION(date_sunrise); ZEND_FUNCTION(date_sunset); ZEND_FUNCTION(date_sun_info); ZEND_METHOD(DateTime, __construct); +ZEND_METHOD(DateTime, __serialize); +ZEND_METHOD(DateTime, __unserialize); ZEND_METHOD(DateTime, __wakeup); ZEND_METHOD(DateTime, __set_state); ZEND_METHOD(DateTime, createFromImmutable); ZEND_METHOD(DateTime, createFromInterface); ZEND_METHOD(DateTimeImmutable, __construct); +ZEND_METHOD(DateTimeImmutable, __serialize); +ZEND_METHOD(DateTimeImmutable, __unserialize); ZEND_METHOD(DateTimeImmutable, __wakeup); ZEND_METHOD(DateTimeImmutable, __set_state); ZEND_METHOD(DateTimeImmutable, modify); @@ -610,12 +628,16 @@ static const zend_function_entry class_DateTimeInterface_methods[] = { ZEND_ABSTRACT_ME_WITH_FLAGS(DateTimeInterface, getTimestamp, arginfo_class_DateTimeInterface_getTimestamp, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) ZEND_ABSTRACT_ME_WITH_FLAGS(DateTimeInterface, diff, arginfo_class_DateTimeInterface_diff, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) ZEND_ABSTRACT_ME_WITH_FLAGS(DateTimeInterface, __wakeup, arginfo_class_DateTimeInterface___wakeup, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) + ZEND_ABSTRACT_ME_WITH_FLAGS(DateTimeInterface, __serialize, arginfo_class_DateTimeInterface___serialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) + ZEND_ABSTRACT_ME_WITH_FLAGS(DateTimeInterface, __unserialize, arginfo_class_DateTimeInterface___unserialize, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) ZEND_FE_END }; static const zend_function_entry class_DateTime_methods[] = { ZEND_ME(DateTime, __construct, arginfo_class_DateTime___construct, ZEND_ACC_PUBLIC) + ZEND_ME(DateTime, __serialize, arginfo_class_DateTime___serialize, ZEND_ACC_PUBLIC) + ZEND_ME(DateTime, __unserialize, arginfo_class_DateTime___unserialize, ZEND_ACC_PUBLIC) ZEND_ME(DateTime, __wakeup, arginfo_class_DateTime___wakeup, ZEND_ACC_PUBLIC) ZEND_ME(DateTime, __set_state, arginfo_class_DateTime___set_state, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME(DateTime, createFromImmutable, arginfo_class_DateTime_createFromImmutable, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) @@ -641,6 +663,8 @@ static const zend_function_entry class_DateTime_methods[] = { static const zend_function_entry class_DateTimeImmutable_methods[] = { ZEND_ME(DateTimeImmutable, __construct, arginfo_class_DateTimeImmutable___construct, ZEND_ACC_PUBLIC) + ZEND_ME(DateTimeImmutable, __serialize, arginfo_class_DateTimeImmutable___serialize, ZEND_ACC_PUBLIC) + ZEND_ME(DateTimeImmutable, __unserialize, arginfo_class_DateTimeImmutable___unserialize, ZEND_ACC_PUBLIC) ZEND_ME(DateTimeImmutable, __wakeup, arginfo_class_DateTimeImmutable___wakeup, ZEND_ACC_PUBLIC) ZEND_ME(DateTimeImmutable, __set_state, arginfo_class_DateTimeImmutable___set_state, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME_MAPPING(createFromFormat, date_create_immutable_from_format, arginfo_class_DateTimeImmutable_createFromFormat, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) diff --git a/ext/date/tests/DateTimeImmutable_serialisation.phpt b/ext/date/tests/DateTimeImmutable_serialisation.phpt new file mode 100644 index 0000000000000..9c4c5bacf1a08 --- /dev/null +++ b/ext/date/tests/DateTimeImmutable_serialisation.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test DateTimeImmutable::__serialize and DateTimeImmutable::__unserialize +--FILE-- +__serialize()); + +echo "\n\nCalling __unserialize manually:\n"; +$d = new DateTimeImmutable; +$d->__unserialize( + [ + 'date' => '2022-04-14 11:27:42.541106', + 'timezone_type' => 3, + 'timezone' => 'UTC', + ] +); +var_dump($d); + +echo "\n\nCalling __unserialize a few more times, with abbreviations:\n"; +$d->__unserialize( + [ + 'date' => '2022-04-14 11:27:42.541106', + 'timezone_type' => 2, + 'timezone' => 'CEST', + ] +); +var_dump($d); +$d->__unserialize( + [ + 'date' => '2022-04-14 11:27:42.541106', + 'timezone_type' => 1, + 'timezone' => '+0130', + ] +); +var_dump($d); + +?> +--EXPECTF-- +Original object: +object(DateTimeImmutable)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} + + +Serialised object: +string(135) "O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2022-04-14 11:27:42.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/London";}" + + +Unserialised object: +object(DateTimeImmutable)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} + + +Calling __serialize manually: +array(3) { + ["date"]=> + string(26) "2022-04-14 11:27:42.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} + + +Calling __unserialize manually: +object(DateTimeImmutable)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.541106" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(3) "UTC" +} + + +Calling __unserialize a few more times, with abbreviations: +object(DateTimeImmutable)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.541106" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(4) "CEST" +} +object(DateTimeImmutable)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.541106" + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(6) "+01:30" +} diff --git a/ext/date/tests/DateTime_serialisation.phpt b/ext/date/tests/DateTime_serialisation.phpt new file mode 100644 index 0000000000000..f7a34bd7f558b --- /dev/null +++ b/ext/date/tests/DateTime_serialisation.phpt @@ -0,0 +1,118 @@ +--TEST-- +Test DateTime::__serialize and DateTime::__unserialize +--FILE-- +__serialize()); + +echo "\n\nCalling __unserialize manually:\n"; +$d = new DateTime; +$d->__unserialize( + [ + 'date' => '2022-04-14 11:27:42.541106', + 'timezone_type' => 3, + 'timezone' => 'UTC', + ] +); +var_dump($d); + +echo "\n\nCalling __unserialize a few more times, with abbreviations:\n"; +$d->__unserialize( + [ + 'date' => '2022-04-14 11:27:42.541106', + 'timezone_type' => 2, + 'timezone' => 'CEST', + ] +); +var_dump($d); +$d->__unserialize( + [ + 'date' => '2022-04-14 11:27:42.541106', + 'timezone_type' => 1, + 'timezone' => '+0130', + ] +); +var_dump($d); + +?> +--EXPECTF-- +Original object: +object(DateTime)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} + + +Serialised object: +string(125) "O:8:"DateTime":3:{s:4:"date";s:26:"2022-04-14 11:27:42.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/London";}" + + +Unserialised object: +object(DateTime)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} + + +Calling __serialize manually: +array(3) { + ["date"]=> + string(26) "2022-04-14 11:27:42.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} + + +Calling __unserialize manually: +object(DateTime)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.541106" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(3) "UTC" +} + + +Calling __unserialize a few more times, with abbreviations: +object(DateTime)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.541106" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(4) "CEST" +} +object(DateTime)#%d (%d) { + ["date"]=> + string(26) "2022-04-14 11:27:42.541106" + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(6) "+01:30" +} diff --git a/ext/date/tests/bug55397.phpt b/ext/date/tests/bug55397.phpt index 98f29a25b5356..559490dfa3bfa 100644 --- a/ext/date/tests/bug55397.phpt +++ b/ext/date/tests/bug55397.phpt @@ -8,7 +8,7 @@ var_dump(unserialize('O:8:"DateTime":0:{}') == new DateTime); --EXPECTF-- Fatal error: Uncaught Error: Invalid serialization data for DateTime object in %sbug55397.php:%d Stack trace: -#0 [internal function]: DateTime->__wakeup() +#0 [internal function]: DateTime->__unserialize(Array) #1 %sbug55397.php(%d): unserialize('O:8:"DateTime":...') #2 {main} thrown in %sbug55397.php on line %d diff --git a/ext/date/tests/bug62852.phpt b/ext/date/tests/bug62852.phpt index 4ec9a0eab1ca6..120c08faf2393 100644 --- a/ext/date/tests/bug62852.phpt +++ b/ext/date/tests/bug62852.phpt @@ -13,7 +13,7 @@ try { --EXPECTF-- Fatal error: Uncaught Error: Invalid serialization data for DateTime object in %sbug62852.php:%d Stack trace: -#0 [internal function]: DateTime->__wakeup() +#0 [internal function]: DateTime->__unserialize(Array) #1 %sbug62852.php(%d): unserialize('O:8:"DateTime":...') #2 {main} thrown in %sbug62852.php on line %d diff --git a/ext/date/tests/bug62852_var2.phpt b/ext/date/tests/bug62852_var2.phpt index 57fbd6e94e955..4749d2a9bb21f 100644 --- a/ext/date/tests/bug62852_var2.phpt +++ b/ext/date/tests/bug62852_var2.phpt @@ -24,8 +24,7 @@ var_dump( $foo ); --EXPECTF-- Fatal error: Uncaught Error: Invalid serialization data for DateTime object in %sbug62852_var2.php:%d Stack trace: -#0 %sbug62852_var2.php(%d): DateTime->__wakeup() -#1 [internal function]: Foo->__wakeup() -#2 %sbug62852_var2.php(%d): unserialize('O:3:"Foo":3:{s:...') -#3 {main} +#0 [internal function]: DateTime->__unserialize(Array) +#1 %sbug62852_var2.php(%d): unserialize('O:3:"Foo":3:{s:...') +#2 {main} thrown in %sbug62852_var2.php on line %d diff --git a/ext/date/tests/bug62852_var3.phpt b/ext/date/tests/bug62852_var3.phpt index df3669893f257..7049efcebd84f 100644 --- a/ext/date/tests/bug62852_var3.phpt +++ b/ext/date/tests/bug62852_var3.phpt @@ -24,8 +24,7 @@ var_dump( $foo ); --EXPECTF-- Fatal error: Uncaught Error: Invalid serialization data for DateTime object in %sbug62852_var3.php:%d Stack trace: -#0 %sbug62852_var3.php(%d): DateTime->__wakeup() -#1 [internal function]: Foo->__wakeup() -#2 %sbug62852_var3.php(%d): unserialize('O:3:"Foo":3:{s:...') -#3 {main} +#0 [internal function]: DateTime->__unserialize(Array) +#1 %sbug62852_var3.php(%d): unserialize('O:3:"Foo":3:{s:...') +#2 {main} thrown in %sbug62852_var3.php on line %d diff --git a/ext/date/tests/bug66721.phpt b/ext/date/tests/bug66721.phpt index 9effb7ca5622e..5636aa6036b9f 100644 --- a/ext/date/tests/bug66721.phpt +++ b/ext/date/tests/bug66721.phpt @@ -1,5 +1,5 @@ --TEST-- -Test for bug #66721: __wakeup of DateTime segfaults when invalid object data is supplied +Test for bug #66721: __unserialize of DateTime segfaults when invalid object data is supplied --CREDITS-- Boro Sitnikovski --FILE-- @@ -10,7 +10,7 @@ var_dump(unserialize($y)); --EXPECTF-- Fatal error: Uncaught Error: Invalid serialization data for DateTime object in %sbug66721.php:%d Stack trace: -#0 [internal function]: DateTime->__wakeup() +#0 [internal function]: DateTime->__unserialize(Array) #1 %sbug66721.php(%d): unserialize('O:8:"DateTime":...') #2 {main} thrown in %sbug66721.php on line %d diff --git a/ext/date/tests/bug68942_2.phpt b/ext/date/tests/bug68942_2.phpt index 9870bbce5c997..5718db92ce37b 100644 --- a/ext/date/tests/bug68942_2.phpt +++ b/ext/date/tests/bug68942_2.phpt @@ -8,7 +8,7 @@ var_dump($data); --EXPECTF-- Fatal error: Uncaught Error: Invalid serialization data for DateTime object in %sbug68942_2.php:%d Stack trace: -#0 [internal function]: DateTime->__wakeup() +#0 [internal function]: DateTime->__unserialize(Array) #1 %sbug68942_2.php(%d): unserialize('a:2:{i:0;O:8:"D...') #2 {main} thrown in %sbug68942_2.php on line %d From 181623f9c00f971b9b41bee2b8fe7a9982d4a1d0 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 14 Apr 2022 16:52:22 +0100 Subject: [PATCH 0469/1346] Add DateTimeZone's __serialize and __unserialize methods --- ext/date/php_date.c | 81 ++++++++++++++----- ext/date/php_date.stub.php | 4 + ext/date/php_date_arginfo.h | 10 ++- .../tests/DateTimeZone_serialisation.phpt | 58 +++++++++++++ .../tests/DateTimeZone_serialize_errors.phpt | 15 ++++ ext/date/tests/bug68942.phpt | 4 +- 6 files changed, 151 insertions(+), 21 deletions(-) create mode 100644 ext/date/tests/DateTimeZone_serialisation.phpt create mode 100644 ext/date/tests/DateTimeZone_serialize_errors.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 02fbdd9c49e64..1a37a6a3cf8a6 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1969,10 +1969,20 @@ static void php_timezone_to_string(php_timezone_obj *tzobj, zval *zv) } } +void date_timezone_object_to_hash(php_timezone_obj *tzobj, HashTable *props) +{ + zval zv; + + ZVAL_LONG(&zv, tzobj->type); + zend_hash_str_update(props, "timezone_type", strlen("timezone_type"), &zv); + + php_timezone_to_string(tzobj, &zv); + zend_hash_str_update(props, "timezone", strlen("timezone"), &zv); +} + static HashTable *date_object_get_properties_for_timezone(zend_object *object, zend_prop_purpose purpose) /* {{{ */ { HashTable *props; - zval zv; php_timezone_obj *tzobj; switch (purpose) { @@ -1992,11 +2002,7 @@ static HashTable *date_object_get_properties_for_timezone(zend_object *object, z return props; } - ZVAL_LONG(&zv, tzobj->type); - zend_hash_str_update(props, "timezone_type", sizeof("timezone_type")-1, &zv); - - php_timezone_to_string(tzobj, &zv); - zend_hash_str_update(props, "timezone", sizeof("timezone")-1, &zv); + date_timezone_object_to_hash(tzobj, props); return props; } /* }}} */ @@ -3500,7 +3506,7 @@ PHP_FUNCTION(date_diff) } /* }}} */ -static zend_result timezone_initialize(php_timezone_obj *tzobj, const char *tz, size_t tz_len) /* {{{ */ +static bool timezone_initialize(php_timezone_obj *tzobj, const char *tz, size_t tz_len) /* {{{ */ { timelib_time *dummy_t = ecalloc(1, sizeof(timelib_time)); int dst, not_found; @@ -3509,19 +3515,19 @@ static zend_result timezone_initialize(php_timezone_obj *tzobj, const char *tz, if (strlen(tz) != tz_len) { php_error_docref(NULL, E_WARNING, "Timezone must not contain null bytes"); efree(dummy_t); - return FAILURE; + return false; } dummy_t->z = timelib_parse_zone(&tz, &dst, dummy_t, ¬_found, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); if (not_found) { php_error_docref(NULL, E_WARNING, "Unknown or bad timezone (%s)", orig_tz); efree(dummy_t); - return FAILURE; + return false; } else { set_timezone_from_timelib_time(tzobj, dummy_t); timelib_free(dummy_t->tz_abbr); efree(dummy_t); - return SUCCESS; + return true; } } /* }}} */ @@ -3536,7 +3542,7 @@ PHP_FUNCTION(timezone_open) ZEND_PARSE_PARAMETERS_END(); tzobj = Z_PHPTIMEZONE_P(php_date_instantiate(date_ce_timezone, return_value)); - if (FAILURE == timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz))) { + if (!timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz))) { zval_ptr_dtor(return_value); RETURN_FALSE; } @@ -3561,25 +3567,25 @@ PHP_METHOD(DateTimeZone, __construct) } /* }}} */ -static zend_result php_date_timezone_initialize_from_hash(zval **return_value, php_timezone_obj **tzobj, HashTable *myht) /* {{{ */ +static bool php_date_timezone_initialize_from_hash(zval **return_value, php_timezone_obj **tzobj, HashTable *myht) /* {{{ */ { zval *z_timezone_type; if ((z_timezone_type = zend_hash_str_find(myht, "timezone_type", sizeof("timezone_type") - 1)) == NULL) { - return FAILURE; + return false; } zval *z_timezone; if ((z_timezone = zend_hash_str_find(myht, "timezone", sizeof("timezone") - 1)) == NULL) { - return FAILURE; + return false; } if (Z_TYPE_P(z_timezone_type) != IS_LONG) { - return FAILURE; + return false; } if (Z_TYPE_P(z_timezone) != IS_STRING) { - return FAILURE; + return false; } return timezone_initialize(*tzobj, Z_STRVAL_P(z_timezone), Z_STRLEN_P(z_timezone)); } /* }}} */ @@ -3599,7 +3605,7 @@ PHP_METHOD(DateTimeZone, __set_state) php_date_instantiate(date_ce_timezone, return_value); tzobj = Z_PHPTIMEZONE_P(return_value); - if (php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) == FAILURE) { + if (!php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht)) { zend_throw_error(NULL, "Timezone initialization failed"); zval_ptr_dtor(return_value); } @@ -3619,12 +3625,51 @@ PHP_METHOD(DateTimeZone, __wakeup) myht = Z_OBJPROP_P(object); - if (php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht) == FAILURE) { + if (!php_date_timezone_initialize_from_hash(&return_value, &tzobj, myht)) { zend_throw_error(NULL, "Timezone initialization failed"); } } /* }}} */ +/* {{{ */ +PHP_METHOD(DateTimeZone, __serialize) +{ + zval *object = ZEND_THIS; + php_timezone_obj *tzobj; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_NONE(); + + tzobj = Z_PHPTIMEZONE_P(object); + DATE_CHECK_INITIALIZED(tzobj->initialized, DateTimeZone); + + array_init(return_value); + myht = Z_ARRVAL_P(return_value); + date_timezone_object_to_hash(tzobj, myht); +} +/* }}} */ + +/* {{{ */ +PHP_METHOD(DateTimeZone, __unserialize) +{ + zval *object = ZEND_THIS; + php_timezone_obj *tzobj; + zval *array; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ARRAY(array) + ZEND_PARSE_PARAMETERS_END(); + + tzobj = Z_PHPTIMEZONE_P(object); + myht = Z_ARRVAL_P(array); + + if (!php_date_timezone_initialize_from_hash(&object, &tzobj, myht)) { + zend_throw_error(NULL, "Invalid serialization data for DateTimeZone object"); + } +} +/* }}} */ + /* {{{ Returns the name of the timezone. */ PHP_FUNCTION(timezone_name_get) { diff --git a/ext/date/php_date.stub.php b/ext/date/php_date.stub.php index 55d17bd168ab0..ea3aba7c7b361 100644 --- a/ext/date/php_date.stub.php +++ b/ext/date/php_date.stub.php @@ -453,6 +453,10 @@ public static function listAbbreviations(): array {} */ public static function listIdentifiers(int $timezoneGroup = DateTimeZone::ALL, ?string $countryCode = null): array {} + public function __serialize(): array {} + + public function __unserialize(array $data): void {} + /** @tentative-return-type */ public function __wakeup(): void {} diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h index 6cc1b75997f3d..367674f5e4f43 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: ea354510fbf64c42ee1cdd6fd786ab937516226c */ + * Stub hash: a157de6bca4bcf5a9ddace9e81ef700f132b4dda */ 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) @@ -431,6 +431,10 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_DateTimeZone_lis ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, countryCode, IS_STRING, 1, "null") ZEND_END_ARG_INFO() +#define arginfo_class_DateTimeZone___serialize arginfo_timezone_abbreviations_list + +#define arginfo_class_DateTimeZone___unserialize arginfo_class_DateTimeInterface___unserialize + #define arginfo_class_DateTimeZone___wakeup arginfo_class_DateTimeInterface___wakeup ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_DateTimeZone___set_state, 0, 1, DateTimeZone, 0) @@ -553,6 +557,8 @@ ZEND_METHOD(DateTimeImmutable, setTimestamp); ZEND_METHOD(DateTimeImmutable, createFromMutable); ZEND_METHOD(DateTimeImmutable, createFromInterface); ZEND_METHOD(DateTimeZone, __construct); +ZEND_METHOD(DateTimeZone, __serialize); +ZEND_METHOD(DateTimeZone, __unserialize); ZEND_METHOD(DateTimeZone, __wakeup); ZEND_METHOD(DateTimeZone, __set_state); ZEND_METHOD(DateInterval, __construct); @@ -696,6 +702,8 @@ static const zend_function_entry class_DateTimeZone_methods[] = { ZEND_ME_MAPPING(getLocation, timezone_location_get, arginfo_class_DateTimeZone_getLocation, ZEND_ACC_PUBLIC) ZEND_ME_MAPPING(listAbbreviations, timezone_abbreviations_list, arginfo_class_DateTimeZone_listAbbreviations, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME_MAPPING(listIdentifiers, timezone_identifiers_list, arginfo_class_DateTimeZone_listIdentifiers, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(DateTimeZone, __serialize, arginfo_class_DateTimeZone___serialize, ZEND_ACC_PUBLIC) + ZEND_ME(DateTimeZone, __unserialize, arginfo_class_DateTimeZone___unserialize, ZEND_ACC_PUBLIC) ZEND_ME(DateTimeZone, __wakeup, arginfo_class_DateTimeZone___wakeup, ZEND_ACC_PUBLIC) ZEND_ME(DateTimeZone, __set_state, arginfo_class_DateTimeZone___set_state, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_FE_END diff --git a/ext/date/tests/DateTimeZone_serialisation.phpt b/ext/date/tests/DateTimeZone_serialisation.phpt new file mode 100644 index 0000000000000..60f6f4c59f5be --- /dev/null +++ b/ext/date/tests/DateTimeZone_serialisation.phpt @@ -0,0 +1,58 @@ +--TEST-- +Test DateTimeZone::__serialize and DateTime::__unserialize +--FILE-- +__serialize()); + +$tz = new DateTimeZone("UTC"); +$tz->__unserialize( + [ + 'timezone_type' => 3, + 'timezone' => 'Europe/London', + ] +); +var_dump($tz); + +$tz->__unserialize( + [ + 'timezone_type' => 2, + 'timezone' => 'CEST', + ] +); +var_dump($tz); + +$tz->__unserialize( + [ + 'timezone_type' => 1, + 'timezone' => '+0130', + ] +); +var_dump($tz); + +?> +--EXPECTF-- +array(2) { + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(4) "CEST" +} +object(DateTimeZone)#%d (%d) { + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" +} +object(DateTimeZone)#%d (%d) { + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(4) "CEST" +} +object(DateTimeZone)#%d (%d) { + ["timezone_type"]=> + int(1) + ["timezone"]=> + string(6) "+01:30" +} diff --git a/ext/date/tests/DateTimeZone_serialize_errors.phpt b/ext/date/tests/DateTimeZone_serialize_errors.phpt new file mode 100644 index 0000000000000..f89e3bfafcbf4 --- /dev/null +++ b/ext/date/tests/DateTimeZone_serialize_errors.phpt @@ -0,0 +1,15 @@ +--TEST-- +Test unserialization of DateTimeZone with null byte +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECTF-- +Warning: DateTimeZone::__unserialize(): Timezone must not contain null bytes in %s on line %d +Invalid serialization data for DateTimeZone object diff --git a/ext/date/tests/bug68942.phpt b/ext/date/tests/bug68942.phpt index 9a9a5cfb888f0..91df60b007b62 100644 --- a/ext/date/tests/bug68942.phpt +++ b/ext/date/tests/bug68942.phpt @@ -6,9 +6,9 @@ $data = unserialize('a:2:{i:0;O:12:"DateTimeZone":2:{s:13:"timezone_type";a:2:{i var_dump($data); ?> --EXPECTF-- -Fatal error: Uncaught Error: Timezone initialization failed in %s:%d +Fatal error: Uncaught Error: Invalid serialization data for DateTimeZone object in %s:%d Stack trace: -#0 [internal function]: DateTimeZone->__wakeup() +#0 [internal function]: DateTimeZone->__unserialize(Array) #1 %s(%d): unserialize('a:2:{i:0;O:12:"...') #2 {main} thrown in %s on line %d From 6f2c5017f997c595733f51882cc6d09ceb936c68 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 14 Apr 2022 16:52:45 +0100 Subject: [PATCH 0470/1346] Fixed memory leak with unserialize was called multiple times and an abbreviation was stored --- ext/date/php_date.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 1a37a6a3cf8a6..0a02a70f6266a 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3130,6 +3130,12 @@ PHP_METHOD(DateTimeImmutable, sub) static void set_timezone_from_timelib_time(php_timezone_obj *tzobj, timelib_time *t) { + /* Free abbreviation if already set */ + if (tzobj->initialized && tzobj->type == TIMELIB_ZONETYPE_ABBR) { + timelib_free(tzobj->tzi.z.abbr); + } + + /* Set new values */ tzobj->initialized = 1; tzobj->type = t->zone_type; From 3be8b5f5cbdf70f407ec253b53c18266916c8312 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 14 Apr 2022 19:08:33 +0100 Subject: [PATCH 0471/1346] Remove fake properties from DateInterval --- ext/date/php_date.c | 44 +++++++----- ext/date/tests/DatePeriod_set_state.phpt | 16 +---- ext/date/tests/bug45682.phpt | 16 +---- ext/date/tests/bug48678.phpt | 14 ---- ext/date/tests/bug49081.phpt | 7 -- ext/date/tests/bug49778.phpt | 16 +---- ext/date/tests/bug52113.phpt | 87 ++---------------------- ext/date/tests/bug52738.phpt | 7 -- ext/date/tests/bug52808.phpt | 48 +------------ ext/date/tests/bug53437.phpt | 32 +-------- ext/date/tests/bug53437_var2.phpt | 34 +-------- ext/date/tests/bug53437_var4.phpt | 16 +---- ext/date/tests/bug53437_var5.phpt | 20 +----- ext/date/tests/bug53437_var6.phpt | 16 +---- ext/date/tests/bug60774.phpt | 14 ---- ext/date/tests/bug66545.phpt | 7 -- ext/date/tests/bug70153.phpt | 36 ++++++++-- ext/date/tests/bug71700.phpt | 18 +---- ext/date/tests/bug73091.phpt | 18 +---- ext/date/tests/bug74274.phpt | 7 -- ext/date/tests/bug74524.phpt | 7 -- ext/date/tests/bug77571.phpt | 7 -- ext/date/tests/bug78452.phpt | 18 +---- ext/date/tests/bug79015.phpt | 16 +---- ext/date/tests/date_diff1.phpt | 18 +---- ext/date/tests/date_time_fractions.phpt | 16 +---- 26 files changed, 91 insertions(+), 464 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0a02a70f6266a..fb8e9c90ad1e9 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2061,17 +2061,9 @@ static HashTable *date_object_get_gc_interval(zend_object *object, zval **table, return zend_std_get_properties(object); } /* }}} */ -static HashTable *date_object_get_properties_interval(zend_object *object) /* {{{ */ +static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTable *props, bool include_fakes) { - HashTable *props; zval zv; - php_interval_obj *intervalobj; - - intervalobj = php_interval_obj_from_obj(object); - props = zend_std_get_properties(object); - if (!intervalobj->initialized) { - return props; - } #define PHP_DATE_INTERVAL_ADD_PROPERTY(n,f) \ ZVAL_LONG(&zv, (zend_long)intervalobj->diff->f); \ @@ -2085,9 +2077,11 @@ static HashTable *date_object_get_properties_interval(zend_object *object) /* {{ PHP_DATE_INTERVAL_ADD_PROPERTY("s", s); ZVAL_DOUBLE(&zv, (double)intervalobj->diff->us / 1000000.0); zend_hash_str_update(props, "f", sizeof("f") - 1, &zv); - PHP_DATE_INTERVAL_ADD_PROPERTY("weekday", weekday); - PHP_DATE_INTERVAL_ADD_PROPERTY("weekday_behavior", weekday_behavior); - PHP_DATE_INTERVAL_ADD_PROPERTY("first_last_day_of", first_last_day_of); + if (include_fakes) { + PHP_DATE_INTERVAL_ADD_PROPERTY("weekday", weekday); + PHP_DATE_INTERVAL_ADD_PROPERTY("weekday_behavior", weekday_behavior); + PHP_DATE_INTERVAL_ADD_PROPERTY("first_last_day_of", first_last_day_of); + } PHP_DATE_INTERVAL_ADD_PROPERTY("invert", invert); if (intervalobj->diff->days != -99999) { PHP_DATE_INTERVAL_ADD_PROPERTY("days", days); @@ -2095,10 +2089,28 @@ static HashTable *date_object_get_properties_interval(zend_object *object) /* {{ ZVAL_FALSE(&zv); zend_hash_str_update(props, "days", sizeof("days")-1, &zv); } - PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); - PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); - PHP_DATE_INTERVAL_ADD_PROPERTY("have_weekday_relative", have_weekday_relative); - PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); + if (include_fakes) { + PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); + PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); + PHP_DATE_INTERVAL_ADD_PROPERTY("have_weekday_relative", have_weekday_relative); + PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); + } + +#undef PHP_DATE_INTERVAL_ADD_PROPERTY +} + +static HashTable *date_object_get_properties_interval(zend_object *object) /* {{{ */ +{ + HashTable *props; + php_interval_obj *intervalobj; + + intervalobj = php_interval_obj_from_obj(object); + props = zend_std_get_properties(object); + if (!intervalobj->initialized) { + return props; + } + + date_interval_object_to_hash(intervalobj, props, false); return props; } /* }}} */ diff --git a/ext/date/tests/DatePeriod_set_state.phpt b/ext/date/tests/DatePeriod_set_state.phpt index eaef2163cc8a3..eaf7d4dfe9e93 100644 --- a/ext/date/tests/DatePeriod_set_state.phpt +++ b/ext/date/tests/DatePeriod_set_state.phpt @@ -34,7 +34,7 @@ object(DatePeriod)#%d (6) { ["end"]=> NULL ["interval"]=> - object(DateInterval)#%d (16) { + object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -49,24 +49,10 @@ object(DatePeriod)#%d (6) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } ["recurrences"]=> int(25) diff --git a/ext/date/tests/bug45682.phpt b/ext/date/tests/bug45682.phpt index 636381dcfeda0..7568fd07d9bca 100644 --- a/ext/date/tests/bug45682.phpt +++ b/ext/date/tests/bug45682.phpt @@ -13,7 +13,7 @@ $diff = date_diff($date, $other); var_dump($diff); ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -28,22 +28,8 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(3) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/bug48678.phpt b/ext/date/tests/bug48678.phpt index 9c1cecd2df780..df1571a829648 100644 --- a/ext/date/tests/bug48678.phpt +++ b/ext/date/tests/bug48678.phpt @@ -17,15 +17,8 @@ DateInterval Object [i] => 30 [s] => 5 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) DateInterval Object ( @@ -36,13 +29,6 @@ DateInterval Object [i] => 30 [s] => 5 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug49081.phpt b/ext/date/tests/bug49081.phpt index b5d17a6c264b6..c29075e17cea9 100644 --- a/ext/date/tests/bug49081.phpt +++ b/ext/date/tests/bug49081.phpt @@ -18,13 +18,6 @@ DateInterval Object [i] => 0 [s] => 0 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => 30 - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug49778.phpt b/ext/date/tests/bug49778.phpt index 56ce135179222..cce69f8e7748f 100644 --- a/ext/date/tests/bug49778.phpt +++ b/ext/date/tests/bug49778.phpt @@ -8,7 +8,7 @@ echo $i->format("%d"), "\n"; echo $i->format("%a"), "\n"; ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -23,24 +23,10 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } 7 (unknown) diff --git a/ext/date/tests/bug52113.phpt b/ext/date/tests/bug52113.phpt index 84cd1b5210157..c6e280cd40668 100644 --- a/ext/date/tests/bug52113.phpt +++ b/ext/date/tests/bug52113.phpt @@ -33,7 +33,7 @@ var_dump($unser, $p); ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -48,24 +48,10 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" \DateInterval::__set_state(array( @@ -76,16 +62,9 @@ string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h" 'i' => 0, 's' => 0, 'f' => 0.0, - 'weekday' => 0, - 'weekday_behavior' => 0, - 'first_last_day_of' => 0, 'invert' => 0, 'days' => 0, - 'special_type' => 0, - 'special_amount' => 0, - 'have_weekday_relative' => 0, - 'have_special_relative' => 0, -))object(DateInterval)#%d (16) { +))object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -100,24 +79,10 @@ string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h" int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } object(DatePeriod)#%d (6) { ["start"]=> @@ -134,7 +99,7 @@ object(DatePeriod)#%d (6) { ["end"]=> NULL ["interval"]=> - object(DateInterval)#%d (16) { + object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -149,31 +114,17 @@ object(DatePeriod)#%d (6) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } ["recurrences"]=> int(3) ["include_start_date"]=> bool(true) } -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(7) ["m"]=> @@ -188,24 +139,10 @@ object(DateInterval)#%d (16) { int(2) ["f"]=> float(0.876543) - ["weekday"]=> - int(-1) - ["weekday_behavior"]=> - int(-1) - ["first_last_day_of"]=> - int(-1) ["invert"]=> int(1) ["days"]=> int(2400) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(-1) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } object(DatePeriod)#%d (6) { ["start"]=> @@ -222,7 +159,7 @@ object(DatePeriod)#%d (6) { ["end"]=> NULL ["interval"]=> - object(DateInterval)#%d (16) { + object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -237,24 +174,10 @@ object(DatePeriod)#%d (6) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } ["recurrences"]=> int(3) diff --git a/ext/date/tests/bug52738.phpt b/ext/date/tests/bug52738.phpt index 4f51fc38988a4..46be78af1943c 100644 --- a/ext/date/tests/bug52738.phpt +++ b/ext/date/tests/bug52738.phpt @@ -29,13 +29,6 @@ di Object [i] => 0 [s] => 0 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug52808.phpt b/ext/date/tests/bug52808.phpt index c0ab817bcc84b..190d5184393df 100644 --- a/ext/date/tests/bug52808.phpt +++ b/ext/date/tests/bug52808.phpt @@ -25,7 +25,7 @@ foreach($intervals as $iv) { echo "==DONE==\n"; ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(1) ["m"]=> @@ -40,26 +40,12 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(1) ["days"]=> int(437) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -74,26 +60,12 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(294) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -108,24 +80,10 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(294) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } Failed to parse interval (2007-05-11T15:30:00Z/) Failed to parse interval (2007-05-11T15:30:00Z) diff --git a/ext/date/tests/bug53437.phpt b/ext/date/tests/bug53437.phpt index f19f073aa9430..349fd5b39f0b8 100644 --- a/ext/date/tests/bug53437.phpt +++ b/ext/date/tests/bug53437.phpt @@ -50,7 +50,7 @@ object(DatePeriod)#%d (6) { ["end"]=> NULL ["interval"]=> - object(DateInterval)#%d (16) { + object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -65,24 +65,10 @@ object(DatePeriod)#%d (6) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } ["recurrences"]=> int(3) @@ -111,7 +97,7 @@ object(DatePeriod)#%d (6) { ["end"]=> NULL ["interval"]=> - object(DateInterval)#%d (16) { + object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -126,24 +112,10 @@ object(DatePeriod)#%d (6) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } ["recurrences"]=> int(3) diff --git a/ext/date/tests/bug53437_var2.phpt b/ext/date/tests/bug53437_var2.phpt index 7a87b38421a50..23527684f39ef 100644 --- a/ext/date/tests/bug53437_var2.phpt +++ b/ext/date/tests/bug53437_var2.phpt @@ -11,8 +11,8 @@ $di1 = unserialize($s); var_dump($di0, $di1); ?> ---EXPECT-- -object(DateInterval)#1 (16) { +--EXPECTF-- +object(DateInterval)#1 (%d) { ["y"]=> int(2) ["m"]=> @@ -27,26 +27,12 @@ object(DateInterval)#1 (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } -object(DateInterval)#2 (16) { +object(DateInterval)#2 (%d) { ["y"]=> int(2) ["m"]=> @@ -61,22 +47,8 @@ object(DateInterval)#2 (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/bug53437_var4.phpt b/ext/date/tests/bug53437_var4.phpt index b53483ab7fa2b..05defd24125e4 100644 --- a/ext/date/tests/bug53437_var4.phpt +++ b/ext/date/tests/bug53437_var4.phpt @@ -21,7 +21,7 @@ var_dump($df, ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -36,24 +36,10 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(2) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } int(0) int(0) diff --git a/ext/date/tests/bug53437_var5.phpt b/ext/date/tests/bug53437_var5.phpt index 55bba9ed59d8f..61ebffe5237dd 100644 --- a/ext/date/tests/bug53437_var5.phpt +++ b/ext/date/tests/bug53437_var5.phpt @@ -11,7 +11,7 @@ var_dump($di); ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(2) ["m"]=> @@ -24,24 +24,10 @@ object(DateInterval)#%d (16) { int(8) ["s"]=> int(0) - ["weekday"]=> - int(10) - ["weekday_behavior"]=> - int(10) - ["first_last_day_of"]=> - int(0) + ["f"]=> + float(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(9223372036854775807) - ["have_weekday_relative"]=> - int(9) - ["have_special_relative"]=> - int(0) - ["f"]=> - float(0) } diff --git a/ext/date/tests/bug53437_var6.phpt b/ext/date/tests/bug53437_var6.phpt index f5ff22c4a4612..e03a28ec6b4c9 100644 --- a/ext/date/tests/bug53437_var6.phpt +++ b/ext/date/tests/bug53437_var6.phpt @@ -11,7 +11,7 @@ var_dump($di); ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(2) ["m"]=> @@ -26,22 +26,8 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0.123654) - ["weekday"]=> - int(10) - ["weekday_behavior"]=> - int(10) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(9223372036854775807) - ["have_weekday_relative"]=> - int(9) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/bug60774.phpt b/ext/date/tests/bug60774.phpt index 0a9c4223c37c3..6349ee0f37348 100644 --- a/ext/date/tests/bug60774.phpt +++ b/ext/date/tests/bug60774.phpt @@ -23,24 +23,10 @@ object(DateInterval)#1 (%d) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } 2 (unknown) diff --git a/ext/date/tests/bug66545.phpt b/ext/date/tests/bug66545.phpt index 276c6d5f67581..85518920f433a 100644 --- a/ext/date/tests/bug66545.phpt +++ b/ext/date/tests/bug66545.phpt @@ -25,13 +25,6 @@ DateInterval Object [i] => 59 [s] => 59 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => 14 - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug70153.phpt b/ext/date/tests/bug70153.phpt index 5b965207fc27d..ca82dba980cc9 100644 --- a/ext/date/tests/bug70153.phpt +++ b/ext/date/tests/bug70153.phpt @@ -3,12 +3,40 @@ Bug #70153 (\DateInterval incorrectly unserialized) --FILE-- days, $i2->days); -var_dump($i2->special_amount, $i2->special_amount); ?> --EXPECT-- +DateInterval Object +( + [y] => 0 + [m] => 1 + [d] => 0 + [h] => 0 + [i] => 0 + [s] => 0 + [f] => 0 + [invert] => 0 + [days] => +) +O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;s:1:"h";i:0;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";b:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}DateInterval Object +( + [y] => 0 + [m] => 1 + [d] => 0 + [h] => 0 + [i] => 0 + [s] => 0 + [f] => 0 + [invert] => 0 + [days] => +) bool(false) bool(false) -int(0) -int(0) diff --git a/ext/date/tests/bug71700.phpt b/ext/date/tests/bug71700.phpt index 53a6f9db20992..8a9ec3992fc02 100644 --- a/ext/date/tests/bug71700.phpt +++ b/ext/date/tests/bug71700.phpt @@ -11,8 +11,8 @@ $diff = date_diff($date1, $date2, true); var_dump($diff); ?> ---EXPECT-- -object(DateInterval)#3 (16) { +--EXPECTF-- +object(DateInterval)#3 (%d) { ["y"]=> int(0) ["m"]=> @@ -27,22 +27,8 @@ object(DateInterval)#3 (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(30) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/bug73091.phpt b/ext/date/tests/bug73091.phpt index 918170d823fb1..b75951d036e4c 100644 --- a/ext/date/tests/bug73091.phpt +++ b/ext/date/tests/bug73091.phpt @@ -12,9 +12,7 @@ class foo { var_dump(unserialize('O:12:"DateInterval":1:{s:4:"days";O:3:"foo":0:{}}')); ?> --EXPECTF-- -object(DateInterval)#%d (16) { - ["days"]=> - int(-1) +object(DateInterval)#%d (%d) { ["y"]=> int(-1) ["m"]=> @@ -29,20 +27,8 @@ object(DateInterval)#%d (16) { int(-1) ["f"]=> float(0) - ["weekday"]=> - int(-1) - ["weekday_behavior"]=> - int(-1) - ["first_last_day_of"]=> - int(-1) ["invert"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> + ["days"]=> int(-1) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/bug74274.phpt b/ext/date/tests/bug74274.phpt index e03d40cf88da7..f5b7f6595454c 100644 --- a/ext/date/tests/bug74274.phpt +++ b/ext/date/tests/bug74274.phpt @@ -18,13 +18,6 @@ DateInterval Object [i] => 0 [s] => 0 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => 1 - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug74524.phpt b/ext/date/tests/bug74524.phpt index f49a5340185e9..40cca02108858 100644 --- a/ext/date/tests/bug74524.phpt +++ b/ext/date/tests/bug74524.phpt @@ -20,13 +20,6 @@ DateInterval Object [i] => 36 [s] => 10 [f] => 0.920541 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 1 [days] => 227 - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug77571.phpt b/ext/date/tests/bug77571.phpt index f6a5b55dab0f6..673b943256e47 100644 --- a/ext/date/tests/bug77571.phpt +++ b/ext/date/tests/bug77571.phpt @@ -21,13 +21,6 @@ DateInterval Object [i] => 0 [s] => 0 [f] => 0 - [weekday] => 0 - [weekday_behavior] => 0 - [first_last_day_of] => 0 [invert] => 0 [days] => 35 - [special_type] => 0 - [special_amount] => 0 - [have_weekday_relative] => 0 - [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug78452.phpt b/ext/date/tests/bug78452.phpt index a4b095de03abb..dec40fafea306 100644 --- a/ext/date/tests/bug78452.phpt +++ b/ext/date/tests/bug78452.phpt @@ -7,8 +7,8 @@ $date1 = new \DateTime('2019-09-24 11:47:24'); $date2 = new \DateTime('2019-08-21 12:47:24'); var_dump($date1->diff($date2)); ?> ---EXPECT-- -object(DateInterval)#3 (16) { +--EXPECTF-- +object(DateInterval)#3 (%d) { ["y"]=> int(0) ["m"]=> @@ -23,22 +23,8 @@ object(DateInterval)#3 (16) { int(0) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(1) ["days"]=> int(33) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/bug79015.phpt b/ext/date/tests/bug79015.phpt index 9d752dee7221e..2059658e1e05c 100644 --- a/ext/date/tests/bug79015.phpt +++ b/ext/date/tests/bug79015.phpt @@ -6,7 +6,7 @@ $payload = 'O:12:"DateInterval":16:{s:1:"y";i:1;s:1:"m";i:0;s:1:"d";i:4;s:1:"h"; var_dump(unserialize($payload)); ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(1) ["m"]=> @@ -21,22 +21,8 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(%f) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> bool(false) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/date_diff1.phpt b/ext/date/tests/date_diff1.phpt index 2b73eae6a8cc3..e3556590f8e3e 100644 --- a/ext/date/tests/date_diff1.phpt +++ b/ext/date/tests/date_diff1.phpt @@ -28,7 +28,7 @@ object(DateTime)#2 (3) { ["timezone"]=> string(3) "EDT" } -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -36,29 +36,15 @@ object(DateInterval)#%d (16) { ["d"]=> int(2) ["h"]=> - int(16) + int(%d) ["i"]=> int(19) ["s"]=> int(40) ["f"]=> float(0) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(33) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } diff --git a/ext/date/tests/date_time_fractions.phpt b/ext/date/tests/date_time_fractions.phpt index 29f7cd0d14103..215b7c92333b2 100644 --- a/ext/date/tests/date_time_fractions.phpt +++ b/ext/date/tests/date_time_fractions.phpt @@ -58,7 +58,7 @@ microseconds = true 2016-10-02 00:00:00.000000 2016-10-03 12:00:00.000000 2016-10-17 12:47:18.081921 -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(0) ["m"]=> @@ -73,24 +73,10 @@ object(DateInterval)#%d (16) { int(0) ["f"]=> float(0.378189) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) } 2016-10-03 13:20:06.724934 2016-10-03 13:20:07.103123 From f869a546e7b44d9361e0632f4f2509becb6f3fc5 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 15 Apr 2022 10:53:16 +0100 Subject: [PATCH 0472/1346] Add DateInterval's __serialize and __unserialize methods --- ext/date/php_date.c | 38 +++++++++++++++++++++++++++++++++++++ ext/date/php_date.stub.php | 4 ++++ ext/date/php_date_arginfo.h | 10 +++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index fb8e9c90ad1e9..636e4f874e9fc 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4204,6 +4204,44 @@ PHP_METHOD(DateInterval, __set_state) } /* }}} */ +/* {{{ */ +PHP_METHOD(DateInterval, __serialize) +{ + zval *object = ZEND_THIS; + php_interval_obj *intervalobj; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_NONE(); + + intervalobj = Z_PHPINTERVAL_P(object); + DATE_CHECK_INITIALIZED(intervalobj->initialized, DateInterval); + + array_init(return_value); + myht = Z_ARRVAL_P(return_value); + date_interval_object_to_hash(intervalobj, myht, true); +} +/* }}} */ + + +/* {{{ */ +PHP_METHOD(DateInterval, __unserialize) +{ + zval *object = ZEND_THIS; + php_interval_obj *intervalobj; + zval *array; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ARRAY(array) + ZEND_PARSE_PARAMETERS_END(); + + intervalobj = Z_PHPINTERVAL_P(object); + myht = Z_ARRVAL_P(array); + + php_date_interval_initialize_from_hash(&object, &intervalobj, myht); +} +/* }}} */ + /* {{{ */ PHP_METHOD(DateInterval, __wakeup) { diff --git a/ext/date/php_date.stub.php b/ext/date/php_date.stub.php index ea3aba7c7b361..5cb435647c946 100644 --- a/ext/date/php_date.stub.php +++ b/ext/date/php_date.stub.php @@ -480,6 +480,10 @@ public static function createFromDateString(string $datetime): DateInterval|fals */ public function format(string $format): string {} + public function __serialize(): array; + + public function __unserialize(array $data): void; + /** @tentative-return-type */ public function __wakeup(): void {} diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h index 367674f5e4f43..722f38b1793d6 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: a157de6bca4bcf5a9ddace9e81ef700f132b4dda */ + * Stub hash: 4845891ab3872f292438de639953e2022f849125 */ 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) @@ -451,6 +451,10 @@ ZEND_END_ARG_INFO() #define arginfo_class_DateInterval_format arginfo_class_DateTimeInterface_format +#define arginfo_class_DateInterval___serialize arginfo_timezone_abbreviations_list + +#define arginfo_class_DateInterval___unserialize arginfo_class_DateTimeInterface___unserialize + #define arginfo_class_DateInterval___wakeup arginfo_class_DateTimeInterface___wakeup ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_DateInterval___set_state, 0, 1, DateInterval, 0) @@ -562,6 +566,8 @@ ZEND_METHOD(DateTimeZone, __unserialize); ZEND_METHOD(DateTimeZone, __wakeup); ZEND_METHOD(DateTimeZone, __set_state); ZEND_METHOD(DateInterval, __construct); +ZEND_METHOD(DateInterval, __serialize); +ZEND_METHOD(DateInterval, __unserialize); ZEND_METHOD(DateInterval, __wakeup); ZEND_METHOD(DateInterval, __set_state); ZEND_METHOD(DatePeriod, __construct); @@ -714,6 +720,8 @@ static const zend_function_entry class_DateInterval_methods[] = { ZEND_ME(DateInterval, __construct, arginfo_class_DateInterval___construct, ZEND_ACC_PUBLIC) ZEND_ME_MAPPING(createFromDateString, date_interval_create_from_date_string, arginfo_class_DateInterval_createFromDateString, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME_MAPPING(format, date_interval_format, arginfo_class_DateInterval_format, ZEND_ACC_PUBLIC) + ZEND_ME(DateInterval, __serialize, arginfo_class_DateInterval___serialize, ZEND_ACC_PUBLIC) + ZEND_ME(DateInterval, __unserialize, arginfo_class_DateInterval___unserialize, ZEND_ACC_PUBLIC) ZEND_ME(DateInterval, __wakeup, arginfo_class_DateInterval___wakeup, ZEND_ACC_PUBLIC) ZEND_ME(DateInterval, __set_state, arginfo_class_DateInterval___set_state, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_FE_END From 76e852e7e8ba20901d33ccf405ba85e914870768 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 15 Apr 2022 10:54:42 +0100 Subject: [PATCH 0473/1346] Fixed memory leak with manual calls to DateInterval::__unserialize --- ext/date/php_date.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 636e4f874e9fc..7dc885d56aae2 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4104,6 +4104,12 @@ 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); + } + + /* Set new value */ (*intobj)->diff = timelib_rel_time_ctor(); #define PHP_DATE_INTERVAL_READ_PROPERTY(element, member, itype, def) \ From f4e5010aa995862b60473376c7242422b53b8191 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 15 Apr 2022 10:55:39 +0100 Subject: [PATCH 0474/1346] Show the 'have_special_relative' property in var_dumps, and disallow serialization if set --- ext/date/php_date.c | 7 ++++++- ext/date/tests/DatePeriod_set_state.phpt | 2 ++ ext/date/tests/bug45682.phpt | 2 ++ ext/date/tests/bug48678.phpt | 2 ++ ext/date/tests/bug49081.phpt | 1 + ext/date/tests/bug49778.phpt | 2 ++ ext/date/tests/bug52113.phpt | 11 +++++++++++ ext/date/tests/bug52738.phpt | 1 + ext/date/tests/bug52808.phpt | 6 ++++++ ext/date/tests/bug53437.phpt | 4 ++++ ext/date/tests/bug53437_var2.phpt | 6 +++++- ext/date/tests/bug53437_var4.phpt | 2 ++ ext/date/tests/bug53437_var5.phpt | 4 +++- ext/date/tests/bug53437_var6.phpt | 4 +++- ext/date/tests/bug60774.phpt | 2 ++ ext/date/tests/bug66545.phpt | 1 + ext/date/tests/bug70153.phpt | 2 ++ ext/date/tests/bug71700.phpt | 2 ++ ext/date/tests/bug73091.phpt | 2 ++ ext/date/tests/bug74274.phpt | 1 + ext/date/tests/bug74524.phpt | 1 + ext/date/tests/bug77571.phpt | 3 ++- ext/date/tests/bug78452.phpt | 2 ++ ext/date/tests/bug79015.phpt | 2 ++ ext/date/tests/date_diff1.phpt | 2 ++ ext/date/tests/date_time_fractions.phpt | 2 ++ 26 files changed, 71 insertions(+), 5 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 7dc885d56aae2..0dff004b676c1 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2093,8 +2093,9 @@ static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTabl PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); PHP_DATE_INTERVAL_ADD_PROPERTY("have_weekday_relative", have_weekday_relative); - PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); } + /* Records whether this is a special relative interval that can't be serialized */ + PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); #undef PHP_DATE_INTERVAL_ADD_PROPERTY } @@ -4222,6 +4223,10 @@ PHP_METHOD(DateInterval, __serialize) intervalobj = Z_PHPINTERVAL_P(object); DATE_CHECK_INITIALIZED(intervalobj->initialized, DateInterval); + if (intervalobj->diff->have_special_relative) { + zend_throw_exception_ex(NULL, 0, "Serializing special relative time specifications is not supported"); + } + array_init(return_value); myht = Z_ARRVAL_P(return_value); date_interval_object_to_hash(intervalobj, myht, true); diff --git a/ext/date/tests/DatePeriod_set_state.phpt b/ext/date/tests/DatePeriod_set_state.phpt index eaf7d4dfe9e93..558afe3bea56b 100644 --- a/ext/date/tests/DatePeriod_set_state.phpt +++ b/ext/date/tests/DatePeriod_set_state.phpt @@ -53,6 +53,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } ["recurrences"]=> int(25) diff --git a/ext/date/tests/bug45682.phpt b/ext/date/tests/bug45682.phpt index 7568fd07d9bca..989c9451614fd 100644 --- a/ext/date/tests/bug45682.phpt +++ b/ext/date/tests/bug45682.phpt @@ -32,4 +32,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(3) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug48678.phpt b/ext/date/tests/bug48678.phpt index df1571a829648..8ef58ca6af7e2 100644 --- a/ext/date/tests/bug48678.phpt +++ b/ext/date/tests/bug48678.phpt @@ -19,6 +19,7 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => + [have_special_relative] => 0 ) DateInterval Object ( @@ -31,4 +32,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug49081.phpt b/ext/date/tests/bug49081.phpt index c29075e17cea9..0e679da8b3a0f 100644 --- a/ext/date/tests/bug49081.phpt +++ b/ext/date/tests/bug49081.phpt @@ -20,4 +20,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 30 + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug49778.phpt b/ext/date/tests/bug49778.phpt index cce69f8e7748f..2774d1b0a7247 100644 --- a/ext/date/tests/bug49778.phpt +++ b/ext/date/tests/bug49778.phpt @@ -27,6 +27,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } 7 (unknown) diff --git a/ext/date/tests/bug52113.phpt b/ext/date/tests/bug52113.phpt index c6e280cd40668..f973f210162a5 100644 --- a/ext/date/tests/bug52113.phpt +++ b/ext/date/tests/bug52113.phpt @@ -52,6 +52,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" \DateInterval::__set_state(array( @@ -64,6 +66,7 @@ string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h" 'f' => 0.0, 'invert' => 0, 'days' => 0, + 'have_special_relative' => 0, ))object(DateInterval)#%d (%d) { ["y"]=> int(0) @@ -83,6 +86,8 @@ string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h" int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } object(DatePeriod)#%d (6) { ["start"]=> @@ -118,6 +123,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } ["recurrences"]=> int(3) @@ -143,6 +150,8 @@ object(DateInterval)#%d (%d) { int(1) ["days"]=> int(2400) + ["have_special_relative"]=> + int(0) } object(DatePeriod)#%d (6) { ["start"]=> @@ -178,6 +187,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } ["recurrences"]=> int(3) diff --git a/ext/date/tests/bug52738.phpt b/ext/date/tests/bug52738.phpt index 46be78af1943c..e4d2595e75e22 100644 --- a/ext/date/tests/bug52738.phpt +++ b/ext/date/tests/bug52738.phpt @@ -31,4 +31,5 @@ di Object [f] => 0 [invert] => 0 [days] => + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug52808.phpt b/ext/date/tests/bug52808.phpt index 190d5184393df..3abd5261bd0bb 100644 --- a/ext/date/tests/bug52808.phpt +++ b/ext/date/tests/bug52808.phpt @@ -44,6 +44,8 @@ object(DateInterval)#%d (%d) { int(1) ["days"]=> int(437) + ["have_special_relative"]=> + int(0) } object(DateInterval)#%d (%d) { ["y"]=> @@ -64,6 +66,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(294) + ["have_special_relative"]=> + int(0) } object(DateInterval)#%d (%d) { ["y"]=> @@ -84,6 +88,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(294) + ["have_special_relative"]=> + int(0) } Failed to parse interval (2007-05-11T15:30:00Z/) Failed to parse interval (2007-05-11T15:30:00Z) diff --git a/ext/date/tests/bug53437.phpt b/ext/date/tests/bug53437.phpt index 349fd5b39f0b8..afb67ad41a1b8 100644 --- a/ext/date/tests/bug53437.phpt +++ b/ext/date/tests/bug53437.phpt @@ -69,6 +69,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } ["recurrences"]=> int(3) @@ -116,6 +118,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } ["recurrences"]=> int(3) diff --git a/ext/date/tests/bug53437_var2.phpt b/ext/date/tests/bug53437_var2.phpt index 23527684f39ef..b625d572f7a0a 100644 --- a/ext/date/tests/bug53437_var2.phpt +++ b/ext/date/tests/bug53437_var2.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #53437 DateInterval basic serialization +Bug #53437 (DateInterval basic serialization) --FILE-- bool(false) + ["have_special_relative"]=> + int(0) } object(DateInterval)#2 (%d) { ["y"]=> @@ -51,4 +53,6 @@ object(DateInterval)#2 (%d) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug53437_var4.phpt b/ext/date/tests/bug53437_var4.phpt index 05defd24125e4..7c558a24c884f 100644 --- a/ext/date/tests/bug53437_var4.phpt +++ b/ext/date/tests/bug53437_var4.phpt @@ -40,6 +40,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(2) + ["have_special_relative"]=> + int(0) } int(0) int(0) diff --git a/ext/date/tests/bug53437_var5.phpt b/ext/date/tests/bug53437_var5.phpt index 61ebffe5237dd..8e04fea933d51 100644 --- a/ext/date/tests/bug53437_var5.phpt +++ b/ext/date/tests/bug53437_var5.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #53437 DateInterval unserialize bad data, 64 bit +Bug #53437 (DateInterval unserialize bad data, 64 bit) --SKIPIF-- --FILE-- @@ -30,4 +30,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug53437_var6.phpt b/ext/date/tests/bug53437_var6.phpt index e03a28ec6b4c9..aa7657eec14b2 100644 --- a/ext/date/tests/bug53437_var6.phpt +++ b/ext/date/tests/bug53437_var6.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #53437 DateInterval unserialize bad data, 64 bit +Bug #53437 (DateInterval unserialize bad data, 64 bit) --SKIPIF-- --FILE-- @@ -30,4 +30,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug60774.phpt b/ext/date/tests/bug60774.phpt index 6349ee0f37348..130048e71de4c 100644 --- a/ext/date/tests/bug60774.phpt +++ b/ext/date/tests/bug60774.phpt @@ -27,6 +27,8 @@ object(DateInterval)#1 (%d) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } 2 (unknown) diff --git a/ext/date/tests/bug66545.phpt b/ext/date/tests/bug66545.phpt index 85518920f433a..efe3e6d1eab44 100644 --- a/ext/date/tests/bug66545.phpt +++ b/ext/date/tests/bug66545.phpt @@ -27,4 +27,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 14 + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug70153.phpt b/ext/date/tests/bug70153.phpt index ca82dba980cc9..556a5b4f7fd8d 100644 --- a/ext/date/tests/bug70153.phpt +++ b/ext/date/tests/bug70153.phpt @@ -25,6 +25,7 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => + [have_special_relative] => 0 ) O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;s:1:"h";i:0;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";b:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}DateInterval Object ( @@ -37,6 +38,7 @@ O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;s:1:"h";i:0;s:1:"i"; [f] => 0 [invert] => 0 [days] => + [have_special_relative] => 0 ) bool(false) bool(false) diff --git a/ext/date/tests/bug71700.phpt b/ext/date/tests/bug71700.phpt index 8a9ec3992fc02..243511fbf976a 100644 --- a/ext/date/tests/bug71700.phpt +++ b/ext/date/tests/bug71700.phpt @@ -31,4 +31,6 @@ object(DateInterval)#3 (%d) { int(0) ["days"]=> int(30) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug73091.phpt b/ext/date/tests/bug73091.phpt index b75951d036e4c..7f16a024ad5b6 100644 --- a/ext/date/tests/bug73091.phpt +++ b/ext/date/tests/bug73091.phpt @@ -31,4 +31,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(-1) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug74274.phpt b/ext/date/tests/bug74274.phpt index f5b7f6595454c..b83a2b641c898 100644 --- a/ext/date/tests/bug74274.phpt +++ b/ext/date/tests/bug74274.phpt @@ -20,4 +20,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 1 + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug74524.phpt b/ext/date/tests/bug74524.phpt index 40cca02108858..93f4cd9209928 100644 --- a/ext/date/tests/bug74524.phpt +++ b/ext/date/tests/bug74524.phpt @@ -22,4 +22,5 @@ DateInterval Object [f] => 0.920541 [invert] => 1 [days] => 227 + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug77571.phpt b/ext/date/tests/bug77571.phpt index 673b943256e47..bc85354002cba 100644 --- a/ext/date/tests/bug77571.phpt +++ b/ext/date/tests/bug77571.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #77571 (DateTime's diff DateInterval incorrect in timezones from UTC+01:00 to UTC+12:00 +Bug #77571 (DateTime's diff DateInterval incorrect in timezones from UTC+01:00 to UTC+12:00) --FILE-- 0 [invert] => 0 [days] => 35 + [have_special_relative] => 0 ) diff --git a/ext/date/tests/bug78452.phpt b/ext/date/tests/bug78452.phpt index dec40fafea306..ac4aa887f2862 100644 --- a/ext/date/tests/bug78452.phpt +++ b/ext/date/tests/bug78452.phpt @@ -27,4 +27,6 @@ object(DateInterval)#3 (%d) { int(1) ["days"]=> int(33) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/bug79015.phpt b/ext/date/tests/bug79015.phpt index 2059658e1e05c..69a197563ea83 100644 --- a/ext/date/tests/bug79015.phpt +++ b/ext/date/tests/bug79015.phpt @@ -25,4 +25,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> bool(false) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/date_diff1.phpt b/ext/date/tests/date_diff1.phpt index e3556590f8e3e..437e43fc640ad 100644 --- a/ext/date/tests/date_diff1.phpt +++ b/ext/date/tests/date_diff1.phpt @@ -47,4 +47,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(33) + ["have_special_relative"]=> + int(0) } diff --git a/ext/date/tests/date_time_fractions.phpt b/ext/date/tests/date_time_fractions.phpt index 215b7c92333b2..ada2e3e772074 100644 --- a/ext/date/tests/date_time_fractions.phpt +++ b/ext/date/tests/date_time_fractions.phpt @@ -77,6 +77,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) + ["have_special_relative"]=> + int(0) } 2016-10-03 13:20:06.724934 2016-10-03 13:20:07.103123 From c280121b72c31b9fec724bcbf39456adb94ab93e Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 15 Apr 2022 10:55:59 +0100 Subject: [PATCH 0475/1346] Add a few test cases for DateInterval --- .../tests/DateInterval_serialize-001.phpt | 111 +++++++++++++ .../tests/DateInterval_serialize-002.phpt | 155 ++++++++++++++++++ .../tests/DateInterval_serialize-003.phpt | 45 +++++ 3 files changed, 311 insertions(+) create mode 100644 ext/date/tests/DateInterval_serialize-001.phpt create mode 100644 ext/date/tests/DateInterval_serialize-002.phpt create mode 100644 ext/date/tests/DateInterval_serialize-003.phpt diff --git a/ext/date/tests/DateInterval_serialize-001.phpt b/ext/date/tests/DateInterval_serialize-001.phpt new file mode 100644 index 0000000000000..f0834172fb73e --- /dev/null +++ b/ext/date/tests/DateInterval_serialize-001.phpt @@ -0,0 +1,111 @@ +--TEST-- +Test DateInterval::__serialize and DateInterval::__unserialize +--FILE-- +__serialize()); +?> +--EXPECTF-- +Original object: +object(DateInterval)#1 (10) { + ["y"]=> + int(2) + ["m"]=> + int(0) + ["d"]=> + int(4) + ["h"]=> + int(6) + ["i"]=> + int(8) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["have_special_relative"]=> + int(0) +} + + +Serialised object: +string(332) "O:12:"DateInterval":16:{s:1:"y";i:2;s:1:"m";i:0;s:1:"d";i:4;s:1:"h";i:6;s:1:"i";i:8;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";b:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" + + +Unserialised object: +object(DateInterval)#2 (10) { + ["y"]=> + int(2) + ["m"]=> + int(0) + ["d"]=> + int(4) + ["h"]=> + int(6) + ["i"]=> + int(8) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["have_special_relative"]=> + int(0) +} + + +Calling __serialize manually: +array(16) { + ["y"]=> + int(2) + ["m"]=> + int(0) + ["d"]=> + int(4) + ["h"]=> + int(6) + ["i"]=> + int(8) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["weekday"]=> + int(0) + ["weekday_behavior"]=> + int(0) + ["first_last_day_of"]=> + int(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["special_type"]=> + int(0) + ["special_amount"]=> + int(0) + ["have_weekday_relative"]=> + int(0) + ["have_special_relative"]=> + int(0) +} diff --git a/ext/date/tests/DateInterval_serialize-002.phpt b/ext/date/tests/DateInterval_serialize-002.phpt new file mode 100644 index 0000000000000..df31cf1910e18 --- /dev/null +++ b/ext/date/tests/DateInterval_serialize-002.phpt @@ -0,0 +1,155 @@ +--TEST-- +Test DateInterval::__serialize and DateInterval::__unserialize +--FILE-- +diff($d2); +echo "Original object:\n"; +var_dump($d); + +echo "\n\nSerialised object:\n"; +$s = serialize($d); +var_dump($s); + +echo "\n\nUnserialised object:\n"; +$e = unserialize($s); +var_dump($e); + +echo "\n\nCalling __serialize manually:\n"; +var_dump($d->__serialize()); + +echo "\n\nCalling __unserialize manually:\n"; +$d = new DateInterval('P2Y4DT6H8M'); +$d->__unserialize( + [ + 'y' => 43, + 'm' => 3, + 'd' => 24, + 'h' => 1, + 'i' => 12, + 's' => 27, + 'f' => 0.654321, + 'days' => 15820, + ] +); +var_dump($d); +?> +--EXPECTF-- +Original object: +object(DateInterval)#3 (10) { + ["y"]=> + int(43) + ["m"]=> + int(3) + ["d"]=> + int(24) + ["h"]=> + int(1) + ["i"]=> + int(12) + ["s"]=> + int(27) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + int(15820) + ["have_special_relative"]=> + int(0) +} + + +Serialised object: +string(340) "O:12:"DateInterval":16:{s:1:"y";i:43;s:1:"m";i:3;s:1:"d";i:24;s:1:"h";i:1;s:1:"i";i:12;s:1:"s";i:27;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:15820;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" + + +Unserialised object: +object(DateInterval)#4 (10) { + ["y"]=> + int(43) + ["m"]=> + int(3) + ["d"]=> + int(24) + ["h"]=> + int(1) + ["i"]=> + int(12) + ["s"]=> + int(27) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + int(15820) + ["have_special_relative"]=> + int(0) +} + + +Calling __serialize manually: +array(16) { + ["y"]=> + int(43) + ["m"]=> + int(3) + ["d"]=> + int(24) + ["h"]=> + int(1) + ["i"]=> + int(12) + ["s"]=> + int(27) + ["f"]=> + float(0) + ["weekday"]=> + int(0) + ["weekday_behavior"]=> + int(0) + ["first_last_day_of"]=> + int(0) + ["invert"]=> + int(0) + ["days"]=> + int(15820) + ["special_type"]=> + int(0) + ["special_amount"]=> + int(0) + ["have_weekday_relative"]=> + int(0) + ["have_special_relative"]=> + int(0) +} + + +Calling __unserialize manually: +object(DateInterval)#5 (10) { + ["y"]=> + int(43) + ["m"]=> + int(3) + ["d"]=> + int(24) + ["h"]=> + int(1) + ["i"]=> + int(12) + ["s"]=> + int(27) + ["f"]=> + float(0.654321) + ["invert"]=> + int(0) + ["days"]=> + int(15820) + ["have_special_relative"]=> + int(0) +} diff --git a/ext/date/tests/DateInterval_serialize-003.phpt b/ext/date/tests/DateInterval_serialize-003.phpt new file mode 100644 index 0000000000000..f32f9d9858d81 --- /dev/null +++ b/ext/date/tests/DateInterval_serialize-003.phpt @@ -0,0 +1,45 @@ +--TEST-- +Test DateInterval::__serialize and DateInterval::__unserialize +--FILE-- +getMessage(), "\n"; +} +?> +--EXPECTF-- +Original object: +object(DateInterval)#1 (10) { + ["y"]=> + int(0) + ["m"]=> + int(0) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["have_special_relative"]=> + int(1) +} + + +Serialised object: +Serializing special relative time specifications is not supported From c8a6a8abc0447d6d4639f2b9ffd998e471a2d83e Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 22 Apr 2022 15:29:15 +0100 Subject: [PATCH 0476/1346] Rename have_special_relative to from_string, fix serialisation constraint, and reorder fields --- ext/date/php_date.c | 20 +++++++------ ext/date/php_date.h | 1 + .../tests/DateInterval_serialize-001.phpt | 24 +++++++++------- .../tests/DateInterval_serialize-002.phpt | 28 +++++++++++-------- .../tests/DateInterval_serialize-003.phpt | 4 +-- ext/date/tests/DatePeriod_set_state.phpt | 4 +-- ext/date/tests/bug45682.phpt | 4 +-- ext/date/tests/bug48678.phpt | 4 +-- ext/date/tests/bug49081.phpt | 2 +- ext/date/tests/bug49778.phpt | 4 +-- ext/date/tests/bug52113.phpt | 26 ++++++++--------- ext/date/tests/bug52738.phpt | 2 +- ext/date/tests/bug52808.phpt | 12 ++++---- ext/date/tests/bug53437.phpt | 8 +++--- ext/date/tests/bug53437_var2.phpt | 8 +++--- ext/date/tests/bug53437_var4.phpt | 4 +-- ext/date/tests/bug53437_var5.phpt | 4 +-- ext/date/tests/bug53437_var6.phpt | 4 +-- ext/date/tests/bug60774.phpt | 4 +-- ext/date/tests/bug66545.phpt | 2 +- ext/date/tests/bug70153.phpt | 6 ++-- ext/date/tests/bug71700.phpt | 4 +-- ext/date/tests/bug73091.phpt | 4 +-- ext/date/tests/bug74274.phpt | 2 +- ext/date/tests/bug74524.phpt | 2 +- ext/date/tests/bug77571.phpt | 2 +- ext/date/tests/bug78452.phpt | 4 +-- ext/date/tests/bug79015.phpt | 4 +-- ext/date/tests/date_diff1.phpt | 4 +-- ext/date/tests/date_time_fractions.phpt | 4 +-- 30 files changed, 108 insertions(+), 97 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0dff004b676c1..1e1aa03fc6f25 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2077,11 +2077,6 @@ static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTabl PHP_DATE_INTERVAL_ADD_PROPERTY("s", s); ZVAL_DOUBLE(&zv, (double)intervalobj->diff->us / 1000000.0); zend_hash_str_update(props, "f", sizeof("f") - 1, &zv); - if (include_fakes) { - PHP_DATE_INTERVAL_ADD_PROPERTY("weekday", weekday); - PHP_DATE_INTERVAL_ADD_PROPERTY("weekday_behavior", weekday_behavior); - PHP_DATE_INTERVAL_ADD_PROPERTY("first_last_day_of", first_last_day_of); - } PHP_DATE_INTERVAL_ADD_PROPERTY("invert", invert); if (intervalobj->diff->days != -99999) { PHP_DATE_INTERVAL_ADD_PROPERTY("days", days); @@ -2090,12 +2085,19 @@ static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTabl zend_hash_str_update(props, "days", sizeof("days")-1, &zv); } if (include_fakes) { + PHP_DATE_INTERVAL_ADD_PROPERTY("weekday", weekday); + PHP_DATE_INTERVAL_ADD_PROPERTY("weekday_behavior", weekday_behavior); + PHP_DATE_INTERVAL_ADD_PROPERTY("first_last_day_of", first_last_day_of); PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); PHP_DATE_INTERVAL_ADD_PROPERTY("have_weekday_relative", have_weekday_relative); + PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); + ZVAL_LONG(&zv, (zend_long)intervalobj->civil_or_wall); + zend_hash_str_update(props, "civil_or_wall", strlen("civil_or_wall"), &zv); } - /* Records whether this is a special relative interval that can't be serialized */ - PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); + /* Records whether this is a special relative interval that needs to be recreated from a string */ + ZVAL_BOOL(&zv, (zend_bool)intervalobj->from_string); + zend_hash_str_update(props, "from_string", strlen("from_string"), &zv); #undef PHP_DATE_INTERVAL_ADD_PROPERTY } @@ -3095,7 +3097,7 @@ static void php_date_sub(zval *object, zval *interval, zval *return_value) /* {{ intobj = Z_PHPINTERVAL_P(interval); DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval); - if (intobj->diff->have_special_relative) { + if (intobj->diff->have_weekday_relative || intobj->diff->have_special_relative) { php_error_docref(NULL, E_WARNING, "Only non-special relative time specifications are supported for subtraction"); return; } @@ -4223,7 +4225,7 @@ PHP_METHOD(DateInterval, __serialize) intervalobj = Z_PHPINTERVAL_P(object); DATE_CHECK_INITIALIZED(intervalobj->initialized, DateInterval); - if (intervalobj->diff->have_special_relative) { + if (intervalobj->diff->have_weekday_relative || intervalobj->diff->have_special_relative) { zend_throw_exception_ex(NULL, 0, "Serializing special relative time specifications is not supported"); } diff --git a/ext/date/php_date.h b/ext/date/php_date.h index c30d34d3aa76a..9df3c37594887 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -72,6 +72,7 @@ static inline php_timezone_obj *php_timezone_obj_from_obj(zend_object *obj) { struct _php_interval_obj { timelib_rel_time *diff; int civil_or_wall; + bool from_string; bool initialized; zend_object std; }; diff --git a/ext/date/tests/DateInterval_serialize-001.phpt b/ext/date/tests/DateInterval_serialize-001.phpt index f0834172fb73e..def7fcb2611ca 100644 --- a/ext/date/tests/DateInterval_serialize-001.phpt +++ b/ext/date/tests/DateInterval_serialize-001.phpt @@ -40,13 +40,13 @@ object(DateInterval)#1 (10) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } Serialised object: -string(332) "O:12:"DateInterval":16:{s:1:"y";i:2;s:1:"m";i:0;s:1:"d";i:4;s:1:"h";i:6;s:1:"i";i:8;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";b:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" +string(380) "O:12:"DateInterval":18:{s:1:"y";i:2;s:1:"m";i:0;s:1:"d";i:4;s:1:"h";i:6;s:1:"i";i:8;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";b:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:2;s:11:"from_string";b:0;}" Unserialised object: @@ -69,13 +69,13 @@ object(DateInterval)#2 (10) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } Calling __serialize manually: -array(16) { +array(%d) { ["y"]=> int(2) ["m"]=> @@ -90,16 +90,16 @@ array(16) { int(0) ["f"]=> float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) - ["invert"]=> - int(0) - ["days"]=> - bool(false) ["special_type"]=> int(0) ["special_amount"]=> @@ -108,4 +108,8 @@ array(16) { int(0) ["have_special_relative"]=> int(0) + ["civil_or_wall"]=> + int(2) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/DateInterval_serialize-002.phpt b/ext/date/tests/DateInterval_serialize-002.phpt index df31cf1910e18..e72c39edc48a5 100644 --- a/ext/date/tests/DateInterval_serialize-002.phpt +++ b/ext/date/tests/DateInterval_serialize-002.phpt @@ -59,13 +59,13 @@ object(DateInterval)#3 (10) { int(0) ["days"]=> int(15820) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } Serialised object: -string(340) "O:12:"DateInterval":16:{s:1:"y";i:43;s:1:"m";i:3;s:1:"d";i:24;s:1:"h";i:1;s:1:"i";i:12;s:1:"s";i:27;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:15820;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" +string(388) "O:12:"DateInterval":18:{s:1:"y";i:43;s:1:"m";i:3;s:1:"d";i:24;s:1:"h";i:1;s:1:"i";i:12;s:1:"s";i:27;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:15820;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:1;s:11:"from_string";b:0;}" Unserialised object: @@ -88,13 +88,13 @@ object(DateInterval)#4 (10) { int(0) ["days"]=> int(15820) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } Calling __serialize manually: -array(16) { +array(%d) { ["y"]=> int(43) ["m"]=> @@ -109,16 +109,16 @@ array(16) { int(27) ["f"]=> float(0) + ["invert"]=> + int(0) + ["days"]=> + int(15820) ["weekday"]=> int(0) ["weekday_behavior"]=> int(0) ["first_last_day_of"]=> int(0) - ["invert"]=> - int(0) - ["days"]=> - int(15820) ["special_type"]=> int(0) ["special_amount"]=> @@ -127,6 +127,10 @@ array(16) { int(0) ["have_special_relative"]=> int(0) + ["civil_or_wall"]=> + int(1) + ["from_string"]=> + bool(false) } @@ -150,6 +154,6 @@ object(DateInterval)#5 (10) { int(0) ["days"]=> int(15820) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/DateInterval_serialize-003.phpt b/ext/date/tests/DateInterval_serialize-003.phpt index f32f9d9858d81..9b52c39c244ae 100644 --- a/ext/date/tests/DateInterval_serialize-003.phpt +++ b/ext/date/tests/DateInterval_serialize-003.phpt @@ -36,8 +36,8 @@ object(DateInterval)#1 (10) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(1) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/DatePeriod_set_state.phpt b/ext/date/tests/DatePeriod_set_state.phpt index 558afe3bea56b..de41eac50a5f9 100644 --- a/ext/date/tests/DatePeriod_set_state.phpt +++ b/ext/date/tests/DatePeriod_set_state.phpt @@ -53,8 +53,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } ["recurrences"]=> int(25) diff --git a/ext/date/tests/bug45682.phpt b/ext/date/tests/bug45682.phpt index 989c9451614fd..84178aadb8447 100644 --- a/ext/date/tests/bug45682.phpt +++ b/ext/date/tests/bug45682.phpt @@ -32,6 +32,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(3) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug48678.phpt b/ext/date/tests/bug48678.phpt index 8ef58ca6af7e2..3934b187e7098 100644 --- a/ext/date/tests/bug48678.phpt +++ b/ext/date/tests/bug48678.phpt @@ -19,7 +19,7 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => - [have_special_relative] => 0 + [from_string] => ) DateInterval Object ( @@ -32,5 +32,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug49081.phpt b/ext/date/tests/bug49081.phpt index 0e679da8b3a0f..6f98041e8f74d 100644 --- a/ext/date/tests/bug49081.phpt +++ b/ext/date/tests/bug49081.phpt @@ -20,5 +20,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 30 - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug49778.phpt b/ext/date/tests/bug49778.phpt index 2774d1b0a7247..d4e1a2c0ace03 100644 --- a/ext/date/tests/bug49778.phpt +++ b/ext/date/tests/bug49778.phpt @@ -27,8 +27,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } 7 (unknown) diff --git a/ext/date/tests/bug52113.phpt b/ext/date/tests/bug52113.phpt index f973f210162a5..131243d91340b 100644 --- a/ext/date/tests/bug52113.phpt +++ b/ext/date/tests/bug52113.phpt @@ -52,11 +52,11 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } -string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}" -\DateInterval::__set_state(array( +string(380) "O:12:"DateInterval":18:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:1;s:11:"from_string";b:0;}" +DateInterval::__set_state(array( 'y' => 0, 'm' => 0, 'd' => 0, @@ -66,7 +66,7 @@ string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h" 'f' => 0.0, 'invert' => 0, 'days' => 0, - 'have_special_relative' => 0, + 'from_string' => false, ))object(DateInterval)#%d (%d) { ["y"]=> int(0) @@ -86,8 +86,8 @@ string(332) "O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h" int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } object(DatePeriod)#%d (6) { ["start"]=> @@ -123,8 +123,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } ["recurrences"]=> int(3) @@ -150,8 +150,8 @@ object(DateInterval)#%d (%d) { int(1) ["days"]=> int(2400) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } object(DatePeriod)#%d (6) { ["start"]=> @@ -187,8 +187,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } ["recurrences"]=> int(3) diff --git a/ext/date/tests/bug52738.phpt b/ext/date/tests/bug52738.phpt index e4d2595e75e22..e0f3a1ef5c84b 100644 --- a/ext/date/tests/bug52738.phpt +++ b/ext/date/tests/bug52738.phpt @@ -31,5 +31,5 @@ di Object [f] => 0 [invert] => 0 [days] => - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug52808.phpt b/ext/date/tests/bug52808.phpt index 3abd5261bd0bb..a059624fdd7a0 100644 --- a/ext/date/tests/bug52808.phpt +++ b/ext/date/tests/bug52808.phpt @@ -44,8 +44,8 @@ object(DateInterval)#%d (%d) { int(1) ["days"]=> int(437) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } object(DateInterval)#%d (%d) { ["y"]=> @@ -66,8 +66,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(294) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } object(DateInterval)#%d (%d) { ["y"]=> @@ -88,8 +88,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(294) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } Failed to parse interval (2007-05-11T15:30:00Z/) Failed to parse interval (2007-05-11T15:30:00Z) diff --git a/ext/date/tests/bug53437.phpt b/ext/date/tests/bug53437.phpt index afb67ad41a1b8..ed885696bec11 100644 --- a/ext/date/tests/bug53437.phpt +++ b/ext/date/tests/bug53437.phpt @@ -69,8 +69,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } ["recurrences"]=> int(3) @@ -118,8 +118,8 @@ object(DatePeriod)#%d (6) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } ["recurrences"]=> int(3) diff --git a/ext/date/tests/bug53437_var2.phpt b/ext/date/tests/bug53437_var2.phpt index b625d572f7a0a..9ca6a0f6b2762 100644 --- a/ext/date/tests/bug53437_var2.phpt +++ b/ext/date/tests/bug53437_var2.phpt @@ -31,8 +31,8 @@ object(DateInterval)#1 (%d) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } object(DateInterval)#2 (%d) { ["y"]=> @@ -53,6 +53,6 @@ object(DateInterval)#2 (%d) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug53437_var4.phpt b/ext/date/tests/bug53437_var4.phpt index 7c558a24c884f..14823fb4ba47f 100644 --- a/ext/date/tests/bug53437_var4.phpt +++ b/ext/date/tests/bug53437_var4.phpt @@ -40,8 +40,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(2) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } int(0) int(0) diff --git a/ext/date/tests/bug53437_var5.phpt b/ext/date/tests/bug53437_var5.phpt index 8e04fea933d51..eb3722f38bb36 100644 --- a/ext/date/tests/bug53437_var5.phpt +++ b/ext/date/tests/bug53437_var5.phpt @@ -30,6 +30,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug53437_var6.phpt b/ext/date/tests/bug53437_var6.phpt index aa7657eec14b2..cb76c66d4d9d3 100644 --- a/ext/date/tests/bug53437_var6.phpt +++ b/ext/date/tests/bug53437_var6.phpt @@ -30,6 +30,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug60774.phpt b/ext/date/tests/bug60774.phpt index 130048e71de4c..bb4f97f9c3f05 100644 --- a/ext/date/tests/bug60774.phpt +++ b/ext/date/tests/bug60774.phpt @@ -27,8 +27,8 @@ object(DateInterval)#1 (%d) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } 2 (unknown) diff --git a/ext/date/tests/bug66545.phpt b/ext/date/tests/bug66545.phpt index efe3e6d1eab44..0d2f337570698 100644 --- a/ext/date/tests/bug66545.phpt +++ b/ext/date/tests/bug66545.phpt @@ -27,5 +27,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 14 - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug70153.phpt b/ext/date/tests/bug70153.phpt index 556a5b4f7fd8d..25ddc9bcc2a03 100644 --- a/ext/date/tests/bug70153.phpt +++ b/ext/date/tests/bug70153.phpt @@ -25,9 +25,9 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => - [have_special_relative] => 0 + [from_string] => ) -O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;s:1:"h";i:0;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:6:"invert";i:0;s:4:"days";b:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;}DateInterval Object +O:12:"DateInterval":18:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;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:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:1;s:11:"from_string";b:0;}DateInterval Object ( [y] => 0 [m] => 1 @@ -38,7 +38,7 @@ O:12:"DateInterval":16:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;s:1:"h";i:0;s:1:"i"; [f] => 0 [invert] => 0 [days] => - [have_special_relative] => 0 + [from_string] => ) bool(false) bool(false) diff --git a/ext/date/tests/bug71700.phpt b/ext/date/tests/bug71700.phpt index 243511fbf976a..09f6e76058c52 100644 --- a/ext/date/tests/bug71700.phpt +++ b/ext/date/tests/bug71700.phpt @@ -31,6 +31,6 @@ object(DateInterval)#3 (%d) { int(0) ["days"]=> int(30) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug73091.phpt b/ext/date/tests/bug73091.phpt index 7f16a024ad5b6..440f2bbca60d2 100644 --- a/ext/date/tests/bug73091.phpt +++ b/ext/date/tests/bug73091.phpt @@ -31,6 +31,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(-1) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug74274.phpt b/ext/date/tests/bug74274.phpt index b83a2b641c898..20387419728de 100644 --- a/ext/date/tests/bug74274.phpt +++ b/ext/date/tests/bug74274.phpt @@ -20,5 +20,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 1 - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug74524.phpt b/ext/date/tests/bug74524.phpt index 93f4cd9209928..825fb0be8b301 100644 --- a/ext/date/tests/bug74524.phpt +++ b/ext/date/tests/bug74524.phpt @@ -22,5 +22,5 @@ DateInterval Object [f] => 0.920541 [invert] => 1 [days] => 227 - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug77571.phpt b/ext/date/tests/bug77571.phpt index bc85354002cba..84790e0cd67b9 100644 --- a/ext/date/tests/bug77571.phpt +++ b/ext/date/tests/bug77571.phpt @@ -23,5 +23,5 @@ DateInterval Object [f] => 0 [invert] => 0 [days] => 35 - [have_special_relative] => 0 + [from_string] => ) diff --git a/ext/date/tests/bug78452.phpt b/ext/date/tests/bug78452.phpt index ac4aa887f2862..ba6936551168b 100644 --- a/ext/date/tests/bug78452.phpt +++ b/ext/date/tests/bug78452.phpt @@ -27,6 +27,6 @@ object(DateInterval)#3 (%d) { int(1) ["days"]=> int(33) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/bug79015.phpt b/ext/date/tests/bug79015.phpt index 69a197563ea83..63dac799c5403 100644 --- a/ext/date/tests/bug79015.phpt +++ b/ext/date/tests/bug79015.phpt @@ -25,6 +25,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> bool(false) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/date_diff1.phpt b/ext/date/tests/date_diff1.phpt index 437e43fc640ad..fa2c64ddd59d4 100644 --- a/ext/date/tests/date_diff1.phpt +++ b/ext/date/tests/date_diff1.phpt @@ -47,6 +47,6 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(33) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } diff --git a/ext/date/tests/date_time_fractions.phpt b/ext/date/tests/date_time_fractions.phpt index ada2e3e772074..4536e0f2eb21e 100644 --- a/ext/date/tests/date_time_fractions.phpt +++ b/ext/date/tests/date_time_fractions.phpt @@ -77,8 +77,8 @@ object(DateInterval)#%d (%d) { int(0) ["days"]=> int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } 2016-10-03 13:20:06.724934 2016-10-03 13:20:07.103123 From 83a6bcc15736b7d4528cbb53f4aafd0c0f37143d Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 22 Apr 2022 16:11:36 +0100 Subject: [PATCH 0477/1346] Fixed cloning DateInterval --- ext/date/php_date.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 1e1aa03fc6f25..8d7745d65a8c9 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2045,6 +2045,8 @@ static zend_object *date_object_clone_interval(zend_object *this_ptr) /* {{{ */ php_interval_obj *new_obj = php_interval_obj_from_obj(date_object_new_interval(old_obj->std.ce)); zend_objects_clone_members(&new_obj->std, &old_obj->std); + new_obj->civil_or_wall = old_obj->civil_or_wall; + new_obj->from_string = old_obj->from_string; new_obj->initialized = old_obj->initialized; if (old_obj->diff) { new_obj->diff = timelib_rel_time_clone(old_obj->diff); From cae1d4adde91ccad25649d7c2ba97bcb266f1d08 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 22 Apr 2022 16:13:23 +0100 Subject: [PATCH 0478/1346] Add support for serialising all DateInterval objects --- ext/date/php_date.c | 66 +++++++++++----- ext/date/php_date.h | 1 + .../tests/DateInterval_serialize-001.phpt | 18 +---- .../tests/DateInterval_serialize-002.phpt | 18 +---- .../tests/DateInterval_serialize-003.phpt | 77 ++++++++++++------- ext/date/tests/bug52113.phpt | 2 +- ext/date/tests/bug60774.phpt | 22 +----- ext/date/tests/bug70153.phpt | 29 ++----- 8 files changed, 113 insertions(+), 120 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 8d7745d65a8c9..483ca4995b868 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2063,10 +2063,19 @@ static HashTable *date_object_get_gc_interval(zend_object *object, zval **table, return zend_std_get_properties(object); } /* }}} */ -static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTable *props, bool include_fakes) +static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTable *props) { zval zv; + /* Records whether this is a special relative interval that needs to be recreated from a string */ + if (intervalobj->from_string) { + ZVAL_BOOL(&zv, (zend_bool)intervalobj->from_string); + zend_hash_str_update(props, "from_string", strlen("from_string"), &zv); + ZVAL_STR(&zv, intervalobj->date_string); + zend_hash_str_update(props, "date_string", strlen("date_string"), &zv); + return; + } + #define PHP_DATE_INTERVAL_ADD_PROPERTY(n,f) \ ZVAL_LONG(&zv, (zend_long)intervalobj->diff->f); \ zend_hash_str_update(props, n, sizeof(n)-1, &zv); @@ -2086,18 +2095,6 @@ static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTabl ZVAL_FALSE(&zv); zend_hash_str_update(props, "days", sizeof("days")-1, &zv); } - if (include_fakes) { - PHP_DATE_INTERVAL_ADD_PROPERTY("weekday", weekday); - PHP_DATE_INTERVAL_ADD_PROPERTY("weekday_behavior", weekday_behavior); - PHP_DATE_INTERVAL_ADD_PROPERTY("first_last_day_of", first_last_day_of); - PHP_DATE_INTERVAL_ADD_PROPERTY("special_type", special.type); - PHP_DATE_INTERVAL_ADD_PROPERTY("special_amount", special.amount); - PHP_DATE_INTERVAL_ADD_PROPERTY("have_weekday_relative", have_weekday_relative); - PHP_DATE_INTERVAL_ADD_PROPERTY("have_special_relative", have_special_relative); - ZVAL_LONG(&zv, (zend_long)intervalobj->civil_or_wall); - zend_hash_str_update(props, "civil_or_wall", strlen("civil_or_wall"), &zv); - } - /* Records whether this is a special relative interval that needs to be recreated from a string */ ZVAL_BOOL(&zv, (zend_bool)intervalobj->from_string); zend_hash_str_update(props, "from_string", strlen("from_string"), &zv); @@ -2115,7 +2112,7 @@ static HashTable *date_object_get_properties_interval(zend_object *object) /* {{ return props; } - date_interval_object_to_hash(intervalobj, props, false); + date_interval_object_to_hash(intervalobj, props); return props; } /* }}} */ @@ -2183,6 +2180,9 @@ static void date_object_free_storage_interval(zend_object *object) /* {{{ */ { php_interval_obj *intern = php_interval_obj_from_obj(object); + if (intern->date_string) { + zend_string_release(intern->date_string); + } timelib_rel_time_dtor(intern->diff); zend_object_std_dtor(&intern->std); } /* }}} */ @@ -4114,6 +4114,35 @@ static void php_date_interval_initialize_from_hash(zval **return_value, php_inte 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) { + timelib_time *time; + timelib_error_container *err = NULL; + + time = timelib_strtotime(Z_STRVAL_P(date_str), Z_STRLEN_P(date_str), &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); + + if (err->error_count > 0) { + php_error_docref(NULL, + E_WARNING, + "Unknown or bad format (%s) at position %d (%c) while unserializing: %s", + 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); + } + + (*intobj)->diff = timelib_rel_time_clone(&time->relative); + (*intobj)->initialized = 1; + (*intobj)->civil_or_wall = PHP_DATE_CIVIL; + (*intobj)->from_string = true; + (*intobj)->date_string = zend_string_copy(Z_STR_P(date_str)); + + timelib_time_dtor(time); + timelib_error_container_dtor(err); + + return; + } + /* Set new value */ (*intobj)->diff = timelib_rel_time_ctor(); @@ -4193,6 +4222,7 @@ static void php_date_interval_initialize_from_hash(zval **return_value, php_inte (*intobj)->civil_or_wall = val; } } + (*intobj)->initialized = 1; } /* }}} */ @@ -4227,13 +4257,9 @@ PHP_METHOD(DateInterval, __serialize) intervalobj = Z_PHPINTERVAL_P(object); DATE_CHECK_INITIALIZED(intervalobj->initialized, DateInterval); - if (intervalobj->diff->have_weekday_relative || intervalobj->diff->have_special_relative) { - zend_throw_exception_ex(NULL, 0, "Serializing special relative time specifications is not supported"); - } - array_init(return_value); myht = Z_ARRVAL_P(return_value); - date_interval_object_to_hash(intervalobj, myht, true); + date_interval_object_to_hash(intervalobj, myht); } /* }}} */ @@ -4300,6 +4326,8 @@ PHP_FUNCTION(date_interval_create_from_date_string) diobj->diff = timelib_rel_time_clone(&time->relative); diobj->initialized = 1; diobj->civil_or_wall = PHP_DATE_CIVIL; + diobj->from_string = true; + diobj->date_string = zend_string_copy(time_str); cleanup: timelib_time_dtor(time); diff --git a/ext/date/php_date.h b/ext/date/php_date.h index 9df3c37594887..d18529f10d30f 100644 --- a/ext/date/php_date.h +++ b/ext/date/php_date.h @@ -73,6 +73,7 @@ struct _php_interval_obj { timelib_rel_time *diff; int civil_or_wall; bool from_string; + zend_string *date_string; bool initialized; zend_object std; }; diff --git a/ext/date/tests/DateInterval_serialize-001.phpt b/ext/date/tests/DateInterval_serialize-001.phpt index def7fcb2611ca..276b9e76fbc09 100644 --- a/ext/date/tests/DateInterval_serialize-001.phpt +++ b/ext/date/tests/DateInterval_serialize-001.phpt @@ -46,7 +46,7 @@ object(DateInterval)#1 (10) { Serialised object: -string(380) "O:12:"DateInterval":18:{s:1:"y";i:2;s:1:"m";i:0;s:1:"d";i:4;s:1:"h";i:6;s:1:"i";i:8;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";b:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:2;s:11:"from_string";b:0;}" +string(164) "O:12:"DateInterval":10:{s:1:"y";i:2;s:1:"m";i:0;s:1:"d";i:4;s:1:"h";i:6;s:1:"i";i:8;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;}" Unserialised object: @@ -94,22 +94,6 @@ array(%d) { int(0) ["days"]=> bool(false) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) - ["civil_or_wall"]=> - int(2) ["from_string"]=> bool(false) } diff --git a/ext/date/tests/DateInterval_serialize-002.phpt b/ext/date/tests/DateInterval_serialize-002.phpt index e72c39edc48a5..54daa6062ffc0 100644 --- a/ext/date/tests/DateInterval_serialize-002.phpt +++ b/ext/date/tests/DateInterval_serialize-002.phpt @@ -65,7 +65,7 @@ object(DateInterval)#3 (10) { Serialised object: -string(388) "O:12:"DateInterval":18:{s:1:"y";i:43;s:1:"m";i:3;s:1:"d";i:24;s:1:"h";i:1;s:1:"i";i:12;s:1:"s";i:27;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:15820;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:1;s:11:"from_string";b:0;}" +string(172) "O:12:"DateInterval":10:{s:1:"y";i:43;s:1:"m";i:3;s:1:"d";i:24;s:1:"h";i:1;s:1:"i";i:12;s:1:"s";i:27;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:15820;s:11:"from_string";b:0;}" Unserialised object: @@ -113,22 +113,6 @@ array(%d) { int(0) ["days"]=> int(15820) - ["weekday"]=> - int(0) - ["weekday_behavior"]=> - int(0) - ["first_last_day_of"]=> - int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(0) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) - ["civil_or_wall"]=> - int(1) ["from_string"]=> bool(false) } diff --git a/ext/date/tests/DateInterval_serialize-003.phpt b/ext/date/tests/DateInterval_serialize-003.phpt index 9b52c39c244ae..04687664a7a80 100644 --- a/ext/date/tests/DateInterval_serialize-003.phpt +++ b/ext/date/tests/DateInterval_serialize-003.phpt @@ -9,37 +9,62 @@ echo "Original object:\n"; var_dump($d); echo "\n\nSerialised object:\n"; -try { - $s = serialize($d); -} catch (Exception $e) { - echo $e->getMessage(), "\n"; -} +$s = serialize($d); +var_dump($s); + +echo "\n\nUnserialised object:\n"; +$e = unserialize($s); +var_dump($e); + +echo "\n\nCalling __serialize manually:\n"; +var_dump($d->__serialize()); + +echo "\n\nCalling __unserialize manually:\n"; +$d = new DateInterval('P2Y4DT6H8M'); +$d->__unserialize( + [ + 'from_string' => true, + 'date_string' => 'next weekday 15:30', + ] +); +var_dump($d); ?> --EXPECTF-- Original object: -object(DateInterval)#1 (10) { - ["y"]=> - int(0) - ["m"]=> - int(0) - ["d"]=> - int(0) - ["h"]=> - int(0) - ["i"]=> - int(0) - ["s"]=> - int(0) - ["f"]=> - float(0) - ["invert"]=> - int(0) - ["days"]=> - bool(false) +object(DateInterval)#1 (%d) { ["from_string"]=> - bool(false) + bool(true) + ["date_string"]=> + string(18) "next weekday 15:30" } Serialised object: -Serializing special relative time specifications is not supported +string(92) "O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:18:"next weekday 15:30";}" + + +Unserialised object: +object(DateInterval)#2 (2) { + ["from_string"]=> + bool(true) + ["date_string"]=> + string(18) "next weekday 15:30" +} + + +Calling __serialize manually: +array(2) { + ["from_string"]=> + bool(true) + ["date_string"]=> + string(18) "next weekday 15:30" +} + + +Calling __unserialize manually: +object(DateInterval)#3 (2) { + ["from_string"]=> + bool(true) + ["date_string"]=> + string(18) "next weekday 15:30" +} diff --git a/ext/date/tests/bug52113.phpt b/ext/date/tests/bug52113.phpt index 131243d91340b..1a8d42ec7295e 100644 --- a/ext/date/tests/bug52113.phpt +++ b/ext/date/tests/bug52113.phpt @@ -55,7 +55,7 @@ object(DateInterval)#%d (%d) { ["from_string"]=> bool(false) } -string(380) "O:12:"DateInterval":18:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:0;s:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:1;s:11:"from_string";b:0;}" +string(164) "O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:0;s:11:"from_string";b:0;}" DateInterval::__set_state(array( 'y' => 0, 'm' => 0, diff --git a/ext/date/tests/bug60774.phpt b/ext/date/tests/bug60774.phpt index bb4f97f9c3f05..2f3de6bafd141 100644 --- a/ext/date/tests/bug60774.phpt +++ b/ext/date/tests/bug60774.phpt @@ -9,26 +9,10 @@ echo $i->format("%a"), "\n"; ?> --EXPECTF-- object(DateInterval)#1 (%d) { - ["y"]=> - int(0) - ["m"]=> - int(0) - ["d"]=> - int(2) - ["h"]=> - int(0) - ["i"]=> - int(0) - ["s"]=> - int(0) - ["f"]=> - float(0) - ["invert"]=> - int(0) - ["days"]=> - bool(false) ["from_string"]=> - bool(false) + bool(true) + ["date_string"]=> + string(6) "2 days" } 2 (unknown) diff --git a/ext/date/tests/bug70153.phpt b/ext/date/tests/bug70153.phpt index 25ddc9bcc2a03..9aaa0e7d538fa 100644 --- a/ext/date/tests/bug70153.phpt +++ b/ext/date/tests/bug70153.phpt @@ -8,6 +8,8 @@ print_r($i1); $s = serialize($i1); print_r($s); +echo "\n"; + $i2 = unserialize($s); print_r($i2); @@ -16,29 +18,14 @@ var_dump($i1->days, $i2->days); --EXPECT-- DateInterval Object ( - [y] => 0 - [m] => 1 - [d] => 0 - [h] => 0 - [i] => 0 - [s] => 0 - [f] => 0 - [invert] => 0 - [days] => - [from_string] => + [from_string] => 1 + [date_string] => +1 month ) -O:12:"DateInterval":18:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;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:7:"weekday";i:0;s:16:"weekday_behavior";i:0;s:17:"first_last_day_of";i:0;s:12:"special_type";i:0;s:14:"special_amount";i:0;s:21:"have_weekday_relative";i:0;s:21:"have_special_relative";i:0;s:13:"civil_or_wall";i:1;s:11:"from_string";b:0;}DateInterval Object +O:12:"DateInterval":2:{s:11:"from_string";b:1;s:11:"date_string";s:8:"+1 month";} +DateInterval Object ( - [y] => 0 - [m] => 1 - [d] => 0 - [h] => 0 - [i] => 0 - [s] => 0 - [f] => 0 - [invert] => 0 - [days] => - [from_string] => + [from_string] => 1 + [date_string] => +1 month ) bool(false) bool(false) From 5fb36414a38cd24dc93824c3a2d1d237520260c7 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 22 Apr 2022 16:12:59 +0100 Subject: [PATCH 0479/1346] Fixed cloning DateInterval --- ext/date/php_date.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 483ca4995b868..8d2fbdc9e7de4 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2047,6 +2047,9 @@ static zend_object *date_object_clone_interval(zend_object *this_ptr) /* {{{ */ zend_objects_clone_members(&new_obj->std, &old_obj->std); new_obj->civil_or_wall = old_obj->civil_or_wall; new_obj->from_string = old_obj->from_string; + if (old_obj->date_string) { + new_obj->date_string = zend_string_copy(old_obj->date_string); + } new_obj->initialized = old_obj->initialized; if (old_obj->diff) { new_obj->diff = timelib_rel_time_clone(old_obj->diff); From d57b05249c96f7e34e3bc2ab87d24a31047f9675 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 29 Apr 2022 09:22:08 +0100 Subject: [PATCH 0480/1346] Extended tests --- .../tests/DateInterval_serialize-001.phpt | 24 ++++++++++++++++ .../tests/DateInterval_serialize-002.phpt | 24 ++++++++++++++++ .../tests/DateInterval_serialize-003.phpt | 28 +++++++++++++++++++ ext/date/tests/bug52113.phpt | 2 +- 4 files changed, 77 insertions(+), 1 deletion(-) diff --git a/ext/date/tests/DateInterval_serialize-001.phpt b/ext/date/tests/DateInterval_serialize-001.phpt index 276b9e76fbc09..cad33185cf9bb 100644 --- a/ext/date/tests/DateInterval_serialize-001.phpt +++ b/ext/date/tests/DateInterval_serialize-001.phpt @@ -18,6 +18,11 @@ var_dump($e); echo "\n\nCalling __serialize manually:\n"; var_dump($d->__serialize()); + +echo "\n\nUsed serialised interval:\n"; +$now = new DateTimeImmutable("2022-04-22 16:25:11 BST"); +var_dump($now->add($e)); +var_dump($now->sub($e)); ?> --EXPECTF-- Original object: @@ -97,3 +102,22 @@ array(%d) { ["from_string"]=> bool(false) } + + +Used serialised interval: +object(DateTimeImmutable)#4 (3) { + ["date"]=> + string(26) "2024-04-26 22:33:11.000000" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(3) "BST" +} +object(DateTimeImmutable)#4 (3) { + ["date"]=> + string(26) "2020-04-18 10:17:11.000000" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(3) "BST" +} diff --git a/ext/date/tests/DateInterval_serialize-002.phpt b/ext/date/tests/DateInterval_serialize-002.phpt index 54daa6062ffc0..d21e02245e695 100644 --- a/ext/date/tests/DateInterval_serialize-002.phpt +++ b/ext/date/tests/DateInterval_serialize-002.phpt @@ -37,6 +37,11 @@ $d->__unserialize( ] ); var_dump($d); + +echo "\n\nUsed serialised interval:\n"; +$now = new DateTimeImmutable("2022-04-15 10:27:27 BST"); +var_dump($now->add($e)); +var_dump($now->sub($e)); ?> --EXPECTF-- Original object: @@ -141,3 +146,22 @@ object(DateInterval)#5 (10) { ["from_string"]=> bool(false) } + + +Used serialised interval: +object(DateTimeImmutable)#6 (3) { + ["date"]=> + string(26) "2065-08-08 11:39:54.000000" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(3) "BST" +} +object(DateTimeImmutable)#6 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(3) "BST" +} diff --git a/ext/date/tests/DateInterval_serialize-003.phpt b/ext/date/tests/DateInterval_serialize-003.phpt index 04687664a7a80..e8915ee515d25 100644 --- a/ext/date/tests/DateInterval_serialize-003.phpt +++ b/ext/date/tests/DateInterval_serialize-003.phpt @@ -4,6 +4,8 @@ Test DateInterval::__serialize and DateInterval::__unserialize __unserialize( ] ); var_dump($d); + +echo "\n\nUsed serialised interval:\n"; +$now = new DateTimeImmutable("2022-04-22 16:25:11 BST"); +var_dump($now->add($e)); +var_dump($now->sub($e)); ?> --EXPECTF-- Original object: @@ -68,3 +75,24 @@ object(DateInterval)#3 (2) { ["date_string"]=> string(18) "next weekday 15:30" } + + +Used serialised interval: +object(DateTimeImmutable)#4 (3) { + ["date"]=> + string(26) "2022-04-25 16:25:11.000000" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(3) "BST" +} + +Warning: DateTimeImmutable::sub(): Only non-special relative time specifications are supported for subtraction in %s on line %d +object(DateTimeImmutable)#4 (3) { + ["date"]=> + string(26) "2022-04-22 16:25:11.000000" + ["timezone_type"]=> + int(2) + ["timezone"]=> + string(3) "BST" +} diff --git a/ext/date/tests/bug52113.phpt b/ext/date/tests/bug52113.phpt index 1a8d42ec7295e..2e02195bd1d1a 100644 --- a/ext/date/tests/bug52113.phpt +++ b/ext/date/tests/bug52113.phpt @@ -56,7 +56,7 @@ object(DateInterval)#%d (%d) { bool(false) } string(164) "O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:4;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";i:0;s:11:"from_string";b:0;}" -DateInterval::__set_state(array( +\DateInterval::__set_state(array( 'y' => 0, 'm' => 0, 'd' => 0, From 8a67d7c3630968e2ea94866718ecf5ca7bb61904 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 29 Apr 2022 11:25:55 +0100 Subject: [PATCH 0481/1346] Update related test in ext/standard --- ext/standard/tests/serialize/bug69425.phpt | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/ext/standard/tests/serialize/bug69425.phpt b/ext/standard/tests/serialize/bug69425.phpt index 906c7192fb20a..1bc79c0387c8c 100644 --- a/ext/standard/tests/serialize/bug69425.phpt +++ b/ext/standard/tests/serialize/bug69425.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #69425: Use After Free in unserialize() +Bug #69425 (Use After Free in unserialize()) --FILE-- ---EXPECT-- +--EXPECTF-- int(1) array(2) { [0]=> - object(DateInterval)#1 (16) { + object(DateInterval)#1 (%d) { ["y"]=> int(-1) ["m"]=> @@ -41,24 +41,12 @@ array(2) { int(-1) ["f"]=> float(0) - ["weekday"]=> - int(-1) - ["weekday_behavior"]=> - int(-1) - ["first_last_day_of"]=> - int(-1) ["invert"]=> int(0) ["days"]=> int(-1) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(-1) - ["have_weekday_relative"]=> - int(0) - ["have_special_relative"]=> - int(0) + ["from_string"]=> + bool(false) } [1]=> int(2) From ef30c9ed98eb059b2f79373d2c147896dd24df32 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 29 Apr 2022 14:19:27 +0100 Subject: [PATCH 0482/1346] Update 32-bit only test --- ext/date/tests/bug53437_var3.phpt | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/ext/date/tests/bug53437_var3.phpt b/ext/date/tests/bug53437_var3.phpt index eb043398e2daa..6fd5f11f0301b 100644 --- a/ext/date/tests/bug53437_var3.phpt +++ b/ext/date/tests/bug53437_var3.phpt @@ -11,7 +11,7 @@ var_dump($di); ?> --EXPECTF-- -object(DateInterval)#%d (16) { +object(DateInterval)#%d (%d) { ["y"]=> int(2) ["m"]=> @@ -24,24 +24,12 @@ object(DateInterval)#%d (16) { int(8) ["s"]=> int(0) - ["weekday"]=> - int(10) - ["weekday_behavior"]=> - int(10) - ["first_last_day_of"]=> - int(0) + ["f"]=> + float(0) ["invert"]=> int(0) ["days"]=> int(0) - ["special_type"]=> - int(0) - ["special_amount"]=> - int(-1) - ["have_weekday_relative"]=> - int(%d) - ["have_special_relative"]=> - int(0) - ["f"]=> - float(0) + ["from_string"]=> + bool(false) } From c1ad706b8264b59a65777660ba2d82b77247a047 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 29 Apr 2022 14:33:16 +0100 Subject: [PATCH 0483/1346] Fixed reference count issue with zend_string --- ext/date/php_date.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 8d2fbdc9e7de4..ed66a4a4b9a70 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2074,7 +2074,7 @@ static void date_interval_object_to_hash(php_interval_obj *intervalobj, HashTabl if (intervalobj->from_string) { ZVAL_BOOL(&zv, (zend_bool)intervalobj->from_string); zend_hash_str_update(props, "from_string", strlen("from_string"), &zv); - ZVAL_STR(&zv, intervalobj->date_string); + ZVAL_STR_COPY(&zv, intervalobj->date_string); zend_hash_str_update(props, "date_string", strlen("date_string"), &zv); return; } @@ -2185,6 +2185,7 @@ static void date_object_free_storage_interval(zend_object *object) /* {{{ */ if (intern->date_string) { zend_string_release(intern->date_string); + intern->date_string = NULL; } timelib_rel_time_dtor(intern->diff); zend_object_std_dtor(&intern->std); From fb3cba494e261a89f629388708ded3380358fb85 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 29 Apr 2022 13:47:16 +0100 Subject: [PATCH 0484/1346] Fix multi-same-name-fields in Curl for old (> 7.56.0) versions --- ext/curl/interface.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 7b1599839fa02..7fee37770f7d3 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -2061,15 +2061,17 @@ static void free_cb(void *arg) /* {{{ */ /* }}} */ #endif +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ static inline CURLcode add_simple_field(curl_mime *mime, zend_string *string_key, zval *current) +#else +static inline CURLcode add_simple_field(struct HttpPost **first, struct HttpPost **last, zend_string *string_key, zval *current) +#endif { CURLcode error = CURLE_OK; #if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ curl_mimepart *part; CURLcode form_error; #else - struct HttpPost *first = NULL; - struct HttpPost *last = NULL; CURLFORMcode form_error; #endif zend_string *postval, *tmp_postval; @@ -2091,7 +2093,7 @@ static inline CURLcode add_simple_field(curl_mime *mime, zend_string *string_key /* The arguments after _NAMELENGTH and _CONTENTSLENGTH * must be explicitly cast to long in curl_formadd * use since curl needs a long not an int. */ - form_error = curl_formadd(&first, &last, + form_error = curl_formadd(first, last, CURLFORM_COPYNAME, ZSTR_VAL(string_key), CURLFORM_NAMELENGTH, ZSTR_LEN(string_key), CURLFORM_COPYCONTENTS, ZSTR_VAL(postval), @@ -2303,14 +2305,22 @@ static inline zend_result build_mime_structure_from_hash(php_curl *ch, zval *zpo zval *current_element; ZEND_HASH_FOREACH_VAL(HASH_OF(current), current_element) { +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ add_simple_field(mime, string_key, current_element); +#else + add_simple_field(&first, &last, string_key, current_element); +#endif } ZEND_HASH_FOREACH_END(); zend_string_release_ex(string_key, 0); continue; } +#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ add_simple_field(mime, string_key, current); +#else + add_simple_field(&first, &last, string_key, current); +#endif zend_string_release_ex(string_key, 0); } ZEND_HASH_FOREACH_END(); From f7a53535310a85668824b519a1b1556f0fd69b9c Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 29 Apr 2022 15:09:32 +0100 Subject: [PATCH 0485/1346] Turn off "Expect" header in test Without this explicitly set, curl might decide to add a `Expect: 100-continue` header if it deems the request too large. See also: https://gms.tf/when-curl-sends-100-continue.html --- ext/curl/tests/curl_postfields_array.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/curl/tests/curl_postfields_array.phpt b/ext/curl/tests/curl_postfields_array.phpt index 05aa91a3f06df..4fe41eb1e0b5d 100644 --- a/ext/curl/tests/curl_postfields_array.phpt +++ b/ext/curl/tests/curl_postfields_array.phpt @@ -31,6 +31,7 @@ $options = [ CURLOPT_FORBID_REUSE => 1, CURLOPT_TIMEOUT => 1, CURLOPT_POSTFIELDS => $fields, + CURLOPT_HTTPHEADER => [ 'Expect:' ], ]; $ch = curl_init(); From 31692a16af0685979286b064b87e41dba987e7b1 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 21 Dec 2021 08:29:09 +0000 Subject: [PATCH 0486/1346] Support zend alloc USE_ZEND_ALLOC_HUGE_PAGES option on MacOS ZEND_MM_CHUNK_SIZE fits the VM_FLAGS_SUPERPAGE_SIZE_2MB special file descriptor for mmap call. --- NEWS | 1 + Zend/zend_alloc.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 580b8ba811b07..8599a72c55454 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ PHP NEWS . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) + . Support huge pages on MacOS. (David CARLIER) - Curl: . Added support for CURLOPT_XFERINFOFUNCTION. (David Carlier) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index e2d06c1762dd9..3511c48a76f5e 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -464,9 +464,16 @@ static void *zend_mm_mmap(size_t size) #else void *ptr; -#ifdef MAP_HUGETLB +#if defined(MAP_HUGETLB) || defined(VM_FLAGS_SUPERPAGE_SIZE_2MB) if (zend_mm_use_huge_pages && size == ZEND_MM_CHUNK_SIZE) { - ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON | MAP_HUGETLB, -1, 0); + int fd = -1; + int mflags = MAP_PRIVATE | MAP_ANON; +#if defined(MAP_HUGETLB) + mflags |= MAP_HUGETLB; +#else + fd = VM_FLAGS_SUPERPAGE_SIZE_2MB; +#endif + ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, mflags, fd, 0); if (ptr != MAP_FAILED) { return ptr; } @@ -671,7 +678,7 @@ static zend_always_inline void zend_mm_hugepage(void* ptr, size_t size) #elif defined(HAVE_MEMCNTL) struct memcntl_mha m = {.mha_cmd = MHA_MAPSIZE_VA, .mha_pagesize = ZEND_MM_CHUNK_SIZE, .mha_flags = 0}; (void)memcntl(ptr, size, MC_HAT_ADVISE, (char *)&m, 0, 0); -#else +#elif !defined(VM_FLAGS_SUPERPAGE_SIZE_2MB) && !defined(MAP_ALIGNED_SUPER) zend_error_noreturn(E_WARNING, "huge_pages: thp unsupported on this platform"); #endif } From be04769c9a3917fe157b8679d0022af1b0b25dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= Date: Wed, 20 Apr 2022 20:25:38 +0000 Subject: [PATCH 0487/1346] main: set IP_BIND_ADDRESS_NO_PORT if available when connecting to remote host When you choose to bind() to a local address and connect to a remote host the kernel does not know if socket is listener or whatnot and has to reserve a port within a ~32k range on which you are also competing with other applications bound to the same address, this is easy to exhaust and get a EADDRINUSE. The linux kernel implemented IP_BIND_ADDRESS_NO_PORT on https://github.com/torvalds/linux/commit/90c337da1524863838658078ec34241f45d8394d which delays the port allocation until the 4-tuple is known in case source port is 0. --- main/network.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main/network.c b/main/network.c index 47082ba3bb125..7e31f7d57eefa 100644 --- a/main/network.c +++ b/main/network.c @@ -884,6 +884,12 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short local_address.in6.sin6_port = htons(bindport); } } +#endif +#ifdef IP_BIND_ADDRESS_NO_PORT + { + int val = 1; + (void) setsockopt(sock, SOL_IP, IP_BIND_ADDRESS_NO_PORT, &val, sizeof(val)); + } #endif if (local_address_len == 0) { php_error_docref(NULL, E_WARNING, "Invalid IP Address: %s", bindto); From 9e74e58bcf7e31aef563f1ee00b7f0bc17fe3ef2 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 29 Apr 2022 23:37:57 +0200 Subject: [PATCH 0488/1346] Fix whitespaces --- main/network.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main/network.c b/main/network.c index 7e31f7d57eefa..2eb9fb51d86bc 100644 --- a/main/network.c +++ b/main/network.c @@ -886,10 +886,10 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short } #endif #ifdef IP_BIND_ADDRESS_NO_PORT - { - int val = 1; - (void) setsockopt(sock, SOL_IP, IP_BIND_ADDRESS_NO_PORT, &val, sizeof(val)); - } + { + int val = 1; + (void) setsockopt(sock, SOL_IP, IP_BIND_ADDRESS_NO_PORT, &val, sizeof(val)); + } #endif if (local_address_len == 0) { php_error_docref(NULL, E_WARNING, "Invalid IP Address: %s", bindto); From bf46bc8718d0ddbccb26ac07b6de4bf316447473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Wed, 27 Apr 2022 23:49:58 +0200 Subject: [PATCH 0489/1346] Fix test XFAIL, update phar to use spl_autoload_register Closes GH-8449. --- ext/phar/tests/fatal_error_webphar.phpt | 3 --- ext/phar/tests/files/pear2coverage.phar | Bin 55262 -> 55276 bytes 2 files changed, 3 deletions(-) diff --git a/ext/phar/tests/fatal_error_webphar.phpt b/ext/phar/tests/fatal_error_webphar.phpt index 9ac1e03503a50..4617ee0c45745 100644 --- a/ext/phar/tests/fatal_error_webphar.phpt +++ b/ext/phar/tests/fatal_error_webphar.phpt @@ -1,7 +1,5 @@ --TEST-- Phar web-based phar with fatal error ---XFAIL-- -Uses no longer supported __autoload() function, new phar needed --INI-- default_charset=UTF-8 --EXTENSIONS-- @@ -15,7 +13,6 @@ files/pear2coverage.phar --EXPECTHEADERS-- Content-type: text/html; charset=UTF-8 --EXPECTF-- -Deprecated: __autoload() is deprecated, use spl_autoload_register() instead in %s on line %d string(9) "\Web\View" Parse error: syntax error, unexpected %s, expecting %s in phar://%r([A-Za-z]:)?%r/%sfatal_error_webphar.php/Web/View.php on line 380 diff --git a/ext/phar/tests/files/pear2coverage.phar b/ext/phar/tests/files/pear2coverage.phar index 621b0d07f8de1a2b751e4ae3c984dede2e72098b..4382d4fd8110e1e1d26acea7ffc915c2ebc27e3d 100644 GIT binary patch delta 173 zcmcb&p83ssW>p*ef{X&L;)0y`#L|-doczR;_@dPG%;J*NB8{}tyyTM1{5*w;lIxf> zttTEo&eFImGimZ9MimHS7o!%0@q$qk!VqOrgD~u2j7%m~h{z-+B?w~&lOBZeib)a7 p*v!wo`HGC++&L%awjb)yytd>0i%s%-Mdv)~Vq#!maCh=`0su2wMGF7` delta 158 zcmaE}p84K-W=R|Sf{X&Lw9>rflFa-(h4}cy(vtj~{KS-rs_Q0RJ0CWN8Pqy}O5!WiXDst}O{OiB>OF(y3-;|G%>n6X)wdGi&S3wtGUro^T^ Z&Wn0-^6VG)%`!Eu9ZU=i4DL?8P5_gPKI;Gg From 6672a5ecfec0e0166f65d9e0b378c61e3c469977 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 2 May 2022 15:18:02 +0200 Subject: [PATCH 0490/1346] bump zip version --- ext/zip/php_zip.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 49c1491828f06..d3f224cb51d29 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -31,7 +31,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_OVERWRITE ZIP_TRUNCATE #endif -#define PHP_ZIP_VERSION "1.20.0" +#define PHP_ZIP_VERSION "1.20.1" #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) From ef5478b8236714eaf2998df5cc1f64c0df9c7102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 3 May 2022 20:34:00 +0200 Subject: [PATCH 0491/1346] Reorder param parsing and reflection object retrieval --- ext/reflection/php_reflection.c | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 33ec42c75794e..0a4c0adcfc0ff 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1988,12 +1988,12 @@ ZEND_METHOD(ReflectionFunction, invokeArgs) zend_function *fptr; HashTable *params; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "h", ¶ms) == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + fci.size = sizeof(fci); ZVAL_UNDEF(&fci.function_name); fci.object = NULL; @@ -2034,12 +2034,12 @@ ZEND_METHOD(ReflectionFunctionAbstract, returnsReference) reflection_object *intern; zend_function *fptr; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + RETURN_BOOL((fptr->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0); } /* }}} */ @@ -2051,12 +2051,12 @@ ZEND_METHOD(ReflectionFunctionAbstract, getNumberOfParameters) zend_function *fptr; uint32_t num_args; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + num_args = fptr->common.num_args; if (fptr->common.fn_flags & ZEND_ACC_VARIADIC) { num_args++; @@ -2072,12 +2072,12 @@ ZEND_METHOD(ReflectionFunctionAbstract, getNumberOfRequiredParameters) reflection_object *intern; zend_function *fptr; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + RETURN_LONG(fptr->common.required_num_args); } /* }}} */ @@ -2090,12 +2090,12 @@ ZEND_METHOD(ReflectionFunctionAbstract, getParameters) uint32_t i, num_args; struct _zend_arg_info *arg_info; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + arg_info= fptr->common.arg_info; num_args = fptr->common.num_args; if (fptr->common.fn_flags & ZEND_ACC_VARIADIC) { @@ -2132,12 +2132,12 @@ ZEND_METHOD(ReflectionFunctionAbstract, getExtension) zend_function *fptr; zend_internal_function *internal; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + if (fptr->type != ZEND_INTERNAL_FUNCTION) { RETURN_NULL(); } @@ -2158,12 +2158,12 @@ ZEND_METHOD(ReflectionFunctionAbstract, getExtensionName) zend_function *fptr; zend_internal_function *internal; - GET_REFLECTION_OBJECT_PTR(fptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(fptr); + if (fptr->type != ZEND_INTERNAL_FUNCTION) { RETURN_FALSE; } @@ -3644,12 +3644,12 @@ ZEND_METHOD(ReflectionMethod, getDeclaringClass) reflection_object *intern; zend_function *mptr; - GET_REFLECTION_OBJECT_PTR(mptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(mptr); + zend_reflection_class_factory(mptr->common.scope, return_value); } /* }}} */ @@ -3660,12 +3660,12 @@ ZEND_METHOD(ReflectionMethod, getPrototype) reflection_object *intern; zend_function *mptr; - GET_REFLECTION_OBJECT_PTR(mptr); - if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); } + GET_REFLECTION_OBJECT_PTR(mptr); + if (!mptr->common.prototype) { zend_throw_exception_ex(reflection_exception_ptr, 0, "Method %s::%s does not have a prototype", ZSTR_VAL(intern->ce->name), ZSTR_VAL(mptr->common.function_name)); From fc04a6ebdd65523b0d66e4c04c2077f9072f831a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 3 May 2022 21:21:36 +0200 Subject: [PATCH 0492/1346] Throw when calling ReflectionAttribute::__construct() ReflectionAttribute::__construct() accepted any number of parameters until now, because parameter validation was missing. Even though this was unlikely to be an issue in practice (since the method is private), the problem is fixed by always throwing an exception. --- ext/reflection/php_reflection.c | 1 + .../ReflectionAttribute_constructor_001.phpt | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 ext/reflection/tests/ReflectionAttribute_constructor_001.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 0a4c0adcfc0ff..6fb85154a767a 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -6395,6 +6395,7 @@ ZEND_METHOD(ReflectionReference, getId) ZEND_METHOD(ReflectionAttribute, __construct) { + _DO_THROW("Cannot directly instantiate ReflectionAttribute"); } ZEND_METHOD(ReflectionAttribute, __clone) diff --git a/ext/reflection/tests/ReflectionAttribute_constructor_001.phpt b/ext/reflection/tests/ReflectionAttribute_constructor_001.phpt new file mode 100644 index 0000000000000..ad895dc424377 --- /dev/null +++ b/ext/reflection/tests/ReflectionAttribute_constructor_001.phpt @@ -0,0 +1,25 @@ +--TEST-- +ReflectionAttribute cannot be instantiated directly +--FILE-- +getAttributes()[0]; + +$rm = new ReflectionMethod($attribute, "__construct"); + +try { + var_dump($rm->invoke($attribute, 0, 1, 2)); +} catch (ReflectionException $exception) { + echo $exception->getMessage(); +} +?> +--EXPECT-- +Cannot directly instantiate ReflectionAttribute From d54bcbb43befb57d909dec66786c2092b6418396 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Tue, 3 May 2022 22:06:17 +0100 Subject: [PATCH 0493/1346] Add DatePeriod's __serialize and __unserialize methods (#8464) --- ext/date/php_date.c | 66 +++++- ext/date/php_date.stub.php | 4 + ext/date/php_date_arginfo.h | 10 +- ext/date/tests/DatePeriod_serialize-001.phpt | 160 +++++++++++++ ext/date/tests/DatePeriod_serialize-002.phpt | 210 ++++++++++++++++++ ext/date/tests/DatePeriod_serialize-003.phpt | 209 +++++++++++++++++ ext/date/tests/DatePeriod_serialize-004.phpt | 207 +++++++++++++++++ .../{bug53437.phpt => bug53437_var0.phpt} | 2 +- ext/date/tests/bug53437_var1.phpt | 2 +- 9 files changed, 857 insertions(+), 13 deletions(-) create mode 100644 ext/date/tests/DatePeriod_serialize-001.phpt create mode 100644 ext/date/tests/DatePeriod_serialize-002.phpt create mode 100644 ext/date/tests/DatePeriod_serialize-003.phpt create mode 100644 ext/date/tests/DatePeriod_serialize-004.phpt rename ext/date/tests/{bug53437.phpt => bug53437_var0.phpt} (99%) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index ed66a4a4b9a70..40ab52213f6df 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -5015,17 +5015,9 @@ static HashTable *date_object_get_gc_period(zend_object *object, zval **table, i return zend_std_get_properties(object); } /* }}} */ -static HashTable *date_object_get_properties_period(zend_object *object) /* {{{ */ +static void date_period_object_to_hash(php_period_obj *period_obj, HashTable *props) { - HashTable *props; - zval zv; - php_period_obj *period_obj; - - period_obj = php_period_obj_from_obj(object); - props = zend_std_get_properties(object); - if (!period_obj->start) { - return props; - } + zval zv; if (period_obj->start) { php_date_obj *date_obj; @@ -5074,6 +5066,20 @@ static HashTable *date_object_get_properties_period(zend_object *object) /* {{{ ZVAL_BOOL(&zv, period_obj->include_start_date); zend_hash_str_update(props, "include_start_date", sizeof("include_start_date")-1, &zv); +} + +static HashTable *date_object_get_properties_period(zend_object *object) /* {{{ */ +{ + HashTable *props; + php_period_obj *period_obj; + + period_obj = php_period_obj_from_obj(object); + props = zend_std_get_properties(object); + if (!period_obj->start) { + return props; + } + + date_period_object_to_hash(period_obj, props); return props; } /* }}} */ @@ -5179,6 +5185,46 @@ PHP_METHOD(DatePeriod, __set_state) } /* }}} */ +/* {{{ */ +PHP_METHOD(DatePeriod, __serialize) +{ + zval *object = ZEND_THIS; + php_period_obj *period_obj; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_NONE(); + + period_obj = Z_PHPPERIOD_P(object); + DATE_CHECK_INITIALIZED(period_obj->start, DatePeriod); + + array_init(return_value); + myht = Z_ARRVAL_P(return_value); + date_period_object_to_hash(period_obj, myht); +} +/* }}} */ + + +/* {{{ */ +PHP_METHOD(DatePeriod, __unserialize) +{ + zval *object = ZEND_THIS; + php_period_obj *period_obj; + zval *array; + HashTable *myht; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ARRAY(array) + ZEND_PARSE_PARAMETERS_END(); + + period_obj = Z_PHPPERIOD_P(object); + myht = Z_ARRVAL_P(array); + + if (!php_date_period_initialize_from_hash(period_obj, myht)) { + zend_throw_error(NULL, "Invalid serialization data for DatePeriod object"); + } +} +/* }}} */ + /* {{{ */ PHP_METHOD(DatePeriod, __wakeup) { diff --git a/ext/date/php_date.stub.php b/ext/date/php_date.stub.php index 5cb435647c946..ae59c144614f3 100644 --- a/ext/date/php_date.stub.php +++ b/ext/date/php_date.stub.php @@ -513,6 +513,10 @@ public function getDateInterval(): DateInterval {} /** @tentative-return-type */ public function getRecurrences(): ?int {} + public function __serialize(): array; + + public function __unserialize(array $data): void; + /** @tentative-return-type */ public function __wakeup(): void {} diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h index 722f38b1793d6..5c735b7cba43e 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: 4845891ab3872f292438de639953e2022f849125 */ + * Stub hash: db6fd5b6c366dd8ee48ead99d235baa86e564401 */ 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) @@ -480,6 +480,10 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_DatePeriod_getRecurrences, 0, 0, IS_LONG, 1) ZEND_END_ARG_INFO() +#define arginfo_class_DatePeriod___serialize arginfo_timezone_abbreviations_list + +#define arginfo_class_DatePeriod___unserialize arginfo_class_DateTimeInterface___unserialize + #define arginfo_class_DatePeriod___wakeup arginfo_class_DateTimeInterface___wakeup ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_DatePeriod___set_state, 0, 1, DatePeriod, 0) @@ -575,6 +579,8 @@ ZEND_METHOD(DatePeriod, getStartDate); ZEND_METHOD(DatePeriod, getEndDate); ZEND_METHOD(DatePeriod, getDateInterval); ZEND_METHOD(DatePeriod, getRecurrences); +ZEND_METHOD(DatePeriod, __serialize); +ZEND_METHOD(DatePeriod, __unserialize); ZEND_METHOD(DatePeriod, __wakeup); ZEND_METHOD(DatePeriod, __set_state); ZEND_METHOD(DatePeriod, getIterator); @@ -734,6 +740,8 @@ static const zend_function_entry class_DatePeriod_methods[] = { ZEND_ME(DatePeriod, getEndDate, arginfo_class_DatePeriod_getEndDate, ZEND_ACC_PUBLIC) ZEND_ME(DatePeriod, getDateInterval, arginfo_class_DatePeriod_getDateInterval, ZEND_ACC_PUBLIC) ZEND_ME(DatePeriod, getRecurrences, arginfo_class_DatePeriod_getRecurrences, ZEND_ACC_PUBLIC) + ZEND_ME(DatePeriod, __serialize, arginfo_class_DatePeriod___serialize, ZEND_ACC_PUBLIC) + ZEND_ME(DatePeriod, __unserialize, arginfo_class_DatePeriod___unserialize, ZEND_ACC_PUBLIC) ZEND_ME(DatePeriod, __wakeup, arginfo_class_DatePeriod___wakeup, ZEND_ACC_PUBLIC) ZEND_ME(DatePeriod, __set_state, arginfo_class_DatePeriod___set_state, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME(DatePeriod, getIterator, arginfo_class_DatePeriod_getIterator, ZEND_ACC_PUBLIC) diff --git a/ext/date/tests/DatePeriod_serialize-001.phpt b/ext/date/tests/DatePeriod_serialize-001.phpt new file mode 100644 index 0000000000000..0f555ab425145 --- /dev/null +++ b/ext/date/tests/DatePeriod_serialize-001.phpt @@ -0,0 +1,160 @@ +--TEST-- +Test DatePeriod::__serialize and DatePeriod::__unserialize (ISO String) +--FILE-- +__serialize()); + +?> +--EXPECTF-- +Original object: +object(DatePeriod)#1 (6) { + ["start"]=> + object(DateTime)#2 (3) { + ["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)#3 (10) { + ["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) +} + + +Serialised object: +string(411) "O:10:"DatePeriod":6:{s:5:"start";O:8:"DateTime":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;}" + + +Unserialised object: +object(DatePeriod)#5 (6) { + ["start"]=> + object(DateTime)#6 (3) { + ["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)#4 (10) { + ["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) +} + + +Calling __serialize manually: +array(6) { + ["start"]=> + object(DateTime)#7 (3) { + ["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)#8 (10) { + ["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) +} diff --git a/ext/date/tests/DatePeriod_serialize-002.phpt b/ext/date/tests/DatePeriod_serialize-002.phpt new file mode 100644 index 0000000000000..7e9d3e62dae54 --- /dev/null +++ b/ext/date/tests/DatePeriod_serialize-002.phpt @@ -0,0 +1,210 @@ +--TEST-- +Test DatePeriod::__serialize and DatePeriod::__unserialize (start/end) +--FILE-- +__serialize()); + +echo "\n\nIterate of unserialised object:\n"; +foreach ( $e as $d ) +{ + echo $d->format(DateTime::ISO8601), "\n"; +} +?> +--EXPECTF-- +Original object: +object(DatePeriod)#4 (6) { + ["start"]=> + object(DateTimeImmutable)#5 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + object(DateTimeImmutable)#6 (3) { + ["date"]=> + string(26) "2022-04-29 15:51:56.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" + } + ["interval"]=> + object(DateInterval)#7 (10) { + ["y"]=> + int(2) + ["m"]=> + int(6) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(1) + ["include_start_date"]=> + bool(true) +} + + +Serialised object: +string(565) "O:10:"DatePeriod":6:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"1978-12-22 09:15:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:16:"Europe/Amsterdam";}s:7:"current";N;s:3:"end";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2022-04-29 15:51:56.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/London";}s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:2;s:1:"m";i:6;s:1:"d";i:0;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:1;s:18:"include_start_date";b:1;}" + + +Unserialised object: +object(DatePeriod)#1 (6) { + ["start"]=> + object(DateTimeImmutable)#2 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + object(DateTimeImmutable)#8 (3) { + ["date"]=> + string(26) "2022-04-29 15:51:56.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" + } + ["interval"]=> + object(DateInterval)#9 (10) { + ["y"]=> + int(2) + ["m"]=> + int(6) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(1) + ["include_start_date"]=> + bool(true) +} + + +Calling __serialize manually: +array(6) { + ["start"]=> + object(DateTimeImmutable)#10 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + object(DateTimeImmutable)#11 (3) { + ["date"]=> + string(26) "2022-04-29 15:51:56.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" + } + ["interval"]=> + object(DateInterval)#12 (10) { + ["y"]=> + int(2) + ["m"]=> + int(6) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(1) + ["include_start_date"]=> + bool(true) +} + + +Iterate of unserialised object: +1978-12-22T09:15:00+0100 +1981-06-22T09:15:00+0200 +1983-12-22T09:15:00+0100 +1986-06-22T09:15:00+0200 +1988-12-22T09:15:00+0100 +1991-06-22T09:15:00+0200 +1993-12-22T09:15:00+0100 +1996-06-22T09:15:00+0200 +1998-12-22T09:15:00+0100 +2001-06-22T09:15:00+0200 +2003-12-22T09:15:00+0100 +2006-06-22T09:15:00+0200 +2008-12-22T09:15:00+0100 +2011-06-22T09:15:00+0200 +2013-12-22T09:15:00+0100 +2016-06-22T09:15:00+0200 +2018-12-22T09:15:00+0100 +2021-06-22T09:15:00+0200 diff --git a/ext/date/tests/DatePeriod_serialize-003.phpt b/ext/date/tests/DatePeriod_serialize-003.phpt new file mode 100644 index 0000000000000..ada8c7478f586 --- /dev/null +++ b/ext/date/tests/DatePeriod_serialize-003.phpt @@ -0,0 +1,209 @@ +--TEST-- +Test DatePeriod::__serialize and DatePeriod::__unserialize (start/end) +--FILE-- +__serialize()); + +echo "\n\nIterate of unserialised object:\n"; +foreach ( $e as $d ) +{ + echo $d->format(DateTime::ISO8601), "\n"; +} +?> +--EXPECTF-- +Original object: +object(DatePeriod)#4 (6) { + ["start"]=> + object(DateTimeImmutable)#5 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + object(DateTimeImmutable)#6 (3) { + ["date"]=> + string(26) "2022-04-29 15:51:56.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" + } + ["interval"]=> + object(DateInterval)#7 (10) { + ["y"]=> + int(2) + ["m"]=> + int(6) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(0) + ["include_start_date"]=> + bool(false) +} + + +Serialised object: +string(565) "O:10:"DatePeriod":6:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"1978-12-22 09:15:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:16:"Europe/Amsterdam";}s:7:"current";N;s:3:"end";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2022-04-29 15:51:56.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:13:"Europe/London";}s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:2;s:1:"m";i:6;s:1:"d";i:0;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:0;s:18:"include_start_date";b:0;}" + + +Unserialised object: +object(DatePeriod)#1 (6) { + ["start"]=> + object(DateTimeImmutable)#2 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + object(DateTimeImmutable)#8 (3) { + ["date"]=> + string(26) "2022-04-29 15:51:56.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" + } + ["interval"]=> + object(DateInterval)#9 (10) { + ["y"]=> + int(2) + ["m"]=> + int(6) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(0) + ["include_start_date"]=> + bool(false) +} + + +Calling __serialize manually: +array(6) { + ["start"]=> + object(DateTimeImmutable)#10 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + object(DateTimeImmutable)#11 (3) { + ["date"]=> + string(26) "2022-04-29 15:51:56.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(13) "Europe/London" + } + ["interval"]=> + object(DateInterval)#12 (10) { + ["y"]=> + int(2) + ["m"]=> + int(6) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(0) + ["include_start_date"]=> + bool(false) +} + + +Iterate of unserialised object: +1981-06-22T09:15:00+0200 +1983-12-22T09:15:00+0100 +1986-06-22T09:15:00+0200 +1988-12-22T09:15:00+0100 +1991-06-22T09:15:00+0200 +1993-12-22T09:15:00+0100 +1996-06-22T09:15:00+0200 +1998-12-22T09:15:00+0100 +2001-06-22T09:15:00+0200 +2003-12-22T09:15:00+0100 +2006-06-22T09:15:00+0200 +2008-12-22T09:15:00+0100 +2011-06-22T09:15:00+0200 +2013-12-22T09:15:00+0100 +2016-06-22T09:15:00+0200 +2018-12-22T09:15:00+0100 +2021-06-22T09:15:00+0200 diff --git a/ext/date/tests/DatePeriod_serialize-004.phpt b/ext/date/tests/DatePeriod_serialize-004.phpt new file mode 100644 index 0000000000000..fd62c5e2b7630 --- /dev/null +++ b/ext/date/tests/DatePeriod_serialize-004.phpt @@ -0,0 +1,207 @@ +--TEST-- +Test DatePeriod::__serialize and DatePeriod::__unserialize (start/recurrences) +--FILE-- +format(DateTime::ISO8601), "\n"; +} + +echo "\n\nSerialised object:\n"; +$s = serialize($p); +var_dump($s); + +echo "\n\nUnserialised object:\n"; +$e = unserialize($s); +var_dump($e); + +echo "\n\nCalling __serialize manually:\n"; +var_dump($p->__serialize()); + +echo "\n\nIterate of unserialised object:\n"; +foreach ( $p as $d ) +{ + echo $d->format(DateTime::ISO8601), "\n"; +} +?> +--EXPECTF-- +Original object: +object(DatePeriod)#3 (6) { + ["start"]=> + object(DateTimeImmutable)#4 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + NULL + ["end"]=> + NULL + ["interval"]=> + object(DateInterval)#5 (10) { + ["y"]=> + int(0) + ["m"]=> + int(1) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(7) + ["include_start_date"]=> + bool(false) +} + + +Iterate of object: +1979-01-01T09:15:00+0100 +1979-02-05T09:15:00+0100 +1979-03-05T09:15:00+0100 +1979-04-02T09:15:00+0200 +1979-05-07T09:15:00+0200 +1979-06-04T09:15:00+0200 +1979-07-02T09:15:00+0200 + + +Serialised object: +string(568) "O:10:"DatePeriod":6:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"1978-12-22 09:15:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:16:"Europe/Amsterdam";}s:7:"current";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"1979-08-06 09:15:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:16:"Europe/Amsterdam";}s:3:"end";N;s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:1;s:1:"d";i:0;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:7;s:18:"include_start_date";b:0;}" + + +Unserialised object: +object(DatePeriod)#1 (6) { + ["start"]=> + object(DateTimeImmutable)#6 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + object(DateTimeImmutable)#8 (3) { + ["date"]=> + string(26) "1979-08-06 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["end"]=> + NULL + ["interval"]=> + object(DateInterval)#9 (10) { + ["y"]=> + int(0) + ["m"]=> + int(1) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(7) + ["include_start_date"]=> + bool(false) +} + + +Calling __serialize manually: +array(6) { + ["start"]=> + object(DateTimeImmutable)#10 (3) { + ["date"]=> + string(26) "1978-12-22 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["current"]=> + object(DateTimeImmutable)#11 (3) { + ["date"]=> + string(26) "1979-08-06 09:15:00.000000" + ["timezone_type"]=> + int(3) + ["timezone"]=> + string(16) "Europe/Amsterdam" + } + ["end"]=> + NULL + ["interval"]=> + object(DateInterval)#12 (10) { + ["y"]=> + int(0) + ["m"]=> + int(1) + ["d"]=> + int(0) + ["h"]=> + int(0) + ["i"]=> + int(0) + ["s"]=> + int(0) + ["f"]=> + float(0) + ["invert"]=> + int(0) + ["days"]=> + bool(false) + ["from_string"]=> + bool(false) + } + ["recurrences"]=> + int(7) + ["include_start_date"]=> + bool(false) +} + + +Iterate of unserialised object: +1979-01-01T09:15:00+0100 +1979-02-05T09:15:00+0100 +1979-03-05T09:15:00+0100 +1979-04-02T09:15:00+0200 +1979-05-07T09:15:00+0200 +1979-06-04T09:15:00+0200 +1979-07-02T09:15:00+0200 diff --git a/ext/date/tests/bug53437.phpt b/ext/date/tests/bug53437_var0.phpt similarity index 99% rename from ext/date/tests/bug53437.phpt rename to ext/date/tests/bug53437_var0.phpt index ed885696bec11..36b6c317177f2 100644 --- a/ext/date/tests/bug53437.phpt +++ b/ext/date/tests/bug53437_var0.phpt @@ -1,5 +1,5 @@ --TEST-- -Bug #53437 (Crash when using unserialized DatePeriod instance), variation 1 +Bug #53437 (Crash when using unserialized DatePeriod instance), variation 0 --FILE-- __wakeup() +#0 [internal function]: DatePeriod->__unserialize(Array) #1 %sbug53437_var1.php(%d): unserialize('O:10:"DatePerio...') #2 {main} thrown in %sbug53437_var1.php on line %d From 9b0e391cf7f40926f159d54dc9d161b84ab4a35c Mon Sep 17 00:00:00 2001 From: Ben Ramsey Date: Tue, 3 May 2022 19:38:24 -0500 Subject: [PATCH 0494/1346] [ci skip] Mention selection of a veteran + 1 or 2 rookies --- docs/release-process.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/release-process.md b/docs/release-process.md index f9bb1d1fe71aa..b73274d028f7c 100644 --- a/docs/release-process.md +++ b/docs/release-process.md @@ -4,7 +4,7 @@ A release managers role includes making packaged source code from the canonical available according to their release schedule. The release schedule for their branch is available on a Wiki page, for example - [PHP 8.0 release schedule](https://wiki.php.net/todo/php80) +[PHP 8.0 release schedule](https://wiki.php.net/todo/php80) There are two types of release: @@ -15,8 +15,8 @@ The process of making packaged source available and announcing availability is e in detail below. The process differs slightly for non-stable and stable releases. Before a release manager can begin their work, there are several things that must happen, -explained at the end of this document in - [New Release Manager Checklist](#new-release-manager-checklist). +explained at the end of this document in +[New Release Manager Checklist](#new-release-manager-checklist). ## General notes and tips @@ -422,8 +422,9 @@ branch: next minor or major release, issue a call for volunteers on internals@lists.php.net (cf. http://news.php.net/php.internals/98652). - 2. Make sure that there are two or more volunteers, and hold a vote if - necessary (see + 2. Make sure that there are two or more volunteers. Typically, one should be a + veteran release manager (having previously served as a php-src release manager), + while the other one (or two) should be rookies. Hold a vote if necessary (see https://wiki.php.net/rfc/releaseprocess#release_managers_selection). 3. Help the new release managers with their first steps. From 9a90bd705483004c2ef408ee9e9bb0902beade3f Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sat, 12 Mar 2022 12:44:19 +0100 Subject: [PATCH 0495/1346] Deprecate ${} string interpolation https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation --- UPGRADING | 4 ++++ Zend/tests/bug61681.phpt | 3 ++- ...cate_dollar_brace_string_interpolation_1.phpt | 12 ++++++++++++ Zend/tests/exception_in_nested_rope.phpt | 3 ++- Zend/tests/flexible-heredoc-complex-test1.phpt | 5 ++++- Zend/tests/flexible-heredoc-complex-test2.phpt | 5 ++++- Zend/tests/flexible-heredoc-complex-test3.phpt | 5 ++++- Zend/tests/flexible-heredoc-complex-test4.phpt | 5 ++++- Zend/tests/temporary_cleaning_016.phpt | 3 ++- .../tests/warning_during_heredoc_scan_ahead.phpt | 2 ++ Zend/zend_compile.c | 11 ++++++++++- Zend/zend_compile.h | 4 ++++ Zend/zend_language_parser.y | 6 +++--- Zend/zend_vm_gen.php | 2 +- build/gen_stub.php | 2 +- ext/oci8/tests/lob_prefetch.phpt | 6 +++--- ext/oci8/tests/lob_prefetch_ini.phpt | 6 +++--- ext/opcache/tests/opt/gh8140a.phpt | 2 +- ext/opcache/tests/opt/gh8140b.phpt | 2 +- ext/pgsql/tests/config.inc | 4 ++-- ext/phar/phar/clicommand.inc | 16 ++++++++-------- ext/phar/phar/pharcommand.inc | 2 +- ext/session/tests/save_handler.inc | 16 ++++++++-------- ext/soap/tests/bug73037.phpt | 2 +- .../tests/file/windows_mb_path/test_big5_1.phpt | 4 ++-- .../windows_mb_path/test_big5_to_utf8_1.phpt | 4 ++-- .../windows_mb_path/test_cp1250_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp1250_to_utf8_2.phpt | 4 ++-- .../windows_mb_path/test_cp1250_to_utf8_4.phpt | 6 +++--- .../windows_mb_path/test_cp1250_to_utf8_5.phpt | 4 ++-- .../file/windows_mb_path/test_cp1251_1.phpt | 2 +- .../file/windows_mb_path/test_cp1251_2.phpt | 2 +- .../windows_mb_path/test_cp1251_to_utf8_1.phpt | 2 +- .../windows_mb_path/test_cp1251_to_utf8_2.phpt | 2 +- .../test_cp1251_zend_multibyte_1.phpt | 4 ++-- .../windows_mb_path/test_cp1252_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp1252_to_utf8_2.phpt | 4 ++-- .../windows_mb_path/test_cp1252_to_utf8_4.phpt | 6 +++--- .../windows_mb_path/test_cp1252_to_utf8_5.phpt | 4 ++-- .../file/windows_mb_path/test_cp1253_1.phpt | 6 +++--- .../file/windows_mb_path/test_cp1253_2.phpt | 4 ++-- .../windows_mb_path/test_cp1253_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp1253_to_utf8_2.phpt | 4 ++-- .../file/windows_mb_path/test_cp1254_1.phpt | 6 +++--- .../file/windows_mb_path/test_cp1254_2.phpt | 4 ++-- .../windows_mb_path/test_cp1254_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp1254_to_utf8_2.phpt | 4 ++-- .../file/windows_mb_path/test_cp1255_1.phpt | 6 +++--- .../file/windows_mb_path/test_cp1255_2.phpt | 4 ++-- .../windows_mb_path/test_cp1255_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp1255_to_utf8_2.phpt | 4 ++-- .../file/windows_mb_path/test_cp1256_1.phpt | 6 +++--- .../file/windows_mb_path/test_cp1256_2.phpt | 4 ++-- .../windows_mb_path/test_cp1256_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp1256_to_utf8_2.phpt | 4 ++-- .../tests/file/windows_mb_path/test_cp932_1.phpt | 6 +++--- .../tests/file/windows_mb_path/test_cp932_2.phpt | 4 ++-- .../windows_mb_path/test_cp932_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_cp932_to_utf8_2.phpt | 4 ++-- .../tests/file/windows_mb_path/test_cp936_1.phpt | 4 ++-- .../windows_mb_path/test_cp936_to_utf8_1.phpt | 4 ++-- .../windows_mb_path/test_eucjp_to_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_eucjp_to_utf8_2.phpt | 4 ++-- .../windows_mb_path/test_kartuli_utf8_1.phpt | 6 +++--- .../windows_mb_path/test_kartuli_utf8_2.phpt | 4 ++-- .../tests/general_functions/sleep_basic.phpt | 2 +- ext/standard/tests/strings/lcfirst.phpt | 1 + .../tests/strings/str_replace_variation3.phpt | 2 ++ ext/standard/tests/strings/strcasecmp.phpt | 1 + ext/standard/tests/strings/strcmp.phpt | 1 + ext/standard/tests/strings/strlen.phpt | 1 + ext/standard/tests/strings/strpos.phpt | 1 + ext/standard/tests/strings/strstr.phpt | 1 + ext/standard/tests/strings/ucfirst.phpt | 1 + run-tests.php | 4 ++-- .../cli/tests/sapi_windows_set_ctrl_handler.phpt | 4 ++-- 76 files changed, 195 insertions(+), 140 deletions(-) create mode 100644 Zend/tests/deprecate_dollar_brace_string_interpolation_1.phpt diff --git a/UPGRADING b/UPGRADING index 68acde170ec6e..a9d7b6747a5bc 100644 --- a/UPGRADING +++ b/UPGRADING @@ -106,6 +106,10 @@ PHP 8.2 UPGRADE NOTES RFC: https://wiki.php.net/rfc/deprecate_partially_supported_callables + . The "${var}" and "${expr}" style string interpolations are deprecated and + will be removed in PHP 9. Use "$var"/"{$var}" or "${expr}", respectively. + RFC: https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation + - Mbstring: . Use of QPrint, Base64, Uuencode, and HTML-ENTITIES 'text encodings' is deprecated for all Mbstring functions. Unlike all the other text diff --git a/Zend/tests/bug61681.phpt b/Zend/tests/bug61681.phpt index 00a23e97d7a18..6329c6083e1ac 100644 --- a/Zend/tests/bug61681.phpt +++ b/Zend/tests/bug61681.phpt @@ -7,5 +7,6 @@ $la = "ooxx"; echo "${substr('laruence', 0, 2)}"; ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d ooxx diff --git a/Zend/tests/deprecate_dollar_brace_string_interpolation_1.phpt b/Zend/tests/deprecate_dollar_brace_string_interpolation_1.phpt new file mode 100644 index 0000000000000..84652675e62b5 --- /dev/null +++ b/Zend/tests/deprecate_dollar_brace_string_interpolation_1.phpt @@ -0,0 +1,12 @@ +--TEST-- +"${}" emits a deprecation +--FILE-- + +--EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d +string(3) "bar" diff --git a/Zend/tests/exception_in_nested_rope.phpt b/Zend/tests/exception_in_nested_rope.phpt index df0d6fbf8d2a1..7afd1412354a9 100644 --- a/Zend/tests/exception_in_nested_rope.phpt +++ b/Zend/tests/exception_in_nested_rope.phpt @@ -13,5 +13,6 @@ try { } ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d Exception diff --git a/Zend/tests/flexible-heredoc-complex-test1.phpt b/Zend/tests/flexible-heredoc-complex-test1.phpt index 3e148d065243b..5f3d085ea4162 100644 --- a/Zend/tests/flexible-heredoc-complex-test1.phpt +++ b/Zend/tests/flexible-heredoc-complex-test1.phpt @@ -21,7 +21,10 @@ var_dump(<< ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d + +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d string(5) "a b c" diff --git a/Zend/tests/flexible-heredoc-complex-test2.phpt b/Zend/tests/flexible-heredoc-complex-test2.phpt index d585e4b476b48..818c670c4ae5b 100644 --- a/Zend/tests/flexible-heredoc-complex-test2.phpt +++ b/Zend/tests/flexible-heredoc-complex-test2.phpt @@ -21,7 +21,10 @@ var_dump(<< ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d + +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d string(5) "a b c" diff --git a/Zend/tests/flexible-heredoc-complex-test3.phpt b/Zend/tests/flexible-heredoc-complex-test3.phpt index cf68f123163b2..ed48a0e6c12ec 100644 --- a/Zend/tests/flexible-heredoc-complex-test3.phpt +++ b/Zend/tests/flexible-heredoc-complex-test3.phpt @@ -21,7 +21,10 @@ var_dump(<< ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d + +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d string(8) " a b c" diff --git a/Zend/tests/flexible-heredoc-complex-test4.phpt b/Zend/tests/flexible-heredoc-complex-test4.phpt index 5be0f442f62fe..3ffff0b60fb73 100644 --- a/Zend/tests/flexible-heredoc-complex-test4.phpt +++ b/Zend/tests/flexible-heredoc-complex-test4.phpt @@ -28,7 +28,10 @@ the same delimiter name as the heredoc } ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d + +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d string(8) "Test FOO" string(16) " Test diff --git a/Zend/tests/temporary_cleaning_016.phpt b/Zend/tests/temporary_cleaning_016.phpt index cdc9bff0cb8c2..8dc4c8ea31488 100644 --- a/Zend/tests/temporary_cleaning_016.phpt +++ b/Zend/tests/temporary_cleaning_016.phpt @@ -11,5 +11,6 @@ try { } ?> DONE ---EXPECT-- +--EXPECTF-- +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d DONE diff --git a/Zend/tests/warning_during_heredoc_scan_ahead.phpt b/Zend/tests/warning_during_heredoc_scan_ahead.phpt index 7def8a4554e6a..a0becbb782a6d 100644 --- a/Zend/tests/warning_during_heredoc_scan_ahead.phpt +++ b/Zend/tests/warning_during_heredoc_scan_ahead.phpt @@ -14,4 +14,6 @@ Warning: Octal escape sequence overflow \400 is greater than \377 in %s on line Warning: Octal escape sequence overflow \400 is greater than \377 in %s on line %d +Deprecated: Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead in %s on line %d + Warning: Undefined variable $ in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e0ee212a6b146..76470e811cea9 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -9504,7 +9504,16 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */ j = 0; last_const_node.op_type = IS_UNUSED; for (i = 0; i < list->children; i++) { - zend_compile_expr(&elem_node, list->child[i]); + zend_ast *encaps_var = list->child[i]; + if (encaps_var->attr & (ZEND_ENCAPS_VAR_DOLLAR_CURLY|ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR)) { + if (encaps_var->attr & ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR) { + zend_error(E_DEPRECATED, "Using ${expr} (variable variables) in strings is deprecated, use {${expr}} instead"); + } else { + zend_error(E_DEPRECATED, "Using ${var} in strings is deprecated, use {$var} instead"); + } + } + + zend_compile_expr(&elem_node, encaps_var); if (elem_node.op_type == IS_CONST) { convert_to_string(&elem_node.u.constant); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index b3e2d62737d51..038eb6543f19e 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -1077,6 +1077,10 @@ static zend_always_inline bool zend_check_arg_send_type(const zend_function *zf, /* Attribute for ternary inside parentheses */ #define ZEND_PARENTHESIZED_CONDITIONAL 1 +/* Attributes for ${} encaps var in strings */ +#define ZEND_ENCAPS_VAR_DOLLAR_CURLY (1<<0) +#define ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR (1<<1) + /* For "use" AST nodes and the seen symbol table */ #define ZEND_SYMBOL_CLASS (1<<0) #define ZEND_SYMBOL_FUNCTION (1<<1) diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index f6ba5465abebb..01adacf065ef4 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -1490,11 +1490,11 @@ encaps_var: { $$ = zend_ast_create(ZEND_AST_NULLSAFE_PROP, zend_ast_create(ZEND_AST_VAR, $1), $3); } | T_DOLLAR_OPEN_CURLY_BRACES expr '}' - { $$ = zend_ast_create(ZEND_AST_VAR, $2); } + { $$ = zend_ast_create_ex(ZEND_AST_VAR, ZEND_ENCAPS_VAR_DOLLAR_CURLY_VAR_VAR, $2); } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' - { $$ = zend_ast_create(ZEND_AST_VAR, $2); } + { $$ = zend_ast_create_ex(ZEND_AST_VAR, ZEND_ENCAPS_VAR_DOLLAR_CURLY, $2); } | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' - { $$ = zend_ast_create(ZEND_AST_DIM, + { $$ = zend_ast_create_ex(ZEND_AST_DIM, ZEND_ENCAPS_VAR_DOLLAR_CURLY, zend_ast_create(ZEND_AST_VAR, $2), $4); } | T_CURLY_OPEN variable '}' { $$ = $2; } ; diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index ed3b9fecf1d8a..f878425ab65be 100755 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -2865,7 +2865,7 @@ function gen_vm($def, $skel) { out($f, "\t\t\t\t\tbreak;\n"); out($f, "\t\t\t\t}\n"); } - out($f, "\t\t\t\tspec = ${spec_dsc['spec_code']};\n"); + out($f, "\t\t\t\tspec = {$spec_dsc['spec_code']};\n"); if (isset($spec_dsc["spec"]["COMMUTATIVE"]) && !isset($dsc["spec"]["COMMUTATIVE"])) { out($f, "\t\t\t\tif (op->op1_type < op->op2_type) {\n"); out($f, "\t\t\t\t\tzend_swap_operands(op);\n"); diff --git a/build/gen_stub.php b/build/gen_stub.php index 4ebe961d8b774..bd8166d3afe0d 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1484,7 +1484,7 @@ public function getDeclaration(): string { } else { $escapedClassName = $arginfoType->classTypes[0]->toEscapedName(); $varEscapedClassName = $arginfoType->classTypes[0]->toVarEscapedName(); - $code .= "\tzend_string *property_{$propertyName}_class_{$varEscapedClassName} = zend_string_init(\"{$escapedClassName}\", sizeof(\"${escapedClassName}\")-1, 1);\n"; + $code .= "\tzend_string *property_{$propertyName}_class_{$varEscapedClassName} = zend_string_init(\"{$escapedClassName}\", sizeof(\"{$escapedClassName}\")-1, 1);\n"; $typeCode = "(zend_type) ZEND_TYPE_INIT_CLASS(property_{$propertyName}_class_{$varEscapedClassName}, 0, " . $arginfoType->toTypeMask() . ")"; } diff --git a/ext/oci8/tests/lob_prefetch.phpt b/ext/oci8/tests/lob_prefetch.phpt index 94a85585a8e8a..909e20b38605d 100755 --- a/ext/oci8/tests/lob_prefetch.phpt +++ b/ext/oci8/tests/lob_prefetch.phpt @@ -35,7 +35,7 @@ $ora_sql = end loop; dbms_lob.createtemporary(b, false); dbms_lob.converttoblob(b, c, dbms_lob.lobmaxsize, dest_offset, src_offset, dbms_lob.default_csid, ctx, warn); - insert /*+ APPEND */ into ${schema}${table_name} (id, clob, blob) values (j, c, b); + insert /*+ APPEND */ into {$schema}{$table_name} (id, clob, blob) values (j, c, b); end loop; commit; end;"; @@ -119,7 +119,7 @@ try { print("Test 3 - CLOB prefetch_lob_size 100000\n"); -$sql = "select clob from ${schema}${table_name}" . " order by id"; +$sql = "select clob from {$schema}{$table_name}" . " order by id"; $locarr = get_clob_loc($c, $sql, 100000); $inlinearr = get_clob_inline($c, $sql, 100000); @@ -138,7 +138,7 @@ check_clobs($locarr, $inlinearr); print("Test 4 - BLOB prefetch_lob_size 100000\n"); -$sql = "select blob from ${schema}${table_name}" . " order by id"; +$sql = "select blob from {$schema}{$table_name}" . " order by id"; $locarr = get_blob_loc($c, $sql, 100000); print(count($locarr) . "\n"); diff --git a/ext/oci8/tests/lob_prefetch_ini.phpt b/ext/oci8/tests/lob_prefetch_ini.phpt index 2142a8e0ece01..b37217d034469 100755 --- a/ext/oci8/tests/lob_prefetch_ini.phpt +++ b/ext/oci8/tests/lob_prefetch_ini.phpt @@ -37,7 +37,7 @@ $ora_sql = end loop; dbms_lob.createtemporary(b, false); dbms_lob.converttoblob(b, c, dbms_lob.lobmaxsize, dest_offset, src_offset, dbms_lob.default_csid, ctx, warn); - insert /*+ APPEND */ into ${schema}${table_name} (id, clob, blob) values (j, c, b); + insert /*+ APPEND */ into {$schema}{$table_name} (id, clob, blob) values (j, c, b); end loop; commit; end;"; @@ -108,7 +108,7 @@ var_dump($r); print("Test 2 - CLOB with current oci8.prefetch_lob_size\n"); -$sql = "select clob from ${schema}${table_name}" . " order by id"; +$sql = "select clob from {$schema}{$table_name}" . " order by id"; $locarr = get_clob_loc($c, $sql, -1); $inlinearr = get_clob_inline($c, $sql, -1); @@ -136,7 +136,7 @@ check_clobs($locarr, $inlinearr); print("Test 5 - BLOB with current ocig8.prefetch_lob_size \n"); -$sql = "select blob from ${schema}${table_name}" . " order by id"; +$sql = "select blob from {$schema}{$table_name}" . " order by id"; $locarr = get_blob_loc($c, $sql, -1); print(count($locarr) . "\n"); diff --git a/ext/opcache/tests/opt/gh8140a.phpt b/ext/opcache/tests/opt/gh8140a.phpt index 03f097c77c5ce..998b33e75685b 100644 --- a/ext/opcache/tests/opt/gh8140a.phpt +++ b/ext/opcache/tests/opt/gh8140a.phpt @@ -5,7 +5,7 @@ GH-8140 (Wrong first class callable by name optimization) namespace Test; function greeter(string $name) { - echo "Hello, ${name}!"; + echo "Hello, {$name}!"; } $mycallable = greeter(...); diff --git a/ext/opcache/tests/opt/gh8140b.phpt b/ext/opcache/tests/opt/gh8140b.phpt index 60da3a79e1408..cdffab4463b5e 100644 --- a/ext/opcache/tests/opt/gh8140b.phpt +++ b/ext/opcache/tests/opt/gh8140b.phpt @@ -5,7 +5,7 @@ GH-8140 (Wrong first class callable by name optimization) $mycallable = greeter(...); function greeter(string $name) { - echo "Hello, ${name}!"; + echo "Hello, {$name}!"; } $mycallable("world"); diff --git a/ext/pgsql/tests/config.inc b/ext/pgsql/tests/config.inc index fbe58588a208f..66ba4810203af 100644 --- a/ext/pgsql/tests/config.inc +++ b/ext/pgsql/tests/config.inc @@ -16,8 +16,8 @@ $view_name = "php_pgsql_viewtest"; $view_def = "CREATE VIEW {$view_name} AS SELECT * FROM {$table_name};"; // Test table -$table_def = "CREATE TABLE ${table_name} (num int, str text, bin bytea);"; -$table_def_92 = "CREATE TABLE ${table_name_92} (textary text[], jsn json);"; +$table_def = "CREATE TABLE {$table_name} (num int, str text, bin bytea);"; +$table_def_92 = "CREATE TABLE {$table_name_92} (textary text[], jsn json);"; $field_name = "num"; // For pg_field_num() ?> diff --git a/ext/phar/phar/clicommand.inc b/ext/phar/phar/clicommand.inc index 7527e1c4d9e7d..0b84bd6030b4f 100644 --- a/ext/phar/phar/clicommand.inc +++ b/ext/phar/phar/clicommand.inc @@ -30,9 +30,9 @@ abstract class CLICommand $this->typs = self::getArgTyps($this); if ($argc < 2) { - self::error("No command given, check ${argv[0]} help\n"); + self::error("No command given, check {$argv[0]} help\n"); } elseif (!isset($this->cmds[$argv[1]]['run'])) { - self::error("Unknown command '${argv[1]}', check ${argv[0]} help\n"); + self::error("Unknown command '{$argv[1]}', check {$argv[0]} help\n"); } else { $command = $argv[1]; } @@ -46,12 +46,12 @@ abstract class CLICommand if (strlen($argv[$i]) == 2 && isset($this->args[$argv[$i][1]])) { $arg = $argv[$i][1]; if (++$i >= $argc) { - self::error("Missing argument to parameter '$arg' of command '$command', check ${argv[0]} help\n"); + self::error("Missing argument to parameter '$arg' of command '$command', check {$argv[0]} help\n"); } else { $this->args[$arg]['val'] = $this->checkArgTyp($arg, $i, $argc, $argv); } } else { - self::error("Unknown parameter '${argv[$i]}' to command $command, check ${argv[0]} help\n"); + self::error("Unknown parameter '{$argv[$i]}' to command $command, check {$argv[0]} help\n"); } } else { break; @@ -61,7 +61,7 @@ abstract class CLICommand if (isset($this->args[''])) { if ($i >= $argc) { if (isset($this->args['']['require']) && $this->args['']['require']) { - self::error("Missing default trailing arguments to command $command, check ${argv[0]} help\n"); + self::error("Missing default trailing arguments to command $command, check {$argv[0]} help\n"); } } else { $this->args['']['val'] = array(); @@ -70,12 +70,12 @@ abstract class CLICommand } } } else if ($i < $argc) { - self::error("Unexpected default arguments to command $command, check ${argv[0]} help\n"); + self::error("Unexpected default arguments to command $command, check {$argv[0]} help\n"); } foreach($this->args as $arg => $inf) { if (strlen($arg) && !isset($inf['val']) && isset($inf['required']) && $inf['required']) { - $missing .= "Missing parameter '-$arg' to command $command, check ${argv[0]} help\n"; + $missing .= "Missing parameter '-$arg' to command $command, check {$argv[0]} help\n"; } } @@ -265,7 +265,7 @@ abstract class CLICommand $sp3 = $this->cli_get_SP3($l, $ls, $inf); $l3 = strlen($sp3); foreach($conf['select'] as $opt => $what) { - $inf .= $this->cli_wordwrap($sp2 . " " . sprintf("%-${ls}s ", $opt) . $what, $l3, $sp3) . "\n"; + $inf .= $this->cli_wordwrap($sp2 . " " . sprintf("%-{$ls}s ", $opt) . $what, $l3, $sp3) . "\n"; } } } diff --git a/ext/phar/phar/pharcommand.inc b/ext/phar/phar/pharcommand.inc index 1b1eeca59c560..fdc43654dd7eb 100644 --- a/ext/phar/phar/pharcommand.inc +++ b/ext/phar/phar/pharcommand.inc @@ -1598,7 +1598,7 @@ class PharCommand extends CLICommand if (is_bool($v)) { $v = $v ? 'enabled' : 'disabled'; } - printf("%-${klen}s %s\n", $k.':', $v); + printf("%-{$klen}s %s\n", $k.':', $v); } } // }}} diff --git a/ext/session/tests/save_handler.inc b/ext/session/tests/save_handler.inc index 56b3505284bb5..43475d33b8029 100644 --- a/ext/session/tests/save_handler.inc +++ b/ext/session/tests/save_handler.inc @@ -27,7 +27,7 @@ function open($save_path, $session_name) { global $session_save_path, $name; $session_save_path = $save_path; $name = $session_name; - echo "Open [${session_save_path},${session_name}]\n"; + echo "Open [{$session_save_path},{$session_name}]\n"; // MUST return bool. Return TRUE for success. return true; @@ -39,7 +39,7 @@ function close() { // NOTE: This function should unlock session data, if write() does not unlock it. global $session_save_path, $name; - echo "Close [${session_save_path},${name}]\n"; + echo "Close [{$session_save_path},{$name}]\n"; // MUST return bool. Return TRUE for success. return true; @@ -54,7 +54,7 @@ function read($id) { global $session_save_path, $name, $session_id; $session_id = $id; - echo "Read [${session_save_path},${id}]\n"; + echo "Read [{$session_save_path},{$id}]\n"; $session_file = "$session_save_path/".SESSION_FILE_PREFIX.$id; // read MUST create file. Otherwise, strict mode will not work touch($session_file); @@ -74,7 +74,7 @@ function write($id, $session_data) { global $session_save_path, $name, $session_id; $session_id = $id; - echo "Write [${session_save_path},${id},${session_data}]\n"; + echo "Write [{$session_save_path},{$id},{$session_data}]\n"; $session_file = "$session_save_path/".SESSION_FILE_PREFIX.$id; if ($fp = fopen($session_file, "w")) { $return = fwrite($fp, $session_data); @@ -91,7 +91,7 @@ function destroy($id) { // string $id - Session ID string global $session_save_path, $name; - echo "Destroy [${session_save_path},${id}]\n"; + echo "Destroy [{$session_save_path},{$id}]\n"; $session_file = "$session_save_path/".SESSION_FILE_PREFIX.$id; unlink($session_file); @@ -136,7 +136,7 @@ function create_sid() { // e.g. hash('sha2', random_bytes(64)) or use /dev/urandom $id = ('PHPT-'.time()); - echo "CreateID [${id}]\n"; + echo "CreateID [{$id}]\n"; // MUST return session ID string. // Return FALSE for error. @@ -148,7 +148,7 @@ function validate_sid($id) { // string $id - Session ID string global $session_save_path, $name; - echo "ValidateID [${session_save_path},${id}]\n"; + echo "ValidateID [{$session_save_path},{$id}]\n"; $session_file = "$session_save_path/".SESSION_FILE_PREFIX.$id; $ret = file_exists($session_file); @@ -168,7 +168,7 @@ function update($id, $session_data) { // support time stamp updating, you must not define this. global $session_save_path, $name; - echo "Update [${session_save_path},${id}]\n"; + echo "Update [{$session_save_path},{$id}]\n"; $session_file = "$session_save_path/".SESSION_FILE_PREFIX.$id; $ret = touch($session_file); diff --git a/ext/soap/tests/bug73037.phpt b/ext/soap/tests/bug73037.phpt index 023551176fc3a..3853e50c26913 100644 --- a/ext/soap/tests/bug73037.phpt +++ b/ext/soap/tests/bug73037.phpt @@ -88,7 +88,7 @@ Content-Type: application/soap+xml; charset=UTF-8 Accept: application/soap+xml, application/dime, multipart/related, text/* SOAPAction: "urn:adressen#adressen#SetAda" Expect: 100-continue -Content-Length: ${len} +Content-Length: {$len} HDRS; if ($b) { $hdrs .="\nContent-Encoding: gzip"; diff --git a/ext/standard/tests/file/windows_mb_path/test_big5_1.phpt b/ext/standard/tests/file/windows_mb_path/test_big5_1.phpt index 461ed5d002592..d4821b23be0e4 100644 --- a/ext/standard/tests/file/windows_mb_path/test_big5_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_big5_1.phpt @@ -25,9 +25,9 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "���զh�r�`���|"; // BIG5 string $prefix = create_data("dir_big5", $item . "5", 950); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}5"; +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}5"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_big5_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_big5_to_utf8_1.phpt index 01952217784ff..5076768c955b3 100644 --- a/ext/standard/tests/file/windows_mb_path/test_big5_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_big5_to_utf8_1.phpt @@ -22,9 +22,9 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('big5', 'utf-8', "���զh�r�`���|"); // BIG5 string $prefix = create_data("dir_big5", $item . "5"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}5"; +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}5"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_1.phpt index c792988ba503a..ad09ff1967caf 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp1250 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "šđčćž_ŠĐČĆŽ"; // cp1250 specific chars -$prefix = create_data("dir_cp1250", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1250", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_2.phpt index 9e1279a5cdef4..61e1b4eaa598b 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp1250 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "šđčćž_ŠĐČĆŽ"; // cp1250 specific chars -$prefix = create_data("dir_cp1250", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1250", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_4.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_4.phpt index 0eb0f9b09768a..8992a847eb507 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_4.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_4.phpt @@ -21,10 +21,10 @@ dir_cp1250 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "Árvíztűrő tükörfúrógép"; // cp1250 specific chars -$prefix = create_data("dir_cp1250", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1250", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_5.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_5.phpt index 0c56ea4b48f35..392c486a767f7 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_5.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1250_to_utf8_5.phpt @@ -21,8 +21,8 @@ dir_cp1250 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "Árvíztűrő tükörfúrógép"; // cp1250 specific chars -$prefix = create_data("dir_cp1250", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1250", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_1.phpt index a1f05c80f6d7a..0ea67f575e563 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_1.phpt @@ -27,7 +27,7 @@ $item = " $prefix = create_data("dir_cp1251", $item . "3", 1251); $path = $prefix . DIRECTORY_SEPARATOR . $item . "3"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_2.phpt index 742af59480610..f65b38eafdad0 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_2.phpt @@ -25,7 +25,7 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "������"; // cp1251 string $prefix = create_data("file_cp1251", $item . "7", 1251); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}7"; +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}7"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_1.phpt index e7e274c4e6d7d..6e53ff48c99d9 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_1.phpt @@ -24,7 +24,7 @@ $item = iconv('cp1251', 'utf-8', " $prefix = create_data("dir_cp1251", $item . "3"); $path = $prefix . DIRECTORY_SEPARATOR . $item . "3"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_2.phpt index 31e611303edee..95b75985c6188 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_to_utf8_2.phpt @@ -22,7 +22,7 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp1251', 'utf-8', "������"); // cp1251 string $prefix = create_data("file_cp1251", $item . "7"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}7"; +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}7"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt index ca11bfff560dc..855fd4617b329 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt @@ -25,9 +25,9 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "������"; // cp1251 string $prefix = create_data("dir_cp1251", $item . "3"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}3"; +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}3"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_1.phpt index 2465145758110..5f5a6a78385a7 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp1252 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp1252', 'utf-8', "tsch��"); // cp1252 string -$prefix = create_data("dir_cp1252", "${item}3"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}3"; +$prefix = create_data("dir_cp1252", "{$item}3"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}3"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_2.phpt index 9185503abea45..04baef95b0252 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp1252 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp1252', 'utf-8', "tsch��"); // cp1252 string -$prefix = create_data("dir_cp1252", "${item}3"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}7"; +$prefix = create_data("dir_cp1252", "{$item}3"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}7"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_4.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_4.phpt index 98a419efc576b..a3359f686c1b3 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_4.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_4.phpt @@ -21,10 +21,10 @@ dir2_cp1252 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp1252', 'utf-8', "Vol��ao"); // cp1252 string -$prefix = create_data("dir2_cp1252", "${item}3"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}3"; +$prefix = create_data("dir2_cp1252", "{$item}3"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}3"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_5.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_5.phpt index fb98361c17ab9..42212d027126c 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_5.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1252_to_utf8_5.phpt @@ -21,8 +21,8 @@ dir2_cp1252 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp1252', 'utf-8', "Vol��ao"); // cp1252 string -$prefix = create_data("dir2_cp1252", "${item}3"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}7"; +$prefix = create_data("dir2_cp1252", "{$item}3"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}7"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1253_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1253_1.phpt index aa08aa24eaac4..9ffdb11b2b83e 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1253_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1253_1.phpt @@ -24,10 +24,10 @@ default_charset=cp1253 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�������� �������"; -$prefix = create_data("dir_cp1253", "${item}42", 1253); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1253", "{$item}42", 1253); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1253_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1253_2.phpt index 46ce9b5fef305..642e4aaabd194 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1253_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1253_2.phpt @@ -24,8 +24,8 @@ internal_encoding=cp1253 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�������� �������"; -$prefix = create_data("dir_cp1253", "${item}42}", 1253); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1253", "{$item}42}", 1253); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_1.phpt index 70a548f6685b6..c84e9c95b3694 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp1253 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "διαδρομή δοκιμής"; -$prefix = create_data("dir_cp1253", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1253", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_2.phpt index ef15325feaf75..c0723d18b1228 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1253_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp1253 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "διαδρομή δοκιμής"; -$prefix = create_data("dir_cp1253", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1253", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1254_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1254_1.phpt index 54108d0e7908a..82d74c750961b 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1254_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1254_1.phpt @@ -24,10 +24,10 @@ internal_encoding=cp1254 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�okbaytl� i�leri"; -$prefix = create_data("dir_cp1254", "${item}42", 1254); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1254", "{$item}42", 1254); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1254_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1254_2.phpt index b2ba41900d321..f14a4c3de086e 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1254_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1254_2.phpt @@ -24,8 +24,8 @@ internal_encoding=cp1254 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�okbaytl� i�leri"; -$prefix = create_data("dir_cp1254", "${item}42}", 1254); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1254", "{$item}42}", 1254); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_1.phpt index 23fd79d44e7b6..42b241176ffb6 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp1254 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "çokbaytlı işleri"; -$prefix = create_data("dir_cp1254", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1254", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_2.phpt index 4bff1e9baaf0f..b0c4f5ec83f0e 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1254_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp1254 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "çokbaytlı işleri"; -$prefix = create_data("dir_cp1254", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1254", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1255_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1255_1.phpt index 0c78b91ab09e8..2cf42239267ad 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1255_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1255_1.phpt @@ -24,10 +24,10 @@ default_charset=cp1255 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "����� ������"; -$prefix = create_data("dir_cp1255", "${item}42", 1255); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1255", "{$item}42", 1255); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1255_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1255_2.phpt index 1af549f0a7a3a..e4779b721ba92 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1255_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1255_2.phpt @@ -24,8 +24,8 @@ internal_encoding=cp1255 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "����� ������"; -$prefix = create_data("dir_cp1255", "${item}42}", 1255); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1255", "{$item}42}", 1255); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_1.phpt index e53936090a295..356143ca7876a 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp1255 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "כללים מרובים"; -$prefix = create_data("dir_cp1255", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1255", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_2.phpt index 1c9396348e406..b378a7231d15e 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1255_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp1255 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "כללים מרובים"; -$prefix = create_data("dir_cp1255", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1255", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1256_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1256_1.phpt index 08e8067163412..244758fe7bd67 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1256_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1256_1.phpt @@ -24,10 +24,10 @@ internal_encoding=cp1256 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "���� ����� ������ ������"; -$prefix = create_data("dir_cp1256", "${item}42", 1256); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1256", "{$item}42", 1256); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1256_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1256_2.phpt index d68cd3113ab2a..f5b5db8935277 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1256_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1256_2.phpt @@ -24,8 +24,8 @@ default_charset=cp1256 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "���� ����� ������ ������"; -$prefix = create_data("dir_cp1256", "${item}42}", 1256); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1256", "{$item}42}", 1256); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_1.phpt index 04f5854e5b34e..b630f37648bc4 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp1256 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "مسار متعدد البايت اختبار"; -$prefix = create_data("dir_cp1256", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp1256", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_2.phpt index 7b01bc56e080f..6aa29f43c4268 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1256_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp1256 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "مسار متعدد البايت اختبار"; -$prefix = create_data("dir_cp1256", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp1256", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp932_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp932_1.phpt index 4bc6028ce2564..744d1a592be95 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp932_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp932_1.phpt @@ -24,10 +24,10 @@ default_charset=cp932 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�e�X�g�}���`�o�C�g�E�p�X"; // cp932 string -$prefix = create_data("dir_cp932", "${item}42", 932); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp932", "{$item}42", 932); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp932_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp932_2.phpt index 2860eb9fb37b3..737a4d3eb869b 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp932_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp932_2.phpt @@ -24,8 +24,8 @@ internal_encoding=cp932 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�e�X�g�}���`�o�C�g�E�p�X"; // cp932 string -$prefix = create_data("dir_cp932", "${item}42}", 932); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp932", "{$item}42}", 932); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_1.phpt index 0c487a33d3845..b9575302c8abc 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_cp932 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp932', 'utf-8', "�e�X�g�}���`�o�C�g�E�p�X"); // cp932 string -$prefix = create_data("dir_cp932", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_cp932", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_2.phpt index 064625d1c88c9..7c3870593692e 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp932_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_cp932 include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp932', 'utf-8', "�e�X�g�}���`�o�C�g�E�p�X"); // cp932 string -$prefix = create_data("dir_cp932", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_cp932", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_cp936_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp936_1.phpt index b965a6855247d..529808aad5fb2 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp936_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp936_1.phpt @@ -25,9 +25,9 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "�yԇ���ֹ�·��"; // cp936 string $prefix = create_data("dir_cp936", $item . "5", 936); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}5"; +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}5"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_cp936_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp936_to_utf8_1.phpt index c00e5f6b1f5f3..f9730b6fe9a08 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp936_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp936_to_utf8_1.phpt @@ -22,9 +22,9 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('cp936', 'utf-8', "�yԇ���ֹ�·��"); // cp936 string $prefix = create_data("dir_cp936", $item . "5"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}5"; +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}5"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_1.phpt index 313d0db9b7ae7..e3111ba33af7e 100644 --- a/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_1.phpt @@ -21,10 +21,10 @@ dir_eucjp include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('eucjp', 'utf-8', "�ƥ��ȥޥ���Х��ȡ��ѥ�"); // EUCJP string -$prefix = create_data("dir_eucjp", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_eucjp", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_2.phpt index 6707146c67d76..9425a1cc1cea8 100644 --- a/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_eucjp_to_utf8_2.phpt @@ -21,8 +21,8 @@ dir_eucjp include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = iconv('eucjp', 'utf-8', "�ƥ��ȥޥ���Х��ȡ��ѥ�"); // EUCJP string -$prefix = create_data("dir_eucjp", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_eucjp", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_1.phpt b/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_1.phpt index baa6e96606b31..d348ccfd3c8fd 100644 --- a/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_1.phpt @@ -21,10 +21,10 @@ dir_kartuli include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "ქართველები"; -$prefix = create_data("dir_kartuli", "${item}42"); -$path = $prefix . DIRECTORY_SEPARATOR . "${item}42"; +$prefix = create_data("dir_kartuli", "{$item}42"); +$path = $prefix . DIRECTORY_SEPARATOR . "{$item}42"; -$subpath = $path . DIRECTORY_SEPARATOR . "${item}4"; +$subpath = $path . DIRECTORY_SEPARATOR . "{$item}4"; /* The mb dirname exists*/ var_dump(file_exists($path)); diff --git a/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_2.phpt b/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_2.phpt index 4944aade2df3d..2e57dc0c91fa0 100644 --- a/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_kartuli_utf8_2.phpt @@ -21,8 +21,8 @@ dir_kartuli include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; $item = "ქართველები"; -$prefix = create_data("dir_kartuli", "${item}42}"); -$fn = $prefix . DIRECTORY_SEPARATOR . "${item}33"; +$prefix = create_data("dir_kartuli", "{$item}42}"); +$fn = $prefix . DIRECTORY_SEPARATOR . "{$item}33"; $f = fopen($fn, 'w'); if ($f) { diff --git a/ext/standard/tests/general_functions/sleep_basic.phpt b/ext/standard/tests/general_functions/sleep_basic.phpt index 249f7ac6e5934..98402ad8b21fa 100644 --- a/ext/standard/tests/general_functions/sleep_basic.phpt +++ b/ext/standard/tests/general_functions/sleep_basic.phpt @@ -29,7 +29,7 @@ echo "Return value: " . $result . "\n"; if ($time >= $sleeplow) { echo "TEST PASSED\n"; } else { - echo "TEST FAILED - time is ${time} secs and sleep was ${sleeptime} secs\n"; + echo "TEST FAILED - time is {$time} secs and sleep was {$sleeptime} secs\n"; } ?> --EXPECTF-- diff --git a/ext/standard/tests/strings/lcfirst.phpt b/ext/standard/tests/strings/lcfirst.phpt index d98b3a9cb0eed..1abc31d0b3b51 100644 --- a/ext/standard/tests/strings/lcfirst.phpt +++ b/ext/standard/tests/strings/lcfirst.phpt @@ -130,6 +130,7 @@ var_dump(lcfirst(lcfirst("hello"))); echo "Done\n"; ?> --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d #### Basic and Various operations #### string(16) "tesTing lcfirst." string(17) "1.testing lcfirst" diff --git a/ext/standard/tests/strings/str_replace_variation3.phpt b/ext/standard/tests/strings/str_replace_variation3.phpt index f08d8c7dc1bae..07c6ef7da3467 100644 --- a/ext/standard/tests/strings/str_replace_variation3.phpt +++ b/ext/standard/tests/strings/str_replace_variation3.phpt @@ -149,6 +149,8 @@ closedir($resource2); ?> --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d + *** Testing Miscellaneous input data *** string(3) "qqq" int(5) diff --git a/ext/standard/tests/strings/strcasecmp.phpt b/ext/standard/tests/strings/strcasecmp.phpt index 04452067d488f..e55b2a684fb21 100644 --- a/ext/standard/tests/strings/strcasecmp.phpt +++ b/ext/standard/tests/strings/strcasecmp.phpt @@ -113,6 +113,7 @@ var_dump(strcasecmp(10.55555555595555555555555555, 10.555555556)); // int(0) echo "Done\n"; ?> --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d #### Basic and Possible operations #### *** comparing the strings in an Array diff --git a/ext/standard/tests/strings/strcmp.phpt b/ext/standard/tests/strings/strcmp.phpt index a36873830cedd..5310566d53b60 100644 --- a/ext/standard/tests/strings/strcmp.phpt +++ b/ext/standard/tests/strings/strcmp.phpt @@ -113,6 +113,7 @@ var_dump(strcmp(10.55555555595555555555555555, 10.555555556)); // int(0) echo "Done\n"; ?> --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d #### Basic and Possible operations #### *** comparing the strings in an Array diff --git a/ext/standard/tests/strings/strlen.phpt b/ext/standard/tests/strings/strlen.phpt index 426154504b66b..b98111f15e672 100644 --- a/ext/standard/tests/strings/strlen.phpt +++ b/ext/standard/tests/strings/strlen.phpt @@ -122,6 +122,7 @@ var_dump(strlen(strlen("Hello"))); // len=1 echo "Done\n"; ?> --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d #### Basic operations and variations #### String length of 'Hello, World' is => int(12) String length of 'Hello, World' is => int(12) diff --git a/ext/standard/tests/strings/strpos.phpt b/ext/standard/tests/strings/strpos.phpt index 449601f6e5480..05913cc1f03b5 100644 --- a/ext/standard/tests/strings/strpos.phpt +++ b/ext/standard/tests/strings/strpos.phpt @@ -175,6 +175,7 @@ try { DONE --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d *** Testing basic functionality of strpos() *** int(0) int(5) diff --git a/ext/standard/tests/strings/strstr.phpt b/ext/standard/tests/strings/strstr.phpt index f5a2d80318b74..0d4065b54fb2b 100644 --- a/ext/standard/tests/strings/strstr.phpt +++ b/ext/standard/tests/strings/strstr.phpt @@ -136,6 +136,7 @@ var_dump( strstr("a", "b", "c") ); // args > expected DONE --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d *** Testing basic functionality of strstr() *** string(11) "test string" string(6) "string" diff --git a/ext/standard/tests/strings/ucfirst.phpt b/ext/standard/tests/strings/ucfirst.phpt index 1cae286d98a9a..5389579eb2f38 100644 --- a/ext/standard/tests/strings/ucfirst.phpt +++ b/ext/standard/tests/strings/ucfirst.phpt @@ -101,6 +101,7 @@ var_dump(ucfirst(ucfirst("hello"))); echo "Done\n"; ?> --EXPECTF-- +Deprecated: Using ${var} in strings is deprecated, use {$var} instead in %s on line %d #### Basic and Various operations #### string(16) "Testing ucfirst." string(17) "1.testing ucfirst" diff --git a/run-tests.php b/run-tests.php index 964b7c117592b..8b4061e1c84b8 100755 --- a/run-tests.php +++ b/run-tests.php @@ -2807,10 +2807,10 @@ function run_test(string $php, $file, array $env): string lldb -- {$orig_cmd} ;; "valgrind") - USE_ZEND_ALLOC=0 valgrind $2 ${orig_cmd} + USE_ZEND_ALLOC=0 valgrind $2 {$orig_cmd} ;; "rr") - rr record $2 ${orig_cmd} + rr record $2 {$orig_cmd} ;; *) {$orig_cmd} diff --git a/sapi/cli/tests/sapi_windows_set_ctrl_handler.phpt b/sapi/cli/tests/sapi_windows_set_ctrl_handler.phpt index 09030c90f8175..69ffb52dd63ce 100644 --- a/sapi/cli/tests/sapi_windows_set_ctrl_handler.phpt +++ b/sapi/cli/tests/sapi_windows_set_ctrl_handler.phpt @@ -55,13 +55,13 @@ if ($is_child) { $status = proc_get_status($proc); if ($status["running"]) { - echo "Child $child_pid didn't exit after ${max}us\n"; + echo "Child $child_pid didn't exit after {$max}us\n"; foreach ($pipes as $pipe) { fclose($pipe); } proc_terminate($proc); } else { - echo "Child $child_pid exit with status ", $status["exitcode"], " after ${total}us\n"; + echo "Child $child_pid exit with status ", $status["exitcode"], " after {$total}us\n"; } } From 4556f9db5ac60aee527c350e56ea58b2a64d1dd1 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 5 May 2022 17:49:20 +0200 Subject: [PATCH 0496/1346] [skip ci] Fix alternative string interpolation suggestion in UPGRADING --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index a9d7b6747a5bc..8e59816b07391 100644 --- a/UPGRADING +++ b/UPGRADING @@ -107,7 +107,7 @@ PHP 8.2 UPGRADE NOTES RFC: https://wiki.php.net/rfc/deprecate_partially_supported_callables . The "${var}" and "${expr}" style string interpolations are deprecated and - will be removed in PHP 9. Use "$var"/"{$var}" or "${expr}", respectively. + will be removed in PHP 9. Use "$var"/"{$var}" or "{${expr}}", respectively. RFC: https://wiki.php.net/rfc/deprecate_dollar_brace_string_interpolation - Mbstring: From c9787b4785e4522b2653d322325e87a098b0d218 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 6 May 2022 15:38:04 +0200 Subject: [PATCH 0497/1346] Fix skip clause The function required is called `mb_ereg_search()`. --- ext/mbstring/tests/mb_ereg_search_syntax.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/mbstring/tests/mb_ereg_search_syntax.phpt b/ext/mbstring/tests/mb_ereg_search_syntax.phpt index 4e28ebfb8f742..5e16a91c36956 100644 --- a/ext/mbstring/tests/mb_ereg_search_syntax.phpt +++ b/ext/mbstring/tests/mb_ereg_search_syntax.phpt @@ -4,7 +4,7 @@ Specifying non-default syntax in mb_ereg_search() mbstring --SKIPIF-- --FILE-- Date: Fri, 6 May 2022 15:03:24 +0200 Subject: [PATCH 0498/1346] Don't unnecessarily skip mb related tests Apparently, these tests have been overlooked when we switched to using the `--EXTENSIONS--` section. That caused to skip these tests on AppVeyor. Closes GH-8504. --- ext/exif/tests/exif004.phpt | 1 + ext/standard/tests/file/windows_mb_path/bug54028.phpt | 4 +++- .../file/windows_mb_path/test_cp1251_zend_multibyte_0.phpt | 4 +++- .../file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt | 4 +++- .../file/windows_mb_path/test_cp1251_zend_multibyte_2.phpt | 4 +++- ext/standard/tests/file/windows_mb_path/test_long_path_0.phpt | 4 +++- ext/standard/tests/file/windows_mb_path/test_long_path_2.phpt | 4 +++- 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ext/exif/tests/exif004.phpt b/ext/exif/tests/exif004.phpt index 4f1fe947b8113..b5ffc3ec8fa76 100644 --- a/ext/exif/tests/exif004.phpt +++ b/ext/exif/tests/exif004.phpt @@ -1,6 +1,7 @@ --TEST-- Check for exif_read_data, Unicode WinXP tags --EXTENSIONS-- +mbstring exif --SKIPIF-- --FILE-- diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_0.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_0.phpt index 51d2b6d8c1893..8b800ed3bdeab 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_0.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_0.phpt @@ -1,5 +1,7 @@ --TEST-- Test fopen() for reading CP1251 with zend.multibyte +--EXTENSIONS-- +mbstring --INI-- zend.multibyte=1 zend.script_encoding=cp1251 @@ -9,7 +11,7 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; skip_if_not_win(); if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); -skip_if_no_required_exts("mbstring"); +skip_if_no_required_exts(); ?> --CONFLICTS-- diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt index 855fd4617b329..31db615f4d2c8 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_1.phpt @@ -1,5 +1,7 @@ --TEST-- Test mkdir/rmdir CP1251 with zend.multibyte +--EXTENSIONS-- +mbstring --INI-- zend.multibyte=1 zend.script_encoding=cp1251 @@ -9,7 +11,7 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; skip_if_not_win(); if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); -skip_if_no_required_exts("mbstring"); +skip_if_no_required_exts(); ?> --CONFLICTS-- diff --git a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_2.phpt b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_2.phpt index eb52b78835696..d6075da559c92 100644 --- a/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_cp1251_zend_multibyte_2.phpt @@ -1,5 +1,7 @@ --TEST-- Test fopen() for write CP1251 with zend.multibyte +--EXTENSIONS-- +mbstring --INI-- zend.multibyte=1 zend.script_encoding=cp1251 @@ -9,7 +11,7 @@ include __DIR__ . DIRECTORY_SEPARATOR . "util.inc"; skip_if_not_win(); if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); -skip_if_no_required_exts("mbstring"); +skip_if_no_required_exts(); ?> --CONFLICTS-- diff --git a/ext/standard/tests/file/windows_mb_path/test_long_path_0.phpt b/ext/standard/tests/file/windows_mb_path/test_long_path_0.phpt index 3705582484cf1..6a5b60f08bbeb 100644 --- a/ext/standard/tests/file/windows_mb_path/test_long_path_0.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_long_path_0.phpt @@ -1,12 +1,14 @@ --TEST-- Basic long path test +--EXTENSIONS-- +mbstring --SKIPIF-- --FILE-- diff --git a/ext/standard/tests/file/windows_mb_path/test_long_path_2.phpt b/ext/standard/tests/file/windows_mb_path/test_long_path_2.phpt index 05982133c1672..09ccebc0c0766 100644 --- a/ext/standard/tests/file/windows_mb_path/test_long_path_2.phpt +++ b/ext/standard/tests/file/windows_mb_path/test_long_path_2.phpt @@ -1,12 +1,14 @@ --TEST-- Basic long path test with file I/O, multibyte path and realpath() check +--EXTENSIONS-- +mbstring --SKIPIF-- --FILE-- From 812068f6644ccb19ce48ea615e47a527fc428a36 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 6 May 2022 16:36:31 +0200 Subject: [PATCH 0499/1346] Use zend_register_ini_entries_ex / zend_unregister_ini_entries_ex (#8505) --- Zend/zend_ini.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index 08a4a9cca065f..23258ec0ca8b5 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -150,8 +150,8 @@ END_EXTERN_C() #define INI_ORIG_STR(name) zend_ini_string((name), strlen(name), 1) #define INI_ORIG_BOOL(name) ((bool) INI_ORIG_INT(name)) -#define REGISTER_INI_ENTRIES() zend_register_ini_entries(ini_entries, module_number) -#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries(module_number) +#define REGISTER_INI_ENTRIES() zend_register_ini_entries_ex(ini_entries, module_number, type) +#define UNREGISTER_INI_ENTRIES() zend_unregister_ini_entries_ex(module_number, type) #define DISPLAY_INI_ENTRIES() display_ini_entries(zend_module) #define REGISTER_INI_DISPLAYER(name, displayer) zend_ini_register_displayer((name), strlen(name), displayer) From 5b71b66c273b6b02b1c1248d78a438e7d26e199a Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 6 May 2022 18:43:08 +0200 Subject: [PATCH 0500/1346] [ci skip] NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 8599a72c55454..83599ce83d0ec 100644 --- a/NEWS +++ b/NEWS @@ -40,6 +40,10 @@ PHP NEWS - SQLite3: . Changed sqlite3.defensive from PHP_INI_SYSTEM to PHP_INI_USER. (bohwaz) +- Streams: + . Set IP_BIND_ADDRESS_NO_PORT if available when connecting to remote host. + (Cristian Rodríguez) + - Standard: . net_get_interfaces() also reports wireless network interfaces on Windows. (Yurun) From 1584352e1971f1a71f0e45acc9f26e47a856c1a6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 8 May 2022 18:51:41 +0200 Subject: [PATCH 0501/1346] Add fuzzer for mb_convert_encoding This uses the php-fuzz-mbstring name, moving the existing fuzzer to php-fuzz-mbregex. --- sapi/fuzzer/Makefile.frag | 3 ++ sapi/fuzzer/README.md | 12 +++++- sapi/fuzzer/config.m4 | 3 ++ sapi/fuzzer/fuzzer-mbregex.c | 78 +++++++++++++++++++++++++++++++++++ sapi/fuzzer/fuzzer-mbstring.c | 70 +++++++++++++------------------ sapi/fuzzer/generate_all.php | 1 + 6 files changed, 124 insertions(+), 43 deletions(-) create mode 100644 sapi/fuzzer/fuzzer-mbregex.c diff --git a/sapi/fuzzer/Makefile.frag b/sapi/fuzzer/Makefile.frag index 2f15ad92f8999..8a456ca6c4f13 100644 --- a/sapi/fuzzer/Makefile.frag +++ b/sapi/fuzzer/Makefile.frag @@ -28,3 +28,6 @@ $(SAPI_FUZZER_PATH)/php-fuzz-exif: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZ $(SAPI_FUZZER_PATH)/php-fuzz-mbstring: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_MBSTRING_OBJS) $(FUZZER_BUILD) $(PHP_FUZZER_MBSTRING_OBJS) -o $@ + +$(SAPI_FUZZER_PATH)/php-fuzz-mbregex: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_MBREGEX_OBJS) + $(FUZZER_BUILD) $(PHP_FUZZER_MBREGEX_OBJS) -o $@ diff --git a/sapi/fuzzer/README.md b/sapi/fuzzer/README.md index 63de20aa1ca76..ee2d0ee4e0262 100644 --- a/sapi/fuzzer/README.md +++ b/sapi/fuzzer/README.md @@ -28,7 +28,8 @@ When running `make` it creates these binaries in `sapi/fuzzer/`: * `php-fuzz-unserializehash`: Fuzzing unserialize() for HashContext objects * `php-fuzz-json`: Fuzzing JSON parser (requires --enable-json) * `php-fuzz-exif`: Fuzzing `exif_read_data()` function (requires --enable-exif) -* `php-fuzz-mbstring`: Fuzzing `mb_ereg[i]()` (requires --enable-mbstring) +* `php-fuzz-mbstring`: Fuzzing `mb_convert_encoding()` (requires `--enable-mbstring`) +* `php-fuzz-mbregex`: Fuzzing `mb_ereg[i]()` (requires --enable-mbstring) * `php-fuzz-execute`: Fuzzing the executor * `php-fuzz-function-jit`: Fuzzing the function JIT (requires --enable-opcache) * `php-fuzz-tracing-jit`: Fuzzing the tracing JIT (requires --enable-opcache) @@ -72,7 +73,14 @@ sapi/cli/php sapi/fuzzer/generate_execute_corpus.php ./execute-corpus Zend/tests sapi/fuzzer/php-fuzzer-function-jit ./execute-corpus ``` -For the mbstring fuzzer, you may want to build the libonig dependency with instrumentation. At this time, libonig is not clean under ubsan, so only the fuzzer and address sanitizers may be used. +For the mbstring fuzzer, a dictionary of encodings should be generated first: + +```sh +sapi/cli/php sapi/fuzzer/generate_mbstring_dict.php +sapi/fuzzer/php-fuzz-mbstring -dict=$PWD/sapi/fuzzer/dict/mbstring ./my-mbstring-corpus +``` + +For the mbregex fuzzer, you may want to build the libonig dependency with instrumentation. At this time, libonig is not clean under ubsan, so only the fuzzer and address sanitizers may be used. ```sh git clone https://github.com/kkos/oniguruma.git diff --git a/sapi/fuzzer/config.m4 b/sapi/fuzzer/config.m4 index 72953a8295d79..aac06d1827750 100644 --- a/sapi/fuzzer/config.m4 +++ b/sapi/fuzzer/config.m4 @@ -65,6 +65,9 @@ if test "$PHP_FUZZER" != "no"; then fi if test -n "$enable_mbstring" && test "$enable_mbstring" != "no"; then PHP_FUZZER_TARGET([mbstring], PHP_FUZZER_MBSTRING_OBJS) + if test -n "$enable_mbregex" && test "$enable_mbregex" != "no"; then + PHP_FUZZER_TARGET([mbregex], PHP_FUZZER_MBREGEX_OBJS) + fi fi PHP_SUBST(PHP_FUZZER_BINARIES) diff --git a/sapi/fuzzer/fuzzer-mbregex.c b/sapi/fuzzer/fuzzer-mbregex.c new file mode 100644 index 0000000000000..970a7b5baeedb --- /dev/null +++ b/sapi/fuzzer/fuzzer-mbregex.c @@ -0,0 +1,78 @@ +/* + +----------------------------------------------------------------------+ + | Copyright (c) The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | https://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Stanislav Malyshev | + +----------------------------------------------------------------------+ + */ + + +#include "fuzzer.h" + +#include "Zend/zend.h" +#include "main/php_config.h" +#include "main/php_main.h" +#include "oniguruma.h" + +#include +#include +#include + +#include "fuzzer-sapi.h" + +int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { +#ifdef HAVE_MBREGEX + char *args[2]; + char *data = malloc(Size+1); + memcpy(data, Data, Size); + data[Size] = '\0'; + + if (fuzzer_request_startup() == FAILURE) { + return 0; + } + + fuzzer_setup_dummy_frame(); + + args[0] = data; + args[1] = "test123"; + fuzzer_call_php_func("mb_ereg", 2, args); + + args[0] = data; + args[1] = "test123"; + fuzzer_call_php_func("mb_eregi", 2, args); + + args[0] = data; + args[1] = data; + fuzzer_call_php_func("mb_ereg", 2, args); + + args[0] = data; + args[1] = data; + fuzzer_call_php_func("mb_eregi", 2, args); + + fuzzer_request_shutdown(); + + free(data); +#else + fprintf(stderr, "\n\nERROR:\nPHP built without mbstring, recompile with --enable-mbstring to use this fuzzer\n"); + exit(1); +#endif + return 0; +} + +int LLVMFuzzerInitialize(int *argc, char ***argv) { + fuzzer_init_php(NULL); + + /* The default parse depth limit allows stack overflows under asan. */ + onig_set_parse_depth_limit(512); + + /* fuzzer_shutdown_php(); */ + return 0; +} diff --git a/sapi/fuzzer/fuzzer-mbstring.c b/sapi/fuzzer/fuzzer-mbstring.c index 970a7b5baeedb..9294e71dd7a6a 100644 --- a/sapi/fuzzer/fuzzer-mbstring.c +++ b/sapi/fuzzer/fuzzer-mbstring.c @@ -15,64 +15,52 @@ */ +#include "zend.h" #include "fuzzer.h" - -#include "Zend/zend.h" -#include "main/php_config.h" -#include "main/php_main.h" -#include "oniguruma.h" - -#include -#include -#include - #include "fuzzer-sapi.h" +#include "ext/mbstring/mbstring.h" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { -#ifdef HAVE_MBREGEX - char *args[2]; - char *data = malloc(Size+1); - memcpy(data, Data, Size); - data[Size] = '\0'; - - if (fuzzer_request_startup() == FAILURE) { + const uint8_t *Comma1 = memchr(Data, ',', Size); + if (!Comma1) { return 0; } - fuzzer_setup_dummy_frame(); + size_t ToEncodingNameLen = Comma1 - Data; + char *ToEncodingName = estrndup((char *) Data, ToEncodingNameLen); + Data = Comma1 + 1; + Size -= ToEncodingNameLen + 1; + + const uint8_t *Comma2 = memchr(Data, ',', Size); + if (!Comma2) { + efree(ToEncodingName); + return 0; + } - args[0] = data; - args[1] = "test123"; - fuzzer_call_php_func("mb_ereg", 2, args); + size_t FromEncodingNameLen = Comma2 - Data; + char *FromEncodingName = estrndup((char *) Data, FromEncodingNameLen); + Data = Comma2 + 1; + Size -= FromEncodingNameLen + 1; - args[0] = data; - args[1] = "test123"; - fuzzer_call_php_func("mb_eregi", 2, args); + const mbfl_encoding *ToEncoding = mbfl_name2encoding(ToEncodingName); + const mbfl_encoding *FromEncoding = mbfl_name2encoding(FromEncodingName); - args[0] = data; - args[1] = data; - fuzzer_call_php_func("mb_ereg", 2, args); + if (!ToEncoding || !FromEncoding || fuzzer_request_startup() == FAILURE) { + efree(ToEncodingName); + efree(FromEncodingName); + return 0; + } - args[0] = data; - args[1] = data; - fuzzer_call_php_func("mb_eregi", 2, args); + char *Result = php_mb_convert_encoding_ex((char *) Data, Size, ToEncoding, FromEncoding, NULL); + efree(Result); + efree(ToEncodingName); + efree(FromEncodingName); fuzzer_request_shutdown(); - - free(data); -#else - fprintf(stderr, "\n\nERROR:\nPHP built without mbstring, recompile with --enable-mbstring to use this fuzzer\n"); - exit(1); -#endif return 0; } int LLVMFuzzerInitialize(int *argc, char ***argv) { fuzzer_init_php(NULL); - - /* The default parse depth limit allows stack overflows under asan. */ - onig_set_parse_depth_limit(512); - - /* fuzzer_shutdown_php(); */ return 0; } diff --git a/sapi/fuzzer/generate_all.php b/sapi/fuzzer/generate_all.php index 7a81bc94244bb..5794bdacc6baa 100644 --- a/sapi/fuzzer/generate_all.php +++ b/sapi/fuzzer/generate_all.php @@ -1,5 +1,6 @@ Date: Mon, 9 May 2022 09:13:21 +0200 Subject: [PATCH 0502/1346] Add generate_mbstring_dict.php Forgot to git add it previously. --- sapi/fuzzer/generate_mbstring_dict.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 sapi/fuzzer/generate_mbstring_dict.php diff --git a/sapi/fuzzer/generate_mbstring_dict.php b/sapi/fuzzer/generate_mbstring_dict.php new file mode 100644 index 0000000000000..520d8679cb317 --- /dev/null +++ b/sapi/fuzzer/generate_mbstring_dict.php @@ -0,0 +1,12 @@ + Date: Thu, 5 May 2022 15:51:20 +0200 Subject: [PATCH 0503/1346] Add ReflectionFunction::isAnonymous() Closes GH-8499. --- NEWS | 3 +++ UPGRADING | 3 +++ ext/reflection/php_reflection.c | 13 +++++++++++++ ext/reflection/php_reflection.stub.php | 2 ++ ext/reflection/php_reflection_arginfo.h | 6 +++++- .../tests/ReflectionFunction_isAnonymous.phpt | 17 +++++++++++++++++ 6 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 ext/reflection/tests/ReflectionFunction_isAnonymous.phpt diff --git a/NEWS b/NEWS index 83599ce83d0ec..498072b49fc9a 100644 --- a/NEWS +++ b/NEWS @@ -34,6 +34,9 @@ PHP NEWS . Fixed bug #80909 (crash with persistent connections in PDO_ODBC). (Calvin Buckley) +- Reflection: + . Added ReflectionFunction::isAnonymous(). (Nicolas Grekas) + - Sodium: . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) diff --git a/UPGRADING b/UPGRADING index 8e59816b07391..f88965876936e 100644 --- a/UPGRADING +++ b/UPGRADING @@ -138,6 +138,9 @@ PHP 8.2 UPGRADE NOTES 6. New Functions ======================================== +- Reflection: + . ReflectionFunction::isAnonymous() + - Sodium: . sodium_crypto_stream_xchacha20_xor_ic() diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 6fb85154a767a..c3d695b0b0030 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1790,6 +1790,19 @@ ZEND_METHOD(ReflectionFunctionAbstract, isUserDefined) } /* }}} */ +/* {{{ Returns whether this function is an anonymous closure or not */ +ZEND_METHOD(ReflectionFunction, isAnonymous) +{ + reflection_object *intern; + zend_function *fptr; + + ZEND_PARSE_PARAMETERS_NONE(); + + GET_REFLECTION_OBJECT_PTR(fptr); + RETURN_BOOL((fptr->common.fn_flags & (ZEND_ACC_CLOSURE | ZEND_ACC_FAKE_CLOSURE)) == ZEND_ACC_CLOSURE); +} +/* }}} */ + /* {{{ Returns whether this function has been disabled or not */ ZEND_METHOD(ReflectionFunction, isDisabled) { diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php index 8f2ef6ec6f44e..240015f751d28 100644 --- a/ext/reflection/php_reflection.stub.php +++ b/ext/reflection/php_reflection.stub.php @@ -117,6 +117,8 @@ public function __construct(Closure|string $function) {} public function __toString(): string {} + public function isAnonymous(): bool {} + /** * @tentative-return-type * @deprecated ReflectionFunction can no longer be constructed for disabled functions diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index 12b01c4d264fd..92ff5329d5fbc 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: 62fcf63d2f3e93537560c3a03e71fda131a31586 */ + * Stub hash: f06163b02a76ee7fa526e4662f015201e243743d */ 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) @@ -91,6 +91,8 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionFunction___toString, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() +#define arginfo_class_ReflectionFunction_isAnonymous arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType + #define arginfo_class_ReflectionFunction_isDisabled arginfo_class_ReflectionFunctionAbstract_inNamespace ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionFunction_invoke, 0, 0, IS_MIXED, 0) @@ -630,6 +632,7 @@ ZEND_METHOD(ReflectionFunctionAbstract, getTentativeReturnType); ZEND_METHOD(ReflectionFunctionAbstract, getAttributes); ZEND_METHOD(ReflectionFunction, __construct); ZEND_METHOD(ReflectionFunction, __toString); +ZEND_METHOD(ReflectionFunction, isAnonymous); ZEND_METHOD(ReflectionFunction, isDisabled); ZEND_METHOD(ReflectionFunction, invoke); ZEND_METHOD(ReflectionFunction, invokeArgs); @@ -878,6 +881,7 @@ static const zend_function_entry class_ReflectionFunctionAbstract_methods[] = { static const zend_function_entry class_ReflectionFunction_methods[] = { ZEND_ME(ReflectionFunction, __construct, arginfo_class_ReflectionFunction___construct, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionFunction, __toString, arginfo_class_ReflectionFunction___toString, ZEND_ACC_PUBLIC) + ZEND_ME(ReflectionFunction, isAnonymous, arginfo_class_ReflectionFunction_isAnonymous, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionFunction, isDisabled, arginfo_class_ReflectionFunction_isDisabled, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) ZEND_ME(ReflectionFunction, invoke, arginfo_class_ReflectionFunction_invoke, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionFunction, invokeArgs, arginfo_class_ReflectionFunction_invokeArgs, ZEND_ACC_PUBLIC) diff --git a/ext/reflection/tests/ReflectionFunction_isAnonymous.phpt b/ext/reflection/tests/ReflectionFunction_isAnonymous.phpt new file mode 100644 index 0000000000000..004e0b09af0e0 --- /dev/null +++ b/ext/reflection/tests/ReflectionFunction_isAnonymous.phpt @@ -0,0 +1,17 @@ +--TEST-- +ReflectionFunction::isAnonymous +--FILE-- +isAnonymous()); + +$rf = new ReflectionFunction('strlen'); +var_dump($rf->isAnonymous()); + +$rf = new ReflectionFunction(strlen(...)); +var_dump($rf->isAnonymous()); +?> +--EXPECT-- +bool(true) +bool(false) +bool(false) From f590782b60a4da31487e00a3d0accfaf5d406b1d Mon Sep 17 00:00:00 2001 From: Ollie Read Date: Wed, 4 May 2022 13:21:37 +0200 Subject: [PATCH 0504/1346] Add ReflectionMethod::hasPrototype method Closes GH-8487. --- NEWS | 1 + UPGRADING | 1 + ext/reflection/php_reflection.c | 15 ++++++++ ext/reflection/php_reflection.stub.php | 2 ++ ext/reflection/php_reflection_arginfo.h | 6 +++- .../ReflectionMethod_hasPrototype_basic.phpt | 34 +++++++++++++++++++ 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 ext/reflection/tests/ReflectionMethod_hasPrototype_basic.phpt diff --git a/NEWS b/NEWS index 498072b49fc9a..713620b284536 100644 --- a/NEWS +++ b/NEWS @@ -36,6 +36,7 @@ PHP NEWS - Reflection: . Added ReflectionFunction::isAnonymous(). (Nicolas Grekas) + . Added ReflectionMethod::hasPrototype(). (Ollie Read) - Sodium: . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) diff --git a/UPGRADING b/UPGRADING index f88965876936e..215c5edbd85c5 100644 --- a/UPGRADING +++ b/UPGRADING @@ -140,6 +140,7 @@ PHP 8.2 UPGRADE NOTES - Reflection: . ReflectionFunction::isAnonymous() + . ReflectionMethod::hasPrototype() - Sodium: . sodium_crypto_stream_xchacha20_xor_ic() diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index c3d695b0b0030..5ca89f0d2a742 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3667,6 +3667,21 @@ ZEND_METHOD(ReflectionMethod, getDeclaringClass) } /* }}} */ +/* {{{ Returns whether a method has a prototype or not */ +ZEND_METHOD(ReflectionMethod, hasPrototype) +{ + reflection_object *intern; + zend_function *mptr; + + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + + GET_REFLECTION_OBJECT_PTR(mptr); + RETURN_BOOL(mptr->common.prototype != NULL); +} +/* }}} */ + /* {{{ Get the prototype */ ZEND_METHOD(ReflectionMethod, getPrototype) { diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php index 240015f751d28..22d01b6905168 100644 --- a/ext/reflection/php_reflection.stub.php +++ b/ext/reflection/php_reflection.stub.php @@ -206,6 +206,8 @@ public function getDeclaringClass(): ReflectionClass {} /** @tentative-return-type */ public function getPrototype(): ReflectionMethod {} + public function hasPrototype(): bool {} + /** @tentative-return-type */ public function setAccessible(bool $accessible): void {} } diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h index 92ff5329d5fbc..25a750f2bdcac 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: f06163b02a76ee7fa526e4662f015201e243743d */ + * Stub hash: c9656b23db965e890e73d0064005b981ee1991cf */ 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) @@ -169,6 +169,8 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionMethod_getPrototype, 0, 0, ReflectionMethod, 0) ZEND_END_ARG_INFO() +#define arginfo_class_ReflectionMethod_hasPrototype arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType + ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionMethod_setAccessible, 0, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, accessible, _IS_BOOL, 0) ZEND_END_ARG_INFO() @@ -659,6 +661,7 @@ ZEND_METHOD(ReflectionMethod, invoke); ZEND_METHOD(ReflectionMethod, invokeArgs); ZEND_METHOD(ReflectionMethod, getDeclaringClass); ZEND_METHOD(ReflectionMethod, getPrototype); +ZEND_METHOD(ReflectionMethod, hasPrototype); ZEND_METHOD(ReflectionMethod, setAccessible); ZEND_METHOD(ReflectionClass, __construct); ZEND_METHOD(ReflectionClass, __toString); @@ -918,6 +921,7 @@ static const zend_function_entry class_ReflectionMethod_methods[] = { ZEND_ME(ReflectionMethod, invokeArgs, arginfo_class_ReflectionMethod_invokeArgs, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionMethod, getDeclaringClass, arginfo_class_ReflectionMethod_getDeclaringClass, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionMethod, getPrototype, arginfo_class_ReflectionMethod_getPrototype, ZEND_ACC_PUBLIC) + ZEND_ME(ReflectionMethod, hasPrototype, arginfo_class_ReflectionMethod_hasPrototype, ZEND_ACC_PUBLIC) ZEND_ME(ReflectionMethod, setAccessible, arginfo_class_ReflectionMethod_setAccessible, ZEND_ACC_PUBLIC) ZEND_FE_END }; diff --git a/ext/reflection/tests/ReflectionMethod_hasPrototype_basic.phpt b/ext/reflection/tests/ReflectionMethod_hasPrototype_basic.phpt new file mode 100644 index 0000000000000..d94c8962e11b3 --- /dev/null +++ b/ext/reflection/tests/ReflectionMethod_hasPrototype_basic.phpt @@ -0,0 +1,34 @@ +--TEST-- +public ReflectionMethod ReflectionMethod::hasPrototype ( void ); +--FILE-- +hasPrototype()); + +$reflectionMethod2 = new ReflectionMethod('Hello', 'sayHelloTo'); +var_dump($reflectionMethod2->hasPrototype()); + +$reflectionMethod3 = new ReflectionMethod('HelloWorld', 'sayHiTo'); +var_dump($reflectionMethod3->hasPrototype()); + +?> +--EXPECT-- +bool(true) +bool(false) +bool(false) From 9601475ebb85b959d51eaddd2f545794f172ff96 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 9 May 2022 22:29:16 +0100 Subject: [PATCH 0505/1346] Minimal refactoring of CLI SAPI (#8519) More specific types, some cleanup and voidifying functions which always return ``SUCCESS`` --- sapi/cli/php_cli.c | 16 +-- sapi/cli/php_cli_server.c | 203 +++++++++++++++++++------------------- 2 files changed, 110 insertions(+), 109 deletions(-) diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 5a161fcb23c40..66a1b9ad86b09 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -234,7 +234,7 @@ static void print_extensions(void) /* {{{ */ #define STDERR_FILENO 2 #endif -static inline int sapi_cli_select(php_socket_t fd) +static inline bool sapi_cli_select(php_socket_t fd) { fd_set wfd; struct timeval tv; @@ -572,7 +572,7 @@ static void cli_register_file_handles(bool no_close) /* {{{ */ static const char *param_mode_conflict = "Either execute direct code, process stdin or use a file.\n"; /* {{{ cli_seek_file_begin */ -static int cli_seek_file_begin(zend_file_handle *file_handle, char *script_file) +static zend_result cli_seek_file_begin(zend_file_handle *file_handle, char *script_file) { FILE *fp = VCWD_FOPEN(script_file, "rb"); if (!fp) { @@ -609,9 +609,9 @@ static int do_cli(int argc, char **argv) /* {{{ */ char *exec_direct=NULL, *exec_run=NULL, *exec_begin=NULL, *exec_end=NULL; char *arg_free=NULL, **arg_excp=&arg_free; char *script_file=NULL, *translated_path = NULL; - int interactive=0; + bool interactive = false; const char *param_error=NULL; - int hide_argv = 0; + bool hide_argv = false; int num_repeats = 1; pid_t pid = getpid(); @@ -698,7 +698,7 @@ static int do_cli(int argc, char **argv) /* {{{ */ break; } - interactive=1; + interactive = true; } break; @@ -818,7 +818,7 @@ static int do_cli(int argc, char **argv) /* {{{ */ zend_load_extension(php_optarg); break; case 'H': - hide_argv = 1; + hide_argv = true; break; case 10: behavior=PHP_MODE_REFLECTION_FUNCTION; @@ -894,7 +894,7 @@ static int do_cli(int argc, char **argv) /* {{{ */ } if (script_file) { virtual_cwd_activate(); - if (cli_seek_file_begin(&file_handle, script_file) != SUCCESS) { + if (cli_seek_file_begin(&file_handle, script_file) == FAILURE) { goto err; } else { char real_path[MAXPATHLEN]; @@ -1022,7 +1022,7 @@ static int do_cli(int argc, char **argv) /* {{{ */ zend_eval_string_ex(exec_run, NULL, "Command line run code", 1); } else { if (script_file) { - if (cli_seek_file_begin(&file_handle, script_file) != SUCCESS) { + if (cli_seek_file_begin(&file_handle, script_file) == FAILURE) { EG(exit_status) = 1; } else { CG(skip_shebang) = 1; diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 7a8ec7918e233..8b7b62a7154d9 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -241,23 +241,23 @@ static const char php_cli_server_css[] = " -

Not Found

The requested resource /main/foo/bar was not found on this server.

From 7065a222b777098fedc3e529f864e994966c5688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vedran=20Mileti=C4=87?= Date: Sun, 20 Mar 2022 22:53:51 +0100 Subject: [PATCH 1186/1346] Respond with HTTP status 405 to DELETE/PUT/PATCH request on a static resource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marin Martuslović --- sapi/cli/php_cli_server.c | 16 +++++ sapi/cli/tests/php_cli_server_013.phpt | 86 ++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 42bd36c492338..66e31323947c4 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -202,6 +202,7 @@ typedef struct php_cli_server_http_response_status_code_pair { static php_cli_server_http_response_status_code_pair template_map[] = { { 400, "

%s

Your browser sent a request that this server could not understand.

" }, { 404, "

%s

The requested resource %s was not found on this server.

" }, + { 405, "

%s

Requested method not allowed.

" }, { 500, "

%s

The server is temporarily unavailable.

" }, { 501, "

%s

Request method not supported.

" } }; @@ -2040,6 +2041,15 @@ static zend_result php_cli_server_send_error_page(php_cli_server *server, php_cl smart_str_appends_ex(&buffer, "Content-Length: ", 1); smart_str_append_unsigned_ex(&buffer, php_cli_server_buffer_size(&client->content_sender.buffer), 1); smart_str_appendl_ex(&buffer, "\r\n", 2, 1); + if (status == 405) { + smart_str_appends_ex(&buffer, "Allow: ", 1); + smart_str_appends_ex(&buffer, php_http_method_str(PHP_HTTP_GET), 1); + smart_str_appends_ex(&buffer, ", ", 1); + smart_str_appends_ex(&buffer, php_http_method_str(PHP_HTTP_HEAD), 1); + smart_str_appends_ex(&buffer, ", ", 1); + smart_str_appends_ex(&buffer, php_http_method_str(PHP_HTTP_POST), 1); + smart_str_appendl_ex(&buffer, "\r\n", 2, 1); + } smart_str_appendl_ex(&buffer, "\r\n", 2, 1); chunk = php_cli_server_chunk_heap_new(buffer.s, ZSTR_VAL(buffer.s), ZSTR_LEN(buffer.s)); @@ -2094,6 +2104,12 @@ static zend_result php_cli_server_begin_send_static(php_cli_server *server, php_ int fd; int status = 200; + if (client->request.request_method == PHP_HTTP_DELETE + || client->request.request_method == PHP_HTTP_PUT + || client->request.request_method == PHP_HTTP_PATCH) { + return php_cli_server_send_error_page(server, client, 405); + } + if (client->request.path_translated && strlen(client->request.path_translated) != client->request.path_translated_len) { /* can't handle paths that contain nul bytes */ return php_cli_server_send_error_page(server, client, 400); diff --git a/sapi/cli/tests/php_cli_server_013.phpt b/sapi/cli/tests/php_cli_server_013.phpt index 06a982b407c4a..11e3fdf065b1f 100644 --- a/sapi/cli/tests/php_cli_server_013.phpt +++ b/sapi/cli/tests/php_cli_server_013.phpt @@ -58,6 +58,60 @@ HEAD /main/foo/bar HTTP/1.1 Host: {$host} +HEADER +)) { + while (!feof($fp)) { + $output .= fgets($fp); + } +} + +echo preg_replace("/", $output), "\n"; +fclose($fp); + +$output = ''; +$fp = php_cli_server_connect(); + +if(fwrite($fp, <<
(.*?)<\/style>/s", "", $output), "\n"; +fclose($fp); + +$output = ''; +$fp = php_cli_server_connect(); + +if(fwrite($fp, <<
(.*?)<\/style>/s", "", $output), "\n"; +fclose($fp); + +$output = ''; +$fp = php_cli_server_connect(); + +if(fwrite($fp, <<
405 Method Not Allowed +

Method Not Allowed

Requested method not allowed.

+HTTP/1.1 405 Method Not Allowed +Host: %s +Date: %s +Connection: close +Content-Type: text/html; charset=UTF-8 +Content-Length: %d +Allow: GET, HEAD, POST + +405 Method Not Allowed +

Method Not Allowed

Requested method not allowed.

+HTTP/1.1 405 Method Not Allowed +Host: %s +Date: %s +Connection: close +Content-Type: text/html; charset=UTF-8 +Content-Length: %d +Allow: GET, HEAD, POST + +405 Method Not Allowed +

Method Not Allowed

Requested method not allowed.

From 5e9af0d0b07f5c980be7089a1ae23d23388fb3d4 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sun, 28 Aug 2022 13:32:03 +0100 Subject: [PATCH 1187/1346] Update NEWS for CLI built-in server changes --- NEWS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NEWS b/NEWS index 9e7596f70ced8..448071e3e158d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,13 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC1 +- CLI: + . Implement built-in web server responding without body to HEAD requst on + a static resource. (Vedran Miletic, Marin Martuslovic) + . Implement built-in web server responding with HTTP status 405 to + DELETE/PUT/PATCH request on a static resource. + (Vedran Miletic, Marin Martuslovic) + - Core: . Fixed bug GH-9323 (Crash in ZEND_RETURN/GC/zend_call_function) (Tim Starling) From 386a044748a3b082783a7a6fec95ebbfdd67853b Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 28 Aug 2022 14:41:44 +0200 Subject: [PATCH 1188/1346] =?UTF-8?q?[ci=20skip]=20Fix=20typo=20(requst=20?= =?UTF-8?q?=E2=86=92=20request)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes GH-9443. --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 448071e3e158d..8c63e1a341b89 100644 --- a/NEWS +++ b/NEWS @@ -3,7 +3,7 @@ PHP NEWS ?? ??? ????, PHP 8.2.0RC1 - CLI: - . Implement built-in web server responding without body to HEAD requst on + . Implement built-in web server responding without body to HEAD request on a static resource. (Vedran Miletic, Marin Martuslovic) . Implement built-in web server responding with HTTP status 405 to DELETE/PUT/PATCH request on a static resource. From 335979fe1b9019d3caa4f1a949077c2d804dd9a5 Mon Sep 17 00:00:00 2001 From: Mikhail Galanin Date: Fri, 26 Aug 2022 14:15:49 +0100 Subject: [PATCH 1189/1346] Add a bit verbosity in FPM logs --- sapi/fpm/fpm/fpm_stdio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c index e920923b009bc..d51e1312ee3d2 100644 --- a/sapi/fpm/fpm/fpm_stdio.c +++ b/sapi/fpm/fpm/fpm_stdio.c @@ -218,7 +218,7 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg) zlog_stream_finish(log_stream); } if (read_fail < 0) { - zlog(ZLOG_SYSERROR, "unable to read what child say"); + zlog(ZLOG_SYSERROR, "unable to read what child %d said into %s", (int) child->pid, is_stdout ? "stdout" : "stderr"); } fpm_event_del(event); From 8fe1db208923f719f546f6bad95006ca8dee86cc Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 26 Aug 2022 16:08:06 +0200 Subject: [PATCH 1190/1346] Delay fiber VM stack cleanup until after observer has been called Signed-off-by: Bob Weinand --- Zend/zend_fibers.c | 25 ++++++++++++++++++++----- Zend/zend_fibers.h | 7 +++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Zend/zend_fibers.c b/Zend/zend_fibers.c index 80a70d87f6f28..0bb45d1c3dc9c 100644 --- a/Zend/zend_fibers.c +++ b/Zend/zend_fibers.c @@ -360,6 +360,10 @@ ZEND_API void zend_fiber_destroy_context(zend_fiber_context *context) { zend_observer_fiber_destroy_notify(context); + if (context->cleanup) { + context->cleanup(context); + } + zend_fiber_stack_free(context->stack); } @@ -441,6 +445,19 @@ ZEND_API void zend_fiber_switch_context(zend_fiber_transfer *transfer) } } +static void zend_fiber_cleanup(zend_fiber_context *context) +{ + zend_fiber *fiber = zend_fiber_from_context(context); + + zend_vm_stack current_stack = EG(vm_stack); + EG(vm_stack) = fiber->vm_stack; + zend_vm_stack_destroy(); + EG(vm_stack) = current_stack; + fiber->execute_data = NULL; + fiber->stack_bottom = NULL; + fiber->caller = NULL; +} + static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer) { ZEND_ASSERT(Z_TYPE(transfer->value) == IS_NULL && "Initial transfer value to fiber context must be NULL"); @@ -501,12 +518,10 @@ static ZEND_STACK_ALIGNED void zend_fiber_execute(zend_fiber_transfer *transfer) transfer->flags = ZEND_FIBER_TRANSFER_FLAG_BAILOUT; } zend_end_try(); - transfer->context = fiber->caller; + fiber->context.cleanup = &zend_fiber_cleanup; + fiber->vm_stack = EG(vm_stack); - zend_vm_stack_destroy(); - fiber->execute_data = NULL; - fiber->stack_bottom = NULL; - fiber->caller = NULL; + transfer->context = fiber->caller; } /* Handles forwarding of result / error from a transfer into the running fiber. */ diff --git a/Zend/zend_fibers.h b/Zend/zend_fibers.h index aefe2e53be6c5..2673e7814b093 100644 --- a/Zend/zend_fibers.h +++ b/Zend/zend_fibers.h @@ -71,6 +71,7 @@ typedef struct _zend_fiber_transfer { /* Coroutine functions must populate the given transfer with a new context * and (optional) data before they return. */ typedef void (*zend_fiber_coroutine)(zend_fiber_transfer *transfer); +typedef void (*zend_fiber_clean)(zend_fiber_context *context); struct _zend_fiber_context { /* Pointer to boost.context or ucontext_t data. */ @@ -82,6 +83,9 @@ struct _zend_fiber_context { /* Entrypoint function of the fiber. */ zend_fiber_coroutine function; + /* Cleanup function for fiber. */ + zend_fiber_clean cleanup; + /* Assigned C stack. */ zend_fiber_stack *stack; @@ -121,6 +125,9 @@ struct _zend_fiber { /* Frame on the bottom of the fiber vm stack. */ zend_execute_data *stack_bottom; + /* Active fiber vm stack. */ + zend_vm_stack vm_stack; + /* Storage for fiber return value. */ zval result; }; From 4b884bedc8de35ceb90d3e6978be580d5ce89864 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 29 Aug 2022 14:36:16 +0300 Subject: [PATCH 1191/1346] JIT: Fix missing type store Fixes oss-fuzz #50653 --- ext/opcache/jit/zend_jit_trace.c | 2 +- ext/opcache/tests/jit/assign_054.phpt | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/jit/assign_054.phpt diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index f89d6f8a40d4d..075acf5e6f862 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6377,7 +6377,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par } SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->op2.var), type, (gen_handler || type == IS_UNKNOWN || !ra || - (!ra[ssa_op->op2_def] && !ssa->vars[ssa_op->op2_def].no_val))); + (!ra[ssa_op->op2_def] /*&& !ssa->vars[ssa_op->op2_def].no_val*/))); if (type != IS_UNKNOWN) { ssa->var_info[ssa_op->op2_def].type &= ~MAY_BE_GUARD; if (ra && ra[ssa_op->op2_def]) { diff --git a/ext/opcache/tests/jit/assign_054.phpt b/ext/opcache/tests/jit/assign_054.phpt new file mode 100644 index 0000000000000..a4c4706b7cefd --- /dev/null +++ b/ext/opcache/tests/jit/assign_054.phpt @@ -0,0 +1,24 @@ +--TEST-- +JIT ASSIGN: missing type store +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- + +DONE +--EXPECT-- +DONE From 932586c426d7f016e5d0e0d95579f9503ec70a89 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Mon, 29 Aug 2022 14:33:41 +0100 Subject: [PATCH 1192/1346] Fixed bug GH-9431: DateTime::getLastErrors() not returning false when no errors/warnings For PHP 8.2 and later only. --- NEWS | 4 ++++ ext/date/php_date.c | 6 +++++- ext/date/tests/bug51866.phpt | 26 ++----------------------- ext/date/tests/date-lenient-create.phpt | 26 ------------------------- 4 files changed, 11 insertions(+), 51 deletions(-) diff --git a/NEWS b/NEWS index 8c63e1a341b89..9e988f903a5a1 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,10 @@ PHP NEWS . Fixed bug GH-9285 (Traits cannot be used in readonly classes). (kocsismate) +- Date: + . Fixed bug GH-9431 (DateTime::getLastErrors() not returning false when no + errors/warnings). (Derick) + - Opcache: . Fixed bug GH-9371 (Crash with JIT on mac arm64) (jdp1024/David Carlier) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 869349fd808fa..229d9890251e6 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2269,7 +2269,11 @@ static void update_errors_warnings(timelib_error_container *last_errors) /* {{{ timelib_error_container_dtor(DATEG(last_errors)); DATEG(last_errors) = NULL; } - DATEG(last_errors) = last_errors; + if (last_errors->warning_count || last_errors->error_count) { + DATEG(last_errors) = last_errors; + } else { + timelib_error_container_dtor(last_errors); + } } /* }}} */ static void php_date_set_time_fraction(timelib_time *time, int microseconds) diff --git a/ext/date/tests/bug51866.phpt b/ext/date/tests/bug51866.phpt index 921a9392932f7..c73f6b0cb9e8d 100644 --- a/ext/date/tests/bug51866.phpt +++ b/ext/date/tests/bug51866.phpt @@ -105,18 +105,7 @@ object(DateTime)#%d (3) { ["timezone"]=> string(%d) "%s" } -array(4) { - ["warning_count"]=> - int(0) - ["warnings"]=> - array(0) { - } - ["error_count"]=> - int(0) - ["errors"]=> - array(0) { - } -} +bool(false) string(7) "Y-m-d +" @@ -148,15 +137,4 @@ object(DateTime)#%d (3) { ["timezone"]=> string(%d) "%s" } -array(4) { - ["warning_count"]=> - int(0) - ["warnings"]=> - array(0) { - } - ["error_count"]=> - int(0) - ["errors"]=> - array(0) { - } -} +bool(false) diff --git a/ext/date/tests/date-lenient-create.phpt b/ext/date/tests/date-lenient-create.phpt index 2d59ceba79c87..0168238a96d8b 100644 --- a/ext/date/tests/date-lenient-create.phpt +++ b/ext/date/tests/date-lenient-create.phpt @@ -113,19 +113,6 @@ DateTime Object [timezone_type] => 3 [timezone] => UTC ) -Array -( - [warning_count] => 0 - [warnings] => Array - ( - ) - - [error_count] => 0 - [errors] => Array - ( - ) - -) == DateTime Object ( @@ -133,17 +120,4 @@ DateTime Object [timezone_type] => 3 [timezone] => UTC ) -Array -( - [warning_count] => 0 - [warnings] => Array - ( - ) - - [error_count] => 0 - [errors] => Array - ( - ) - -) == From f3a14d1b1ad6cd60570b264f913536c4b28bc10f Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Tue, 23 Aug 2022 19:11:28 +0200 Subject: [PATCH 1193/1346] Fix GH-9347: Current ODBC liveness checks may be inadequate We implement SQL_ATTR_CONNECTION_DEAD for ODBC and PDO_ODBC. This is semantically appropriate and should be used whenever the driver supports it. In the event that it fails or says the connection isn't dead (which may be inaccurate in some cases), try the old heuristic. Closes GH-9353. --- NEWS | 8 ++++++++ ext/odbc/php_odbc.c | 13 +++++++++++++ ext/pdo_odbc/odbc_driver.c | 12 ++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 9e988f903a5a1..d499246c542a3 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,10 @@ PHP NEWS . Fixed bug GH-9431 (DateTime::getLastErrors() not returning false when no errors/warnings). (Derick) +- ODBC: + . Fixed bug GH-9347 (Current ODBC liveness checks may be inadequate). (Calvin + Buckley) + - Opcache: . Fixed bug GH-9371 (Crash with JIT on mac arm64) (jdp1024/David Carlier) @@ -32,6 +36,10 @@ PHP NEWS AEAD). (Jakub Zelenka) . Added openssl_cipher_key_length function. (Jakub Zelenka) +- PDO_ODBC: + . Fixed bug GH-9347 (Current ODBC liveness checks may be inadequate). (Calvin + Buckley) + - Random: . Fixed bug GH-9415 (Randomizer::getInt(0, 2**32 - 1) with Mt19937 always returns 1). (timwolla) diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 3a821a35ea38c..5e0945e0a43de 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -2246,7 +2246,20 @@ void odbc_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) RETCODE ret; UCHAR d_name[32]; SQLSMALLINT len; + SQLUINTEGER dead = SQL_CD_FALSE; + ret = SQLGetConnectAttr(db_conn->hdbc, + SQL_ATTR_CONNECTION_DEAD, + &dead, 0, NULL); + if (ret == SQL_SUCCESS && dead == SQL_CD_TRUE) { + /* Bail early here, since we know it's gone */ + zend_hash_str_del(&EG(persistent_list), hashed_details, hashed_len); + goto try_and_get_another_connection; + } + /* If the driver doesn't support it, or returns + * false (could be a false positive), fall back + * to the old heuristic. + */ ret = SQLGetInfo(db_conn->hdbc, SQL_DATA_SOURCE_READ_ONLY, d_name, sizeof(d_name), &len); diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c index 308cf7e10c94d..661cab3c04f8c 100644 --- a/ext/pdo_odbc/odbc_driver.c +++ b/ext/pdo_odbc/odbc_driver.c @@ -396,11 +396,19 @@ static zend_result odbc_handle_check_liveness(pdo_dbh_t *dbh) RETCODE ret; UCHAR d_name[32]; SQLSMALLINT len; + SQLUINTEGER dead = SQL_CD_FALSE; pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data; + ret = SQLGetConnectAttr(H->dbc, SQL_ATTR_CONNECTION_DEAD, &dead, 0, NULL); + if (ret == SQL_SUCCESS && dead == SQL_CD_TRUE) { + /* Bail early here, since we know it's gone */ + return FAILURE; + } /* - * SQL_ATTR_CONNECTION_DEAD is tempting, but only in ODBC 3.5, - * and not all drivers implement it properly + * If the driver doesn't support SQL_ATTR_CONNECTION_DEAD, or if + * it returns false (which could be a false positive), fall back + * to using SQL_DATA_SOURCE_READ_ONLY, which isn't semantically + * correct, but works with many drivers. */ ret = SQLGetInfo(H->dbc, SQL_DATA_SOURCE_READ_ONLY, d_name, sizeof(d_name), &len); From e3034dba3e7fd1cd571e2f49336d245e6fd554af Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Mon, 29 Aug 2022 22:44:53 +0100 Subject: [PATCH 1194/1346] Fix FPM tester conflict --- sapi/fpm/tests/tester.inc | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc index 8f2e9f7b1899b..71bafcb3bb607 100644 --- a/sapi/fpm/tests/tester.inc +++ b/sapi/fpm/tests/tester.inc @@ -619,12 +619,9 @@ class Tester string $errorMessage = null, bool $connKeepAlive = false, string $scriptFilename = null, -<<<<<<< HEAD - string $stdin = null -======= + string $stdin = null, bool $expectError = false, int $readLimit = -1, ->>>>>>> PHP-8.1 ) { if ($this->hasError()) { return new Response(null, true); @@ -634,11 +631,7 @@ class Tester try { $this->response = new Response( -<<<<<<< HEAD - $this->getClient($address, $connKeepAlive)->request_data($params, $stdin) -======= - $this->getClient($address, $connKeepAlive)->request_data($params, false, $readLimit) ->>>>>>> PHP-8.1 + $this->getClient($address, $connKeepAlive)->request_data($params, $stdin, $readLimit) ); if ($expectError) { $this->error('Expected request error but the request was successful'); From f7d42f646baf0f77bde4ed52aed3efb9b0ebc11a Mon Sep 17 00:00:00 2001 From: Andreas Braun Date: Tue, 23 Aug 2022 13:46:44 +0200 Subject: [PATCH 1195/1346] Update gen_stub to avoid compile errors on duplicate function names Closes GH-9406 --- UPGRADING.INTERNALS | 5 ++++ build/gen_stub.php | 49 ++++++++++++++++++++---------------- ext/zend_test/test.c | 38 +++++++++++++++++++++++++++- ext/zend_test/test.stub.php | 35 ++++++++++++++++++++++++++ ext/zend_test/test_arginfo.h | 44 ++++++++++++++++++++++++++++---- 5 files changed, 144 insertions(+), 27 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 8d39d01e3453b..6b5fe08f7e5dd 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -63,6 +63,11 @@ PHP 8.2 INTERNALS UPGRADE NOTES ======================== * Unsupported libxml2 2.10.0 symbols are no longer exported on Windows. +* Identifier names for namespaced functions generated from stub files through + gen_stub.php have been changed. This requires that namespaced functions + should be declared via the PHP_FUNCTION macro by using the fully qualified + function name (whereas each part is separated by "_") instead of just the + function name itself. ======================== 3. Module changes diff --git a/build/gen_stub.php b/build/gen_stub.php index 1aadd2cdda216..6b1556d735196 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1037,6 +1037,10 @@ public function getNonNamespacedName(): string { } public function getDeclarationName(): string { + return implode('_', $this->name->parts); + } + + public function getFunctionName(): string { return $this->name->getLast(); } @@ -1380,39 +1384,42 @@ public function getFunctionEntry(): string { } } else if ($this->name instanceof FunctionName) { $namespace = $this->name->getNamespace(); - $declarationName = $this->name->getDeclarationName(); + $functionName = $this->name->getFunctionName(); + $declarationName = $this->alias ? $this->alias->getNonNamespacedName() : $this->name->getDeclarationName(); + + if ($namespace) { + // Namespaced functions are always declared as aliases to avoid name conflicts when two functions with + // the same name exist in separate namespaces + $macro = $this->isDeprecated ? 'ZEND_NS_DEP_FALIAS' : 'ZEND_NS_FALIAS'; - if ($this->alias && $this->isDeprecated) { + // Render A\B as "A\\B" in C strings for namespaces return sprintf( - "\tZEND_DEP_FALIAS(%s, %s, %s)\n", - $declarationName, $this->alias->getNonNamespacedName(), $this->getArgInfoName() + "\t%s(\"%s\", %s, %s, %s)\n", + $macro, addslashes($namespace), $this->name->getFunctionName(), $declarationName, $this->getArgInfoName() ); } if ($this->alias) { + $macro = $this->isDeprecated ? 'ZEND_DEP_FALIAS' : 'ZEND_FALIAS'; + return sprintf( - "\tZEND_FALIAS(%s, %s, %s)\n", - $declarationName, $this->alias->getNonNamespacedName(), $this->getArgInfoName() + "\t%s(%s, %s, %s)\n", + $macro, $functionName, $declarationName, $this->getArgInfoName() ); } - if ($this->isDeprecated) { - return sprintf( - "\tZEND_DEP_FE(%s, %s)\n", $declarationName, $this->getArgInfoName()); + switch (true) { + case $this->isDeprecated: + $macro = 'ZEND_DEP_FE'; + break; + case $this->supportsCompileTimeEval: + $macro = 'ZEND_SUPPORTS_COMPILE_TIME_EVAL_FE'; + break; + default: + $macro = 'ZEND_FE'; } - if ($namespace) { - // Render A\B as "A\\B" in C strings for namespaces - return sprintf( - "\tZEND_NS_FE(\"%s\", %s, %s)\n", - addslashes($namespace), $declarationName, $this->getArgInfoName()); - } else { - if ($this->supportsCompileTimeEval) { - return sprintf( - "\tZEND_SUPPORTS_COMPILE_TIME_EVAL_FE(%s, %s)\n", $declarationName, $this->getArgInfoName()); - } - return sprintf("\tZEND_FE(%s, %s)\n", $declarationName, $this->getArgInfoName()); - } + return sprintf("\t%s(%s, %s)\n", $macro, $functionName, $this->getArgInfoName()); } else { throw new Error("Cannot happen"); } diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 9852887ef74b1..815bc9cfc7b5d 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -95,6 +95,16 @@ static ZEND_FUNCTION(zend_test_deprecated) zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &arg1); } +static ZEND_FUNCTION(zend_test_alias) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + +static ZEND_FUNCTION(zend_test_deprecated_alias) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + /* Create a string without terminating null byte. Must be terminated with * zend_terminate_string() before destruction, otherwise a warning is issued * in debug builds. */ @@ -415,12 +425,38 @@ static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity) } } -static ZEND_FUNCTION(namespaced_func) +static ZEND_FUNCTION(ZendTestNS2_namespaced_func) { ZEND_PARSE_PARAMETERS_NONE(); RETURN_TRUE; } +static ZEND_FUNCTION(ZendTestNS2_namespaced_deprecated_func) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + +static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_func) +{ + ZEND_PARSE_PARAMETERS_NONE(); + RETURN_TRUE; +} + +static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_deprecated_func) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + +static ZEND_FUNCTION(namespaced_alias_func) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + +static ZEND_FUNCTION(namespaced_deprecated_alias_func) +{ + ZEND_PARSE_PARAMETERS_NONE(); +} + static ZEND_FUNCTION(zend_test_parameter_with_attribute) { zend_string *parameter; diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 45bbaedfc32ca..cc8f5249ef16f 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -109,6 +109,15 @@ function zend_test_compile_string(string $source_string, string $filename, int $ /** @deprecated */ function zend_test_deprecated(mixed $arg = null): void {} + /** @alias zend_test_alias */ + function zend_test_aliased(): void {} + + /** + * @deprecated + * @alias zend_test_deprecated_alias + */ + function zend_test_deprecated_aliased(): void {} + function zend_create_unterminated_string(string $str): string {} function zend_terminate_string(string &$str): void {} @@ -168,6 +177,20 @@ class Foo { public function method(): void {} } + function namespaced_func(): bool {} + + /** @deprecated */ + function namespaced_deprecated_func(): void {} + + /** @alias namespaced_alias_func */ + function namespaced_aliased_func(): void {} + + /** + * @deprecated + * @alias namespaced_deprecated_alias_func + */ + function namespaced_deprecated_aliased_func(): void {} + } namespace ZendTestNS2\ZendSubNS { @@ -178,4 +201,16 @@ public function method(): void {} function namespaced_func(): bool {} + /** @deprecated */ + function namespaced_deprecated_func(): void {} + + /** @alias namespaced_alias_func */ + function namespaced_aliased_func(): void {} + + /** + * @deprecated + * @alias namespaced_deprecated_alias_func + */ + function namespaced_deprecated_aliased_func(): void {} + } diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index d3f4fe77f2b75..f393d77797897 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: daa7be53e9009c66c814fb5b0407a6dfbe09679a */ + * Stub hash: 0c3e4da20bf5b32e289a795e0beac649294e83f3 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -20,6 +20,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_deprecated, 0, 0, IS_V ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arg, IS_MIXED, 0, "null") ZEND_END_ARG_INFO() +#define arginfo_zend_test_aliased arginfo_zend_test_void_return + +#define arginfo_zend_test_deprecated_aliased arginfo_zend_test_void_return + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_create_unterminated_string, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, str, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -91,9 +95,23 @@ ZEND_END_ARG_INFO() #define arginfo_zend_test_zend_ini_parse_uquantity arginfo_zend_test_zend_ini_parse_quantity -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ZendTestNS2_ZendSubNS_namespaced_func, 0, 0, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ZendTestNS2_namespaced_func, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() +#define arginfo_ZendTestNS2_namespaced_deprecated_func arginfo_zend_test_void_return + +#define arginfo_ZendTestNS2_namespaced_aliased_func arginfo_zend_test_void_return + +#define arginfo_ZendTestNS2_namespaced_deprecated_aliased_func arginfo_zend_test_void_return + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_func arginfo_ZendTestNS2_namespaced_func + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_func arginfo_zend_test_void_return + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func arginfo_zend_test_void_return + +#define arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func arginfo_zend_test_void_return + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class__ZendTestClass_is_object, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -108,7 +126,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class__ZendTestChildClass_returnsThrowable, 0, 0, Exception, 0) ZEND_END_ARG_INFO() -#define arginfo_class__ZendTestTrait_testMethod arginfo_ZendTestNS2_ZendSubNS_namespaced_func +#define arginfo_class__ZendTestTrait_testMethod arginfo_ZendTestNS2_namespaced_func ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZendTestParameterAttribute___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, parameter, IS_STRING, 0) @@ -144,6 +162,8 @@ static ZEND_FUNCTION(zend_test_nullable_array_return); static ZEND_FUNCTION(zend_test_void_return); static ZEND_FUNCTION(zend_test_compile_string); static ZEND_FUNCTION(zend_test_deprecated); +static ZEND_FUNCTION(zend_test_alias); +static ZEND_FUNCTION(zend_test_deprecated_alias); static ZEND_FUNCTION(zend_create_unterminated_string); static ZEND_FUNCTION(zend_terminate_string); static ZEND_FUNCTION(zend_leak_variable); @@ -162,7 +182,12 @@ static ZEND_FUNCTION(zend_get_current_func_name); static ZEND_FUNCTION(zend_call_method); static ZEND_FUNCTION(zend_test_zend_ini_parse_quantity); static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity); -static ZEND_FUNCTION(namespaced_func); +static ZEND_FUNCTION(ZendTestNS2_namespaced_func); +static ZEND_FUNCTION(ZendTestNS2_namespaced_deprecated_func); +static ZEND_FUNCTION(namespaced_alias_func); +static ZEND_FUNCTION(namespaced_deprecated_alias_func); +static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_func); +static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_deprecated_func); static ZEND_METHOD(_ZendTestClass, is_object); static ZEND_METHOD(_ZendTestClass, __toString); static ZEND_METHOD(_ZendTestClass, returnsStatic); @@ -187,6 +212,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_test_void_return, arginfo_zend_test_void_return) ZEND_FE(zend_test_compile_string, arginfo_zend_test_compile_string) ZEND_DEP_FE(zend_test_deprecated, arginfo_zend_test_deprecated) + ZEND_FALIAS(zend_test_aliased, zend_test_alias, arginfo_zend_test_aliased) + ZEND_DEP_FALIAS(zend_test_deprecated_aliased, zend_test_deprecated_alias, arginfo_zend_test_deprecated_aliased) ZEND_FE(zend_create_unterminated_string, arginfo_zend_create_unterminated_string) ZEND_FE(zend_terminate_string, arginfo_zend_terminate_string) ZEND_FE(zend_leak_variable, arginfo_zend_leak_variable) @@ -205,7 +232,14 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_call_method, arginfo_zend_call_method) ZEND_FE(zend_test_zend_ini_parse_quantity, arginfo_zend_test_zend_ini_parse_quantity) ZEND_FE(zend_test_zend_ini_parse_uquantity, arginfo_zend_test_zend_ini_parse_uquantity) - ZEND_NS_FE("ZendTestNS2\\ZendSubNS", namespaced_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_func) + ZEND_NS_FALIAS("ZendTestNS2", namespaced_func, ZendTestNS2_namespaced_func, arginfo_ZendTestNS2_namespaced_func) + ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_func, ZendTestNS2_namespaced_deprecated_func, arginfo_ZendTestNS2_namespaced_deprecated_func) + ZEND_NS_FALIAS("ZendTestNS2", namespaced_aliased_func, namespaced_alias_func, arginfo_ZendTestNS2_namespaced_aliased_func) + ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_aliased_func, namespaced_deprecated_alias_func, arginfo_ZendTestNS2_namespaced_deprecated_aliased_func) + ZEND_NS_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_func, ZendTestNS2_ZendSubNS_namespaced_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_func) + ZEND_NS_DEP_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_deprecated_func, ZendTestNS2_ZendSubNS_namespaced_deprecated_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_func) + ZEND_NS_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_aliased_func, namespaced_alias_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func) + ZEND_NS_DEP_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_deprecated_aliased_func, namespaced_deprecated_alias_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func) ZEND_FE_END }; From ef21bbe66cdeb0cd829a9cea99c07c9c2c071b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 30 Aug 2022 11:48:12 +0200 Subject: [PATCH 1196/1346] Fix zend/test aliases --- ext/zend_test/test.stub.php | 15 ++++++--------- ext/zend_test/test_arginfo.h | 18 +++++++----------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index cc8f5249ef16f..fa5470a2da9fb 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -5,7 +5,6 @@ * @generate-legacy-arginfo 80000 */ namespace { - /** * @var int * @deprecated @@ -109,12 +108,12 @@ function zend_test_compile_string(string $source_string, string $filename, int $ /** @deprecated */ function zend_test_deprecated(mixed $arg = null): void {} - /** @alias zend_test_alias */ + /** @alias zend_test_void_return */ function zend_test_aliased(): void {} /** * @deprecated - * @alias zend_test_deprecated_alias + * @alias zend_test_void_return */ function zend_test_deprecated_aliased(): void {} @@ -182,15 +181,14 @@ function namespaced_func(): bool {} /** @deprecated */ function namespaced_deprecated_func(): void {} - /** @alias namespaced_alias_func */ + /** @alias zend_test_void_return */ function namespaced_aliased_func(): void {} /** * @deprecated - * @alias namespaced_deprecated_alias_func + * @alias zend_test_void_return */ function namespaced_deprecated_aliased_func(): void {} - } namespace ZendTestNS2\ZendSubNS { @@ -204,13 +202,12 @@ function namespaced_func(): bool {} /** @deprecated */ function namespaced_deprecated_func(): void {} - /** @alias namespaced_alias_func */ + /** @alias zend_test_void_return */ function namespaced_aliased_func(): void {} /** * @deprecated - * @alias namespaced_deprecated_alias_func + * @alias zend_test_void_return */ function namespaced_deprecated_aliased_func(): void {} - } diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index f393d77797897..19115689c7228 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: 0c3e4da20bf5b32e289a795e0beac649294e83f3 */ + * Stub hash: da3c0e9e8fbf51669ed6f1584b914f80c9dd0d3f */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -162,8 +162,6 @@ static ZEND_FUNCTION(zend_test_nullable_array_return); static ZEND_FUNCTION(zend_test_void_return); static ZEND_FUNCTION(zend_test_compile_string); static ZEND_FUNCTION(zend_test_deprecated); -static ZEND_FUNCTION(zend_test_alias); -static ZEND_FUNCTION(zend_test_deprecated_alias); static ZEND_FUNCTION(zend_create_unterminated_string); static ZEND_FUNCTION(zend_terminate_string); static ZEND_FUNCTION(zend_leak_variable); @@ -184,8 +182,6 @@ static ZEND_FUNCTION(zend_test_zend_ini_parse_quantity); static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity); static ZEND_FUNCTION(ZendTestNS2_namespaced_func); static ZEND_FUNCTION(ZendTestNS2_namespaced_deprecated_func); -static ZEND_FUNCTION(namespaced_alias_func); -static ZEND_FUNCTION(namespaced_deprecated_alias_func); static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_func); static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_deprecated_func); static ZEND_METHOD(_ZendTestClass, is_object); @@ -212,8 +208,8 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_test_void_return, arginfo_zend_test_void_return) ZEND_FE(zend_test_compile_string, arginfo_zend_test_compile_string) ZEND_DEP_FE(zend_test_deprecated, arginfo_zend_test_deprecated) - ZEND_FALIAS(zend_test_aliased, zend_test_alias, arginfo_zend_test_aliased) - ZEND_DEP_FALIAS(zend_test_deprecated_aliased, zend_test_deprecated_alias, arginfo_zend_test_deprecated_aliased) + ZEND_FALIAS(zend_test_aliased, zend_test_void_return, arginfo_zend_test_aliased) + ZEND_DEP_FALIAS(zend_test_deprecated_aliased, zend_test_void_return, arginfo_zend_test_deprecated_aliased) ZEND_FE(zend_create_unterminated_string, arginfo_zend_create_unterminated_string) ZEND_FE(zend_terminate_string, arginfo_zend_terminate_string) ZEND_FE(zend_leak_variable, arginfo_zend_leak_variable) @@ -234,12 +230,12 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_test_zend_ini_parse_uquantity, arginfo_zend_test_zend_ini_parse_uquantity) ZEND_NS_FALIAS("ZendTestNS2", namespaced_func, ZendTestNS2_namespaced_func, arginfo_ZendTestNS2_namespaced_func) ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_func, ZendTestNS2_namespaced_deprecated_func, arginfo_ZendTestNS2_namespaced_deprecated_func) - ZEND_NS_FALIAS("ZendTestNS2", namespaced_aliased_func, namespaced_alias_func, arginfo_ZendTestNS2_namespaced_aliased_func) - ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_aliased_func, namespaced_deprecated_alias_func, arginfo_ZendTestNS2_namespaced_deprecated_aliased_func) + ZEND_NS_FALIAS("ZendTestNS2", namespaced_aliased_func, zend_test_void_return, arginfo_ZendTestNS2_namespaced_aliased_func) + ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_aliased_func, zend_test_void_return, arginfo_ZendTestNS2_namespaced_deprecated_aliased_func) ZEND_NS_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_func, ZendTestNS2_ZendSubNS_namespaced_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_func) ZEND_NS_DEP_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_deprecated_func, ZendTestNS2_ZendSubNS_namespaced_deprecated_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_func) - ZEND_NS_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_aliased_func, namespaced_alias_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func) - ZEND_NS_DEP_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_deprecated_aliased_func, namespaced_deprecated_alias_func, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func) + ZEND_NS_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_aliased_func, zend_test_void_return, arginfo_ZendTestNS2_ZendSubNS_namespaced_aliased_func) + ZEND_NS_DEP_FALIAS("ZendTestNS2\\ZendSubNS", namespaced_deprecated_aliased_func, zend_test_void_return, arginfo_ZendTestNS2_ZendSubNS_namespaced_deprecated_aliased_func) ZEND_FE_END }; From 869ab3c4816b30d1a89890a5aa688c1d5baa0994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 30 Aug 2022 11:56:29 +0200 Subject: [PATCH 1197/1346] Adjust PHPDoc --- ext/zend_test/test.stub.php | 12 ++++++------ ext/zend_test/test_arginfo.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index fa5470a2da9fb..1f60a047f0d29 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -185,9 +185,9 @@ function namespaced_deprecated_func(): void {} function namespaced_aliased_func(): void {} /** - * @deprecated - * @alias zend_test_void_return - */ + * @deprecated + * @alias zend_test_void_return + */ function namespaced_deprecated_aliased_func(): void {} } @@ -206,8 +206,8 @@ function namespaced_deprecated_func(): void {} function namespaced_aliased_func(): void {} /** - * @deprecated - * @alias zend_test_void_return - */ + * @deprecated + * @alias zend_test_void_return + */ function namespaced_deprecated_aliased_func(): void {} } diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 19115689c7228..52c784b61e28f 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: da3c0e9e8fbf51669ed6f1584b914f80c9dd0d3f */ + * Stub hash: 42a9cfb3fb78beb59d251712e9dab24364bf1c1c */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() From 8d78dce902d2ba05d937800171cc7ad3ae8ac960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 30 Aug 2022 11:57:29 +0200 Subject: [PATCH 1198/1346] Remove unused ext/zend_test alias functions --- ext/zend_test/test.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 815bc9cfc7b5d..a4a6ba07fc444 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -95,16 +95,6 @@ static ZEND_FUNCTION(zend_test_deprecated) zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &arg1); } -static ZEND_FUNCTION(zend_test_alias) -{ - ZEND_PARSE_PARAMETERS_NONE(); -} - -static ZEND_FUNCTION(zend_test_deprecated_alias) -{ - ZEND_PARSE_PARAMETERS_NONE(); -} - /* Create a string without terminating null byte. Must be terminated with * zend_terminate_string() before destruction, otherwise a warning is issued * in debug builds. */ @@ -447,16 +437,6 @@ static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_deprecated_func) ZEND_PARSE_PARAMETERS_NONE(); } -static ZEND_FUNCTION(namespaced_alias_func) -{ - ZEND_PARSE_PARAMETERS_NONE(); -} - -static ZEND_FUNCTION(namespaced_deprecated_alias_func) -{ - ZEND_PARSE_PARAMETERS_NONE(); -} - static ZEND_FUNCTION(zend_test_parameter_with_attribute) { zend_string *parameter; From adb45a63c0f56bb4e04ffd74579de0c8ab9d722f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 30 Aug 2022 13:46:32 +0200 Subject: [PATCH 1199/1346] Fix GH-9186 @strict-properties can be bypassed using unserialization (#9354) * Emit deprecation warnings when adding dynamic properties to classes during unserialization - this will become an Error in php 9.0. (Adding dynamic properties in other contexts was already a deprecation warning - the use case of unserialization was overlooked) * Throw an error when attempting to add a dynamic property to a `readonly` class when unserializing * Add new serialization methods `__serialize`/`__unserialize` for SplFixedArray to avoid creating deprecated dynamic properties that would then be added to the backing fixed-size array * Don't add named dynamic/declared properties (e.g. $obj->foo) of SplFixedArray to the backing array when unserializing * Update tests to declare properties or to expect the deprecation warning * Add news entry Co-authored-by: Tyson Andre --- NEWS | 2 + Zend/tests/gc_043.phpt | 3 +- .../readonly_class_unserialize_error.phpt | 16 ++++ Zend/zend_API.c | 17 ++++ ext/gmp/tests/gmp_dynamic_property.phpt | 24 ++++++ ext/gmp/tests/serialize.phpt | 2 + ext/random/engine_mt19937.c | 4 + ext/random/randomizer.c | 8 +- .../03_randomizer/gh_9186_unserialize.phpt | 14 +++ ext/session/tests/003.phpt | 1 + ext/session/tests/004.phpt | 1 + ext/session/tests/005.phpt | 1 + ext/session/tests/023.phpt | 1 + ext/session/tests/024.phpt | 1 + ext/session/tests/025.phpt | 1 + ext/soap/tests/bug70388.phpt | 2 + ext/soap/tests/bugs/bug69085.phpt | 1 + ext/spl/spl_array.c | 3 + ext/spl/spl_fixedarray.c | 85 ++++++++++++++++++- ext/spl/spl_fixedarray.stub.php | 4 + ext/spl/spl_fixedarray_arginfo.h | 16 +++- ext/spl/tests/SplFixedArray_serialize.phpt | 25 +++++- ext/spl/tests/bug70155.phpt | 2 + ext/spl/tests/bug74669.phpt | 2 + ext/standard/basic_functions.stub.php | 1 + ext/standard/basic_functions_arginfo.h | 8 +- ext/standard/tests/serialize/bug49649.phpt | 3 +- ext/standard/tests/serialize/bug49649_1.phpt | 3 +- ext/standard/tests/serialize/bug49649_2.phpt | 3 +- ext/standard/tests/serialize/bug62836_1.phpt | 2 +- ext/standard/tests/serialize/bug62836_2.phpt | 2 +- ext/standard/tests/serialize/bug72663.phpt | 2 + .../serialization_objects_incomplete.phpt | 14 +++ ...ialize_overwrite_undeclared_protected.phpt | 3 +- ...lize_ref_to_overwritten_declared_prop.phpt | 4 +- ext/standard/var_unserializer.re | 12 +++ 36 files changed, 271 insertions(+), 22 deletions(-) create mode 100644 Zend/tests/readonly_classes/readonly_class_unserialize_error.phpt create mode 100644 ext/gmp/tests/gmp_dynamic_property.phpt create mode 100644 ext/random/tests/03_randomizer/gh_9186_unserialize.phpt create mode 100644 ext/standard/tests/serialize/serialization_objects_incomplete.phpt diff --git a/NEWS b/NEWS index d499246c542a3..94d1193e0a39e 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS (cmb) . Fixed bug GH-9285 (Traits cannot be used in readonly classes). (kocsismate) + . Fixed bug GH-9186 (@strict-properties can be bypassed using + unserialization). (kocsismate) - Date: . Fixed bug GH-9431 (DateTime::getLastErrors() not returning false when no diff --git a/Zend/tests/gc_043.phpt b/Zend/tests/gc_043.phpt index 06b64de39acf9..37906a025145f 100644 --- a/Zend/tests/gc_043.phpt +++ b/Zend/tests/gc_043.phpt @@ -8,7 +8,8 @@ STR; var_dump(unserialize($s)); gc_collect_cycles(); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property RegexIterator::$5 is deprecated in %s on line %d object(stdClass)#1 (2) { ["5"]=> object(SplStack)#2 (2) { diff --git a/Zend/tests/readonly_classes/readonly_class_unserialize_error.phpt b/Zend/tests/readonly_classes/readonly_class_unserialize_error.phpt new file mode 100644 index 0000000000000..e0672e4d97f80 --- /dev/null +++ b/Zend/tests/readonly_classes/readonly_class_unserialize_error.phpt @@ -0,0 +1,16 @@ +--TEST-- +Fix GH-9186 Readonly classes can have dynamic properties created by unserialize() +--FILE-- +getMessage() . "\n"; +} + +?> +--EXPECT-- +Cannot create dynamic property C::$x diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 56db031102095..54bcad825a501 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1628,6 +1628,15 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties) zend_hash_update(object->properties, key, &tmp); } } else { + if (UNEXPECTED(object->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) { + zend_throw_error(NULL, "Cannot create dynamic property %s::$%s", + ZSTR_VAL(object->ce->name), property_info != ZEND_WRONG_PROPERTY_INFO ? zend_get_unmangled_property_name(key): ""); + return; + } else if (!(object->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { + zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated", + ZSTR_VAL(object->ce->name), property_info != ZEND_WRONG_PROPERTY_INFO ? zend_get_unmangled_property_name(key): ""); + } + if (!object->properties) { rebuild_object_properties(object); } @@ -1635,6 +1644,14 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties) zval_add_ref(prop); } } else { + if (UNEXPECTED(object->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) { + zend_throw_error(NULL, "Cannot create dynamic property %s::$" ZEND_LONG_FMT, ZSTR_VAL(object->ce->name), h); + return; + } else if (!(object->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { + zend_error(E_DEPRECATED, "Creation of dynamic property %s::$" ZEND_LONG_FMT " is deprecated", + ZSTR_VAL(object->ce->name), h); + } + if (!object->properties) { rebuild_object_properties(object); } diff --git a/ext/gmp/tests/gmp_dynamic_property.phpt b/ext/gmp/tests/gmp_dynamic_property.phpt new file mode 100644 index 0000000000000..547fe51a7f6a3 --- /dev/null +++ b/ext/gmp/tests/gmp_dynamic_property.phpt @@ -0,0 +1,24 @@ +--TEST-- +GH-9186 Dynamic property unserialization should trigger a deprecated notice +--EXTENSIONS-- +gmp +--FILE-- +{1} = 123; + +$serialized = serialize($g); +var_dump(unserialize($serialized)); + +?> +--EXPECTF-- +Deprecated: Creation of dynamic property GMP::$1 is deprecated in %s on line %d + +Deprecated: Creation of dynamic property GMP::$1 is deprecated in %s on line %d +object(GMP)#%d (%d) { + [1]=> + int(123) + ["num"]=> + string(1) "0" +} diff --git a/ext/gmp/tests/serialize.phpt b/ext/gmp/tests/serialize.phpt index 65c2f34e13d17..84877459a9bc0 100644 --- a/ext/gmp/tests/serialize.phpt +++ b/ext/gmp/tests/serialize.phpt @@ -54,6 +54,8 @@ object(GMP)#%d (1) { Deprecated: Creation of dynamic property GMP::$foo is deprecated in %s on line %d string(56) "O:3:"GMP":2:{i:0;s:1:"d";i:1;a:1:{s:3:"foo";s:3:"bar";}}" + +Deprecated: Creation of dynamic property GMP::$foo is deprecated in %s on line %d object(GMP)#%d (2) { ["foo"]=> string(3) "bar" diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c index 266ec5ea11c24..a2aed76a39d76 100644 --- a/ext/random/engine_mt19937.c +++ b/ext/random/engine_mt19937.c @@ -365,6 +365,10 @@ PHP_METHOD(Random_Engine_Mt19937, __unserialize) RETURN_THROWS(); } object_properties_load(&engine->std, Z_ARRVAL_P(t)); + if (EG(exception)) { + zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(engine->std.ce->name)); + RETURN_THROWS(); + } /* state */ t = zend_hash_index_find(d, 1); diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index c94c9449db93d..f26231b997722 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -90,7 +90,7 @@ PHP_METHOD(Random_Randomizer, __construct) /* {{{ Generate positive random number */ PHP_METHOD(Random_Randomizer, nextInt) -{ +{ php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS); uint64_t result; @@ -104,7 +104,7 @@ PHP_METHOD(Random_Randomizer, nextInt) zend_throw_exception(random_ce_Random_RandomException, "Generated value exceeds size of int", 0); RETURN_THROWS(); } - + RETURN_LONG((zend_long) (result >> 1)); } /* }}} */ @@ -278,6 +278,10 @@ PHP_METHOD(Random_Randomizer, __unserialize) RETURN_THROWS(); } object_properties_load(&randomizer->std, Z_ARRVAL_P(members_zv)); + if (EG(exception)) { + zend_throw_exception(NULL, "Invalid serialization data for Random\\Randomizer object", 0); + RETURN_THROWS(); + } zengine = zend_read_property(randomizer->std.ce, &randomizer->std, "engine", strlen("engine"), 1, NULL); if (Z_TYPE_P(zengine) != IS_OBJECT || !instanceof_function(Z_OBJCE_P(zengine), random_ce_Random_Engine)) { diff --git a/ext/random/tests/03_randomizer/gh_9186_unserialize.phpt b/ext/random/tests/03_randomizer/gh_9186_unserialize.phpt new file mode 100644 index 0000000000000..fe1acb2f74be4 --- /dev/null +++ b/ext/random/tests/03_randomizer/gh_9186_unserialize.phpt @@ -0,0 +1,14 @@ +--TEST-- +Fix GH-9186 @strict-properties can be bypassed using unserialization +--FILE-- +getMessage() . "\n"; +} + +?> +--EXPECT-- +Invalid serialization data for Random\Randomizer object diff --git a/ext/session/tests/003.phpt b/ext/session/tests/003.phpt index c0628e28abdd9..ab1739edf6b76 100644 --- a/ext/session/tests/003.phpt +++ b/ext/session/tests/003.phpt @@ -16,6 +16,7 @@ error_reporting(E_ALL); class foo { public $bar = "ok"; + public $yes; function method() { $this->yes++; } } diff --git a/ext/session/tests/004.phpt b/ext/session/tests/004.phpt index 0901286001808..d6b53072c1633 100644 --- a/ext/session/tests/004.phpt +++ b/ext/session/tests/004.phpt @@ -52,6 +52,7 @@ $hnd = new handler; class foo { public $bar = "ok"; + public $yes; function method() { $this->yes++; } } diff --git a/ext/session/tests/005.phpt b/ext/session/tests/005.phpt index 6c7f246a3630a..c4083557866e3 100644 --- a/ext/session/tests/005.phpt +++ b/ext/session/tests/005.phpt @@ -53,6 +53,7 @@ $hnd = new handler; class foo { public $bar = "ok"; + public $yes; function method() { $this->yes++; } } diff --git a/ext/session/tests/023.phpt b/ext/session/tests/023.phpt index 78f6e41c7e790..092f8db64b790 100644 --- a/ext/session/tests/023.phpt +++ b/ext/session/tests/023.phpt @@ -16,6 +16,7 @@ error_reporting(E_ALL); class foo { public $bar = "ok"; + public $yes; function method() { $this->yes++; } } diff --git a/ext/session/tests/024.phpt b/ext/session/tests/024.phpt index b0f819b9d0d2f..c307d79a6873b 100644 --- a/ext/session/tests/024.phpt +++ b/ext/session/tests/024.phpt @@ -53,6 +53,7 @@ $hnd = new handler; class foo { public $bar = "ok"; + public $yes; function method() { $this->yes++; } } diff --git a/ext/session/tests/025.phpt b/ext/session/tests/025.phpt index b18715af36651..5f9a5ad591c7d 100644 --- a/ext/session/tests/025.phpt +++ b/ext/session/tests/025.phpt @@ -54,6 +54,7 @@ $hnd = new handler; class foo { public $bar = "ok"; + public $yes; function method() { $this->yes++; } } diff --git a/ext/soap/tests/bug70388.phpt b/ext/soap/tests/bug70388.phpt index 87259bf45d50a..8f3e8be766ea1 100644 --- a/ext/soap/tests/bug70388.phpt +++ b/ext/soap/tests/bug70388.phpt @@ -4,6 +4,8 @@ Bug #70388 (SOAP serialize_function_call() type confusion / RCE) soap --FILE-- std, Z_ARRVAL_P(members_zv)); + if (EG(exception)) { + RETURN_THROWS(); + } if (iterator_class_zv && Z_TYPE_P(iterator_class_zv) == IS_STRING) { zend_class_entry *ce = zend_lookup_class(Z_STR_P(iterator_class_zv)); diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index fd18c3d86c378..a00bb8965af65 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -102,13 +102,18 @@ static void spl_fixedarray_init_elems(spl_fixedarray *array, zend_long from, zen } } +static void spl_fixedarray_init_non_empty_struct(spl_fixedarray *array, zend_long size) +{ + array->size = 0; /* reset size in case ecalloc() fails */ + array->elements = size ? safe_emalloc(size, sizeof(zval), 0) : NULL; + array->size = size; + array->should_rebuild_properties = true; +} + static void spl_fixedarray_init(spl_fixedarray *array, zend_long size) { if (size > 0) { - array->size = 0; /* reset size in case ecalloc() fails */ - array->elements = safe_emalloc(size, sizeof(zval), 0); - array->size = size; - array->should_rebuild_properties = true; + spl_fixedarray_init_non_empty_struct(array, size); spl_fixedarray_init_elems(array, 0, size); } else { spl_fixedarray_default_ctor(array); @@ -582,6 +587,78 @@ PHP_METHOD(SplFixedArray, __wakeup) } } +PHP_METHOD(SplFixedArray, __serialize) +{ + spl_fixedarray_object *intern = Z_SPLFIXEDARRAY_P(ZEND_THIS); + zval *current; + zend_string *key; + + if (zend_parse_parameters_none() == FAILURE) { + RETURN_THROWS(); + } + + uint32_t property_num = zend_hash_num_elements(intern->std.properties); + array_init_size(return_value, intern->array.size + property_num); + + /* elements */ + for (zend_long i = 0; i < intern->array.size; i++) { + current = &intern->array.elements[i]; + zend_hash_next_index_insert(Z_ARRVAL_P(return_value), current); + Z_TRY_ADDREF_P(current); + } + + /* members */ + ZEND_HASH_FOREACH_STR_KEY_VAL(intern->std.properties, key, current) { + zend_hash_add(Z_ARRVAL_P(return_value), key, current); + Z_TRY_ADDREF_P(current); + } ZEND_HASH_FOREACH_END(); +} + +PHP_METHOD(SplFixedArray, __unserialize) +{ + spl_fixedarray_object *intern = Z_SPLFIXEDARRAY_P(ZEND_THIS); + HashTable *data; + zval members_zv, *elem; + zend_string *key; + zend_long size; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "h", &data) == FAILURE) { + RETURN_THROWS(); + } + + if (intern->array.size == 0) { + size = zend_hash_num_elements(data); + spl_fixedarray_init_non_empty_struct(&intern->array, size); + if (!size) { + return; + } + array_init(&members_zv); + + intern->array.size = 0; + ZEND_HASH_FOREACH_STR_KEY_VAL(data, key, elem) { + if (key == NULL) { + ZVAL_COPY(&intern->array.elements[intern->array.size], elem); + intern->array.size++; + } else { + Z_TRY_ADDREF_P(elem); + zend_hash_add(Z_ARRVAL(members_zv), key, elem); + } + } ZEND_HASH_FOREACH_END(); + + if (intern->array.size != size) { + if (intern->array.size) { + intern->array.elements = erealloc(intern->array.elements, sizeof(zval) * intern->array.size); + } else { + efree(intern->array.elements); + intern->array.elements = NULL; + } + } + + object_properties_load(&intern->std, Z_ARRVAL(members_zv)); + zval_ptr_dtor(&members_zv); + } +} + PHP_METHOD(SplFixedArray, count) { zval *object = ZEND_THIS; diff --git a/ext/spl/spl_fixedarray.stub.php b/ext/spl/spl_fixedarray.stub.php index 7fa9b2730cf59..13f29b7a109db 100644 --- a/ext/spl/spl_fixedarray.stub.php +++ b/ext/spl/spl_fixedarray.stub.php @@ -9,6 +9,10 @@ public function __construct(int $size = 0) {} /** @tentative-return-type */ public function __wakeup(): void {} + public function __serialize(): array {} + + public function __unserialize(array $data): void {} + /** @tentative-return-type */ public function count(): int {} diff --git a/ext/spl/spl_fixedarray_arginfo.h b/ext/spl/spl_fixedarray_arginfo.h index 10c3fdb29c3bc..11ea1fdb30164 100644 --- a/ext/spl/spl_fixedarray_arginfo.h +++ b/ext/spl/spl_fixedarray_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 79a13a549d91f0e79c78a125de65fbac4795339f */ + * Stub hash: 0b508ad6499b70c92bf25960b30fefa913532a3c */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFixedArray___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, size, IS_LONG, 0, "0") @@ -8,6 +8,13 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFixedArray___wakeup, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SplFixedArray___serialize, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SplFixedArray___unserialize, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFixedArray_count, 0, 0, IS_LONG, 0) ZEND_END_ARG_INFO() @@ -45,12 +52,13 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_SplFixedArray_getIterator, 0, 0, Iterator, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SplFixedArray_jsonSerialize, 0, 0, IS_ARRAY, 0) -ZEND_END_ARG_INFO() +#define arginfo_class_SplFixedArray_jsonSerialize arginfo_class_SplFixedArray___serialize ZEND_METHOD(SplFixedArray, __construct); ZEND_METHOD(SplFixedArray, __wakeup); +ZEND_METHOD(SplFixedArray, __serialize); +ZEND_METHOD(SplFixedArray, __unserialize); ZEND_METHOD(SplFixedArray, count); ZEND_METHOD(SplFixedArray, toArray); ZEND_METHOD(SplFixedArray, fromArray); @@ -67,6 +75,8 @@ ZEND_METHOD(SplFixedArray, jsonSerialize); static const zend_function_entry class_SplFixedArray_methods[] = { ZEND_ME(SplFixedArray, __construct, arginfo_class_SplFixedArray___construct, ZEND_ACC_PUBLIC) ZEND_ME(SplFixedArray, __wakeup, arginfo_class_SplFixedArray___wakeup, ZEND_ACC_PUBLIC) + ZEND_ME(SplFixedArray, __serialize, arginfo_class_SplFixedArray___serialize, ZEND_ACC_PUBLIC) + ZEND_ME(SplFixedArray, __unserialize, arginfo_class_SplFixedArray___unserialize, ZEND_ACC_PUBLIC) ZEND_ME(SplFixedArray, count, arginfo_class_SplFixedArray_count, ZEND_ACC_PUBLIC) ZEND_ME(SplFixedArray, toArray, arginfo_class_SplFixedArray_toArray, ZEND_ACC_PUBLIC) ZEND_ME(SplFixedArray, fromArray, arginfo_class_SplFixedArray_fromArray, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) diff --git a/ext/spl/tests/SplFixedArray_serialize.phpt b/ext/spl/tests/SplFixedArray_serialize.phpt index f99812ecceb70..da7c212109ecd 100644 --- a/ext/spl/tests/SplFixedArray_serialize.phpt +++ b/ext/spl/tests/SplFixedArray_serialize.phpt @@ -13,6 +13,8 @@ $array[2] = 42; $array[3] = $obj; $array[4] = range(1, 5); +$array->foo = "bar"; + $ser = serialize($array); echo "$ser\n"; $unser = unserialize($ser); @@ -24,10 +26,24 @@ var_dump($unser[0], $unser[1], $unser[2], $unser[3], $unser[4]); $unser[4] = 'quux'; var_dump($unser[4]); +var_dump($unser->foo); + +// __unserialize is a no-op on a non-empty SplFixedArray +$array = new SplFixedArray(1); +$array->__unserialize([ + [1], + [ + "foo" => "bar", + ], +]); +var_dump($array); ?> ---EXPECT-- -O:13:"SplFixedArray":5:{i:0;s:3:"foo";i:1;N;i:2;i:42;i:3;O:8:"stdClass":1:{s:4:"prop";s:5:"value";}i:4;a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}} +--EXPECTF-- +Deprecated: Creation of dynamic property SplFixedArray::$foo is deprecated in %s on line %d +O:13:"SplFixedArray":6:{i:0;s:3:"foo";i:1;N;i:2;i:42;i:3;O:8:"stdClass":1:{s:4:"prop";s:5:"value";}i:4;a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}s:3:"foo";s:3:"bar";} + +Deprecated: Creation of dynamic property SplFixedArray::$foo is deprecated in %s on line %d count: 5 getSize(): 5 string(3) "foo" @@ -50,3 +66,8 @@ array(5) { int(5) } string(4) "quux" +string(3) "bar" +object(SplFixedArray)#5 (1) { + [0]=> + NULL +} diff --git a/ext/spl/tests/bug70155.phpt b/ext/spl/tests/bug70155.phpt index 0aa246cc2388f..a609205aca279 100644 --- a/ext/spl/tests/bug70155.phpt +++ b/ext/spl/tests/bug70155.phpt @@ -9,6 +9,8 @@ $data = unserialize($exploit); var_dump($data); ?> --EXPECTF-- +Deprecated: Creation of dynamic property ArrayObject::$0 is deprecated in %s on line %d + Fatal error: Uncaught InvalidArgumentException: Overloaded object of type DateInterval is not compatible with ArrayObject in %s Stack trace: %s diff --git a/ext/spl/tests/bug74669.phpt b/ext/spl/tests/bug74669.phpt index 0966a4cf27e15..597e694296d26 100644 --- a/ext/spl/tests/bug74669.phpt +++ b/ext/spl/tests/bug74669.phpt @@ -105,6 +105,8 @@ object(SelfArray)#9 (1) { string(3) "bar" } string(77) "O:9:"SelfArray":4:{i:0;i:16777216;i:1;N;i:2;a:1:{s:3:"foo";s:3:"bar";}i:3;N;}" + +Deprecated: Creation of dynamic property SelfArray::$foo is deprecated in %s on line %d object(SelfArray)#9 (1) { ["foo"]=> string(3) "bar" diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 6166cf6587bb6..7a6ee00d8e49c 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -343,6 +343,7 @@ */ const PHP_ROUND_HALF_ODD = UNKNOWN; +#[AllowDynamicProperties] final class __PHP_Incomplete_Class { } diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index d3dd087e83a83..4469a5b07ee08 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 0411f358f211eb9173272c6f296899d349ab5971 */ + * Stub hash: 4df5576b4e03b18896abf58e6c70d9fd6ae76687 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -3578,7 +3578,11 @@ static zend_class_entry *register_class___PHP_Incomplete_Class(void) INIT_CLASS_ENTRY(ce, "__PHP_Incomplete_Class", class___PHP_Incomplete_Class_methods); class_entry = zend_register_internal_class_ex(&ce, NULL); - class_entry->ce_flags |= ZEND_ACC_FINAL; + class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES; + + zend_string *attribute_name_AllowDynamicProperties_class___PHP_Incomplete_Class = zend_string_init_interned("AllowDynamicProperties", sizeof("AllowDynamicProperties") - 1, 1); + zend_add_class_attribute(class_entry, attribute_name_AllowDynamicProperties_class___PHP_Incomplete_Class, 0); + zend_string_release(attribute_name_AllowDynamicProperties_class___PHP_Incomplete_Class); return class_entry; } diff --git a/ext/standard/tests/serialize/bug49649.phpt b/ext/standard/tests/serialize/bug49649.phpt index 7bbba03c1492e..310cd5b8881e3 100644 --- a/ext/standard/tests/serialize/bug49649.phpt +++ b/ext/standard/tests/serialize/bug49649.phpt @@ -33,7 +33,8 @@ class Foo $class = unserialize(base64_decode($serialized)); var_dump($class); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property Foo::$notThere is deprecated in %s on line %d object(Foo)#1 (4) { ["public"]=> int(3) diff --git a/ext/standard/tests/serialize/bug49649_1.phpt b/ext/standard/tests/serialize/bug49649_1.phpt index e4f01d3039d5a..ddaff1e960c4f 100644 --- a/ext/standard/tests/serialize/bug49649_1.phpt +++ b/ext/standard/tests/serialize/bug49649_1.phpt @@ -33,7 +33,8 @@ class Foo $class = unserialize(base64_decode($serialized)); var_dump($class); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property Foo::$notThere is deprecated in %s on line %d object(Foo)#1 (4) { ["public":protected]=> int(3) diff --git a/ext/standard/tests/serialize/bug49649_2.phpt b/ext/standard/tests/serialize/bug49649_2.phpt index 93b5e298f993e..16a9b4d7c722e 100644 --- a/ext/standard/tests/serialize/bug49649_2.phpt +++ b/ext/standard/tests/serialize/bug49649_2.phpt @@ -33,7 +33,8 @@ class Foo $class = unserialize(base64_decode($serialized)); var_dump($class); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property Foo::$notThere is deprecated in %s on line %d object(Foo)#1 (4) { ["public":"Foo":private]=> int(3) diff --git a/ext/standard/tests/serialize/bug62836_1.phpt b/ext/standard/tests/serialize/bug62836_1.phpt index 7d03e9fd187bd..480dbab1df127 100644 --- a/ext/standard/tests/serialize/bug62836_1.phpt +++ b/ext/standard/tests/serialize/bug62836_1.phpt @@ -5,7 +5,7 @@ Bug #62836 (Seg fault or broken object references on unserialize()) $serialized_object='O:1:"A":4:{s:1:"b";O:1:"B":0:{}s:2:"b1";r:2;s:1:"c";O:1:"B":0:{}s:2:"c1";r:4;}'; spl_autoload_register(function ($name) { unserialize("i:4;"); - eval("class $name {} "); + eval("#[AllowDynamicProperties] class $name {} "); }); print_r(unserialize($serialized_object)); diff --git a/ext/standard/tests/serialize/bug62836_2.phpt b/ext/standard/tests/serialize/bug62836_2.phpt index 0634b1dac135b..95bd75bb6fb87 100644 --- a/ext/standard/tests/serialize/bug62836_2.phpt +++ b/ext/standard/tests/serialize/bug62836_2.phpt @@ -8,7 +8,7 @@ ini_set('unserialize_callback_func','mycallback'); function mycallback($classname) { unserialize("i:4;"); - eval ("class $classname {} "); + eval ("#[AllowDynamicProperties] class $classname {} "); } print_r(unserialize($serialized_object)); diff --git a/ext/standard/tests/serialize/bug72663.phpt b/ext/standard/tests/serialize/bug72663.phpt index c50591ca963f4..9c006d50d80ba 100644 --- a/ext/standard/tests/serialize/bug72663.phpt +++ b/ext/standard/tests/serialize/bug72663.phpt @@ -3,6 +3,7 @@ Bug #72663 (1): Don't call __destruct if __wakeup not called or fails --FILE-- +--EXPECT-- +object(__PHP_Incomplete_Class)#1 (2) { + ["__PHP_Incomplete_Class_Name"]=> + string(1) "C" + ["p"]=> + int(1) +} diff --git a/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt b/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt index b442c922c4153..d9f44c37a1560 100644 --- a/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt +++ b/ext/standard/tests/serialize/unserialize_overwrite_undeclared_protected.phpt @@ -12,7 +12,8 @@ O:4:"Test":2:{s:4:"\0*\0x";N;s:4:"\0*\0x";N;} STR; var_dump(unserialize($str)); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Creation of dynamic property Test::$x is deprecated in %s on line %d object(Test)#1 (2) { ["foo"]=> NULL diff --git a/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt b/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt index f32b0c12e2f26..c4c3c957d3ee8 100644 --- a/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt +++ b/ext/standard/tests/serialize/unserialize_ref_to_overwritten_declared_prop.phpt @@ -3,10 +3,10 @@ Trying to create a reference to an overwritten declared property --FILE-- --EXPECTF-- -Notice: unserialize(): Error at offset 51 of 52 bytes in %s on line %d +Notice: unserialize(): Error at offset 36 of 52 bytes in %s on line %d bool(false) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 0556d5522ce5d..72d50c190e653 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -641,6 +641,18 @@ declared_property: int ret = is_property_visibility_changed(obj->ce, &key); if (EXPECTED(!ret)) { + if (UNEXPECTED(obj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) { + zend_throw_error(NULL, "Cannot create dynamic property %s::$%s", + ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key))); + goto failure; + } else if (!(obj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { + zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated", + ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key))); + if (EG(exception)) { + goto failure; + } + } + data = zend_hash_add_new(ht, Z_STR(key), &EG(uninitialized_zval)); } else if (ret < 0) { goto failure; From 8b9679e88e13e116db8fd3648b0d4c06dc6f0e5f Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Tue, 30 Aug 2022 09:19:45 -0400 Subject: [PATCH 1200/1346] Make var_export/debug_zval_dump check for infinite recursion on the *object* (#9448) Switch the recursion check from the result of `get_properties_for` (the returned hash table of properties) to just checking for infinite recursion on the object. - In order for a native datastructure to correctly implement `*get_properties_for` for var_export's cycle detection, it would need to return the exact same array every time prior to this PR. Prior to this commit, the requirements for cycle detection would prevent SplFixedArray or similar classes from returning a temporary array that: 1. Wouldn't be affected by unexpected mutations from error handlers 2. Could be garbage collected instead. --- ext/spl/tests/gh8044.phpt | 20 +++++++++++++++++++ ext/standard/var.c | 42 ++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 ext/spl/tests/gh8044.phpt diff --git a/ext/spl/tests/gh8044.phpt b/ext/spl/tests/gh8044.phpt new file mode 100644 index 0000000000000..3567646954634 --- /dev/null +++ b/ext/spl/tests/gh8044.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug GH-8044 (var_export/debug_zval_dump HT_ASSERT_RC1 debug failure for SplFixedArray) +--FILE-- + +--EXPECTF-- +Warning: var_export does not handle circular references in %s on line 5 +\SplFixedArray::__set_state(array( + 0 => NULL, +)) +object(SplFixedArray)#2 (1) refcount(4){ + [0]=> + *RECURSION* +} diff --git a/ext/standard/var.c b/ext/standard/var.c index 9421a5bb74dce..268c535a80242 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -343,15 +343,17 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ PUTS("}\n"); break; case IS_OBJECT: - myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_DEBUG); - if (myht) { - if (GC_IS_RECURSIVE(myht)) { - PUTS("*RECURSION*\n"); - zend_release_properties(myht); - return; - } - GC_PROTECT_RECURSION(myht); + /* Check if this is already recursing on the object before calling zend_get_properties_for, + * to allow infinite recursion detection to work even if classes return temporary arrays, + * and to avoid the need to update the properties table in place to reflect the state + * if the result won't be used. (https://github.com/php/php-src/issues/8044) */ + if (Z_IS_RECURSIVE_P(struc)) { + PUTS("*RECURSION*\n"); + return; } + Z_PROTECT_RECURSION_P(struc); + + myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_DEBUG); class_name = Z_OBJ_HANDLER_P(struc, get_class_name)(Z_OBJ_P(struc)); php_printf("object(%s)#%d (%d) refcount(%u){\n", ZSTR_VAL(class_name), Z_OBJ_HANDLE_P(struc), myht ? zend_array_count(myht) : 0, Z_REFCOUNT_P(struc)); zend_string_release_ex(class_name, 0); @@ -370,13 +372,13 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ zval_object_property_dump(prop_info, val, index, key, level); } } ZEND_HASH_FOREACH_END(); - GC_UNPROTECT_RECURSION(myht); zend_release_properties(myht); } if (level > 1) { php_printf("%*c", level - 1, ' '); } PUTS("}\n"); + Z_UNPROTECT_RECURSION_P(struc); break; case IS_RESOURCE: { const char *type_name = zend_rsrc_list_get_rsrc_type(Z_RES_P(struc)); @@ -552,17 +554,17 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf) /* {{{ */ break; case IS_OBJECT: - myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_VAR_EXPORT); - if (myht) { - if (GC_IS_RECURSIVE(myht)) { - smart_str_appendl(buf, "NULL", 4); - zend_error(E_WARNING, "var_export does not handle circular references"); - zend_release_properties(myht); - return; - } else { - GC_TRY_PROTECT_RECURSION(myht); - } + /* Check if this is already recursing on the object before calling zend_get_properties_for, + * to allow infinite recursion detection to work even if classes return temporary arrays, + * and to avoid the need to update the properties table in place to reflect the state + * if the result won't be used. (https://github.com/php/php-src/issues/8044) */ + if (Z_IS_RECURSIVE_P(struc)) { + smart_str_appendl(buf, "NULL", 4); + zend_error(E_WARNING, "var_export does not handle circular references"); + return; } + Z_PROTECT_RECURSION_P(struc); + myht = zend_get_properties_for(struc, ZEND_PROP_PURPOSE_VAR_EXPORT); if (level > 1) { smart_str_appendc(buf, '\n'); buffer_append_spaces(buf, level - 1); @@ -593,9 +595,9 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf) /* {{{ */ php_object_element_export(val, index, key, level, buf); } ZEND_HASH_FOREACH_END(); } - GC_TRY_UNPROTECT_RECURSION(myht); zend_release_properties(myht); } + Z_UNPROTECT_RECURSION_P(struc); if (level > 1 && !is_enum) { buffer_append_spaces(buf, level - 1); } From 853181a14dd5e0dd96dd3bf144edf9e7fd37bac3 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 30 Aug 2022 16:59:39 +0200 Subject: [PATCH 1201/1346] Add NEWS and UPGRADING entries for GH-9296 --- NEWS | 2 ++ UPGRADING | 2 ++ 2 files changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 94d1193e0a39e..793c6d2be9886 100644 --- a/NEWS +++ b/NEWS @@ -87,6 +87,8 @@ PHP NEWS . Fixed bug #65489 (glob() basedir check is inconsistent). (Jakub Zelenka) . Fixed GH-9200 (setcookie has an obsolete expires date format). (Derick) . Fixed GH-9244 (Segfault with array_multisort + array_shift). (cmb) + . Fixed bug GH-9296 (`ksort` behaves incorrectly on arrays with mixed keys). + (Denis Vaksman) 04 Aug 2022, PHP 8.2.0beta2 diff --git a/UPGRADING b/UPGRADING index 6d1904b3994ef..505828cb21fc0 100644 --- a/UPGRADING +++ b/UPGRADING @@ -51,6 +51,8 @@ PHP 8.2 UPGRADE NOTES . str_split() returns an empty array for an empty string now. Previously it returned an array with a single empty string entry. mb_str_split() is not affected by this change since it was already behaving like that. + . ksort() and krsort() do numeric string comparison under SORT_REGULAR using + the standard PHP 8 rules now. - SPL: . The following methods now enforce their signature: From 58a92772abd11737ee228e3918b78ca666dbce1b Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Tue, 30 Aug 2022 11:57:05 -0400 Subject: [PATCH 1202/1346] Prepare PHP 8.2.0 RC1 --- Zend/zend_extensions.h | 2 +- Zend/zend_modules.h | 2 +- main/php.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h index c32ed5de1adad..4d52ad42cf278 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 420210903 +#define ZEND_EXTENSION_API_NO 420220829 typedef struct _zend_extension_version_info { int zend_extension_api_no; diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index fda01eedc5230..7d80ad4c0608e 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 20210903 +#define ZEND_MODULE_API_NO 20220829 #ifdef ZTS #define USING_ZTS 1 #else diff --git a/main/php.h b/main/php.h index 27eb72389d2c7..7e52eafd84bf4 100644 --- a/main/php.h +++ b/main/php.h @@ -22,7 +22,7 @@ #include #endif -#define PHP_API_VERSION 20210903 +#define PHP_API_VERSION 20220829 #define PHP_HAVE_STREAMS #define YYDEBUG 0 #define PHP_DEFAULT_CHARSET "UTF-8" From 9f303cf7d33127a413f551460914aaa7a0c0d775 Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Tue, 30 Aug 2022 12:10:40 -0400 Subject: [PATCH 1203/1346] Prepare NEWS for PHP 8.2.0RC2 --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 793c6d2be9886..a842befce1d8a 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.2.0RC1 +?? ??? ????, PHP 8.2.0RC2 + + +01 Sep 2022, PHP 8.2.0RC1 - CLI: . Implement built-in web server responding without body to HEAD request on From c77bbf6fe53a3a6b76245516fcc42fa550f70516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 30 Aug 2022 20:02:28 +0200 Subject: [PATCH 1204/1346] Mark crypt()'s $string parameter as #[\SensitiveParameter] --- NEWS | 2 ++ ext/standard/basic_functions.stub.php | 2 +- ext/standard/basic_functions_arginfo.h | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index a842befce1d8a..5edeef8bd15fe 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC2 +- Standard: + . Marked crypt()'s $string parameter as #[\SensitiveParameter]. (timwolla) 01 Sep 2022, PHP 8.2.0RC1 diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 7a6ee00d8e49c..0e0968e3b3c1b 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -911,7 +911,7 @@ function crc32(string $string): int {} /* crypt.c */ /** @refcount 1 */ -function crypt(string $string, string $salt): string {} +function crypt(#[\SensitiveParameter] string $string, string $salt): string {} /* datetime.c */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 4469a5b07ee08..8793bd4eee24e 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 4df5576b4e03b18896abf58e6c70d9fd6ae76687 */ + * Stub hash: d0941f025c602b46179675026eb198d7425c717a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -3567,6 +3567,8 @@ static void register_basic_functions_symbols(int module_number) REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_PERSISTENT); + zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "crypt", sizeof("crypt") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0); + zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "password_hash", sizeof("password_hash") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0); zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "password_verify", sizeof("password_verify") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0); From 8330a0f3237d9677ec9ba706d4088383a133b6c6 Mon Sep 17 00:00:00 2001 From: Ben Ramsey Date: Tue, 30 Aug 2022 11:42:59 -0500 Subject: [PATCH 1205/1346] Add PHP-8.2 branch to build processes --- .github/nightly_matrix.php | 2 +- .github/workflows/push.yml | 1 + azure-pipelines.yml | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/nightly_matrix.php b/.github/nightly_matrix.php index a099a3ba2ad67..9174f7dcd8d2d 100644 --- a/.github/nightly_matrix.php +++ b/.github/nightly_matrix.php @@ -1,6 +1,6 @@ Date: Fri, 22 Jul 2022 11:30:19 +0200 Subject: [PATCH 1206/1346] Store default object handlers alongside the class entry Object handlers being separate from class entries is a legacy inherited from PHP 5. Today it has little benefit to keep them separate: in fact, accessing object handlers usually requires not-so-safe hacks. While it is possible to swap handlers in a custom installed create_object handler, this mostly is tedious, as well as it requires allocating the object handlers struct at runtime, possibly caching it etc.. This allows extensions, which intend to observe other classes to install their own class handlers. The life cycle of internal classes may now be simply observed by swapping the class handlers in post_startup stage. The life cycle of userland classes may be observed by iterating over the new classes in zend_compile_file and zend_compile_string and then swapping their handlers. In general, this would also be a first step in directly tying the object handlers to classes. Especially given that I am not aware of any case where the object handlers would be different between various instances of a given class. Signed-off-by: Bob Weinand --- Zend/zend.h | 2 ++ Zend/zend_API.h | 2 ++ Zend/zend_attributes.c | 14 +------------ Zend/zend_closures.c | 2 +- Zend/zend_compile.c | 1 + Zend/zend_enum.c | 4 ++-- Zend/zend_exceptions.c | 45 +++++++++++++++++------------------------- Zend/zend_fibers.c | 4 +--- Zend/zend_generators.c | 7 ++----- Zend/zend_interfaces.c | 2 +- Zend/zend_objects.c | 2 +- Zend/zend_weakrefs.c | 6 ++---- ext/dom/php_dom.c | 2 +- 13 files changed, 35 insertions(+), 58 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index bea23cf40ba0d..5a31ee6562172 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -182,6 +182,8 @@ struct _zend_class_entry { zend_function *__serialize; zend_function *__unserialize; + const zend_object_handlers *default_object_handlers; + /* allocated only if class implements Iterator or IteratorAggregate interface */ zend_class_iterator_funcs *iterator_funcs_ptr; /* allocated only if class implements ArrayAccess interface */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index fa8c1162788f1..7cb10f6a1d5a4 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -272,11 +272,13 @@ typedef struct _zend_fcall_info_cache { { \ memset(&class_container, 0, sizeof(zend_class_entry)); \ class_container.name = zend_string_init_interned(class_name, class_name_len, 1); \ + class_container.default_object_handlers = &std_object_handlers; \ class_container.info.internal.builtin_functions = functions; \ } #define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions) \ { \ + class_container.default_object_handlers = &std_object_handlers; \ class_container.constructor = NULL; \ class_container.destructor = NULL; \ class_container.clone = NULL; \ diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index 5a446c8c2859e..b34092be038a2 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -131,18 +131,6 @@ ZEND_METHOD(SensitiveParameterValue, __debugInfo) RETURN_EMPTY_ARRAY(); } -static zend_object *attributes_sensitive_parameter_value_new(zend_class_entry *ce) -{ - zend_object *object; - - object = zend_objects_new(ce); - object->handlers = &attributes_object_handlers_sensitive_parameter_value; - - object_properties_init(object, ce); - - return object; -} - static HashTable *attributes_sensitive_parameter_value_get_properties_for(zend_object *zobj, zend_prop_purpose purpose) { return NULL; @@ -382,7 +370,7 @@ void zend_register_attribute_ce(void) /* This is not an actual attribute, thus the zend_mark_internal_attribute() call is missing. */ zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue(); - zend_ce_sensitive_parameter_value->create_object = attributes_sensitive_parameter_value_new; + zend_ce_sensitive_parameter_value->default_object_handlers = &attributes_object_handlers_sensitive_parameter_value; } void zend_attributes_shutdown(void) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index f697f25a0f802..1f9285ef04468 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -521,7 +521,6 @@ static zend_object *zend_closure_new(zend_class_entry *class_type) /* {{{ */ memset(closure, 0, sizeof(zend_closure)); zend_object_std_init(&closure->std, class_type); - closure->std.handlers = &closure_handlers; return (zend_object*)closure; } @@ -678,6 +677,7 @@ void zend_register_closure_ce(void) /* {{{ */ { zend_ce_closure = register_class_Closure(); zend_ce_closure->create_object = zend_closure_new; + zend_ce_closure->default_object_handlers = &closure_handlers; memcpy(&closure_handlers, &std_object_handlers, sizeof(zend_object_handlers)); closure_handlers.free_obj = zend_closure_free_storage; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 03faf9c96e445..13679b00bb33d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1828,6 +1828,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_hand ZEND_MAP_PTR_INIT(ce->static_members_table, NULL); ZEND_MAP_PTR_INIT(ce->mutable_data, NULL); + ce->default_object_handlers = &std_object_handlers; ce->default_properties_count = 0; ce->default_static_members_count = 0; ce->properties_info_table = NULL; diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index 59befde732194..192d0eca99131 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -47,8 +47,6 @@ zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case ZVAL_COPY(OBJ_PROP_NUM(zobj, 1), backing_value_zv); } - zobj->handlers = &enum_handlers; - return zobj; } @@ -184,6 +182,8 @@ void zend_enum_add_interfaces(zend_class_entry *ce) ce->interface_names[num_interfaces_before + 1].name = zend_string_copy(zend_ce_backed_enum->name); ce->interface_names[num_interfaces_before + 1].lc_name = zend_string_init("backedenum", sizeof("backedenum") - 1, 0); } + + ce->default_object_handlers = &enum_handlers; } zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 3934a3cef0717..5a8ebdd0384c1 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -240,7 +240,7 @@ ZEND_API void zend_clear_exception(void) /* {{{ */ } /* }}} */ -static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type, bool skip_top_traces) /* {{{ */ +static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* {{{ */ { zval tmp; zval trace; @@ -248,13 +248,11 @@ static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type, zend_string *filename; zend_object *object = zend_objects_new(class_type); - object->handlers = &default_exception_handlers; - object_properties_init(object, class_type); if (EG(current_execute_data)) { zend_fetch_debug_backtrace(&trace, - skip_top_traces, + 0, EG(exception_ignore_args) ? DEBUG_BACKTRACE_IGNORE_ARGS : 0, 0); } else { array_init(&trace); @@ -282,18 +280,6 @@ static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type, } /* }}} */ -static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* {{{ */ -{ - return zend_default_exception_new_ex(class_type, 0); -} -/* }}} */ - -static zend_object *zend_error_exception_new(zend_class_entry *class_type) /* {{{ */ -{ - return zend_default_exception_new_ex(class_type, 0); -} -/* }}} */ - /* {{{ Clone the exception object */ ZEND_COLD ZEND_METHOD(Exception, __clone) { @@ -739,6 +725,11 @@ ZEND_METHOD(Exception, __toString) } /* }}} */ +static void zend_init_exception_class_entry(zend_class_entry *ce) { + ce->create_object = zend_default_exception_new; + ce->default_object_handlers = &default_exception_handlers; +} + void zend_register_default_exception(void) /* {{{ */ { zend_ce_throwable = register_class_Throwable(zend_ce_stringable); @@ -748,37 +739,37 @@ void zend_register_default_exception(void) /* {{{ */ default_exception_handlers.clone_obj = NULL; zend_ce_exception = register_class_Exception(zend_ce_throwable); - zend_ce_exception->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_exception); zend_ce_error_exception = register_class_ErrorException(zend_ce_exception); - zend_ce_error_exception->create_object = zend_error_exception_new; + zend_init_exception_class_entry(zend_ce_error_exception); zend_ce_error = register_class_Error(zend_ce_throwable); - zend_ce_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_error); zend_ce_compile_error = register_class_CompileError(zend_ce_error); - zend_ce_compile_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_compile_error); zend_ce_parse_error = register_class_ParseError(zend_ce_compile_error); - zend_ce_parse_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_parse_error); zend_ce_type_error = register_class_TypeError(zend_ce_error); - zend_ce_type_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_type_error); zend_ce_argument_count_error = register_class_ArgumentCountError(zend_ce_type_error); - zend_ce_argument_count_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_argument_count_error); zend_ce_value_error = register_class_ValueError(zend_ce_error); - zend_ce_value_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_value_error); zend_ce_arithmetic_error = register_class_ArithmeticError(zend_ce_error); - zend_ce_arithmetic_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_arithmetic_error); zend_ce_division_by_zero_error = register_class_DivisionByZeroError(zend_ce_arithmetic_error); - zend_ce_division_by_zero_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_division_by_zero_error); zend_ce_unhandled_match_error = register_class_UnhandledMatchError(zend_ce_error); - zend_ce_unhandled_match_error->create_object = zend_default_exception_new; + zend_init_exception_class_entry(zend_ce_unhandled_match_error); INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL); diff --git a/Zend/zend_fibers.c b/Zend/zend_fibers.c index 0bb45d1c3dc9c..2df1f0917b32e 100644 --- a/Zend/zend_fibers.c +++ b/Zend/zend_fibers.c @@ -589,12 +589,9 @@ static zend_always_inline zend_fiber_transfer zend_fiber_suspend(zend_fiber *fib static zend_object *zend_fiber_object_create(zend_class_entry *ce) { zend_fiber *fiber = emalloc(sizeof(zend_fiber)); - memset(fiber, 0, sizeof(zend_fiber)); zend_object_std_init(&fiber->std, ce); - fiber->std.handlers = &zend_fiber_handlers; - return &fiber->std; } @@ -903,6 +900,7 @@ void zend_register_fiber_ce(void) { zend_ce_fiber = register_class_Fiber(); zend_ce_fiber->create_object = zend_fiber_object_create; + zend_ce_fiber->default_object_handlers = &zend_fiber_handlers; zend_fiber_handlers = std_object_handlers; zend_fiber_handlers.dtor_obj = zend_fiber_object_destroy; diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 99c888ee09e93..0d3c74b35bbc8 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -404,9 +404,7 @@ static HashTable *zend_generator_get_gc(zend_object *object, zval **table, int * static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ */ { - zend_generator *generator; - - generator = emalloc(sizeof(zend_generator)); + zend_generator *generator = emalloc(sizeof(zend_generator)); memset(generator, 0, sizeof(zend_generator)); /* The key will be incremented on first use, so it'll start at 0 */ @@ -421,8 +419,6 @@ static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ * generator->node.ptr.root = NULL; zend_object_std_init(&generator->std, class_type); - generator->std.handlers = &zend_generator_handlers; - return (zend_object*)generator; } /* }}} */ @@ -1132,6 +1128,7 @@ void zend_register_generator_ce(void) /* {{{ */ zend_ce_generator->create_object = zend_generator_create; /* get_iterator has to be assigned *after* implementing the interface */ zend_ce_generator->get_iterator = zend_generator_get_iterator; + zend_ce_generator->default_object_handlers = &zend_generator_handlers; memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers)); zend_generator_handlers.free_obj = zend_generator_free_storage; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 1fa2493f17af5..ec14b1a99a03f 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -480,7 +480,6 @@ typedef struct { static zend_object *zend_internal_iterator_create(zend_class_entry *ce) { zend_internal_iterator *intern = emalloc(sizeof(zend_internal_iterator)); zend_object_std_init(&intern->std, ce); - intern->std.handlers = &zend_internal_iterator_handlers; intern->iter = NULL; intern->rewind_called = 0; return &intern->std; @@ -655,6 +654,7 @@ ZEND_API void zend_register_interfaces(void) zend_ce_internal_iterator = register_class_InternalIterator(zend_ce_iterator); zend_ce_internal_iterator->create_object = zend_internal_iterator_create; + zend_ce_internal_iterator->default_object_handlers = &zend_internal_iterator_handlers; memcpy(&zend_internal_iterator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index b09ce3b990d5c..df76fa0bb8dc3 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -31,6 +31,7 @@ static zend_always_inline void _zend_object_std_init(zend_object *object, zend_c GC_SET_REFCOUNT(object, 1); GC_TYPE_INFO(object) = GC_OBJECT; object->ce = ce; + object->handlers = ce->default_object_handlers; object->properties = NULL; zend_objects_store_put(object); if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) { @@ -186,7 +187,6 @@ ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce) zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); _zend_object_std_init(object, ce); - object->handlers = &std_object_handlers; return object; } diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index 3f2e517f3fe4e..db95b13a7254a 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -210,9 +210,6 @@ static zend_object* zend_weakref_new(zend_class_entry *ce) { zend_weakref *wr = zend_object_alloc(sizeof(zend_weakref), zend_ce_weakref); zend_object_std_init(&wr->std, zend_ce_weakref); - - wr->std.handlers = &zend_weakref_handlers; - return &wr->std; } @@ -304,7 +301,6 @@ static zend_object *zend_weakmap_create_object(zend_class_entry *ce) { zend_weakmap *wm = zend_object_alloc(sizeof(zend_weakmap), ce); zend_object_std_init(&wm->std, ce); - wm->std.handlers = &zend_weakmap_handlers; zend_hash_init(&wm->ht, 0, NULL, ZVAL_PTR_DTOR, 0); return &wm->std; @@ -651,6 +647,7 @@ void zend_register_weakref_ce(void) /* {{{ */ zend_ce_weakref = register_class_WeakReference(); zend_ce_weakref->create_object = zend_weakref_new; + zend_ce_weakref->default_object_handlers = &zend_weakref_handlers; memcpy(&zend_weakref_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std); @@ -662,6 +659,7 @@ void zend_register_weakref_ce(void) /* {{{ */ zend_ce_weakmap->create_object = zend_weakmap_create_object; zend_ce_weakmap->get_iterator = zend_weakmap_get_iterator; + zend_ce_weakmap->default_object_handlers = &zend_weakmap_handlers; memcpy(&zend_weakmap_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zend_weakmap_handlers.offset = XtOffsetOf(zend_weakmap, std); diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 18b0bce90d3b8..3d3260aee82f7 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -782,6 +782,7 @@ PHP_MINIT_FUNCTION(dom) dom_xpath_class_entry = register_class_DOMXPath(); dom_xpath_class_entry->create_object = dom_xpath_objects_new; + dom_xpath_class_entry->default_object_handlers = &dom_xpath_object_handlers; zend_hash_init(&dom_xpath_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1); dom_register_prop_handler(&dom_xpath_prop_handlers, "document", sizeof("document")-1, dom_xpath_document_read, NULL); @@ -989,7 +990,6 @@ zend_object *dom_xpath_objects_new(zend_class_entry *class_type) intern->register_node_ns = 1; intern->dom.prop_handler = &dom_xpath_prop_handlers; - intern->dom.std.handlers = &dom_xpath_object_handlers; zend_object_std_init(&intern->dom.std, class_type); object_properties_init(&intern->dom.std, class_type); From 800c6672e57a01d68dcaba36f8f7d65c6871aafc Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 24 Aug 2022 18:38:27 +0200 Subject: [PATCH 1207/1346] Fix compilation on MacOS memrchr has an always available equivalent under the name of zend_memrchr. Signed-off-by: Bob Weinand --- ext/spl/spl_array.c | 8 +++----- ext/spl/spl_dllist.c | 4 +--- ext/spl/spl_fixedarray.c | 2 +- ext/spl/spl_heap.c | 4 ++-- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 991fa88ded64a..4098382c61c17 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -177,11 +177,7 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o } while (parent) { - if (parent == spl_ce_ArrayIterator || parent == spl_ce_RecursiveArrayIterator) { - intern->std.handlers = &spl_handler_ArrayIterator; - break; - } else if (parent == spl_ce_ArrayObject) { - intern->std.handlers = &spl_handler_ArrayObject; + if (parent == spl_ce_ArrayIterator || parent == spl_ce_RecursiveArrayIterator || parent == spl_ce_ArrayObject) { break; } parent = parent->parent; @@ -1781,6 +1777,7 @@ PHP_MINIT_FUNCTION(spl_array) { spl_ce_ArrayObject = register_class_ArrayObject(zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable); spl_ce_ArrayObject->create_object = spl_array_object_new; + spl_ce_ArrayObject->default_object_handlers = &spl_handler_ArrayObject; memcpy(&spl_handler_ArrayObject, &std_object_handlers, sizeof(zend_object_handlers)); @@ -1806,6 +1803,7 @@ PHP_MINIT_FUNCTION(spl_array) spl_ce_ArrayIterator = register_class_ArrayIterator(spl_ce_SeekableIterator, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable); spl_ce_ArrayIterator->create_object = spl_array_object_new; + spl_ce_ArrayIterator->default_object_handlers = &spl_handler_ArrayIterator; spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 186b9a34c7efa..a3c17d59668c0 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -344,14 +344,11 @@ static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zend_ while (parent) { if (parent == spl_ce_SplStack) { intern->flags |= (SPL_DLLIST_IT_FIX | SPL_DLLIST_IT_LIFO); - intern->std.handlers = &spl_handler_SplDoublyLinkedList; } else if (parent == spl_ce_SplQueue) { intern->flags |= SPL_DLLIST_IT_FIX; - intern->std.handlers = &spl_handler_SplDoublyLinkedList; } if (parent == spl_ce_SplDoublyLinkedList) { - intern->std.handlers = &spl_handler_SplDoublyLinkedList; break; } @@ -1257,6 +1254,7 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */ zend_ce_iterator, zend_ce_countable, zend_ce_arrayaccess, zend_ce_serializable ); spl_ce_SplDoublyLinkedList->create_object = spl_dllist_object_new; + spl_ce_SplDoublyLinkedList->default_object_handlers = &spl_handler_SplDoublyLinkedList; spl_ce_SplDoublyLinkedList->get_iterator = spl_dllist_get_iterator; memcpy(&spl_handler_SplDoublyLinkedList, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index a00bb8965af65..5c013408ea9f2 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -282,7 +282,6 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z while (parent) { if (parent == spl_ce_SplFixedArray) { - intern->std.handlers = &spl_handler_SplFixedArray; break; } @@ -959,6 +958,7 @@ PHP_MINIT_FUNCTION(spl_fixedarray) spl_ce_SplFixedArray = register_class_SplFixedArray( zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_countable, php_json_serializable_ce); spl_ce_SplFixedArray->create_object = spl_fixedarray_new; + spl_ce_SplFixedArray->default_object_handlers = &spl_handler_SplFixedArray; spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator; memcpy(&spl_handler_SplFixedArray, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index db35511f08d2d..64fe962ee2de3 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -428,7 +428,6 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zend_ob while (parent) { if (parent == spl_ce_SplPriorityQueue) { intern->heap = spl_ptr_heap_init(spl_ptr_pqueue_elem_cmp, spl_ptr_heap_pqueue_elem_ctor, spl_ptr_heap_pqueue_elem_dtor, sizeof(spl_pqueue_elem)); - intern->std.handlers = &spl_handler_SplPriorityQueue; intern->flags = SPL_PQUEUE_EXTR_DATA; break; } @@ -438,7 +437,6 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zend_ob intern->heap = spl_ptr_heap_init( parent == spl_ce_SplMinHeap ? spl_ptr_heap_zval_min_cmp : spl_ptr_heap_zval_max_cmp, spl_ptr_heap_zval_ctor, spl_ptr_heap_zval_dtor, sizeof(zval)); - intern->std.handlers = &spl_handler_SplHeap; break; } @@ -1129,6 +1127,7 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ { spl_ce_SplHeap = register_class_SplHeap(zend_ce_iterator, zend_ce_countable); spl_ce_SplHeap->create_object = spl_heap_object_new; + spl_ce_SplHeap->default_object_handlers = &spl_handler_SplHeap; spl_ce_SplHeap->get_iterator = spl_heap_get_iterator; memcpy(&spl_handler_SplHeap, &std_object_handlers, sizeof(zend_object_handlers)); @@ -1149,6 +1148,7 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ spl_ce_SplPriorityQueue = register_class_SplPriorityQueue(zend_ce_iterator, zend_ce_countable); spl_ce_SplPriorityQueue->create_object = spl_heap_object_new; + spl_ce_SplPriorityQueue->default_object_handlers = &spl_handler_SplPriorityQueue; spl_ce_SplPriorityQueue->get_iterator = spl_pqueue_get_iterator; memcpy(&spl_handler_SplPriorityQueue, &std_object_handlers, sizeof(zend_object_handlers)); From 94ee4f9834743ca74f6c9653863273277ce6c61a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 24 Aug 2022 18:41:34 +0200 Subject: [PATCH 1208/1346] Port all internally used classes to use default_object_handlers Signed-off-by: Bob Weinand --- Zend/zend_inheritance.c | 1 + Zend/zend_iterators.c | 2 +- ext/com_dotnet/com_extension.c | 4 ++++ ext/com_dotnet/com_handlers.c | 1 - ext/com_dotnet/com_misc.c | 2 -- ext/com_dotnet/com_persist.c | 2 +- ext/com_dotnet/com_saproxy.c | 1 - ext/com_dotnet/php_com_dotnet_internal.h | 1 + ext/curl/interface.c | 2 +- ext/curl/multi.c | 6 ++--- ext/curl/share.c | 6 ++--- ext/date/php_date.c | 10 ++++----- ext/dom/php_dom.c | 4 ++-- ext/enchant/enchant.c | 4 ++-- ext/ffi/ffi.c | 9 ++++---- ext/fileinfo/fileinfo.c | 2 +- ext/gd/gd.c | 2 +- ext/gmp/gmp.c | 2 +- .../breakiterator/breakiterator_class.cpp | 3 +-- ext/intl/calendar/calendar_class.cpp | 4 +--- ext/intl/collator/collator_class.c | 3 +-- ext/intl/common/common_enum.cpp | 3 +-- ext/intl/converter/converter.c | 2 +- ext/intl/dateformat/dateformat_class.c | 3 +-- .../dateformat/datepatterngenerator_class.cpp | 3 +-- ext/intl/formatter/formatter_class.c | 3 +-- ext/intl/msgformat/msgformat_class.c | 3 +-- .../resourcebundle/resourcebundle_class.c | 3 +-- ext/intl/spoofchecker/spoofchecker_class.c | 3 +-- ext/intl/timezone/timezone_class.cpp | 3 +-- .../transliterator/transliterator_class.c | 3 +-- ext/ldap/ldap.c | 6 ++--- ext/openssl/openssl.c | 6 ++--- ext/pdo/pdo_dbh.c | 3 +-- ext/pdo/pdo_stmt.c | 6 ++--- ext/pgsql/pgsql.c | 6 ++--- ext/random/random.c | 3 +-- ext/reflection/php_reflection.c | 22 ++++++++++++++++++- ext/shmop/shmop.c | 2 +- ext/simplexml/simplexml.c | 2 +- ext/snmp/snmp.c | 3 +-- ext/soap/soap.c | 2 +- ext/sockets/sockets.c | 4 ++-- ext/spl/spl_directory.c | 19 +++++----------- ext/spl/spl_iterators.c | 4 ++-- ext/spl/spl_observer.c | 4 ++-- ext/sqlite3/sqlite3.c | 9 +++----- ext/sysvmsg/sysvmsg.c | 2 +- ext/sysvsem/sysvsem.c | 2 +- ext/sysvshm/sysvshm.c | 2 +- ext/xml/xml.c | 2 +- ext/xmlreader/php_xmlreader.c | 2 +- ext/xmlwriter/php_xmlwriter.c | 2 +- ext/xsl/php_xsl.c | 2 +- ext/zend_test/fiber.c | 2 +- ext/zip/php_zip.c | 2 +- ext/zlib/zlib.c | 4 ++-- 57 files changed, 108 insertions(+), 115 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 3eaaca3409a78..0dbdaa2b35ec4 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1472,6 +1472,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par zend_string_release_ex(ce->parent_name, 0); } ce->parent = parent_ce; + ce->default_object_handlers = parent_ce->default_object_handlers; ce->ce_flags |= ZEND_ACC_RESOLVED_PARENT; /* Inherit properties */ diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index aa4391f2caa99..f67033b11161c 100644 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -57,6 +57,7 @@ static const zend_object_handlers iterator_object_handlers = { ZEND_API void zend_register_iterator_wrapper(void) { INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL); + zend_iterator_class_entry.default_object_handlers = &iterator_object_handlers; } static void iter_wrapper_free(zend_object *object) @@ -83,7 +84,6 @@ static HashTable *iter_wrapper_get_gc(zend_object *object, zval **table, int *n) ZEND_API void zend_iterator_init(zend_object_iterator *iter) { zend_object_std_init(&iter->std, &zend_iterator_class_entry); - iter->std.handlers = &iterator_object_handlers; } ZEND_API void zend_iterator_dtor(zend_object_iterator *iter) diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index 95361a4b9a9ed..fcf9b3bd95ced 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -184,18 +184,22 @@ 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->default_object_handlers = &php_com_saproxy_handlers; php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get; php_com_variant_class_entry = register_class_variant(); + php_com_variant_class_entry->default_object_handlers = &php_com_object_handlers; php_com_variant_class_entry->create_object = php_com_object_new; php_com_variant_class_entry->get_iterator = php_com_iter_get; tmp = register_class_com(php_com_variant_class_entry); + tmp->default_object_handlers = &php_com_object_handlers; tmp->create_object = php_com_object_new; tmp->get_iterator = php_com_iter_get; #if HAVE_MSCOREE_H tmp = register_class_dotnet(php_com_variant_class_entry); + tmp->default_object_handlers = &php_com_object_handlers; tmp->create_object = php_com_object_new; tmp->get_iterator = php_com_iter_get; #endif diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index db96118ea31c6..0c73d8c4a3a72 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -627,7 +627,6 @@ zend_object* php_com_object_new(zend_class_entry *ce) obj->ce = ce; zend_object_std_init(&obj->zo, ce); - obj->zo.handlers = &php_com_object_handlers; obj->typeinfo = NULL; diff --git a/ext/com_dotnet/com_misc.c b/ext/com_dotnet/com_misc.c index b2920ddba62c2..39d245b7d01a7 100644 --- a/ext/com_dotnet/com_misc.c +++ b/ext/com_dotnet/com_misc.c @@ -61,7 +61,6 @@ PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp, IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo); zend_object_std_init(&obj->zo, php_com_variant_class_entry); - obj->zo.handlers = &php_com_object_handlers; ZVAL_OBJ(z, &obj->zo); } @@ -85,7 +84,6 @@ PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, } zend_object_std_init(&obj->zo, php_com_variant_class_entry); - obj->zo.handlers = &php_com_object_handlers; ZVAL_OBJ(z, &obj->zo); } diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c index ec5271c908c6b..ececdd87aaba8 100644 --- a/ext/com_dotnet/com_persist.c +++ b/ext/com_dotnet/com_persist.c @@ -709,7 +709,6 @@ static zend_object* helper_new(zend_class_entry *ce) memset(helper, 0, sizeof(*helper)); zend_object_std_init(&helper->std, helper_ce); - helper->std.handlers = &helper_handlers; return &helper->std; } @@ -722,6 +721,7 @@ void php_com_persist_minit(INIT_FUNC_ARGS) helper_ce = register_class_COMPersistHelper(); helper_ce->create_object = helper_new; + helper_ce->default_object_handlers = &helper_handlers; le_istream = zend_register_list_destructors_ex(istream_dtor, NULL, "com_dotnet_istream_wrapper", module_number); diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index 6ad4680c0fe65..c99a622070ec2 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -440,7 +440,6 @@ void php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *inde ZVAL_DUP(&proxy->indices[proxy->dimensions-1], index); zend_object_std_init(&proxy->std, php_com_saproxy_class_entry); - proxy->std.handlers = &php_com_saproxy_handlers; ZVAL_OBJ(proxy_out, &proxy->std); } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index d09db6a13bc82..18982e56ccfa0 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -78,6 +78,7 @@ void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable); /* com_saproxy.c */ 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; /* com_olechar.c */ PHP_COM_DOTNET_API zend_string *php_com_olestring_to_string(OLECHAR *olestring, int codepage); diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 66f19f0def72a..e1da59a6c16da 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -398,6 +398,7 @@ PHP_MINIT_FUNCTION(curl) curl_ce = register_class_CurlHandle(); curl_ce->create_object = curl_create_object; + curl_ce->default_object_handlers = &curl_object_handlers; memcpy(&curl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_object_handlers.offset = XtOffsetOf(php_curl, std); @@ -426,7 +427,6 @@ static zend_object *curl_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &curl_object_handlers; return &intern->std; } diff --git a/ext/curl/multi.c b/ext/curl/multi.c index fb8f08ccdbaa4..4998a2ffa365b 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -512,14 +512,11 @@ PHP_FUNCTION(curl_multi_setopt) /* CurlMultiHandle class */ -static zend_object_handlers curl_multi_handlers; - static zend_object *curl_multi_create_object(zend_class_entry *class_type) { php_curlm *intern = zend_object_alloc(sizeof(php_curlm), class_type); zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &curl_multi_handlers; return &intern->std; } @@ -582,8 +579,11 @@ static HashTable *curl_multi_get_gc(zend_object *object, zval **table, int *n) return zend_std_get_properties(object); } +static zend_object_handlers curl_multi_handlers; + void curl_multi_register_handlers(void) { curl_multi_ce->create_object = curl_multi_create_object; + curl_multi_ce->default_object_handlers = &curl_multi_handlers; memcpy(&curl_multi_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_multi_handlers.offset = XtOffsetOf(php_curlm, std); diff --git a/ext/curl/share.c b/ext/curl/share.c index 7f65cb4a27a94..f30790250e0ca 100644 --- a/ext/curl/share.c +++ b/ext/curl/share.c @@ -136,14 +136,11 @@ PHP_FUNCTION(curl_share_strerror) /* CurlShareHandle class */ -static zend_object_handlers curl_share_handlers; - static zend_object *curl_share_create_object(zend_class_entry *class_type) { php_curlsh *intern = zend_object_alloc(sizeof(php_curlsh), class_type); zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &curl_share_handlers; return &intern->std; } @@ -161,8 +158,11 @@ void curl_share_free_obj(zend_object *object) zend_object_std_dtor(&sh->std); } +static zend_object_handlers curl_share_handlers; + void curl_share_register_handlers(void) { curl_share_ce->create_object = curl_share_create_object; + curl_share_ce->default_object_handlers = &curl_share_handlers; memcpy(&curl_share_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_share_handlers.offset = XtOffsetOf(php_curlsh, std); diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 229d9890251e6..c64ef6afe112a 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1722,6 +1722,7 @@ static void date_register_classes(void) /* {{{ */ date_ce_date = register_class_DateTime(date_ce_interface); date_ce_date->create_object = date_object_new_date; + date_ce_date->default_object_handlers = &date_object_handlers_date; memcpy(&date_object_handlers_date, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_date.offset = XtOffsetOf(php_date_obj, std); date_object_handlers_date.free_obj = date_object_free_storage_date; @@ -1732,6 +1733,7 @@ static void date_register_classes(void) /* {{{ */ date_ce_immutable = register_class_DateTimeImmutable(date_ce_interface); date_ce_immutable->create_object = date_object_new_date; + date_ce_immutable->default_object_handlers = &date_object_handlers_date; memcpy(&date_object_handlers_immutable, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_immutable.clone_obj = date_object_clone_date; date_object_handlers_immutable.compare = date_object_compare_date; @@ -1740,6 +1742,7 @@ static void date_register_classes(void) /* {{{ */ date_ce_timezone = register_class_DateTimeZone(); date_ce_timezone->create_object = date_object_new_timezone; + date_ce_timezone->default_object_handlers = &date_object_handlers_timezone; memcpy(&date_object_handlers_timezone, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_timezone.offset = XtOffsetOf(php_timezone_obj, std); date_object_handlers_timezone.free_obj = date_object_free_storage_timezone; @@ -1751,6 +1754,7 @@ static void date_register_classes(void) /* {{{ */ date_ce_interval = register_class_DateInterval(); date_ce_interval->create_object = date_object_new_interval; + date_ce_interval->default_object_handlers = &date_object_handlers_interval; memcpy(&date_object_handlers_interval, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std); date_object_handlers_interval.free_obj = date_object_free_storage_interval; @@ -1765,6 +1769,7 @@ static void date_register_classes(void) /* {{{ */ date_ce_period = register_class_DatePeriod(zend_ce_aggregate); date_ce_period->create_object = date_object_new_period; + date_ce_period->default_object_handlers = &date_object_handlers_period; date_ce_period->get_iterator = date_object_period_get_iterator; memcpy(&date_object_handlers_period, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_period.offset = XtOffsetOf(php_period_obj, std); @@ -1782,7 +1787,6 @@ static zend_object *date_object_new_date(zend_class_entry *class_type) /* {{{ */ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &date_object_handlers_date; return &intern->std; } /* }}} */ @@ -1923,7 +1927,6 @@ static zend_object *date_object_new_timezone(zend_class_entry *class_type) /* {{ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &date_object_handlers_timezone; return &intern->std; } /* }}} */ @@ -2076,7 +2079,6 @@ static zend_object *date_object_new_interval(zend_class_entry *class_type) /* {{ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &date_object_handlers_interval; return &intern->std; } /* }}} */ @@ -2169,8 +2171,6 @@ static zend_object *date_object_new_period(zend_class_entry *class_type) /* {{{ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &date_object_handlers_period; - return &intern->std; } /* }}} */ diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 3d3260aee82f7..d9463012f146b 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -660,6 +660,7 @@ PHP_MINIT_FUNCTION(dom) dom_nodelist_class_entry = register_class_DOMNodeList(zend_ce_aggregate, zend_ce_countable); dom_nodelist_class_entry->create_object = dom_nnodemap_objects_new; + dom_nodelist_class_entry->default_object_handlers = &dom_nnodemap_object_handlers; dom_nodelist_class_entry->get_iterator = php_dom_get_iterator; zend_hash_init(&dom_nodelist_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1); @@ -668,6 +669,7 @@ PHP_MINIT_FUNCTION(dom) dom_namednodemap_class_entry = register_class_DOMNamedNodeMap(zend_ce_aggregate, zend_ce_countable); dom_namednodemap_class_entry->create_object = dom_nnodemap_objects_new; + dom_namednodemap_class_entry->default_object_handlers = &dom_nnodemap_object_handlers; dom_namednodemap_class_entry->get_iterator = php_dom_get_iterator; zend_hash_init(&dom_namednodemap_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1); @@ -1039,8 +1041,6 @@ zend_object *dom_nnodemap_objects_new(zend_class_entry *class_type) /* {{{ */ objmap->local = NULL; objmap->ns = NULL; - intern->std.handlers = &dom_nnodemap_object_handlers; - return &intern->std; } /* }}} */ diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 2ddf5f041003e..5c209705d776b 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -61,7 +61,6 @@ static zend_object *enchant_broker_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &enchant_broker_handlers; return &intern->std; } @@ -80,7 +79,6 @@ static zend_object *enchant_dict_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &enchant_dict_handlers; return &intern->std; } @@ -191,6 +189,7 @@ PHP_MINIT_FUNCTION(enchant) { enchant_broker_ce = register_class_EnchantBroker(); enchant_broker_ce->create_object = enchant_broker_create_object; + enchant_broker_ce->default_object_handlers = &enchant_broker_handlers; memcpy(&enchant_broker_handlers, &std_object_handlers, sizeof(zend_object_handlers)); enchant_broker_handlers.offset = XtOffsetOf(enchant_broker, std); @@ -200,6 +199,7 @@ PHP_MINIT_FUNCTION(enchant) enchant_dict_ce = register_class_EnchantDictionary(); enchant_dict_ce->create_object = enchant_dict_create_object; + enchant_dict_ce->default_object_handlers = &enchant_dict_handlers; memcpy(&enchant_dict_handlers, &std_object_handlers, sizeof(zend_object_handlers)); enchant_dict_handlers.offset = XtOffsetOf(enchant_dict, std); diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index ac1aabc4f6656..edad7465f8cfa 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -234,6 +234,7 @@ static zend_always_inline void zend_ffi_object_init(zend_object *object, zend_cl GC_SET_REFCOUNT(object, 1); GC_TYPE_INFO(object) = GC_OBJECT | (IS_OBJ_DESTRUCTOR_CALLED << GC_FLAGS_SHIFT); object->ce = ce; + object->handlers = ce->default_object_handlers; object->properties = NULL; zend_objects_store_put(object); } @@ -246,7 +247,6 @@ static zend_object *zend_ffi_cdata_new(zend_class_entry *class_type) /* {{{ */ cdata = emalloc(sizeof(zend_ffi_cdata)); zend_ffi_object_init(&cdata->std, class_type); - cdata->std.handlers = &zend_ffi_cdata_handlers; cdata->type = NULL; cdata->ptr = NULL; @@ -495,7 +495,6 @@ static zend_never_inline zend_ffi_cdata *zend_ffi_cdata_to_zval_slow_ptr(void *p zend_ffi_cdata *cdata = emalloc(sizeof(zend_ffi_cdata)); zend_ffi_object_init(&cdata->std, zend_ffi_cdata_ce); - cdata->std.handlers = &zend_ffi_cdata_handlers; cdata->type = type; cdata->flags = flags; cdata->ptr = (void*)&cdata->ptr_holder; @@ -2174,7 +2173,6 @@ static zend_object *zend_ffi_ctype_new(zend_class_entry *class_type) /* {{{ */ ctype = emalloc(sizeof(zend_ffi_ctype)); zend_ffi_object_init(&ctype->std, class_type); - ctype->std.handlers = &zend_ffi_ctype_handlers; ctype->type = NULL; @@ -2261,7 +2259,6 @@ static zend_object *zend_ffi_new(zend_class_entry *class_type) /* {{{ */ ffi = emalloc(sizeof(zend_ffi)); zend_ffi_object_init(&ffi->std, class_type); - ffi->std.handlers = &zend_ffi_handlers; ffi->lib = NULL; ffi->symbols = NULL; @@ -2473,7 +2470,6 @@ static zval *zend_ffi_read_var(zend_object *obj, zend_string *var_name, int read cdata = emalloc(sizeof(zend_ffi_cdata)); zend_ffi_object_init(&cdata->std, zend_ffi_cdata_ce); - cdata->std.handlers = &zend_ffi_cdata_handlers; cdata->type = ZEND_FFI_TYPE_MAKE_OWNED(new_type); cdata->flags = ZEND_FFI_FLAG_CONST; cdata->ptr_holder = sym->addr; @@ -5305,6 +5301,7 @@ ZEND_MINIT_FUNCTION(ffi) zend_ffi_ce = register_class_FFI(); zend_ffi_ce->create_object = zend_ffi_new; + zend_ffi_ce->default_object_handlers = &zend_ffi_handlers; memcpy(&zend_ffi_new_fn, zend_hash_str_find_ptr(&zend_ffi_ce->function_table, "new", sizeof("new")-1), sizeof(zend_internal_function)); zend_ffi_new_fn.fn_flags &= ~ZEND_ACC_STATIC; @@ -5336,6 +5333,7 @@ ZEND_MINIT_FUNCTION(ffi) zend_ffi_cdata_ce = register_class_FFI_CData(); zend_ffi_cdata_ce->create_object = zend_ffi_cdata_new; + zend_ffi_cdata_ce->default_object_handlers = &zend_ffi_cdata_handlers; zend_ffi_cdata_ce->get_iterator = zend_ffi_cdata_get_iterator; memcpy(&zend_ffi_cdata_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); @@ -5410,6 +5408,7 @@ ZEND_MINIT_FUNCTION(ffi) zend_ffi_ctype_ce = register_class_FFI_CType(); zend_ffi_ctype_ce->create_object = zend_ffi_ctype_new; + zend_ffi_ctype_ce->default_object_handlers = &zend_ffi_ctype_handlers; memcpy(&zend_ffi_ctype_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zend_ffi_ctype_handlers.get_constructor = zend_fake_get_constructor; diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c index 8163884577ad6..90af9baa3d08a 100644 --- a/ext/fileinfo/fileinfo.c +++ b/ext/fileinfo/fileinfo.c @@ -89,7 +89,6 @@ PHP_FILEINFO_API zend_object *finfo_objects_new(zend_class_entry *class_type) zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &finfo_object_handlers; return &intern->zo; } @@ -108,6 +107,7 @@ PHP_MINIT_FUNCTION(finfo) { finfo_class_entry = register_class_finfo(); finfo_class_entry->create_object = finfo_objects_new; + finfo_class_entry->default_object_handlers = &finfo_object_handlers; /* copy the standard object handlers to you handler table */ memcpy(&finfo_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/gd/gd.c b/ext/gd/gd.c index cdfaaeedaeb7f..31e8fd9eb0872 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -177,7 +177,6 @@ zend_object *php_gd_image_object_create(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &php_gd_image_object_handlers; return &intern->std; } @@ -207,6 +206,7 @@ static void php_gd_object_minit_helper(void) { gd_image_ce = register_class_GdImage(); gd_image_ce->create_object = php_gd_image_object_create; + gd_image_ce->default_object_handlers = &php_gd_image_object_handlers; /* setting up the object handlers for the GdImage class */ memcpy(&php_gd_image_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index fff4e9293d18f..b6b31cbdcad52 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -256,7 +256,6 @@ static inline zend_object *gmp_create_object_ex(zend_class_entry *ce, mpz_ptr *g mpz_init(intern->num); *gmpnum_target = intern->num; - intern->std.handlers = &gmp_object_handlers; return &intern->std; } @@ -533,6 +532,7 @@ ZEND_MINIT_FUNCTION(gmp) { gmp_ce = register_class_GMP(); gmp_ce->create_object = gmp_create_object; + gmp_ce->default_object_handlers = &gmp_object_handlers; gmp_ce->serialize = gmp_serialize; gmp_ce->unserialize = gmp_unserialize; diff --git a/ext/intl/breakiterator/breakiterator_class.cpp b/ext/intl/breakiterator/breakiterator_class.cpp index 761fcfcfccc65..d4dec4f31d7a5 100644 --- a/ext/intl/breakiterator/breakiterator_class.cpp +++ b/ext/intl/breakiterator/breakiterator_class.cpp @@ -209,8 +209,6 @@ static zend_object *BreakIterator_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); breakiterator_object_init(intern); - intern->zo.handlers = &BreakIterator_handlers; - return &intern->zo; } /* }}} */ @@ -224,6 +222,7 @@ U_CFUNC void breakiterator_register_BreakIterator_class(void) BreakIterator_ce_ptr = register_class_IntlBreakIterator(zend_ce_aggregate); BreakIterator_ce_ptr->create_object = BreakIterator_object_create; + BreakIterator_ce_ptr->default_object_handlers = &BreakIterator_handlers; BreakIterator_ce_ptr->get_iterator = _breakiterator_get_iterator; memcpy(&BreakIterator_handlers, &std_object_handlers, diff --git a/ext/intl/calendar/calendar_class.cpp b/ext/intl/calendar/calendar_class.cpp index f114c9b0fe57c..8a2c7904a2d26 100644 --- a/ext/intl/calendar/calendar_class.cpp +++ b/ext/intl/calendar/calendar_class.cpp @@ -256,9 +256,6 @@ static zend_object *Calendar_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); calendar_object_init(intern); - - intern->zo.handlers = &Calendar_handlers; - return &intern->zo; } /* }}} */ @@ -270,6 +267,7 @@ void calendar_register_IntlCalendar_class(void) { /* Create and register 'IntlCalendar' class. */ Calendar_ce_ptr = register_class_IntlCalendar(); + Calendar_ce_ptr->default_object_handlers = &Calendar_handlers; Calendar_ce_ptr->create_object = Calendar_object_create; memcpy( &Calendar_handlers, &std_object_handlers, diff --git a/ext/intl/collator/collator_class.c b/ext/intl/collator/collator_class.c index 709691123ed35..db974b8748ec6 100644 --- a/ext/intl/collator/collator_class.c +++ b/ext/intl/collator/collator_class.c @@ -50,8 +50,6 @@ zend_object *Collator_object_create(zend_class_entry *ce ) zend_object_std_init(&intern->zo, ce ); object_properties_init(&intern->zo, ce); - intern->zo.handlers = &Collator_handlers; - return &intern->zo; } /* }}} */ @@ -70,6 +68,7 @@ void collator_register_Collator_symbols(int module_number) /* Create and register 'Collator' class. */ Collator_ce_ptr = register_class_Collator(); Collator_ce_ptr->create_object = Collator_object_create; + Collator_ce_ptr->default_object_handlers = &Collator_handlers; memcpy(&Collator_handlers, &std_object_handlers, sizeof Collator_handlers); diff --git a/ext/intl/common/common_enum.cpp b/ext/intl/common/common_enum.cpp index e0ddce7bfa5b0..874c748d58b70 100644 --- a/ext/intl/common/common_enum.cpp +++ b/ext/intl/common/common_enum.cpp @@ -200,8 +200,6 @@ static zend_object *IntlIterator_object_create(zend_class_entry *ce) intern->iterator = NULL; - intern->zo.handlers = &IntlIterator_handlers; - return &intern->zo; } @@ -287,6 +285,7 @@ U_CFUNC void intl_register_common_symbols(int module_number) /* Create and register 'IntlIterator' class. */ IntlIterator_ce_ptr = register_class_IntlIterator(zend_ce_iterator); IntlIterator_ce_ptr->create_object = IntlIterator_object_create; + IntlIterator_ce_ptr->default_object_handlers = &IntlIterator_handlers; IntlIterator_ce_ptr->get_iterator = IntlIterator_get_iterator; memcpy(&IntlIterator_handlers, &std_object_handlers, diff --git a/ext/intl/converter/converter.c b/ext/intl/converter/converter.c index 04a34e207cce1..6f65cfc2eea69 100644 --- a/ext/intl/converter/converter.c +++ b/ext/intl/converter/converter.c @@ -911,7 +911,6 @@ static zend_object *php_converter_object_ctor(zend_class_entry *ce, php_converte object_properties_init(&objval->obj, ce); intl_error_init(&(objval->error)); - objval->obj.handlers = &php_converter_object_handlers; *pobjval = objval; return &objval->obj; @@ -973,6 +972,7 @@ static zend_object *php_converter_clone_object(zend_object *object) { int php_converter_minit(INIT_FUNC_ARGS) { php_converter_ce = register_class_UConverter(); php_converter_ce->create_object = php_converter_create_object; + php_converter_ce->default_object_handlers = &php_converter_object_handlers; memcpy(&php_converter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_converter_object_handlers.offset = XtOffsetOf(php_converter_object, obj); php_converter_object_handlers.clone_obj = php_converter_clone_object; diff --git a/ext/intl/dateformat/dateformat_class.c b/ext/intl/dateformat/dateformat_class.c index c020d69d5976f..f547640efbb0c 100644 --- a/ext/intl/dateformat/dateformat_class.c +++ b/ext/intl/dateformat/dateformat_class.c @@ -57,8 +57,6 @@ zend_object *IntlDateFormatter_object_create(zend_class_entry *ce) intern->calendar = -1; intern->requested_locale = NULL; - intern->zo.handlers = &IntlDateFormatter_handlers; - return &intern->zo; } /* }}} */ @@ -104,6 +102,7 @@ void dateformat_register_IntlDateFormatter_class( void ) /* Create and register 'IntlDateFormatter' class. */ IntlDateFormatter_ce_ptr = register_class_IntlDateFormatter(); IntlDateFormatter_ce_ptr->create_object = IntlDateFormatter_object_create; + IntlDateFormatter_ce_ptr->default_object_handlers = &IntlDateFormatter_handlers; memcpy(&IntlDateFormatter_handlers, &std_object_handlers, sizeof IntlDateFormatter_handlers); diff --git a/ext/intl/dateformat/datepatterngenerator_class.cpp b/ext/intl/dateformat/datepatterngenerator_class.cpp index 4c567beb1a206..c77398deb983f 100644 --- a/ext/intl/dateformat/datepatterngenerator_class.cpp +++ b/ext/intl/dateformat/datepatterngenerator_class.cpp @@ -98,8 +98,6 @@ static zend_object *IntlDatePatternGenerator_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); IntlDatePatternGenerator_object_init(intern); - intern->zo.handlers = &IntlDatePatternGenerator_handlers; - return &intern->zo; } @@ -115,6 +113,7 @@ void dateformat_register_IntlDatePatternGenerator_class( void ) /* Create and register 'IntlDatePatternGenerator' class. */ IntlDatePatternGenerator_ce_ptr = register_class_IntlDatePatternGenerator(); IntlDatePatternGenerator_ce_ptr->create_object = IntlDatePatternGenerator_object_create; + IntlDatePatternGenerator_ce_ptr->default_object_handlers = &IntlDatePatternGenerator_handlers; memcpy(&IntlDatePatternGenerator_handlers, &std_object_handlers, sizeof IntlDatePatternGenerator_handlers); diff --git a/ext/intl/formatter/formatter_class.c b/ext/intl/formatter/formatter_class.c index ce71f43a816a2..0c2d8e418153d 100644 --- a/ext/intl/formatter/formatter_class.c +++ b/ext/intl/formatter/formatter_class.c @@ -51,8 +51,6 @@ zend_object *NumberFormatter_object_create(zend_class_entry *ce) zend_object_std_init( &intern->zo, ce ); object_properties_init(&intern->zo, ce); - intern->zo.handlers = &NumberFormatter_handlers; - return &intern->zo; } /* }}} */ @@ -99,6 +97,7 @@ void formatter_register_class( void ) /* Create and register 'NumberFormatter' class. */ NumberFormatter_ce_ptr = register_class_NumberFormatter(); NumberFormatter_ce_ptr->create_object = NumberFormatter_object_create; + NumberFormatter_ce_ptr->default_object_handlers = &NumberFormatter_handlers; memcpy(&NumberFormatter_handlers, &std_object_handlers, sizeof(NumberFormatter_handlers)); diff --git a/ext/intl/msgformat/msgformat_class.c b/ext/intl/msgformat/msgformat_class.c index 3d7241b0da58e..57378f19bb010 100644 --- a/ext/intl/msgformat/msgformat_class.c +++ b/ext/intl/msgformat/msgformat_class.c @@ -49,8 +49,6 @@ zend_object *MessageFormatter_object_create(zend_class_entry *ce) zend_object_std_init( &intern->zo, ce ); object_properties_init(&intern->zo, ce); - intern->zo.handlers = &MessageFormatter_handlers; - return &intern->zo; } /* }}} */ @@ -98,6 +96,7 @@ void msgformat_register_class( void ) /* Create and register 'MessageFormatter' class. */ MessageFormatter_ce_ptr = register_class_MessageFormatter(); MessageFormatter_ce_ptr->create_object = MessageFormatter_object_create; + MessageFormatter_ce_ptr->default_object_handlers = &MessageFormatter_handlers; memcpy(&MessageFormatter_handlers, &std_object_handlers, sizeof MessageFormatter_handlers); diff --git a/ext/intl/resourcebundle/resourcebundle_class.c b/ext/intl/resourcebundle/resourcebundle_class.c index 5e1e9e5312e29..9e86b41e761a2 100644 --- a/ext/intl/resourcebundle/resourcebundle_class.c +++ b/ext/intl/resourcebundle/resourcebundle_class.c @@ -67,8 +67,6 @@ static zend_object *ResourceBundle_object_create( zend_class_entry *ce ) rb->me = NULL; rb->child = NULL; - rb->zend.handlers = &ResourceBundle_object_handlers; - return &rb->zend; } /* }}} */ @@ -375,6 +373,7 @@ void resourcebundle_register_class( void ) { ResourceBundle_ce_ptr = register_class_ResourceBundle(zend_ce_aggregate, zend_ce_countable); ResourceBundle_ce_ptr->create_object = ResourceBundle_object_create; + ResourceBundle_ce_ptr->default_object_handlers = &ResourceBundle_object_handlers; ResourceBundle_ce_ptr->get_iterator = resourcebundle_get_iterator; ResourceBundle_object_handlers = std_object_handlers; diff --git a/ext/intl/spoofchecker/spoofchecker_class.c b/ext/intl/spoofchecker/spoofchecker_class.c index ed343ec1bed01..176917ed4edec 100644 --- a/ext/intl/spoofchecker/spoofchecker_class.c +++ b/ext/intl/spoofchecker/spoofchecker_class.c @@ -47,8 +47,6 @@ zend_object *Spoofchecker_object_create(zend_class_entry *ce) zend_object_std_init(&intern->zo, ce); object_properties_init(&intern->zo, ce); - intern->zo.handlers = &Spoofchecker_handlers; - return &intern->zo; } /* }}} */ @@ -93,6 +91,7 @@ void spoofchecker_register_Spoofchecker_class(void) /* Create and register 'Spoofchecker' class. */ Spoofchecker_ce_ptr = register_class_Spoofchecker(); Spoofchecker_ce_ptr->create_object = Spoofchecker_object_create; + Spoofchecker_ce_ptr->default_object_handlers = &Spoofchecker_handlers; memcpy(&Spoofchecker_handlers, &std_object_handlers, sizeof Spoofchecker_handlers); diff --git a/ext/intl/timezone/timezone_class.cpp b/ext/intl/timezone/timezone_class.cpp index 559086365ceb8..df1da4c021daa 100644 --- a/ext/intl/timezone/timezone_class.cpp +++ b/ext/intl/timezone/timezone_class.cpp @@ -377,8 +377,6 @@ static zend_object *TimeZone_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); TimeZone_object_init(intern); - intern->zo.handlers = &TimeZone_handlers; - return &intern->zo; } /* }}} */ @@ -391,6 +389,7 @@ U_CFUNC void timezone_register_IntlTimeZone_class(void) /* Create and register 'IntlTimeZone' class. */ TimeZone_ce_ptr = register_class_IntlTimeZone(); TimeZone_ce_ptr->create_object = TimeZone_object_create; + TimeZone_ce_ptr->default_object_handlers = &TimeZone_handlers; memcpy(&TimeZone_handlers, &std_object_handlers, sizeof TimeZone_handlers); diff --git a/ext/intl/transliterator/transliterator_class.c b/ext/intl/transliterator/transliterator_class.c index 552505e19c9a0..78c6d562d2f93 100644 --- a/ext/intl/transliterator/transliterator_class.c +++ b/ext/intl/transliterator/transliterator_class.c @@ -117,8 +117,6 @@ static zend_object *Transliterator_object_create( zend_class_entry *ce ) object_properties_init( &intern->zo, ce ); transliterator_object_init( intern ); - intern->zo.handlers = &Transliterator_handlers; - return &intern->zo; } /* }}} */ @@ -184,6 +182,7 @@ void transliterator_register_Transliterator_class( void ) /* Create and register 'Transliterator' class. */ Transliterator_ce_ptr = register_class_Transliterator(); Transliterator_ce_ptr->create_object = Transliterator_object_create; + Transliterator_ce_ptr->default_object_handlers = &Transliterator_handlers; memcpy( &Transliterator_handlers, &std_object_handlers, sizeof Transliterator_handlers ); Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo); Transliterator_handlers.free_obj = Transliterator_objects_free; diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index b8fb4274215ff..ecd94c2da509e 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -115,7 +115,6 @@ static zend_object *ldap_link_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &ldap_link_object_handlers; return &intern->std; } @@ -161,7 +160,6 @@ static zend_object *ldap_result_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &ldap_result_object_handlers; return &intern->std; } @@ -199,7 +197,6 @@ static zend_object *ldap_result_entry_create_object(zend_class_entry *class_type zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &ldap_result_entry_object_handlers; return &intern->std; } @@ -828,6 +825,7 @@ PHP_MINIT_FUNCTION(ldap) ldap_link_ce = register_class_LDAP_Connection(); ldap_link_ce->create_object = ldap_link_create_object; + ldap_link_ce->default_object_handlers = &ldap_link_object_handlers; memcpy(&ldap_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); ldap_link_object_handlers.offset = XtOffsetOf(ldap_linkdata, std); @@ -838,6 +836,7 @@ PHP_MINIT_FUNCTION(ldap) ldap_result_ce = register_class_LDAP_Result(); ldap_result_ce->create_object = ldap_result_create_object; + ldap_result_ce->default_object_handlers = &ldap_result_object_handlers; memcpy(&ldap_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); ldap_result_object_handlers.offset = XtOffsetOf(ldap_resultdata, std); @@ -848,6 +847,7 @@ PHP_MINIT_FUNCTION(ldap) ldap_result_entry_ce = register_class_LDAP_ResultEntry(); ldap_result_entry_ce->create_object = ldap_result_entry_create_object; + ldap_result_entry_ce->default_object_handlers = &ldap_result_entry_object_handlers; memcpy(&ldap_result_entry_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); ldap_result_entry_object_handlers.offset = XtOffsetOf(ldap_result_entry, std); diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 2ea54dd455ab5..6d10fef971988 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -144,7 +144,6 @@ static zend_object *php_openssl_certificate_create_object(zend_class_entry *clas zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &php_openssl_certificate_object_handlers; return &intern->std; } @@ -184,7 +183,6 @@ static zend_object *php_openssl_request_create_object(zend_class_entry *class_ty zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &php_openssl_request_object_handlers; return &intern->std; } @@ -225,7 +223,6 @@ static zend_object *php_openssl_pkey_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &php_openssl_pkey_object_handlers; return &intern->std; } @@ -1190,6 +1187,7 @@ PHP_MINIT_FUNCTION(openssl) php_openssl_certificate_ce = register_class_OpenSSLCertificate(); php_openssl_certificate_ce->create_object = php_openssl_certificate_create_object; + php_openssl_certificate_ce->default_object_handlers = &php_openssl_certificate_object_handlers; memcpy(&php_openssl_certificate_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_openssl_certificate_object_handlers.offset = XtOffsetOf(php_openssl_certificate_object, std); @@ -1200,6 +1198,7 @@ PHP_MINIT_FUNCTION(openssl) php_openssl_request_ce = register_class_OpenSSLCertificateSigningRequest(); php_openssl_request_ce->create_object = php_openssl_request_create_object; + php_openssl_request_ce->default_object_handlers = &php_openssl_request_object_handlers; memcpy(&php_openssl_request_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_openssl_request_object_handlers.offset = XtOffsetOf(php_openssl_request_object, std); @@ -1210,6 +1209,7 @@ PHP_MINIT_FUNCTION(openssl) php_openssl_pkey_ce = register_class_OpenSSLAsymmetricKey(); php_openssl_pkey_ce->create_object = php_openssl_pkey_create_object; + php_openssl_pkey_ce->default_object_handlers = &php_openssl_pkey_object_handlers; memcpy(&php_openssl_pkey_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_openssl_pkey_object_handlers.offset = XtOffsetOf(php_openssl_pkey_object, std); diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 26d4e9bf85870..1f291def5b835 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1333,6 +1333,7 @@ void pdo_dbh_init(int module_number) { pdo_dbh_ce = register_class_PDO(); pdo_dbh_ce->create_object = pdo_dbh_new; + pdo_dbh_ce->default_object_handlers = &pdo_dbh_object_handlers; memcpy(&pdo_dbh_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pdo_dbh_object_handlers.offset = XtOffsetOf(pdo_dbh_object_t, std); @@ -1419,8 +1420,6 @@ zend_object *pdo_dbh_new(zend_class_entry *ce) dbh->inner = ecalloc(1, sizeof(pdo_dbh_t)); dbh->inner->def_stmt_ce = pdo_dbstmt_ce; - dbh->std.handlers = &pdo_dbh_object_handlers; - return &dbh->std; } diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 453933607f38e..65f0900075af0 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -218,7 +218,6 @@ static void get_lazy_object(pdo_stmt_t *stmt, zval *return_value) /* {{{ */ row->stmt = stmt; zend_object_std_init(&row->std, pdo_row_ce); ZVAL_OBJ(&stmt->lazy_object_ref, &row->std); - row->std.handlers = &pdo_row_object_handlers; GC_ADDREF(&stmt->std); GC_DELREF(&row->std); } @@ -2137,8 +2136,6 @@ zend_object *pdo_dbstmt_new(zend_class_entry *ce) zend_object_std_init(&stmt->std, ce); object_properties_init(&stmt->std, ce); - stmt->std.handlers = &pdo_dbstmt_object_handlers; - return &stmt->std; } /* }}} */ @@ -2464,7 +2461,6 @@ zend_object *pdo_row_new(zend_class_entry *ce) { pdo_row_t *row = ecalloc(1, sizeof(pdo_row_t)); zend_object_std_init(&row->std, ce); - row->std.handlers = &pdo_row_object_handlers; return &row->std; } @@ -2474,6 +2470,7 @@ void pdo_stmt_init(void) pdo_dbstmt_ce = register_class_PDOStatement(zend_ce_aggregate); pdo_dbstmt_ce->get_iterator = pdo_stmt_iter_get; pdo_dbstmt_ce->create_object = pdo_dbstmt_new; + pdo_dbstmt_ce->default_object_handlers = &pdo_dbstmt_object_handlers; memcpy(&pdo_dbstmt_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pdo_dbstmt_object_handlers.offset = XtOffsetOf(pdo_stmt_t, std); @@ -2486,6 +2483,7 @@ void pdo_stmt_init(void) pdo_row_ce = register_class_PDORow(); pdo_row_ce->create_object = pdo_row_new; + pdo_row_ce->default_object_handlers = &pdo_row_object_handlers; memcpy(&pdo_row_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pdo_row_object_handlers.free_obj = pdo_row_free_storage; diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index b5c4b77ad3f71..94b53df711f1c 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -157,7 +157,6 @@ static zend_object *pgsql_link_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &pgsql_link_object_handlers; return &intern->std; } @@ -213,7 +212,6 @@ static zend_object *pgsql_result_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &pgsql_result_object_handlers; return &intern->std; } @@ -251,7 +249,6 @@ static zend_object *pgsql_lob_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &pgsql_lob_object_handlers; return &intern->std; } @@ -440,6 +437,7 @@ PHP_MINIT_FUNCTION(pgsql) pgsql_link_ce = register_class_PgSql_Connection(); pgsql_link_ce->create_object = pgsql_link_create_object; + pgsql_link_ce->default_object_handlers = &pgsql_link_object_handlers; memcpy(&pgsql_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pgsql_link_object_handlers.offset = XtOffsetOf(pgsql_link_handle, std); @@ -450,6 +448,7 @@ PHP_MINIT_FUNCTION(pgsql) pgsql_result_ce = register_class_PgSql_Result(); pgsql_result_ce->create_object = pgsql_result_create_object; + pgsql_result_ce->default_object_handlers = &pgsql_result_object_handlers; memcpy(&pgsql_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pgsql_result_object_handlers.offset = XtOffsetOf(pgsql_result_handle, std); @@ -460,6 +459,7 @@ PHP_MINIT_FUNCTION(pgsql) pgsql_lob_ce = register_class_PgSql_Lob(); pgsql_lob_ce->create_object = pgsql_lob_create_object; + pgsql_lob_ce->default_object_handlers = &pgsql_lob_object_handlers; memcpy(&pgsql_lob_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pgsql_lob_object_handlers.offset = XtOffsetOf(pgLofp, std); diff --git a/ext/random/random.c b/ext/random/random.c index 2380a83b75890..5afc7680d7ddd 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -227,8 +227,6 @@ static zend_object *php_random_randomizer_new(zend_class_entry *ce) zend_object_std_init(&randomizer->std, ce); object_properties_init(&randomizer->std, ce); - randomizer->std.handlers = &random_randomizer_object_handlers; - return &randomizer->std; } @@ -880,6 +878,7 @@ PHP_MINIT_FUNCTION(random) /* Random\Randomizer */ random_ce_Random_Randomizer = register_class_Random_Randomizer(); random_ce_Random_Randomizer->create_object = php_random_randomizer_new; + random_ce_Random_Randomizer->default_object_handlers = &random_randomizer_object_handlers; memcpy(&random_randomizer_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); random_randomizer_object_handlers.offset = XtOffsetOf(php_random_randomizer, std); random_randomizer_object_handlers.free_obj = randomizer_free_obj; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index fef531292b564..b97e271aa4901 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -283,7 +283,6 @@ static zend_object *reflection_objects_new(zend_class_entry *class_type) /* {{{ zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &reflection_object_handlers; return &intern->zo; } /* }}} */ @@ -7127,67 +7126,88 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */ reflector_ptr = register_class_Reflector(zend_ce_stringable); reflection_function_abstract_ptr = register_class_ReflectionFunctionAbstract(reflector_ptr); + reflection_function_abstract_ptr->default_object_handlers = &reflection_object_handlers; reflection_function_abstract_ptr->create_object = reflection_objects_new; reflection_function_ptr = register_class_ReflectionFunction(reflection_function_abstract_ptr); reflection_function_ptr->create_object = reflection_objects_new; + reflection_function_ptr->default_object_handlers = &reflection_object_handlers; reflection_generator_ptr = register_class_ReflectionGenerator(); reflection_generator_ptr->create_object = reflection_objects_new; + reflection_generator_ptr->default_object_handlers = &reflection_object_handlers; reflection_parameter_ptr = register_class_ReflectionParameter(reflector_ptr); reflection_parameter_ptr->create_object = reflection_objects_new; + reflection_parameter_ptr->default_object_handlers = &reflection_object_handlers; reflection_type_ptr = register_class_ReflectionType(zend_ce_stringable); reflection_type_ptr->create_object = reflection_objects_new; + reflection_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_named_type_ptr = register_class_ReflectionNamedType(reflection_type_ptr); reflection_named_type_ptr->create_object = reflection_objects_new; + reflection_named_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_union_type_ptr = register_class_ReflectionUnionType(reflection_type_ptr); reflection_union_type_ptr->create_object = reflection_objects_new; + reflection_union_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_intersection_type_ptr = register_class_ReflectionIntersectionType(reflection_type_ptr); reflection_intersection_type_ptr->create_object = reflection_objects_new; + reflection_intersection_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_method_ptr = register_class_ReflectionMethod(reflection_function_abstract_ptr); reflection_method_ptr->create_object = reflection_objects_new; + reflection_method_ptr->default_object_handlers = &reflection_object_handlers; reflection_class_ptr = register_class_ReflectionClass(reflector_ptr); reflection_class_ptr->create_object = reflection_objects_new; + reflection_class_ptr->default_object_handlers = &reflection_object_handlers; reflection_object_ptr = register_class_ReflectionObject(reflection_class_ptr); reflection_object_ptr->create_object = reflection_objects_new; + reflection_object_ptr->default_object_handlers = &reflection_object_handlers; reflection_property_ptr = register_class_ReflectionProperty(reflector_ptr); reflection_property_ptr->create_object = reflection_objects_new; + reflection_property_ptr->default_object_handlers = &reflection_object_handlers; reflection_class_constant_ptr = register_class_ReflectionClassConstant(reflector_ptr); reflection_class_constant_ptr->create_object = reflection_objects_new; + reflection_class_constant_ptr->default_object_handlers = &reflection_object_handlers; reflection_extension_ptr = register_class_ReflectionExtension(reflector_ptr); reflection_extension_ptr->create_object = reflection_objects_new; + reflection_extension_ptr->default_object_handlers = &reflection_object_handlers; reflection_zend_extension_ptr = register_class_ReflectionZendExtension(reflector_ptr); reflection_zend_extension_ptr->create_object = reflection_objects_new; + reflection_zend_extension_ptr->default_object_handlers = &reflection_object_handlers; reflection_reference_ptr = register_class_ReflectionReference(); reflection_reference_ptr->create_object = reflection_objects_new; + reflection_reference_ptr->default_object_handlers = &reflection_object_handlers; reflection_attribute_ptr = register_class_ReflectionAttribute(reflector_ptr); reflection_attribute_ptr->create_object = reflection_objects_new; + reflection_attribute_ptr->default_object_handlers = &reflection_object_handlers; reflection_enum_ptr = register_class_ReflectionEnum(reflection_class_ptr); reflection_enum_ptr->create_object = reflection_objects_new; + reflection_enum_ptr->default_object_handlers = &reflection_object_handlers; reflection_enum_unit_case_ptr = register_class_ReflectionEnumUnitCase(reflection_class_constant_ptr); reflection_enum_unit_case_ptr->create_object = reflection_objects_new; + reflection_enum_unit_case_ptr->default_object_handlers = &reflection_object_handlers; reflection_enum_backed_case_ptr = register_class_ReflectionEnumBackedCase(reflection_enum_unit_case_ptr); reflection_enum_backed_case_ptr->create_object = reflection_objects_new; + reflection_enum_backed_case_ptr->default_object_handlers = &reflection_object_handlers; reflection_fiber_ptr = register_class_ReflectionFiber(); reflection_fiber_ptr->create_object = reflection_objects_new; + reflection_fiber_ptr->default_object_handlers = &reflection_object_handlers; REFLECTION_G(key_initialized) = 0; diff --git a/ext/shmop/shmop.c b/ext/shmop/shmop.c index ce810a782391e..be4f57ad27162 100644 --- a/ext/shmop/shmop.c +++ b/ext/shmop/shmop.c @@ -84,7 +84,6 @@ static zend_object *shmop_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &shmop_object_handlers; return &intern->std; } @@ -109,6 +108,7 @@ PHP_MINIT_FUNCTION(shmop) { shmop_ce = register_class_Shmop(); shmop_ce->create_object = shmop_create_object; + shmop_ce->default_object_handlers = &shmop_object_handlers; memcpy(&shmop_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); shmop_object_handlers.offset = XtOffsetOf(php_shmop, std); diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 763886730158b..20537989d0711 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -2222,7 +2222,6 @@ static php_sxe_object* php_sxe_object_new(zend_class_entry *ce, zend_function *f zend_object_std_init(&intern->zo, ce); object_properties_init(&intern->zo, ce); - intern->zo.handlers = &sxe_object_handlers; return intern; } @@ -2673,6 +2672,7 @@ PHP_MINIT_FUNCTION(simplexml) { sxe_class_entry = register_class_SimpleXMLElement(zend_ce_stringable, zend_ce_countable, spl_ce_RecursiveIterator); sxe_class_entry->create_object = sxe_object_new; + sxe_class_entry->default_object_handlers = &sxe_object_handlers; sxe_class_entry->get_iterator = php_sxe_get_iterator; memcpy(&sxe_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 299d2d8fd08c8..6c7a6f42e968c 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -185,8 +185,6 @@ static zend_object *php_snmp_object_new(zend_class_entry *class_type) /* {{{ */ zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &php_snmp_object_handlers; - return &intern->zo; } @@ -2024,6 +2022,7 @@ PHP_MINIT_FUNCTION(snmp) /* Register SNMP Class */ php_snmp_ce = register_class_SNMP(); php_snmp_ce->create_object = php_snmp_object_new; + php_snmp_ce->default_object_handlers = &php_snmp_object_handlers; php_snmp_object_handlers.offset = XtOffsetOf(php_snmp_object, zo); php_snmp_object_handlers.clone_obj = NULL; php_snmp_object_handlers.free_obj = php_snmp_object_free_storage; diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 5d89825f91c30..a318ae896f4fd 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -194,7 +194,6 @@ static zend_object *soap_server_object_create(zend_class_entry *ce) soap_server_object *obj = zend_object_alloc(sizeof(soap_server_object), ce); zend_object_std_init(&obj->std, ce); object_properties_init(&obj->std, ce); - obj->std.handlers = &soap_server_object_handlers; return &obj->std; } @@ -407,6 +406,7 @@ PHP_MINIT_FUNCTION(soap) /* Register SoapServer class */ soap_server_class_entry = register_class_SoapServer(); soap_server_class_entry->create_object = soap_server_object_create; + soap_server_class_entry->default_object_handlers = &soap_server_object_handlers; memcpy(&soap_server_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); soap_server_object_handlers.offset = XtOffsetOf(soap_server_object, std); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index b54859ad4a20d..8dd8265d7341c 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -101,7 +101,6 @@ static zend_object *socket_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &socket_object_handlers; intern->bsd_socket = -1; /* invalid socket */ intern->type = PF_UNSPEC; @@ -163,7 +162,6 @@ static zend_object *address_info_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &address_info_object_handlers; return &intern->std; } @@ -428,6 +426,7 @@ static PHP_MINIT_FUNCTION(sockets) socket_ce = register_class_Socket(); socket_ce->create_object = socket_create_object; + socket_ce->default_object_handlers = &socket_object_handlers; memcpy(&socket_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); socket_object_handlers.offset = XtOffsetOf(php_socket, std); @@ -439,6 +438,7 @@ static PHP_MINIT_FUNCTION(sockets) address_info_ce = register_class_AddressInfo(); address_info_ce->create_object = address_info_create_object; + address_info_ce->default_object_handlers = &address_info_object_handlers; memcpy(&address_info_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); address_info_object_handlers.offset = XtOffsetOf(php_addrinfo, std); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index c8cd8f684d406..ff840e6ad3619 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -199,7 +199,6 @@ static zend_object *spl_filesystem_object_new_ex(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &spl_filesystem_object_handlers; return &intern->std; } @@ -213,15 +212,6 @@ static zend_object *spl_filesystem_object_new(zend_class_entry *class_type) } /* }}} */ -/* {{{ spl_filesystem_object_new_check */ -static zend_object *spl_filesystem_object_new_check(zend_class_entry *class_type) -{ - spl_filesystem_object *ret = spl_filesystem_from_obj(spl_filesystem_object_new_ex(class_type)); - ret->std.handlers = &spl_filesystem_object_check_handlers; - return &ret->std; -} -/* }}} */ - PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern) /* {{{ */ { #ifdef HAVE_GLOB @@ -2756,6 +2746,7 @@ PHP_MINIT_FUNCTION(spl_directory) { spl_ce_SplFileInfo = register_class_SplFileInfo(zend_ce_stringable); spl_ce_SplFileInfo->create_object = spl_filesystem_object_new; + spl_ce_SplFileInfo->default_object_handlers = &spl_filesystem_object_handlers; memcpy(&spl_filesystem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); spl_filesystem_object_handlers.offset = XtOffsetOf(spl_filesystem_object, std); @@ -2781,14 +2772,16 @@ PHP_MINIT_FUNCTION(spl_directory) #ifdef HAVE_GLOB spl_ce_GlobIterator = register_class_GlobIterator(spl_ce_FilesystemIterator, zend_ce_countable); - spl_ce_GlobIterator->create_object = spl_filesystem_object_new_check; + spl_ce_GlobIterator->create_object = spl_filesystem_object_new; + spl_ce_GlobIterator->default_object_handlers = &spl_filesystem_object_check_handlers; #endif spl_ce_SplFileObject = register_class_SplFileObject(spl_ce_SplFileInfo, spl_ce_RecursiveIterator, spl_ce_SeekableIterator); - spl_ce_SplFileObject->create_object = spl_filesystem_object_new_check; + spl_ce_SplFileObject->default_object_handlers = &spl_filesystem_object_check_handlers; + spl_ce_SplFileObject->create_object = spl_filesystem_object_new; spl_ce_SplTempFileObject = register_class_SplTempFileObject(spl_ce_SplFileObject); - spl_ce_SplTempFileObject->create_object = spl_filesystem_object_new_check; + spl_ce_SplTempFileObject->create_object = spl_filesystem_object_new; return SUCCESS; } diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index ccbb871269b12..b468a0a5468f4 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1019,7 +1019,6 @@ static zend_object *spl_RecursiveIteratorIterator_new_ex(zend_class_entry *class zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &spl_handlers_rec_it_it; return &intern->std; } /* }}} */ @@ -2206,7 +2205,6 @@ static zend_object *spl_dual_it_new(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &spl_handlers_dual_it; return &intern->std; } /* }}} */ @@ -3261,6 +3259,7 @@ PHP_MINIT_FUNCTION(spl_iterators) spl_ce_RecursiveIteratorIterator = register_class_RecursiveIteratorIterator(spl_ce_OuterIterator); spl_ce_RecursiveIteratorIterator->create_object = spl_RecursiveIteratorIterator_new; + spl_ce_RecursiveIteratorIterator->default_object_handlers = &spl_handlers_rec_it_it; spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator; memcpy(&spl_handlers_rec_it_it, &std_object_handlers, sizeof(zend_object_handlers)); @@ -3279,6 +3278,7 @@ PHP_MINIT_FUNCTION(spl_iterators) spl_ce_IteratorIterator = register_class_IteratorIterator(spl_ce_OuterIterator); spl_ce_IteratorIterator->create_object = spl_dual_it_new; + spl_ce_IteratorIterator->default_object_handlers = &spl_handlers_dual_it; spl_ce_FilterIterator = register_class_FilterIterator(spl_ce_IteratorIterator); spl_ce_FilterIterator->create_object = spl_dual_it_new; diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index 339bd0b6e5d22..ce7852618f875 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -265,8 +265,6 @@ static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend zend_hash_init(&intern->storage, 0, NULL, spl_object_storage_dtor, 0); - intern->std.handlers = &spl_handler_SplObjectStorage; - while (parent) { if (parent == spl_ce_SplObjectStorage) { /* Possible optimization: Cache these results with a map from class entry to IS_NULL/IS_PTR. @@ -1329,6 +1327,7 @@ PHP_MINIT_FUNCTION(spl_observer) spl_ce_SplObjectStorage = register_class_SplObjectStorage(zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_arrayaccess); spl_ce_SplObjectStorage->create_object = spl_SplObjectStorage_new; + spl_ce_SplObjectStorage->default_object_handlers = &spl_handler_SplObjectStorage; memcpy(&spl_handler_SplObjectStorage, &std_object_handlers, sizeof(zend_object_handlers)); @@ -1344,6 +1343,7 @@ PHP_MINIT_FUNCTION(spl_observer) spl_ce_MultipleIterator = register_class_MultipleIterator(zend_ce_iterator); spl_ce_MultipleIterator->create_object = spl_SplObjectStorage_new; + spl_ce_MultipleIterator->default_object_handlers = &spl_handler_SplObjectStorage; return SUCCESS; } diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index 4b9119d79cd35..03dc225d22d39 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -2298,8 +2298,6 @@ static zend_object *php_sqlite3_object_new(zend_class_entry *class_type) /* {{{ zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &sqlite3_object_handlers; - return &intern->zo; } /* }}} */ @@ -2314,8 +2312,6 @@ static zend_object *php_sqlite3_stmt_object_new(zend_class_entry *class_type) /* zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &sqlite3_stmt_object_handlers; - return &intern->zo; } /* }}} */ @@ -2330,8 +2326,6 @@ static zend_object *php_sqlite3_result_object_new(zend_class_entry *class_type) zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &sqlite3_result_object_handlers; - return &intern->zo; } /* }}} */ @@ -2373,6 +2367,7 @@ PHP_MINIT_FUNCTION(sqlite3) sqlite3_object_handlers.free_obj = php_sqlite3_object_free_storage; php_sqlite3_sc_entry = register_class_SQLite3(); php_sqlite3_sc_entry->create_object = php_sqlite3_object_new; + php_sqlite3_sc_entry->default_object_handlers = &sqlite3_object_handlers; /* Register SQLite 3 Prepared Statement Class */ sqlite3_stmt_object_handlers.offset = XtOffsetOf(php_sqlite3_stmt, zo); @@ -2380,6 +2375,7 @@ PHP_MINIT_FUNCTION(sqlite3) sqlite3_stmt_object_handlers.free_obj = php_sqlite3_stmt_object_free_storage; php_sqlite3_stmt_entry = register_class_SQLite3Stmt(); php_sqlite3_stmt_entry->create_object = php_sqlite3_stmt_object_new; + php_sqlite3_stmt_entry->default_object_handlers = &sqlite3_stmt_object_handlers; /* Register SQLite 3 Result Class */ sqlite3_result_object_handlers.offset = XtOffsetOf(php_sqlite3_result, zo); @@ -2387,6 +2383,7 @@ PHP_MINIT_FUNCTION(sqlite3) sqlite3_result_object_handlers.free_obj = php_sqlite3_result_object_free_storage; php_sqlite3_result_entry = register_class_SQLite3Result(); php_sqlite3_result_entry->create_object = php_sqlite3_result_object_new; + php_sqlite3_result_entry->default_object_handlers = &sqlite3_result_object_handlers; REGISTER_INI_ENTRIES(); diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index d9146f6e78cc3..debb8b675b0c2 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -79,7 +79,6 @@ static zend_object *sysvmsg_queue_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &sysvmsg_queue_object_handlers; return &intern->std; } @@ -102,6 +101,7 @@ PHP_MINIT_FUNCTION(sysvmsg) { sysvmsg_queue_ce = register_class_SysvMessageQueue(); sysvmsg_queue_ce->create_object = sysvmsg_queue_create_object; + sysvmsg_queue_ce->default_object_handlers = &sysvmsg_queue_object_handlers; memcpy(&sysvmsg_queue_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); sysvmsg_queue_object_handlers.offset = XtOffsetOf(sysvmsg_queue_t, std); diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index 42fb1d96c6fb0..d9369dfa9f6f1 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -100,7 +100,6 @@ static zend_object *sysvsem_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &sysvsem_object_handlers; return &intern->std; } @@ -152,6 +151,7 @@ PHP_MINIT_FUNCTION(sysvsem) { sysvsem_ce = register_class_SysvSemaphore(); sysvsem_ce->create_object = sysvsem_create_object; + sysvsem_ce->default_object_handlers = &sysvsem_object_handlers; memcpy(&sysvsem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); sysvsem_object_handlers.offset = XtOffsetOf(sysvsem_sem, std); diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c index 717c75337bb66..bec3af680e0d1 100644 --- a/ext/sysvshm/sysvshm.c +++ b/ext/sysvshm/sysvshm.c @@ -47,7 +47,6 @@ static zend_object *sysvshm_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &sysvshm_object_handlers; return &intern->std; } @@ -101,6 +100,7 @@ PHP_MINIT_FUNCTION(sysvshm) { sysvshm_ce = register_class_SysvSharedMemory(); sysvshm_ce->create_object = sysvshm_create_object; + sysvshm_ce->default_object_handlers = &sysvshm_object_handlers; memcpy(&sysvshm_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); sysvshm_object_handlers.offset = XtOffsetOf(sysvshm_shm, std); diff --git a/ext/xml/xml.c b/ext/xml/xml.c index c3bfa37169b78..5d981c5326189 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -245,6 +245,7 @@ PHP_MINIT_FUNCTION(xml) { xml_parser_ce = register_class_XMLParser(); xml_parser_ce->create_object = xml_parser_create_object; + xml_parser_ce->default_object_handlers = &xml_parser_object_handlers; memcpy(&xml_parser_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); xml_parser_object_handlers.offset = XtOffsetOf(xml_parser, std); @@ -313,7 +314,6 @@ static zend_object *xml_parser_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &xml_parser_object_handlers; return &intern->std; } diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 729a1d2c7c3ad..76ca54d686359 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -368,7 +368,6 @@ zend_object *xmlreader_objects_new(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); intern->prop_handler = &xmlreader_prop_handlers; - intern->std.handlers = &xmlreader_object_handlers; return &intern->std; } @@ -1163,6 +1162,7 @@ PHP_MINIT_FUNCTION(xmlreader) xmlreader_class_entry = register_class_XMLReader(); xmlreader_class_entry->create_object = xmlreader_objects_new; + xmlreader_class_entry->default_object_handlers = &xmlreader_object_handlers; memcpy(&xmlreader_open_fn, zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "open", sizeof("open")-1), sizeof(zend_internal_function)); xmlreader_open_fn.fn_flags &= ~ZEND_ACC_STATIC; diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c index 8d4abb3d26b06..5944abf30a98b 100644 --- a/ext/xmlwriter/php_xmlwriter.c +++ b/ext/xmlwriter/php_xmlwriter.c @@ -82,7 +82,6 @@ static zend_object *xmlwriter_object_new(zend_class_entry *class_type) intern = zend_object_alloc(sizeof(ze_xmlwriter_object), class_type); zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &xmlwriter_object_handlers; return &intern->std; } @@ -1039,6 +1038,7 @@ static PHP_MINIT_FUNCTION(xmlwriter) xmlwriter_object_handlers.clone_obj = NULL; xmlwriter_class_entry_ce = register_class_XMLWriter(); xmlwriter_class_entry_ce->create_object = xmlwriter_object_new; + xmlwriter_class_entry_ce->default_object_handlers = &xmlwriter_object_handlers; return SUCCESS; } diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c index 0c9029c9601df..82e782d18f9d1 100644 --- a/ext/xsl/php_xsl.c +++ b/ext/xsl/php_xsl.c @@ -103,7 +103,6 @@ zend_object *xsl_objects_new(zend_class_entry *class_type) intern->parameter = zend_new_array(0); intern->registered_phpfunctions = zend_new_array(0); - intern->std.handlers = &xsl_object_handlers; return &intern->std; } /* }}} */ @@ -118,6 +117,7 @@ PHP_MINIT_FUNCTION(xsl) xsl_xsltprocessor_class_entry = register_class_XSLTProcessor(); xsl_xsltprocessor_class_entry->create_object = xsl_objects_new; + xsl_xsltprocessor_class_entry->default_object_handlers = &xsl_object_handlers; #ifdef HAVE_XSL_EXSLT exsltRegisterAll(); diff --git a/ext/zend_test/fiber.c b/ext/zend_test/fiber.c index 0254799e2bdb5..f67c0217d050f 100644 --- a/ext/zend_test/fiber.c +++ b/ext/zend_test/fiber.c @@ -150,7 +150,6 @@ static zend_object *zend_test_fiber_object_create(zend_class_entry *ce) memset(fiber, 0, sizeof(zend_test_fiber)); zend_object_std_init(&fiber->std, ce); - fiber->std.handlers = &zend_test_fiber_handlers; return &fiber->std; } @@ -344,6 +343,7 @@ void zend_test_fiber_init(void) { zend_test_fiber_class = register_class__ZendTestFiber(); zend_test_fiber_class->create_object = zend_test_fiber_object_create; + zend_test_fiber_class->default_object_handlers = &zend_test_fiber_handlers; zend_test_fiber_handlers = std_object_handlers; zend_test_fiber_handlers.dtor_obj = zend_test_fiber_object_destroy; diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 095fa23fe7746..10abf4447b083 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1075,7 +1075,6 @@ static zend_object *php_zip_object_new(zend_class_entry *class_type) /* {{{ */ intern->prop_handler = &zip_prop_handlers; zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); - intern->zo.handlers = &zip_object_handlers; intern->last_id = -1; return &intern->zo; @@ -3101,6 +3100,7 @@ static PHP_MINIT_FUNCTION(zip) zip_class_entry = register_class_ZipArchive(zend_ce_countable); zip_class_entry->create_object = php_zip_object_new; + zip_class_entry->default_object_handlers = &zip_object_handlers; zend_hash_init(&zip_prop_handlers, 0, NULL, php_zip_free_prop_handler, 1); php_zip_register_prop_handler(&zip_prop_handlers, "lastId", php_zip_last_id, NULL, IS_LONG); diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index d80db3194f0d8..134892a14f900 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -60,7 +60,6 @@ static zend_object *inflate_context_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &inflate_context_object_handlers; return &intern->std; } @@ -99,7 +98,6 @@ static zend_object *deflate_context_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); - intern->std.handlers = &deflate_context_object_handlers; return &intern->std; } @@ -1340,6 +1338,7 @@ static PHP_MINIT_FUNCTION(zlib) inflate_context_ce = register_class_InflateContext(); inflate_context_ce->create_object = inflate_context_create_object; + inflate_context_ce->default_object_handlers = &inflate_context_object_handlers; memcpy(&inflate_context_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); inflate_context_object_handlers.offset = XtOffsetOf(php_zlib_context, std); @@ -1350,6 +1349,7 @@ static PHP_MINIT_FUNCTION(zlib) deflate_context_ce = register_class_DeflateContext(); deflate_context_ce->create_object = deflate_context_create_object; + deflate_context_ce->default_object_handlers = &deflate_context_object_handlers; memcpy(&deflate_context_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); deflate_context_object_handlers.offset = XtOffsetOf(php_zlib_context, std); From f7d426cca697ed1e064ed7f8f5cd2a0b176aef6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Wed, 31 Aug 2022 19:22:39 +0200 Subject: [PATCH 1209/1346] Unify structure for ext/random's randomizer tests (#9410) * Unify structure for ext/random's engine tests (2) This makes adjustments that were missed in 2d6a883b3a1e5ee4f225dce64584ad2522e8e391. * Add `engines.inc` for ext/random tests * Unify structure for ext/random's randomizer tests --- .../tests/02_engine/all_serialize_native.phpt | 9 +- .../tests/02_engine/all_serialize_user.phpt | 27 ++-- .../pcgoneseq128xslrr64_jump_error.phpt | 2 +- .../tests/02_engine/user_compatibility.phpt | 23 ++- .../02_engine/xoshiro256starstar_seed.phpt | 12 +- ext/random/tests/03_randomizer/basic.phpt | 81 ---------- ...eys.phpt => compatibility_array_rand.phpt} | 22 ++- .../tests/03_randomizer/compatibility_mt.phpt | 24 --- .../03_randomizer/compatibility_mt_rand.phpt | 49 ++++++ .../03_randomizer/compatibility_user.phpt | 87 ++++------- .../tests/03_randomizer/construct_twice.phpt | 47 +++--- .../03_randomizer/engine_unsafe_biased.phpt | 58 +++++++ .../engine_unsafe_empty_string.phpt | 58 +++++++ .../03_randomizer/engine_unsafe_exits.phpt | 23 +++ .../03_randomizer/engine_unsafe_throws.phpt | 28 ++++ ext/random/tests/03_randomizer/get_bytes.phpt | 40 ----- .../tests/03_randomizer/get_int_user.phpt | 22 --- .../tests/03_randomizer/methods/getBytes.phpt | 47 ++++++ .../methods/getBytes_expansion.phpt | 43 ++++++ .../tests/03_randomizer/methods/getInt.phpt | 54 +++++++ .../methods/getInt_expansion_32.phpt | 25 ++++ .../methods/getInt_expansion_64.phpt | 27 ++++ .../getInt_gh9415.phpt} | 0 .../tests/03_randomizer/methods/nextInt.phpt | 50 +++++++ .../nextInt_64_engine_on_32_platform.phpt | 21 +++ .../03_randomizer/methods/pickArrayKeys.phpt | 84 +++++++++++ .../methods/pickArrayKeys_error.phpt | 49 ++++++ .../03_randomizer/methods/shuffleArray.phpt | 53 +++++++ .../03_randomizer/methods/shuffleBytes.phpt | 60 ++++++++ .../tests/03_randomizer/nextint_error.phpt | 18 --- .../03_randomizer/pick_array_keys_error.phpt | 52 ------- ext/random/tests/03_randomizer/readonly.phpt | 41 ++--- ext/random/tests/03_randomizer/serialize.phpt | 77 +++++----- .../03_randomizer/serialize_disallowed.phpt | 17 +++ .../tests/03_randomizer/user_exits.phpt | 19 --- .../tests/03_randomizer/user_throws.phpt | 24 --- .../tests/03_randomizer/user_unsafe.phpt | 141 ------------------ ext/random/tests/engines.inc | 74 +++++++++ 38 files changed, 965 insertions(+), 623 deletions(-) delete mode 100644 ext/random/tests/03_randomizer/basic.phpt rename ext/random/tests/03_randomizer/{pick_array_keys.phpt => compatibility_array_rand.phpt} (73%) delete mode 100644 ext/random/tests/03_randomizer/compatibility_mt.phpt create mode 100644 ext/random/tests/03_randomizer/compatibility_mt_rand.phpt create mode 100644 ext/random/tests/03_randomizer/engine_unsafe_biased.phpt create mode 100644 ext/random/tests/03_randomizer/engine_unsafe_empty_string.phpt create mode 100644 ext/random/tests/03_randomizer/engine_unsafe_exits.phpt create mode 100644 ext/random/tests/03_randomizer/engine_unsafe_throws.phpt delete mode 100644 ext/random/tests/03_randomizer/get_bytes.phpt delete mode 100644 ext/random/tests/03_randomizer/get_int_user.phpt create mode 100644 ext/random/tests/03_randomizer/methods/getBytes.phpt create mode 100644 ext/random/tests/03_randomizer/methods/getBytes_expansion.phpt create mode 100644 ext/random/tests/03_randomizer/methods/getInt.phpt create mode 100644 ext/random/tests/03_randomizer/methods/getInt_expansion_32.phpt create mode 100644 ext/random/tests/03_randomizer/methods/getInt_expansion_64.phpt rename ext/random/tests/03_randomizer/{gh9415.phpt => methods/getInt_gh9415.phpt} (100%) create mode 100644 ext/random/tests/03_randomizer/methods/nextInt.phpt create mode 100644 ext/random/tests/03_randomizer/methods/nextInt_64_engine_on_32_platform.phpt create mode 100644 ext/random/tests/03_randomizer/methods/pickArrayKeys.phpt create mode 100644 ext/random/tests/03_randomizer/methods/pickArrayKeys_error.phpt create mode 100644 ext/random/tests/03_randomizer/methods/shuffleArray.phpt create mode 100644 ext/random/tests/03_randomizer/methods/shuffleBytes.phpt delete mode 100644 ext/random/tests/03_randomizer/nextint_error.phpt delete mode 100644 ext/random/tests/03_randomizer/pick_array_keys_error.phpt create mode 100644 ext/random/tests/03_randomizer/serialize_disallowed.phpt delete mode 100644 ext/random/tests/03_randomizer/user_exits.phpt delete mode 100644 ext/random/tests/03_randomizer/user_throws.phpt delete mode 100644 ext/random/tests/03_randomizer/user_unsafe.phpt create mode 100644 ext/random/tests/engines.inc diff --git a/ext/random/tests/02_engine/all_serialize_native.phpt b/ext/random/tests/02_engine/all_serialize_native.phpt index df56456d1338d..cadb208a66422 100644 --- a/ext/random/tests/02_engine/all_serialize_native.phpt +++ b/ext/random/tests/02_engine/all_serialize_native.phpt @@ -13,6 +13,8 @@ $engines[] = new PcgOneseq128XslRr64(1234); $engines[] = new Xoshiro256StarStar(1234); foreach ($engines as $engine) { + echo $engine::class, PHP_EOL; + for ($i = 0; $i < 10_000; $i++) { $engine->generate(); } @@ -21,9 +23,7 @@ foreach ($engines as $engine) { for ($i = 0; $i < 10_000; $i++) { if ($engine->generate() !== $engine2->generate()) { - $className = $engine::class; - - die("failure: {$className} at {$i}"); + die("failure: state differs at {$i}"); } } } @@ -32,4 +32,7 @@ die('success'); ?> --EXPECT-- +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar success diff --git a/ext/random/tests/02_engine/all_serialize_user.phpt b/ext/random/tests/02_engine/all_serialize_user.phpt index de3fe2f8292aa..9ae742314f5af 100644 --- a/ext/random/tests/02_engine/all_serialize_user.phpt +++ b/ext/random/tests/02_engine/all_serialize_user.phpt @@ -4,18 +4,11 @@ Random: Engine: Serialization of user engines must preserve the sequence count); - } -} +require __DIR__ . "/../engines.inc"; -final class User32 implements Engine +final class CountingEngine32 implements Engine { private int $count = 0; @@ -26,12 +19,12 @@ final class User32 implements Engine } $engines = []; -if (PHP_INT_SIZE >= 8) { - $engines[] = new User64(); -} -$engines[] = new User32(); +$engines[] = new CountingEngine32(); +$engines[] = new TestShaEngine(); foreach ($engines as $engine) { + echo $engine::class, PHP_EOL; + for ($i = 0; $i < 10_000; $i++) { $engine->generate(); } @@ -40,9 +33,7 @@ foreach ($engines as $engine) { for ($i = 0; $i < 10_000; $i++) { if ($engine->generate() !== $engine2->generate()) { - $className = $engine::class; - - die("failure: {$className} at {$i}"); + die("failure: state differs at {$i}"); } } } @@ -51,4 +42,6 @@ die('success'); ?> --EXPECT-- +CountingEngine32 +Random\Engine\Test\TestShaEngine success diff --git a/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt b/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt index 02be8ecb6c92f..cbc6e370b1733 100644 --- a/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt +++ b/ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt @@ -16,7 +16,7 @@ try { for ($i = 0; $i < 10_000; $i++) { if ($engine->generate() !== $referenceEngine->generate()) { - die('failure: state changed'); + die("failure: state differs at {$i}"); } } diff --git a/ext/random/tests/02_engine/user_compatibility.phpt b/ext/random/tests/02_engine/user_compatibility.phpt index 11ac451431204..401541e7141b0 100644 --- a/ext/random/tests/02_engine/user_compatibility.phpt +++ b/ext/random/tests/02_engine/user_compatibility.phpt @@ -6,19 +6,10 @@ Random: Engine: Native engines can be wrapped without changing their sequence use Random\Engine; use Random\Engine\Mt19937; use Random\Engine\PcgOneseq128XslRr64; +use Random\Engine\Test\TestWrapperEngine; use Random\Engine\Xoshiro256StarStar; -class WrapperEngine implements Engine -{ - public function __construct(private readonly Engine $engine) - { - } - - public function generate(): string - { - return $this->engine->generate(); - } -} +require __DIR__ . "/../engines.inc"; $engines = []; $engines[] = new Mt19937(1234); @@ -26,13 +17,14 @@ $engines[] = new PcgOneseq128XslRr64(1234); $engines[] = new Xoshiro256StarStar(1234); foreach ($engines as $engine) { + echo $engine::class, PHP_EOL; + $native_engine = clone $engine; - $user_engine = new WrapperEngine(clone $engine); + $user_engine = new TestWrapperEngine(clone $engine); for ($i = 0; $i < 10_000; $i++) { if ($native_engine->generate() !== $user_engine->generate()) { - $className = $engine::class; - die("failure: {$className} at {$i}"); + die("failure: state differs at {$i}"); } } } @@ -41,4 +33,7 @@ die('success'); ?> --EXPECT-- +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar success diff --git a/ext/random/tests/02_engine/xoshiro256starstar_seed.phpt b/ext/random/tests/02_engine/xoshiro256starstar_seed.phpt index f4fa0a40b9898..ec31c358fd68e 100644 --- a/ext/random/tests/02_engine/xoshiro256starstar_seed.phpt +++ b/ext/random/tests/02_engine/xoshiro256starstar_seed.phpt @@ -6,17 +6,17 @@ Random: Engine: Xoshiro256StarStar: The seed parameter must work as expected use Random\Engine\Xoshiro256StarStar; echo "Random integer seed", PHP_EOL; -$engine = new Xoshiro256StarStar(\random_int(\PHP_INT_MIN, \PHP_INT_MAX)); +$engine = new Xoshiro256StarStar(random_int(PHP_INT_MIN, PHP_INT_MAX)); echo PHP_EOL, PHP_EOL; echo "Random string seed", PHP_EOL; -$engine = new Xoshiro256StarStar(\random_bytes(32)); +$engine = new Xoshiro256StarStar(random_bytes(32)); echo PHP_EOL, PHP_EOL; echo "Invalid data type", PHP_EOL; try { $engine = new Xoshiro256StarStar(1.0); -} catch (\Throwable $e) { +} catch (Throwable $e) { echo $e->getMessage(), PHP_EOL; } echo PHP_EOL, PHP_EOL; @@ -24,15 +24,15 @@ echo PHP_EOL, PHP_EOL; echo "Invalid string seed length", PHP_EOL; try { $engine = new Xoshiro256StarStar('foobar'); -} catch (\Throwable $e) { +} catch (Throwable $e) { echo $e->getMessage(), PHP_EOL; } echo PHP_EOL, PHP_EOL; echo "Null seed", PHP_EOL; try { - $engine = new Random\Engine\Xoshiro256StarStar(\str_repeat("\x00", 32)); -} catch (\Throwable $e) { + $engine = new Xoshiro256StarStar(str_repeat("\x00", 32)); +} catch (Throwable $e) { echo $e->getMessage(), PHP_EOL; } echo PHP_EOL, PHP_EOL; diff --git a/ext/random/tests/03_randomizer/basic.phpt b/ext/random/tests/03_randomizer/basic.phpt deleted file mode 100644 index a2f6378a71eb1..0000000000000 --- a/ext/random/tests/03_randomizer/basic.phpt +++ /dev/null @@ -1,81 +0,0 @@ ---TEST-- -Random: Randomizer: basic ---FILE-- -nextInt(); - } catch (\Random\RandomException $e) { - if ($e->getMessage() !== 'Generated value exceeds size of int') { - die($engine::class . ": nextInt: failure: {$e->getMessage()}"); - } - } - } - - // getInt - for ($i = 0; $i < 1000; $i++) { - $result = $randomizer->getInt(-50, 50); - if ($result > 50 || $result < -50) { - die($engine::class . ': getInt: failure'); - } - } - - // getBytes - for ($i = 0; $i < 1000; $i++) { - $length = \random_int(1, 1024); - if (\strlen($randomizer->getBytes($length)) !== $length) { - die($engine::class . ': getBytes: failure'); - } - } - - // shuffleArray - $array = range(1, 1000); - $shuffled_array = $randomizer->shuffleArray($array); - (function () use ($array, $shuffled_array): void { - for ($i = 0; $i < count($array); $i++) { - if ($array[$i] !== $shuffled_array[$i]) { - return; - } - } - - die($engine::class . ': shuffleArray: failure'); - })(); - - // shuffleBytes - $string = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; - $shuffled_string = $randomizer->shuffleBytes($string); - if ($string === $shuffled_string) { - die($engine::class . ': shuffleBytes: failure'); - } -} - -die('success'); -?> ---EXPECTF-- -success diff --git a/ext/random/tests/03_randomizer/pick_array_keys.phpt b/ext/random/tests/03_randomizer/compatibility_array_rand.phpt similarity index 73% rename from ext/random/tests/03_randomizer/pick_array_keys.phpt rename to ext/random/tests/03_randomizer/compatibility_array_rand.phpt index 168d01dbc42dd..364267faf6ba4 100644 --- a/ext/random/tests/03_randomizer/pick_array_keys.phpt +++ b/ext/random/tests/03_randomizer/compatibility_array_rand.phpt @@ -1,8 +1,11 @@ --TEST-- -Random: Randomizer: pickArrayKeys +Random: Randomizer: The Mt19937 engine and pickArrayKeys are consistent with array_rand() --FILE-- 0, 'bar' => 1, 'baz' => 2]; $list = range(1, 10); @@ -14,7 +17,7 @@ $mapPickTwoFunc = array_rand($map, 2); $listPickOneFunc = array_rand($list, 1); $listPickTwoFunc = array_rand($list, 2); -$randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234)); +$randomizer = new Randomizer(new Mt19937(1234)); [$mapPickOneMethod] = $randomizer->pickArrayKeys($map, 1); $mapPickTwoMethod = $randomizer->pickArrayKeys($map, 2); @@ -24,25 +27,30 @@ $listPickTwoMethod = $randomizer->pickArrayKeys($list, 2); if ($mapPickOneFunc !== $mapPickOneMethod) { var_dump($mapPickOneFunc, $mapPickOneMethod); - die('failure mapPickOne'); + + die('failure: mapPickOne'); } if ($mapPickTwoFunc !== $mapPickTwoMethod) { var_dump($mapPickTwoFunc, $mapPickTwoMethod); - die('failure mapPickTwo'); + + die('failure: mapPickTwo'); } if ($listPickOneFunc !== $listPickOneMethod) { var_dump($listPickOneFunc, $listPickOneMethod); - die('failure listPickOne'); + + die('failure: listPickOne'); } if ($listPickTwoFunc !== $listPickTwoMethod) { var_dump($listPickTwoFunc, $listPickOneMethod); - die('failure listPickTwo'); + + die('failure: listPickTwo'); } die('success'); + ?> ---EXPECTF-- +--EXPECT-- success diff --git a/ext/random/tests/03_randomizer/compatibility_mt.phpt b/ext/random/tests/03_randomizer/compatibility_mt.phpt deleted file mode 100644 index 9740a494d6fe6..0000000000000 --- a/ext/random/tests/03_randomizer/compatibility_mt.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Random: Randomizer: Compatibility: Mt19937 ---FILE-- -nextInt() !== \mt_rand()) { - die('failure'); - } -} - -$randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234, \MT_RAND_MT19937)); -\mt_srand(1234, \MT_RAND_MT19937); -for ($i = 0; $i < 1000; $i++) { - if ($randomizer->nextInt() !== \mt_rand()) { - die('failure'); - } -} - -die('success'); ---EXPECT-- -success diff --git a/ext/random/tests/03_randomizer/compatibility_mt_rand.phpt b/ext/random/tests/03_randomizer/compatibility_mt_rand.phpt new file mode 100644 index 0000000000000..a69c50d0cb622 --- /dev/null +++ b/ext/random/tests/03_randomizer/compatibility_mt_rand.phpt @@ -0,0 +1,49 @@ +--TEST-- +Random: Randomizer: The Mt19937 engine is a drop-in replacement for mt_rand() +--FILE-- +nextInt() !== mt_rand()) { + die("failure: state differs at {$i} for nextInt()"); + } +} + +for ($i = 0; $i < 10_000; $i++) { + if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) { + die("failure: state differs at {$i} for getInt()"); + } +} + +echo "MT_RAND_MT19937", PHP_EOL; + +$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_MT19937)); +mt_srand(1234, MT_RAND_MT19937); + +for ($i = 0; $i < 10_000; $i++) { + if ($randomizer->nextInt() !== mt_rand()) { + die("failure: state differs at {$i} for nextInt()"); + } +} + +for ($i = 0; $i < 10_000; $i++) { + if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) { + die("failure: state differs at {$i} for getInt()"); + } +} + +die('success'); + +?> +--EXPECT-- +MT_RAND_PHP +MT_RAND_MT19937 +success diff --git a/ext/random/tests/03_randomizer/compatibility_user.phpt b/ext/random/tests/03_randomizer/compatibility_user.phpt index 3b4251aecbe72..a4601b55ab04a 100644 --- a/ext/random/tests/03_randomizer/compatibility_user.phpt +++ b/ext/random/tests/03_randomizer/compatibility_user.phpt @@ -1,80 +1,43 @@ --TEST-- -Random: Randomizer: Compatibility: user +Random: Randomizer: Native engines can be wrapped without changing their sequence --FILE-- engine->generate(); - } -}); -for ($i = 0; $i < 1000; $i++) { - $native = $native_randomizer->nextInt(); - $user = $user_randomizer->nextInt(); - if ($native !== $user) { - die("failure Mt19937 i: {$i} native: {$native} user: {$user}"); - } -} +require __DIR__ . "/../engines.inc"; -try { - $native_randomizer = new \Random\Randomizer(new \Random\Engine\PcgOneseq128XslRr64(1234)); - $user_randomizer = new \Random\Randomizer(new class () implements \Random\Engine { - public function __construct(private $engine = new \Random\Engine\PcgOneseq128XslRr64(1234)) - { - } +$engines = []; +$engines[] = new Mt19937(1234); +$engines[] = new PcgOneseq128XslRr64(1234); +$engines[] = new Xoshiro256StarStar(1234); - public function generate(): string - { - return $this->engine->generate(); - } - }); - - for ($i = 0; $i < 1000; $i++) { - $native = $native_randomizer->nextInt(); - $user = $user_randomizer->nextInt(); - if ($native !== $user) { - die("failure PcgOneseq128XslRr64 i: {$i} native: {$native} user: {$user}"); - } - } -} catch (\Random\RandomException $e) { - if ($e->getMessage() !== 'Generated value exceeds size of int') { - throw $e; - } -} +foreach ($engines as $engine) { + echo $engine::class, PHP_EOL; -try { - $native_randomizer = new \Random\Randomizer(new \Random\Engine\Xoshiro256StarStar(1234)); - $user_randomizer = new \Random\Randomizer(new class () implements \Random\Engine { - public function __construct(private $engine = new \Random\Engine\Xoshiro256StarStar(1234)) - { - } + $native_randomizer = new Randomizer(clone $engine); + $user_randomizer = new Randomizer(new TestWrapperEngine(clone $engine)); + + for ($i = 0; $i < 10_000; $i++) { + $native = $native_randomizer->getInt(0, $i); + $user = $user_randomizer->getInt(0, $i); - public function generate(): string - { - return $this->engine->generate(); - } - }); - - for ($i = 0; $i < 1000; $i++) { - $native = $native_randomizer->nextInt(); - $user = $user_randomizer->nextInt(); if ($native !== $user) { - die("failure Xoshiro256StarStar i: {$i} native: {$native} user: {$user}"); + die("failure: state differs at {$i}"); } } -} catch (\Random\RandomException $e) { - if ($e->getMessage() !== 'Generated value exceeds size of int') { - throw $e; - } } die('success'); + ?> --EXPECT-- +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar success diff --git a/ext/random/tests/03_randomizer/construct_twice.phpt b/ext/random/tests/03_randomizer/construct_twice.phpt index ed2a667e2af11..7128338ade973 100644 --- a/ext/random/tests/03_randomizer/construct_twice.phpt +++ b/ext/random/tests/03_randomizer/construct_twice.phpt @@ -1,46 +1,47 @@ --TEST-- -Random: Randomizer: Disallow manually calling __construct +Random: Randomizer: Calling __construct() fails due to readonly $engine property --FILE-- __construct(); -} catch (\Error $e) { - echo $e->getMessage() . PHP_EOL; + (new Randomizer())->__construct(); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; } try { - $r = new \Random\Randomizer(new \Random\Engine\Xoshiro256StarStar()); - $r->__construct(new \Random\Engine\PcgOneseq128XslRr64()); -} catch (\Error $e) { - echo $e->getMessage() . PHP_EOL; + $randomizer = new Randomizer(new Xoshiro256StarStar()); + $randomizer->__construct(new PcgOneseq128XslRr64()); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; } try { - $r = new \Random\Randomizer(new \UserEngine()); - $r->__construct(new \UserEngine()); -} catch (\Error $e) { - echo $e->getMessage() . PHP_EOL; + $randomizer = new Randomizer(new TestShaEngine("1234")); + $randomizer->__construct(new TestShaEngine("1234")); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; } try { - $r = new \Random\Randomizer(new \Random\Engine\Xoshiro256StarStar()); - $r->__construct(new \UserEngine()); -} catch (\Error $e) { + $randomizer = new Randomizer(new Xoshiro256StarStar()); + $randomizer->__construct(new TestShaEngine("1234")); +} catch (Error $e) { echo $e->getMessage(), PHP_EOL; } -var_dump($r->engine::class); +var_dump($randomizer->engine::class); die('success'); + ?> --EXPECT-- Cannot modify readonly property Random\Randomizer::$engine diff --git a/ext/random/tests/03_randomizer/engine_unsafe_biased.phpt b/ext/random/tests/03_randomizer/engine_unsafe_biased.phpt new file mode 100644 index 0000000000000..09fbd85b54eb0 --- /dev/null +++ b/ext/random/tests/03_randomizer/engine_unsafe_biased.phpt @@ -0,0 +1,58 @@ +--TEST-- +Random: Randomizer: Heavily biased engines are detected and rejected +--FILE-- +getInt(0, 1234)); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->nextInt()); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(bin2hex(randomizer()->getBytes(1))); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->shuffleArray(range(1, 1234))); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->shuffleBytes('foobar')); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECTF-- +Failed to generate an acceptable random number in 50 attempts +int(%d) +string(2) "ff" +Failed to generate an acceptable random number in 50 attempts +Failed to generate an acceptable random number in 50 attempts diff --git a/ext/random/tests/03_randomizer/engine_unsafe_empty_string.phpt b/ext/random/tests/03_randomizer/engine_unsafe_empty_string.phpt new file mode 100644 index 0000000000000..01bd293bc0508 --- /dev/null +++ b/ext/random/tests/03_randomizer/engine_unsafe_empty_string.phpt @@ -0,0 +1,58 @@ +--TEST-- +Random: Randomizer: Engines returning an empty string are detected and rejected +--FILE-- +getInt(0, 1234)); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->nextInt()); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(bin2hex(randomizer()->getBytes(1))); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->shuffleArray(range(1, 1234))); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->shuffleBytes('foobar')); +} catch (Random\BrokenRandomEngineError $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +A random engine must return a non-empty string +A random engine must return a non-empty string +A random engine must return a non-empty string +A random engine must return a non-empty string +A random engine must return a non-empty string diff --git a/ext/random/tests/03_randomizer/engine_unsafe_exits.phpt b/ext/random/tests/03_randomizer/engine_unsafe_exits.phpt new file mode 100644 index 0000000000000..cb598872d9773 --- /dev/null +++ b/ext/random/tests/03_randomizer/engine_unsafe_exits.phpt @@ -0,0 +1,23 @@ +--TEST-- +Random: Randomizer: Engines calling exit() are gracefully handled +--FILE-- +getBytes(1)); + +?> +--EXPECT-- +Exit diff --git a/ext/random/tests/03_randomizer/engine_unsafe_throws.phpt b/ext/random/tests/03_randomizer/engine_unsafe_throws.phpt new file mode 100644 index 0000000000000..bfb679f81a201 --- /dev/null +++ b/ext/random/tests/03_randomizer/engine_unsafe_throws.phpt @@ -0,0 +1,28 @@ +--TEST-- +Random: Randomizer: Engines throwing an exception are gracefully handled +--FILE-- +getBytes(1)); + +?> +--EXPECTF-- +Fatal error: Uncaught Exception: Error in %s:%d +Stack trace: +#0 [internal function]: ThrowingEngine->generate() +#1 %s(%d): Random\Randomizer->getBytes(1) +#2 {main} + thrown in %s on line %d diff --git a/ext/random/tests/03_randomizer/get_bytes.phpt b/ext/random/tests/03_randomizer/get_bytes.phpt deleted file mode 100644 index c6b4a59475e72..0000000000000 --- a/ext/random/tests/03_randomizer/get_bytes.phpt +++ /dev/null @@ -1,40 +0,0 @@ ---TEST-- -Random: Randomizer: getBytes ---FILE-- -count > 5) { - die('overflow'); - } - - return match ($this->count++) { - 0 => 'H', - 1 => 'e', - 2 => 'll', - 3 => 'o', - 4 => 'abcdefghijklmnopqrstuvwxyz', // 208 bits - 5 => 'success', - default => \random_bytes(16), - }; - } - } -); - -echo $randomizer->getBytes(5) . PHP_EOL; // Hello - -echo $randomizer->getBytes(8) . PHP_EOL; // abcdefgh (64 bits) - -die($randomizer->getBytes(7)); - -?> ---EXPECTF-- -Hello -abcdefgh -success diff --git a/ext/random/tests/03_randomizer/get_int_user.phpt b/ext/random/tests/03_randomizer/get_int_user.phpt deleted file mode 100644 index d6c995314319c..0000000000000 --- a/ext/random/tests/03_randomizer/get_int_user.phpt +++ /dev/null @@ -1,22 +0,0 @@ ---TEST-- -Random: Randomizer: User Engine results are correctly expanded for getInt() ---FILE-- -count++]; - } - } -); - -var_dump(bin2hex(pack('V', $randomizer->getInt(0, 0xFFFFFF)))); - -?> ---EXPECT-- -string(8) "01020300" diff --git a/ext/random/tests/03_randomizer/methods/getBytes.phpt b/ext/random/tests/03_randomizer/methods/getBytes.phpt new file mode 100644 index 0000000000000..a236e9746fa19 --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/getBytes.phpt @@ -0,0 +1,47 @@ +--TEST-- +Random: Randomizer: getBytes(): Basic functionality +--FILE-- +getBytes($i)) !== $i) { + die("failure: incorrect string length at {$i}"); + } + } +} + +die('success'); + +?> +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Secure +Random\Engine\Test\TestShaEngine +success diff --git a/ext/random/tests/03_randomizer/methods/getBytes_expansion.phpt b/ext/random/tests/03_randomizer/methods/getBytes_expansion.phpt new file mode 100644 index 0000000000000..750b7870e4001 --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/getBytes_expansion.phpt @@ -0,0 +1,43 @@ +--TEST-- +Random: Randomizer: getBytes(): Returned bytes are consistently expanded +--FILE-- +count++) { + 0 => 'H', + 1 => 'e', + 2 => 'll', + 3 => 'o', + 4 => 'abcdefghijklmnopqrstuvwxyz', + 5 => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + 6 => 'success', + default => throw new \Exception('Unhandled'), + }; + } +} + +$randomizer = new Randomizer(new TestEngine()); + +// 0-3: "Hello" - Insufficient bytes are concatenated. +var_dump($randomizer->getBytes(5)); + +// 4-5: "abcdefghABC" - Returned values are truncated to 64-bits for technical reasons, thus dropping i-z. +var_dump($randomizer->getBytes(11)); + +// 6: "success" +var_dump($randomizer->getBytes(7)); + +?> +--EXPECT-- +string(5) "Hello" +string(11) "abcdefghABC" +string(7) "success" diff --git a/ext/random/tests/03_randomizer/methods/getInt.phpt b/ext/random/tests/03_randomizer/methods/getInt.phpt new file mode 100644 index 0000000000000..faa098ade1364 --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/getInt.phpt @@ -0,0 +1,54 @@ +--TEST-- +Random: Randomizer: getInt(): Basic functionality +--FILE-- +getInt(-$i, $i); + + if ($result > $i || $result < -$i) { + die("failure: out of range at {$i}"); + } + } + + // Test that extreme ranges do not throw. + for ($i = 0; $i < 10_000; $i++) { + $randomizer->getInt(PHP_INT_MIN, PHP_INT_MAX); + } +} + +die('success'); + +?> +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Secure +Random\Engine\Test\TestShaEngine +success diff --git a/ext/random/tests/03_randomizer/methods/getInt_expansion_32.phpt b/ext/random/tests/03_randomizer/methods/getInt_expansion_32.phpt new file mode 100644 index 0000000000000..6e93208138c5f --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/getInt_expansion_32.phpt @@ -0,0 +1,25 @@ +--TEST-- +Random: Randomizer: getInt(): Returned values with insufficient bits are correctly expanded +--FILE-- +count++]; + } +} + +$randomizer = new Randomizer(new ByteEngine()); + +var_dump(bin2hex(pack('V', $randomizer->getInt(0, 0x00FF_FFFF)))); + +?> +--EXPECT-- +string(8) "01020300" diff --git a/ext/random/tests/03_randomizer/methods/getInt_expansion_64.phpt b/ext/random/tests/03_randomizer/methods/getInt_expansion_64.phpt new file mode 100644 index 0000000000000..87c6bfeafeb85 --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/getInt_expansion_64.phpt @@ -0,0 +1,27 @@ +--TEST-- +Random: Randomizer: getInt(): Returned values with insufficient bits are correctly expanded (64 Bit) +--SKIPIF-- + +--FILE-- +count++]; + } +} + +$randomizer = new Randomizer(new ByteEngine()); + +var_dump(bin2hex(pack('P', $randomizer->getInt(0, 0x00FF_FFFF_FFFF_FFFF)))); + +?> +--EXPECT-- +string(16) "0102030405060700" diff --git a/ext/random/tests/03_randomizer/gh9415.phpt b/ext/random/tests/03_randomizer/methods/getInt_gh9415.phpt similarity index 100% rename from ext/random/tests/03_randomizer/gh9415.phpt rename to ext/random/tests/03_randomizer/methods/getInt_gh9415.phpt diff --git a/ext/random/tests/03_randomizer/methods/nextInt.phpt b/ext/random/tests/03_randomizer/methods/nextInt.phpt new file mode 100644 index 0000000000000..fd4460cb811ce --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/nextInt.phpt @@ -0,0 +1,50 @@ +--TEST-- +Random: Randomizer: nextInt(): Basic functionality +--FILE-- +nextInt(); + } catch (\Random\RandomException $e) { + if ($e->getMessage() !== 'Generated value exceeds size of int' || PHP_INT_SIZE !== 4) { + throw $e; + } + } + } +} + +die('success'); + +?> +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Secure +Random\Engine\Test\TestShaEngine +success diff --git a/ext/random/tests/03_randomizer/methods/nextInt_64_engine_on_32_platform.phpt b/ext/random/tests/03_randomizer/methods/nextInt_64_engine_on_32_platform.phpt new file mode 100644 index 0000000000000..2a408e566e0b4 --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/nextInt_64_engine_on_32_platform.phpt @@ -0,0 +1,21 @@ +--TEST-- +Random: Randomizer: nextInt(): Throws for 64 bit engines on 32 bit platforms +--SKIPIF-- + +--FILE-- +nextInt()); +} catch (Random\RandomException $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +Generated value exceeds size of int diff --git a/ext/random/tests/03_randomizer/methods/pickArrayKeys.phpt b/ext/random/tests/03_randomizer/methods/pickArrayKeys.phpt new file mode 100644 index 0000000000000..4178455898df4 --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/pickArrayKeys.phpt @@ -0,0 +1,84 @@ +--TEST-- +Random: Randomizer: pickArrayKeys(): Basic functionality +--FILE-- +pickArrayKeys($array1, $i); + + if (array_unique($result) !== $result) { + die("failure: duplicates returned at {$i} for array1"); + } + + if (array_diff($result, array_keys($array1)) !== []) { + die("failure: non-keys returned at {$i} for array1"); + } + + $result = $randomizer->pickArrayKeys($array2, $i); + + if (array_unique($result) !== $result) { + die("failure: duplicates returned at {$i} for array2"); + } + + if (array_diff($result, array_keys($array2)) !== []) { + die("failure: non-keys returned at {$i} for array2"); + } + + $result = $randomizer->pickArrayKeys($array3, $i); + + if (array_unique($result) !== $result) { + die("failure: duplicates returned at {$i} for array3"); + } + + if (array_diff($result, array_keys($array3)) !== []) { + die("failure: non-keys returned at {$i} for array3"); + } + } +} + +die('success'); + +?> +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Secure +Random\Engine\Test\TestShaEngine +success diff --git a/ext/random/tests/03_randomizer/methods/pickArrayKeys_error.phpt b/ext/random/tests/03_randomizer/methods/pickArrayKeys_error.phpt new file mode 100644 index 0000000000000..15526327b095c --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/pickArrayKeys_error.phpt @@ -0,0 +1,49 @@ +--TEST-- +Random: Randomizer: pickArrayKeys(): Parameters are correctly validated +--FILE-- +pickArrayKeys("foo", 2)); +} catch (TypeError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->pickArrayKeys([], 0)); +} catch (ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->pickArrayKeys(range(1, 3), 0)); +} catch (ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->pickArrayKeys(range(1, 3), -1)); +} catch (ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} + +try { + var_dump(randomizer()->pickArrayKeys(range(1, 3), 10)); +} catch (ValueError $e) { + echo $e->getMessage(), PHP_EOL; +} + +?> +--EXPECTF-- +Random\Randomizer::pickArrayKeys(): Argument #1 ($array) must be of type array, string given +Random\Randomizer::pickArrayKeys(): Argument #1 ($array) cannot be empty +Random\Randomizer::pickArrayKeys(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array) +Random\Randomizer::pickArrayKeys(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array) +Random\Randomizer::pickArrayKeys(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array) diff --git a/ext/random/tests/03_randomizer/methods/shuffleArray.phpt b/ext/random/tests/03_randomizer/methods/shuffleArray.phpt new file mode 100644 index 0000000000000..c0f6d17fecddf --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/shuffleArray.phpt @@ -0,0 +1,53 @@ +--TEST-- +Random: Randomizer: shuffleArray(): Basic functionality +--FILE-- +shuffleArray($array); + + sort($result); + + if ($result !== $array) { + die("failure: not a permutation at {$i}"); + } + } +} + +die('success'); + +?> +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Secure +Random\Engine\Test\TestShaEngine +success diff --git a/ext/random/tests/03_randomizer/methods/shuffleBytes.phpt b/ext/random/tests/03_randomizer/methods/shuffleBytes.phpt new file mode 100644 index 0000000000000..d16168d32fe2d --- /dev/null +++ b/ext/random/tests/03_randomizer/methods/shuffleBytes.phpt @@ -0,0 +1,60 @@ +--TEST-- +Random: Randomizer: shuffleBytes(): Basic functionality +--FILE-- +shuffleBytes($bytes); + + $result = sort_bytes($result); + + if ($result !== $bytes) { + die("failure: not a permutation at {$i}"); + } + } +} + +die('success'); + +?> +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Secure +Random\Engine\Test\TestShaEngine +success diff --git a/ext/random/tests/03_randomizer/nextint_error.phpt b/ext/random/tests/03_randomizer/nextint_error.phpt deleted file mode 100644 index 5f9f8bdc77cf8..0000000000000 --- a/ext/random/tests/03_randomizer/nextint_error.phpt +++ /dev/null @@ -1,18 +0,0 @@ ---TEST-- -Random: Randomizer: nextInt() throws for too large values on 32 Bit ---SKIPIF-- - ---FILE-- -nextInt()); -} catch (\Random\RandomException $e) { - echo $e->getMessage(), PHP_EOL; -} - -?> ---EXPECT-- -Generated value exceeds size of int diff --git a/ext/random/tests/03_randomizer/pick_array_keys_error.phpt b/ext/random/tests/03_randomizer/pick_array_keys_error.phpt deleted file mode 100644 index 98abc82a55018..0000000000000 --- a/ext/random/tests/03_randomizer/pick_array_keys_error.phpt +++ /dev/null @@ -1,52 +0,0 @@ ---TEST-- -Random: Randomizer: pickArrayKeys error pattern ---FILE-- -pickArrayKeys([], 0)); -} catch (\ValueError $e) { - echo $e->getMessage() . "\n"; -} - -try { - var_dump((new \Random\Randomizer())->pickArrayKeys(range(1, 3), 0)); -} catch (\ValueError $e) { - echo $e->getMessage() . "\n"; -} - -try { - var_dump((new \Random\Randomizer())->pickArrayKeys(range(1, 3), -1)); -} catch (\ValueError $e) { - echo $e->getMessage() . "\n"; -} - -try { - var_dump((new \Random\Randomizer())->pickArrayKeys(range(1, 3), 10)); -} catch (\ValueError $e) { - echo $e->getMessage() . "\n"; -} - -var_dump((new \Random\Randomizer())->pickArrayKeys(range(1, 3), 3)); -var_dump((new \Random\Randomizer())->pickArrayKeys(range(1, 3), 2)); - -?> ---EXPECTF-- -Random\Randomizer::pickArrayKeys(): Argument #1 ($array) cannot be empty -Random\Randomizer::pickArrayKeys(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array) -Random\Randomizer::pickArrayKeys(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array) -Random\Randomizer::pickArrayKeys(): Argument #2 ($num) must be between 1 and the number of elements in argument #1 ($array) -array(3) { - [0]=> - int(%d) - [1]=> - int(%d) - [2]=> - int(%d) -} -array(2) { - [0]=> - int(%d) - [1]=> - int(%d) -} diff --git a/ext/random/tests/03_randomizer/readonly.phpt b/ext/random/tests/03_randomizer/readonly.phpt index f1f4a461714e4..f5cf7cc0dd5b0 100644 --- a/ext/random/tests/03_randomizer/readonly.phpt +++ b/ext/random/tests/03_randomizer/readonly.phpt @@ -1,43 +1,30 @@ --TEST-- -Random: Randomizer: readonly engine +Random: Randomizer: The engine property must be readonly --FILE-- engine; -if ($one->engine->generate() !== $one_ng_clone->generate()) { - die('invalid result'); -} +$randomizer = new Randomizer(new PcgOneseq128XslRr64(1234)); +$referenceRandomizer = new Randomizer(new PcgOneseq128XslRr64(1234)); try { - $one->engine = $one_ng_clone; -} catch (\Throwable $e) { - echo $e->getMessage() . PHP_EOL; + $randomizer->engine = new Xoshiro256StarStar(1234); +} catch (Throwable $e) { + echo $e->getMessage(), PHP_EOL; } -$two = new \Random\Randomizer( - new \Random\Engine\Secure() -); - -try { - $two_ng_clone = clone $two->engine; -} catch (\Throwable $e) { - echo $e->getMessage() . PHP_EOL; +for ($i = 0; $i < 10_000; $i++) { + if ($randomizer->getInt(0, $i) !== $referenceRandomizer->getInt(0, $i)) { + die("failure: state differs at {$i}"); + } } -try { - $two->engine = $one_ng_clone; -} catch (\Throwable $e) { - echo $e->getMessage() . PHP_EOL; -} +die('success'); -die('success') ?> --EXPECT-- Cannot modify readonly property Random\Randomizer::$engine -Trying to clone an uncloneable object of class Random\Engine\Secure -Cannot modify readonly property Random\Randomizer::$engine success diff --git a/ext/random/tests/03_randomizer/serialize.phpt b/ext/random/tests/03_randomizer/serialize.phpt index 37841a0db106f..b02bb93c827b3 100644 --- a/ext/random/tests/03_randomizer/serialize.phpt +++ b/ext/random/tests/03_randomizer/serialize.phpt @@ -1,57 +1,50 @@ --TEST-- -Random: Randomizer: serialize +Random: Randomizer: Serialization of the Randomizer must preserve the sequence --FILE-- getInt(\PHP_INT_MIN, \PHP_INT_MAX); - try { - $randomizer2 = unserialize(serialize($randomizer)); - } catch (\Exception $e) { - echo $e->getMessage() . PHP_EOL; - continue; - } + echo $engine::class, PHP_EOL; + + $randomizer = new Randomizer($engine); - if ($randomizer->getInt(\PHP_INT_MIN, \PHP_INT_MAX) !== $randomizer2->getInt(\PHP_INT_MIN, \PHP_INT_MAX)) { - die($engine::class . ': failure.'); + for ($i = 0; $i < 10_000; $i++) { + $randomizer->getInt(0, $i); } - echo $engine::class . ': success' . PHP_EOL; + $randomizer2 = unserialize(serialize($randomizer)); + + for ($i = 0; $i < 10_000; $i++) { + if ($randomizer->getInt(0, $i) !== $randomizer2->getInt(0, $i)) { + $className = $engine::class; + + die("failure: state differs at {$i}"); + } + } } die('success'); ?> ---EXPECTF-- -Random\Engine\Mt19937: success -Random\Engine\Mt19937: success -Random\Engine\PcgOneseq128XslRr64: success -Random\Engine\Xoshiro256StarStar: success -Serialization of 'Random\Engine\Secure' is not allowed -Serialization of 'Random\Engine@anonymous' is not allowed -UserEngine: success +--EXPECT-- +Random\Engine\Mt19937 +Random\Engine\Mt19937 +Random\Engine\PcgOneseq128XslRr64 +Random\Engine\Xoshiro256StarStar +Random\Engine\Test\TestShaEngine success diff --git a/ext/random/tests/03_randomizer/serialize_disallowed.phpt b/ext/random/tests/03_randomizer/serialize_disallowed.phpt new file mode 100644 index 0000000000000..06f8ea2cb09ae --- /dev/null +++ b/ext/random/tests/03_randomizer/serialize_disallowed.phpt @@ -0,0 +1,17 @@ +--TEST-- +Random: Randomizer: Serialization of the Randomizer fails if the engine is not serializable +--FILE-- +getMessage(), PHP_EOL; +} + +?> +--EXPECT-- +Serialization of 'Random\Engine\Secure' is not allowed diff --git a/ext/random/tests/03_randomizer/user_exits.phpt b/ext/random/tests/03_randomizer/user_exits.phpt deleted file mode 100644 index 6d6f5636cbec4..0000000000000 --- a/ext/random/tests/03_randomizer/user_exits.phpt +++ /dev/null @@ -1,19 +0,0 @@ ---TEST-- -Random: Randomizer: User: Engine exits ---FILE-- -getBytes(1)); - -?> ---EXPECT-- -Exit diff --git a/ext/random/tests/03_randomizer/user_throws.phpt b/ext/random/tests/03_randomizer/user_throws.phpt deleted file mode 100644 index 41cd004b63879..0000000000000 --- a/ext/random/tests/03_randomizer/user_throws.phpt +++ /dev/null @@ -1,24 +0,0 @@ ---TEST-- -Random: Randomizer: User: Engine throws ---FILE-- -getBytes(1)); - -?> ---EXPECTF-- -Fatal error: Uncaught Exception: Error in %s:%d -Stack trace: -#0 [internal function]: Random\Engine@anonymous->generate() -#1 %s(%d): Random\Randomizer->getBytes(1) -#2 {main} - thrown in %s on line %d diff --git a/ext/random/tests/03_randomizer/user_unsafe.phpt b/ext/random/tests/03_randomizer/user_unsafe.phpt deleted file mode 100644 index 6e6a8151fdf11..0000000000000 --- a/ext/random/tests/03_randomizer/user_unsafe.phpt +++ /dev/null @@ -1,141 +0,0 @@ ---TEST-- -Random: Randomizer: User: Engine unsafe ---FILE-- -getInt(0, 123)); - } catch (Throwable $e) { - echo $e, PHP_EOL; - } - - echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - - try { - var_dump((new Randomizer(new $engine()))->nextInt()); - } catch (Throwable $e) { - echo $e, PHP_EOL; - } - - echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - - try { - var_dump(bin2hex((new Randomizer(new $engine()))->getBytes(1))); - } catch (Throwable $e) { - echo $e, PHP_EOL; - } - - echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - - try { - var_dump((new Randomizer(new $engine()))->shuffleArray(\range(1, 10))); - } catch (Throwable $e) { - echo $e, PHP_EOL; - } - - echo PHP_EOL, "-------", PHP_EOL, PHP_EOL; - - try { - var_dump((new Randomizer(new $engine()))->shuffleBytes('foobar')); - } catch (Throwable $e) { - echo $e, PHP_EOL; - } - - echo PHP_EOL, "=====================", PHP_EOL; -} - -?> ---EXPECTF-- -===================== -EmptyStringEngine -===================== - -Random\BrokenRandomEngineError: A random engine must return a non-empty string in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->getInt(0, 123) -#1 {main} - -------- - -Random\BrokenRandomEngineError: A random engine must return a non-empty string in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->nextInt() -#1 {main} - -------- - -Random\BrokenRandomEngineError: A random engine must return a non-empty string in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->getBytes(1) -#1 {main} - -------- - -Random\BrokenRandomEngineError: A random engine must return a non-empty string in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleArray(Array) -#1 {main} - -------- - -Random\BrokenRandomEngineError: A random engine must return a non-empty string in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleBytes('foobar') -#1 {main} - -===================== -HeavilyBiasedEngine -===================== - -Random\BrokenRandomEngineError: Failed to generate an acceptable random number in 50 attempts in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->getInt(0, 123) -#1 {main} - -------- - -int(%d) - -------- - -string(2) "ff" - -------- - -Random\BrokenRandomEngineError: Failed to generate an acceptable random number in 50 attempts in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleArray(Array) -#1 {main} - -------- - -Random\BrokenRandomEngineError: Failed to generate an acceptable random number in 50 attempts in %s:%d -Stack trace: -#0 %s(%d): Random\Randomizer->shuffleBytes('foobar') -#1 {main} - -===================== diff --git a/ext/random/tests/engines.inc b/ext/random/tests/engines.inc new file mode 100644 index 0000000000000..909f581d775a1 --- /dev/null +++ b/ext/random/tests/engines.inc @@ -0,0 +1,74 @@ +state = $state; + } else { + $this->state = random_bytes(20); + } + } + + public function generate(): string + { + $this->state = sha1($this->state, true); + + return substr($this->state, 0, 8); + } +} + +final class TestWrapperEngine implements Engine +{ + public function __construct(private readonly Engine $engine) + { + } + + public function generate(): string + { + return $this->engine->generate(); + } +} + +final class TestXoshiro128PlusPlusEngine implements Engine +{ + public function __construct( + private int $s0, + private int $s1, + private int $s2, + private int $s3 + ) { + } + + private static function rotl($x, $k) + { + return (($x << $k) | ($x >> (32 - $k))) & 0xFFFFFFFF; + } + + public function generate(): string + { + $result = (self::rotl(($this->s0 + $this->s3) & 0xFFFFFFFF, 7) + $this->s0) & 0xFFFFFFFF; + + $t = ($this->s1 << 9) & 0xFFFFFFFF; + + $this->s2 ^= $this->s0; + $this->s3 ^= $this->s1; + $this->s1 ^= $this->s2; + $this->s0 ^= $this->s3; + + $this->s2 ^= $t; + + $this->s3 = self::rotl($this->s3, 11); + + return pack('V', $result); + } +} + +?> From 64b962b241747caf02fce2029c890e3011e71b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 2 Sep 2022 11:14:10 +0200 Subject: [PATCH 1210/1346] Declare ext/standard constants in stubs - part 4 Closes GH-9465 --- ext/standard/basic_functions.c | 1 + ext/standard/basic_functions.stub.php | 199 +++++++++++++++++++++++++ ext/standard/basic_functions_arginfo.h | 63 +++++++- ext/standard/syslog.c | 55 ------- 4 files changed, 262 insertions(+), 56 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 2a2fc2e4ae1e1..0b48bd834e631 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -26,6 +26,7 @@ #include "php_http.h" #include "php_incomplete_class.h" #include "php_getopt.h" +#include "php_ext_syslog.h" #include "ext/standard/info.h" #include "ext/session/php_session.h" #include "zend_exceptions.h" diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 0e0968e3b3c1b..e6473e5932f40 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -343,6 +343,205 @@ */ const PHP_ROUND_HALF_ODD = UNKNOWN; +/* syslog.c */ + +/* error levels */ + +/** + * system unusable + * @var int + * @cvalue LOG_EMERG + */ +const LOG_EMERG = UNKNOWN; +/** + * immediate action required + * @var int + * @cvalue LOG_ALERT + */ +const LOG_ALERT = UNKNOWN; +/** + * critical conditions + * @var int + * @cvalue LOG_CRIT + */ +const LOG_CRIT = UNKNOWN; +/** + * @var int + * @cvalue LOG_ERR + */ +const LOG_ERR = UNKNOWN; +/** + * @var int + * @cvalue LOG_WARNING + */ +const LOG_WARNING = UNKNOWN; +/** + * @var int + * @cvalue LOG_NOTICE + */ +const LOG_NOTICE = UNKNOWN; +/** + * @var int + * @cvalue LOG_INFO + */ +const LOG_INFO = UNKNOWN; +/** + * @var int + * @cvalue LOG_DEBUG + */ +const LOG_DEBUG = UNKNOWN; +/* facility: type of program logging the message */ +/** + * @var int + * @cvalue LOG_KERN + */ +const LOG_KERN = UNKNOWN; +/** + * generic user level + * @var int + * @cvalue LOG_USER + */ +const LOG_USER = UNKNOWN; +/** + * log to email + * @var int + * @cvalue LOG_MAIL + */ +const LOG_MAIL = UNKNOWN; +/** + * other system daemons + * @var int + * @cvalue LOG_DAEMON + */ +const LOG_DAEMON = UNKNOWN; +/** + * @var int + * @cvalue LOG_AUTH + */ +const LOG_AUTH = UNKNOWN; +/** + * @var int + * @cvalue LOG_SYSLOG + */ +const LOG_SYSLOG = UNKNOWN; +/** + * @var int + * @cvalue LOG_LPR + */ +const LOG_LPR = UNKNOWN; +#ifdef LOG_NEWS +/* No LOG_NEWS on HP-UX */ +/** + * usenet new + * @var int + * @cvalue LOG_NEWS + */ +const LOG_NEWS = UNKNOWN; +#endif +#ifdef LOG_UUCP +/* No LOG_UUCP on HP-UX */ +/** + * @var int + * @cvalue LOG_UUCP + */ +const LOG_UUCP = UNKNOWN; +#endif +#ifdef LOG_CRON +/* apparently some systems don't have this one */ +/** + * @var int + * @cvalue LOG_CRON + */ +const LOG_CRON = UNKNOWN; +#endif +#ifdef LOG_AUTHPRIV +/* AIX doesn't have LOG_AUTHPRIV */ +/** + * @var int + * @cvalue LOG_AUTHPRIV + */ +const LOG_AUTHPRIV = UNKNOWN; +#endif +#ifndef PHP_WIN32 +/** + * @var int + * @cvalue LOG_LOCAL0 + */ +const LOG_LOCAL0 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL1 + */ +const LOG_LOCAL1 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL2 + */ +const LOG_LOCAL2 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL3 + */ +const LOG_LOCAL3 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL4 + */ +const LOG_LOCAL4 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL5 + */ +const LOG_LOCAL5 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL6 + */ +const LOG_LOCAL6 = UNKNOWN; +/** + * @var int + * @cvalue LOG_LOCAL7 + */ +const LOG_LOCAL7 = UNKNOWN; +#endif +/* options */ +/** + * @var int + * @cvalue LOG_PID + */ +const LOG_PID = UNKNOWN; +/** + * @var int + * @cvalue LOG_CONS + */ +const LOG_CONS = UNKNOWN; +/** + * @var int + * @cvalue LOG_ODELAY + */ +const LOG_ODELAY = UNKNOWN; +/** + * @var int + * @cvalue LOG_NDELAY + */ +const LOG_NDELAY = UNKNOWN; +#ifdef LOG_NOWAIT +/** + * @var int + * @cvalue LOG_NOWAIT + */ +const LOG_NOWAIT = UNKNOWN; +#endif +#ifdef LOG_PERROR +/* AIX doesn't have LOG_PERROR */ +/** + * log to stderr + * @var int + * @cvalue LOG_PERROR + */ +const LOG_PERROR = UNKNOWN; +#endif + #[AllowDynamicProperties] final class __PHP_Incomplete_Class { diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 8793bd4eee24e..50eea65e01c3e 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d0941f025c602b46179675026eb198d7425c717a */ + * Stub hash: 18f0424186dc6914160176d70f8ac830f949bfd4 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -3565,6 +3565,67 @@ static void register_basic_functions_symbols(int module_number) REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_DOWN", PHP_ROUND_HALF_DOWN, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_EVEN", PHP_ROUND_HALF_EVEN, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_EMERG", LOG_EMERG, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_ALERT", LOG_ALERT, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_CRIT", LOG_CRIT, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_ERR", LOG_ERR, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_WARNING", LOG_WARNING, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_NOTICE", LOG_NOTICE, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_INFO", LOG_INFO, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_DEBUG", LOG_DEBUG, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_KERN", LOG_KERN, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_USER", LOG_USER, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_MAIL", LOG_MAIL, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_DAEMON", LOG_DAEMON, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_AUTH", LOG_AUTH, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_SYSLOG", LOG_SYSLOG, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_LPR", LOG_LPR, CONST_PERSISTENT); +#if defined(LOG_NEWS) + REGISTER_LONG_CONSTANT("LOG_NEWS", LOG_NEWS, CONST_PERSISTENT); +#endif +#if defined(LOG_UUCP) + REGISTER_LONG_CONSTANT("LOG_UUCP", LOG_UUCP, CONST_PERSISTENT); +#endif +#if defined(LOG_CRON) + REGISTER_LONG_CONSTANT("LOG_CRON", LOG_CRON, CONST_PERSISTENT); +#endif +#if defined(LOG_AUTHPRIV) + REGISTER_LONG_CONSTANT("LOG_AUTHPRIV", LOG_AUTHPRIV, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL0", LOG_LOCAL0, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL1", LOG_LOCAL1, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL2", LOG_LOCAL2, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL3", LOG_LOCAL3, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL4", LOG_LOCAL4, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL5", LOG_LOCAL5, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL6", LOG_LOCAL6, CONST_PERSISTENT); +#endif +#if !defined(PHP_WIN32) + REGISTER_LONG_CONSTANT("LOG_LOCAL7", LOG_LOCAL7, CONST_PERSISTENT); +#endif + REGISTER_LONG_CONSTANT("LOG_PID", LOG_PID, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_CONS", LOG_CONS, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_ODELAY", LOG_ODELAY, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LOG_NDELAY", LOG_NDELAY, CONST_PERSISTENT); +#if defined(LOG_NOWAIT) + REGISTER_LONG_CONSTANT("LOG_NOWAIT", LOG_NOWAIT, CONST_PERSISTENT); +#endif +#if defined(LOG_PERROR) + REGISTER_LONG_CONSTANT("LOG_PERROR", LOG_PERROR, CONST_PERSISTENT); +#endif zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "crypt", sizeof("crypt") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0); diff --git a/ext/standard/syslog.c b/ext/standard/syslog.c index e0120a5b603b3..f806e74a03b63 100644 --- a/ext/standard/syslog.c +++ b/ext/standard/syslog.c @@ -35,61 +35,6 @@ /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(syslog) { - /* error levels */ - REGISTER_LONG_CONSTANT("LOG_EMERG", LOG_EMERG, CONST_CS | CONST_PERSISTENT); /* system unusable */ - REGISTER_LONG_CONSTANT("LOG_ALERT", LOG_ALERT, CONST_CS | CONST_PERSISTENT); /* immediate action required */ - REGISTER_LONG_CONSTANT("LOG_CRIT", LOG_CRIT, CONST_CS | CONST_PERSISTENT); /* critical conditions */ - REGISTER_LONG_CONSTANT("LOG_ERR", LOG_ERR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_WARNING", LOG_WARNING, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_NOTICE", LOG_NOTICE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_INFO", LOG_INFO, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_DEBUG", LOG_DEBUG, CONST_CS | CONST_PERSISTENT); - /* facility: type of program logging the message */ - REGISTER_LONG_CONSTANT("LOG_KERN", LOG_KERN, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_USER", LOG_USER, CONST_CS | CONST_PERSISTENT); /* generic user level */ - REGISTER_LONG_CONSTANT("LOG_MAIL", LOG_MAIL, CONST_CS | CONST_PERSISTENT); /* log to email */ - REGISTER_LONG_CONSTANT("LOG_DAEMON", LOG_DAEMON, CONST_CS | CONST_PERSISTENT); /* other system daemons */ - REGISTER_LONG_CONSTANT("LOG_AUTH", LOG_AUTH, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_SYSLOG", LOG_SYSLOG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LPR", LOG_LPR, CONST_CS | CONST_PERSISTENT); -#ifdef LOG_NEWS - /* No LOG_NEWS on HP-UX */ - REGISTER_LONG_CONSTANT("LOG_NEWS", LOG_NEWS, CONST_CS | CONST_PERSISTENT); /* usenet new */ -#endif -#ifdef LOG_UUCP - /* No LOG_UUCP on HP-UX */ - REGISTER_LONG_CONSTANT("LOG_UUCP", LOG_UUCP, CONST_CS | CONST_PERSISTENT); -#endif -#ifdef LOG_CRON - /* apparently some systems don't have this one */ - REGISTER_LONG_CONSTANT("LOG_CRON", LOG_CRON, CONST_CS | CONST_PERSISTENT); -#endif -#ifdef LOG_AUTHPRIV - /* AIX doesn't have LOG_AUTHPRIV */ - REGISTER_LONG_CONSTANT("LOG_AUTHPRIV", LOG_AUTHPRIV, CONST_CS | CONST_PERSISTENT); -#endif -#ifndef PHP_WIN32 - REGISTER_LONG_CONSTANT("LOG_LOCAL0", LOG_LOCAL0, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL1", LOG_LOCAL1, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL2", LOG_LOCAL2, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL3", LOG_LOCAL3, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL4", LOG_LOCAL4, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL5", LOG_LOCAL5, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL6", LOG_LOCAL6, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_LOCAL7", LOG_LOCAL7, CONST_CS | CONST_PERSISTENT); -#endif - /* options */ - REGISTER_LONG_CONSTANT("LOG_PID", LOG_PID, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_CONS", LOG_CONS, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_ODELAY", LOG_ODELAY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LOG_NDELAY", LOG_NDELAY, CONST_CS | CONST_PERSISTENT); -#ifdef LOG_NOWAIT - REGISTER_LONG_CONSTANT("LOG_NOWAIT", LOG_NOWAIT, CONST_CS | CONST_PERSISTENT); -#endif -#ifdef LOG_PERROR - /* AIX doesn't have LOG_PERROR */ - REGISTER_LONG_CONSTANT("LOG_PERROR", LOG_PERROR, CONST_CS | CONST_PERSISTENT); /*log to stderr*/ -#endif BG(syslog_device)=NULL; return SUCCESS; From 840ea641b17dd15242bca2571b899c58cbbed817 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 2 Sep 2022 13:57:11 +0200 Subject: [PATCH 1211/1346] [ci skip] NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 5edeef8bd15fe..b10c23ee4869e 100644 --- a/NEWS +++ b/NEWS @@ -52,6 +52,10 @@ PHP NEWS always returns 1). (timwolla) . Fixed Randomizer::getInt() consistency for 32-bit engines. (timwolla) +- Reflection: + . Fixed bug GH-8932 (ReflectionFunction provides no way to get the called + class of a Closure). (cmb, Nicolas Grekas) + - Streams: . Fixed bug GH-9316 ($http_response_header is wrong for long status line). (cmb, timwolla) From 6f2f228e4ada762067bd5c22b7cab35623fe49cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 2 Sep 2022 11:59:59 +0200 Subject: [PATCH 1212/1346] Declare ext/standard constants in stubs - part 5 Closes GH-9466 --- ext/standard/basic_functions.c | 6 -- ext/standard/basic_functions.stub.php | 82 ++++++++++++++++++++++++++ ext/standard/basic_functions_arginfo.h | 47 ++++++++++++++- ext/standard/dns.c | 41 ------------- ext/standard/dns_win32.c | 18 ------ ext/standard/php_dns.h | 31 ++++++++-- 6 files changed, 154 insertions(+), 71 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 0b48bd834e631..cd30c598440b2 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -359,12 +359,6 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ php_register_url_stream_wrapper("http", &php_stream_http_wrapper); php_register_url_stream_wrapper("ftp", &php_stream_ftp_wrapper); -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) -# if defined(PHP_WIN32) || defined(HAVE_FULL_DNS_FUNCS) - BASIC_MINIT_SUBMODULE(dns) -# endif -#endif - BASIC_MINIT_SUBMODULE(hrtime) return SUCCESS; diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index e6473e5932f40..2bd16bbe4c5d7 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -343,6 +343,88 @@ */ const PHP_ROUND_HALF_ODD = UNKNOWN; +/* dns.c */ + +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) +/** + * @var int + * @cvalue PHP_DNS_A + */ +const DNS_A = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_NS + */ +const DNS_NS = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_CNAME + */ +const DNS_CNAME = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_SOA + */ +const DNS_SOA = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_PTR + */ +const DNS_PTR = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_HINFO + */ +const DNS_HINFO = UNKNOWN; +#if (!defined(PHP_WIN32)) +/** + * @var int + * @cvalue PHP_DNS_CAA + */ +const DNS_CAA = UNKNOWN; +#endif +/** + * @var int + * @cvalue PHP_DNS_MX + */ +const DNS_MX = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_TXT + */ +const DNS_TXT = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_SRV + */ +const DNS_SRV = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_NAPTR + */ +const DNS_NAPTR = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_AAAA + */ +const DNS_AAAA = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_A6 + */ +const DNS_A6 = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_ANY + */ +const DNS_ANY = UNKNOWN; +/** + * @var int + * @cvalue PHP_DNS_ALL + */ +const DNS_ALL = UNKNOWN; +#endif + /* syslog.c */ /* error levels */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 50eea65e01c3e..7e7d5f5692ab3 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 18f0424186dc6914160176d70f8ac830f949bfd4 */ + * Stub hash: 64cff452a29eabb6a1a2da8ba1171a386b98cf71 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -3565,6 +3565,51 @@ static void register_basic_functions_symbols(int module_number) REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_DOWN", PHP_ROUND_HALF_DOWN, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_EVEN", PHP_ROUND_HALF_EVEN, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_ROUND_HALF_ODD", PHP_ROUND_HALF_ODD, CONST_PERSISTENT); +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_NS", PHP_DNS_NS, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_CNAME", PHP_DNS_CNAME, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_SOA", PHP_DNS_SOA, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_PTR", PHP_DNS_PTR, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_HINFO", PHP_DNS_HINFO, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) && (!defined(PHP_WIN32)) + REGISTER_LONG_CONSTANT("DNS_CAA", PHP_DNS_CAA, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_MX", PHP_DNS_MX, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_TXT", PHP_DNS_TXT, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_SRV", PHP_DNS_SRV, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_NAPTR", PHP_DNS_NAPTR, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_AAAA", PHP_DNS_AAAA, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_A6", PHP_DNS_A6, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_ANY", PHP_DNS_ANY, CONST_PERSISTENT); +#endif +#if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) + REGISTER_LONG_CONSTANT("DNS_ALL", PHP_DNS_ALL, CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("LOG_EMERG", LOG_EMERG, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("LOG_ALERT", LOG_ALERT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("LOG_CRIT", LOG_CRIT, CONST_PERSISTENT); diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 456c76ab1af2f..d229b998a4b6b 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -316,26 +316,6 @@ static zend_string *php_gethostbyname(char *name) } /* }}} */ -#if defined(HAVE_FULL_DNS_FUNCS) || defined(PHP_WIN32) -# define PHP_DNS_NUM_TYPES 13 /* Number of DNS Types Supported by PHP currently */ - -# define PHP_DNS_A 0x00000001 -# define PHP_DNS_NS 0x00000002 -# define PHP_DNS_CNAME 0x00000010 -# define PHP_DNS_SOA 0x00000020 -# define PHP_DNS_PTR 0x00000800 -# define PHP_DNS_HINFO 0x00001000 -# define PHP_DNS_CAA 0x00002000 -# define PHP_DNS_MX 0x00004000 -# define PHP_DNS_TXT 0x00008000 -# define PHP_DNS_A6 0x01000000 -# define PHP_DNS_SRV 0x02000000 -# define PHP_DNS_NAPTR 0x04000000 -# define PHP_DNS_AAAA 0x08000000 -# define PHP_DNS_ANY 0x10000000 -# define PHP_DNS_ALL (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_CAA|PHP_DNS_MX|PHP_DNS_TXT|PHP_DNS_A6|PHP_DNS_SRV|PHP_DNS_NAPTR|PHP_DNS_AAAA) -#endif /* HAVE_FULL_DNS_FUNCS || defined(PHP_WIN32) */ - /* Note: These functions are defined in ext/standard/dns_win32.c for Windows! */ #if !defined(PHP_WIN32) && defined(HAVE_DNS_SEARCH_FUNC) @@ -1161,24 +1141,3 @@ PHP_FUNCTION(dns_get_mx) /* }}} */ #endif /* HAVE_FULL_DNS_FUNCS */ #endif /* !defined(PHP_WIN32) && HAVE_DNS_SEARCH_FUNC */ - -#if defined(HAVE_FULL_DNS_FUNCS) && !defined(PHP_WIN32) -PHP_MINIT_FUNCTION(dns) { - REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_NS", PHP_DNS_NS, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_CNAME", PHP_DNS_CNAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_SOA", PHP_DNS_SOA, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_PTR", PHP_DNS_PTR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_HINFO", PHP_DNS_HINFO, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_CAA", PHP_DNS_CAA, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_MX", PHP_DNS_MX, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_TXT", PHP_DNS_TXT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_SRV", PHP_DNS_SRV, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_NAPTR", PHP_DNS_NAPTR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_AAAA", PHP_DNS_AAAA, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_A6", PHP_DNS_A6, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_ANY", PHP_DNS_ANY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_ALL", PHP_DNS_ALL, CONST_CS | CONST_PERSISTENT); - return SUCCESS; -} -#endif /* HAVE_FULL_DNS_FUNCS */ diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c index 25fdccbfcf987..4d87d4c8210de 100644 --- a/ext/standard/dns_win32.c +++ b/ext/standard/dns_win32.c @@ -506,21 +506,3 @@ PHP_FUNCTION(dns_get_record) } } /* }}} */ - -PHP_MINIT_FUNCTION(dns) { - REGISTER_LONG_CONSTANT("DNS_A", PHP_DNS_A, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_NS", PHP_DNS_NS, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_CNAME", PHP_DNS_CNAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_SOA", PHP_DNS_SOA, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_PTR", PHP_DNS_PTR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_HINFO", PHP_DNS_HINFO, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_MX", PHP_DNS_MX, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_TXT", PHP_DNS_TXT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_SRV", PHP_DNS_SRV, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_NAPTR", PHP_DNS_NAPTR, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_AAAA", PHP_DNS_AAAA, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_A6", PHP_DNS_A6, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_ANY", PHP_DNS_ANY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("DNS_ALL", PHP_DNS_ALL, CONST_CS | CONST_PERSISTENT); - return SUCCESS; -} diff --git a/ext/standard/php_dns.h b/ext/standard/php_dns.h index 53fbc76514f53..4e04799cdb8a7 100644 --- a/ext/standard/php_dns.h +++ b/ext/standard/php_dns.h @@ -56,11 +56,32 @@ #define HAVE_FULL_DNS_FUNCS 1 #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) -# if defined(PHP_WIN32) || defined(HAVE_FULL_DNS_FUNCS) -PHP_MINIT_FUNCTION(dns); -# endif -#endif /* defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC */ +#if defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS)) +#define PHP_DNS_A 0x00000001 +#define PHP_DNS_NS 0x00000002 +#define PHP_DNS_CNAME 0x00000010 +#define PHP_DNS_SOA 0x00000020 +#define PHP_DNS_PTR 0x00000800 +#define PHP_DNS_HINFO 0x00001000 +#if !defined(PHP_WIN32) +# define PHP_DNS_CAA 0x00002000 +#endif +#define PHP_DNS_MX 0x00004000 +#define PHP_DNS_TXT 0x00008000 +#define PHP_DNS_A6 0x01000000 +#define PHP_DNS_SRV 0x02000000 +#define PHP_DNS_NAPTR 0x04000000 +#define PHP_DNS_AAAA 0x08000000 +#define PHP_DNS_ANY 0x10000000 + +#if defined(PHP_WIN32) +# define PHP_DNS_NUM_TYPES 12 /* Number of DNS Types Supported by PHP currently */ +# define PHP_DNS_ALL (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_MX|PHP_DNS_TXT|PHP_DNS_A6|PHP_DNS_SRV|PHP_DNS_NAPTR|PHP_DNS_AAAA) +#else +# define PHP_DNS_NUM_TYPES 13 /* Number of DNS Types Supported by PHP currently */ +# define PHP_DNS_ALL (PHP_DNS_A|PHP_DNS_NS|PHP_DNS_CNAME|PHP_DNS_SOA|PHP_DNS_PTR|PHP_DNS_HINFO|PHP_DNS_CAA|PHP_DNS_MX|PHP_DNS_TXT|PHP_DNS_A6|PHP_DNS_SRV|PHP_DNS_NAPTR|PHP_DNS_AAAA) +#endif +#endif #ifndef INT16SZ #define INT16SZ 2 From 5c3559464b721e29c5426dccd1c25811683787ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 2 Sep 2022 14:06:58 +0200 Subject: [PATCH 1213/1346] Fix memory leak triggered by unsuccessful dynamic property unserialization Closes GH-9468 --- ext/standard/var_unserializer.re | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 72d50c190e653..bcf19002fc0a2 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -644,11 +644,13 @@ declared_property: if (UNEXPECTED(obj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) { zend_throw_error(NULL, "Cannot create dynamic property %s::$%s", ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key))); + zval_ptr_dtor_str(&key); goto failure; } else if (!(obj->ce->ce_flags & ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES)) { zend_error(E_DEPRECATED, "Creation of dynamic property %s::$%s is deprecated", ZSTR_VAL(obj->ce->name), zend_get_unmangled_property_name(Z_STR_P(&key))); if (EG(exception)) { + zval_ptr_dtor_str(&key); goto failure; } } From cfa72ff3af144aa720aade9a311bf8160d57e8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 2 Sep 2022 13:00:07 +0200 Subject: [PATCH 1214/1346] Declare ext/standard constants in stubs - part 6 Closes GH-9467 --- ext/standard/basic_functions.c | 2 +- ext/standard/basic_functions.stub.php | 116 +++++++++++++++++++++++++ ext/standard/basic_functions_arginfo.h | 26 +++++- ext/standard/image.c | 32 ------- ext/standard/php_image.h | 4 +- 5 files changed, 143 insertions(+), 37 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index cd30c598440b2..713af33e0674f 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -21,6 +21,7 @@ #include "php_globals.h" #include "php_variables.h" #include "php_ini.h" +#include "php_image.h" #include "php_standard.h" #include "php_math.h" #include "php_http.h" @@ -348,7 +349,6 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ BASIC_MINIT_SUBMODULE(exec) BASIC_MINIT_SUBMODULE(user_streams) - BASIC_MINIT_SUBMODULE(imagetypes) php_register_url_stream_wrapper("php", &php_stream_php_wrapper); php_register_url_stream_wrapper("file", &php_plain_files_wrapper); diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 2bd16bbe4c5d7..596f32b4e4b06 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -425,6 +425,122 @@ const DNS_ALL = UNKNOWN; #endif +/* image.c */ + +/** + * @var int + * @cvalue IMAGE_FILETYPE_GIF + */ +const IMAGETYPE_GIF = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_JPEG + */ +const IMAGETYPE_JPEG = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_PNG + */ +const IMAGETYPE_PNG = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_SWF + */ +const IMAGETYPE_SWF = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_PSD + */ +const IMAGETYPE_PSD = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_BMP + */ +const IMAGETYPE_BMP = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_TIFF_II + */ +const IMAGETYPE_TIFF_II = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_TIFF_MM + */ +const IMAGETYPE_TIFF_MM = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_JPC + */ +const IMAGETYPE_JPC = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_JP2 + */ +const IMAGETYPE_JP2 = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_JPX + */ +const IMAGETYPE_JPX = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_JB2 + */ +const IMAGETYPE_JB2 = UNKNOWN; +#if (defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB)) +/** + * @var int + * @cvalue IMAGE_FILETYPE_SWC + */ +const IMAGETYPE_SWC = UNKNOWN; +#endif +/** + * @var int + * @cvalue IMAGE_FILETYPE_IFF + */ +const IMAGETYPE_IFF = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_WBMP + */ +const IMAGETYPE_WBMP = UNKNOWN; +/* keep alias */ +/** + * @var int + * @cvalue IMAGE_FILETYPE_JPC + */ +const IMAGETYPE_JPEG2000 = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_XBM + */ +const IMAGETYPE_XBM = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_ICO + */ +const IMAGETYPE_ICO = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_WEBP + */ +const IMAGETYPE_WEBP = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_AVIF + */ +const IMAGETYPE_AVIF = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_UNKNOWN + */ +const IMAGETYPE_UNKNOWN = UNKNOWN; +/** + * @var int + * @cvalue IMAGE_FILETYPE_COUNT + */ +const IMAGETYPE_COUNT = UNKNOWN; + /* syslog.c */ /* error levels */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 7e7d5f5692ab3..570dbe9a85c8c 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 64cff452a29eabb6a1a2da8ba1171a386b98cf71 */ + * Stub hash: 1921468762d3df7f36d22f27db02f22caa36238a */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -3610,6 +3610,30 @@ static void register_basic_functions_symbols(int module_number) #if (defined(PHP_WIN32) || (defined(HAVE_DNS_SEARCH_FUNC) && defined(HAVE_FULL_DNS_FUNCS))) REGISTER_LONG_CONSTANT("DNS_ALL", PHP_DNS_ALL, CONST_PERSISTENT); #endif + REGISTER_LONG_CONSTANT("IMAGETYPE_GIF", IMAGE_FILETYPE_GIF, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG", IMAGE_FILETYPE_JPEG, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_PNG", IMAGE_FILETYPE_PNG, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_SWF", IMAGE_FILETYPE_SWF, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_PSD", IMAGE_FILETYPE_PSD, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_BMP", IMAGE_FILETYPE_BMP, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_TIFF_II", IMAGE_FILETYPE_TIFF_II, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_TIFF_MM", IMAGE_FILETYPE_TIFF_MM, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_JPC", IMAGE_FILETYPE_JPC, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_JP2", IMAGE_FILETYPE_JP2, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_JPX", IMAGE_FILETYPE_JPX, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_JB2", IMAGE_FILETYPE_JB2, CONST_PERSISTENT); +#if (defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB)) + REGISTER_LONG_CONSTANT("IMAGETYPE_SWC", IMAGE_FILETYPE_SWC, CONST_PERSISTENT); +#endif + REGISTER_LONG_CONSTANT("IMAGETYPE_IFF", IMAGE_FILETYPE_IFF, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_WBMP", IMAGE_FILETYPE_WBMP, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG2000", IMAGE_FILETYPE_JPC, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_XBM", IMAGE_FILETYPE_XBM, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_ICO", IMAGE_FILETYPE_ICO, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_WEBP", IMAGE_FILETYPE_WEBP, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_AVIF", IMAGE_FILETYPE_AVIF, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_UNKNOWN", IMAGE_FILETYPE_UNKNOWN, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("IMAGETYPE_COUNT", IMAGE_FILETYPE_COUNT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("LOG_EMERG", LOG_EMERG, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("LOG_ALERT", LOG_ALERT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("LOG_CRIT", LOG_CRIT, CONST_PERSISTENT); diff --git a/ext/standard/image.c b/ext/standard/image.c index 831cd8a28bc1f..7375d75fc6477 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -64,38 +64,6 @@ struct gfxinfo { unsigned int channels; }; -/* {{{ PHP_MINIT_FUNCTION(imagetypes) - * Register IMAGETYPE_ constants used by GetImageSize(), image_type_to_mime_type, ext/exif */ -PHP_MINIT_FUNCTION(imagetypes) -{ - REGISTER_LONG_CONSTANT("IMAGETYPE_GIF", IMAGE_FILETYPE_GIF, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG", IMAGE_FILETYPE_JPEG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_PNG", IMAGE_FILETYPE_PNG, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_SWF", IMAGE_FILETYPE_SWF, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_PSD", IMAGE_FILETYPE_PSD, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_BMP", IMAGE_FILETYPE_BMP, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_TIFF_II", IMAGE_FILETYPE_TIFF_II, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_TIFF_MM", IMAGE_FILETYPE_TIFF_MM, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_JPC", IMAGE_FILETYPE_JPC, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_JP2", IMAGE_FILETYPE_JP2, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_JPX", IMAGE_FILETYPE_JPX, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_JB2", IMAGE_FILETYPE_JB2, CONST_CS | CONST_PERSISTENT); -#if defined(HAVE_ZLIB) && !defined(COMPILE_DL_ZLIB) - REGISTER_LONG_CONSTANT("IMAGETYPE_SWC", IMAGE_FILETYPE_SWC, CONST_CS | CONST_PERSISTENT); -#endif - REGISTER_LONG_CONSTANT("IMAGETYPE_IFF", IMAGE_FILETYPE_IFF, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_WBMP", IMAGE_FILETYPE_WBMP, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_JPEG2000",IMAGE_FILETYPE_JPC, CONST_CS | CONST_PERSISTENT); /* keep alias */ - REGISTER_LONG_CONSTANT("IMAGETYPE_XBM", IMAGE_FILETYPE_XBM, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_ICO", IMAGE_FILETYPE_ICO, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_WEBP", IMAGE_FILETYPE_WEBP, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_AVIF", IMAGE_FILETYPE_AVIF, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_UNKNOWN", IMAGE_FILETYPE_UNKNOWN, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("IMAGETYPE_COUNT", IMAGE_FILETYPE_COUNT, CONST_CS | CONST_PERSISTENT); - return SUCCESS; -} -/* }}} */ - /* {{{ php_handle_gif * routine to handle GIF files. If only everything were that easy... ;} */ static struct gfxinfo *php_handle_gif (php_stream * stream) diff --git a/ext/standard/php_image.h b/ext/standard/php_image.h index b975e0bf147a1..a41273e6745ae 100644 --- a/ext/standard/php_image.h +++ b/ext/standard/php_image.h @@ -44,13 +44,11 @@ typedef enum IMAGE_FILETYPE_ICO, IMAGE_FILETYPE_WEBP, IMAGE_FILETYPE_AVIF, -/* WHEN EXTENDING: PLEASE ALSO REGISTER IN image.c:PHP_MINIT_FUNCTION(imagetypes) */ +/* WHEN EXTENDING: PLEASE ALSO REGISTER IN basic_function.stub.php */ IMAGE_FILETYPE_COUNT } image_filetype; /* }}} */ -PHP_MINIT_FUNCTION(imagetypes); - PHPAPI int php_getimagetype(php_stream *stream, const char *input, char *filetype); PHPAPI char * php_image_type_to_mime_type(int image_type); From e733ebf30ef1998d02540f84b80a2ad265d13a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 2 Sep 2022 16:15:06 +0200 Subject: [PATCH 1215/1346] Add parenthesis around preprocessor conditions in stubs gen_stub.php concatenates nested #ifs into one #if so let's make sure the semantics remain the same. --- ext/imap/php_imap.stub.php | 2 +- ext/imap/php_imap_arginfo.h | 32 +++++------ ext/ldap/ldap.stub.php | 2 +- ext/ldap/ldap_arginfo.h | 8 +-- ext/odbc/odbc.stub.php | 2 +- ext/odbc/odbc_arginfo.h | 36 ++++++------- ext/sockets/sockets.stub.php | 6 +-- ext/sockets/sockets_arginfo.h | 14 ++--- ext/standard/basic_functions.stub.php | 10 ++-- ext/standard/basic_functions_arginfo.h | 74 +++++++++++++------------- ext/standard/file.stub.php | 8 +-- ext/standard/file_arginfo.h | 10 ++-- 12 files changed, 102 insertions(+), 102 deletions(-) diff --git a/ext/imap/php_imap.stub.php b/ext/imap/php_imap.stub.php index 7ebe6bce936e7..4c94b72656ee7 100644 --- a/ext/imap/php_imap.stub.php +++ b/ext/imap/php_imap.stub.php @@ -551,7 +551,7 @@ function imap_thread(IMAP\Connection $imap, int $flags = SE_FREE): array|false { function imap_timeout(int $timeout_type, int $timeout = -1): int|bool {} - #if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) + #if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) function imap_get_quota(IMAP\Connection $imap, string $quota_root): array|false {} function imap_get_quotaroot(IMAP\Connection $imap, string $mailbox): array|false {} diff --git a/ext/imap/php_imap_arginfo.h b/ext/imap/php_imap_arginfo.h index fe283484746e0..e6d1ed4c921ab 100644 --- a/ext/imap/php_imap_arginfo.h +++ b/ext/imap/php_imap_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: eebef4c1eaf464b0ff093516cf13f1c33d7d0911 */ + * Stub hash: c1f54f259bde2c49c5b49a595751acd2fb365efe */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_imap_open, 0, 3, IMAP\\Connection, MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0) @@ -292,21 +292,21 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_timeout, 0, 1, MAY_BE_LONG| ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "-1") ZEND_END_ARG_INFO() -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_get_quota, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_OBJ_INFO(0, imap, IMAP\\Connection, 0) ZEND_ARG_TYPE_INFO(0, quota_root, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_imap_get_quotaroot, 0, 2, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_OBJ_INFO(0, imap, IMAP\\Connection, 0) ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_set_quota, 0, 3, _IS_BOOL, 0) ZEND_ARG_OBJ_INFO(0, imap, IMAP\\Connection, 0) ZEND_ARG_TYPE_INFO(0, quota_root, IS_STRING, 0) @@ -314,7 +314,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_set_quota, 0, 3, _IS_BOOL, ZEND_END_ARG_INFO() #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_setacl, 0, 4, _IS_BOOL, 0) ZEND_ARG_OBJ_INFO(0, imap, IMAP\\Connection, 0) ZEND_ARG_TYPE_INFO(0, mailbox, IS_STRING, 0) @@ -323,7 +323,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_imap_setacl, 0, 4, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) #define arginfo_imap_getacl arginfo_imap_get_quotaroot #endif @@ -403,19 +403,19 @@ ZEND_FUNCTION(imap_mutf7_to_utf8); ZEND_FUNCTION(imap_mime_header_decode); ZEND_FUNCTION(imap_thread); ZEND_FUNCTION(imap_timeout); -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FUNCTION(imap_get_quota); #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FUNCTION(imap_get_quotaroot); #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FUNCTION(imap_set_quota); #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FUNCTION(imap_setacl); #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FUNCTION(imap_getacl); #endif ZEND_FUNCTION(imap_mail); @@ -494,19 +494,19 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(imap_mime_header_decode, arginfo_imap_mime_header_decode) ZEND_FE(imap_thread, arginfo_imap_thread) ZEND_FE(imap_timeout, arginfo_imap_timeout) -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FE(imap_get_quota, arginfo_imap_get_quota) #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FE(imap_get_quotaroot, arginfo_imap_get_quotaroot) #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FE(imap_set_quota, arginfo_imap_set_quota) #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FE(imap_setacl, arginfo_imap_setacl) #endif -#if defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001) +#if (defined(HAVE_IMAP2000) || defined(HAVE_IMAP2001)) ZEND_FE(imap_getacl, arginfo_imap_getacl) #endif ZEND_FE(imap_mail, arginfo_imap_mail) diff --git a/ext/ldap/ldap.stub.php b/ext/ldap/ldap.stub.php index 3b5aaae78a848..19deffccad9d7 100644 --- a/ext/ldap/ldap.stub.php +++ b/ext/ldap/ldap.stub.php @@ -751,7 +751,7 @@ function ldap_parse_result(LDAP\Connection $ldap, LDAP\Result $result, &$error_c #endif #endif - #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) + #if (defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)) function ldap_set_rebind_proc(LDAP\Connection $ldap, ?callable $callback): bool {} #endif diff --git a/ext/ldap/ldap_arginfo.h b/ext/ldap/ldap_arginfo.h index 0fcc3446afaf3..e44f4f0417622 100644 --- a/ext/ldap/ldap_arginfo.h +++ b/ext/ldap/ldap_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 470fcd62773b033ac200d7817b7917eee5bb812e */ + * Stub hash: 893c86a23c81c32d2c8a4b2ca14a785cd8a99a37 */ #if defined(HAVE_ORALDAP) ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_ldap_connect, 0, 0, LDAP\\Connection, MAY_BE_FALSE) @@ -267,7 +267,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_parse_result, 0, 3, _IS_BOO ZEND_END_ARG_INFO() #endif -#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) +#if (defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_set_rebind_proc, 0, 2, _IS_BOOL, 0) ZEND_ARG_OBJ_INFO(0, ldap, LDAP\\Connection, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 1) @@ -410,7 +410,7 @@ ZEND_FUNCTION(ldap_parse_reference); #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) && defined(HAVE_LDAP_PARSE_RESULT) ZEND_FUNCTION(ldap_parse_result); #endif -#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) +#if (defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)) ZEND_FUNCTION(ldap_set_rebind_proc); #endif #if defined(HAVE_LDAP_START_TLS_S) @@ -513,7 +513,7 @@ static const zend_function_entry ext_functions[] = { #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) && defined(HAVE_LDAP_PARSE_RESULT) ZEND_FE(ldap_parse_result, arginfo_ldap_parse_result) #endif -#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC) +#if (defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)) ZEND_FE(ldap_set_rebind_proc, arginfo_ldap_set_rebind_proc) #endif #if defined(HAVE_LDAP_START_TLS_S) diff --git a/ext/odbc/odbc.stub.php b/ext/odbc/odbc.stub.php index 20cfe6ceffde4..914a3aae283fd 100644 --- a/ext/odbc/odbc.stub.php +++ b/ext/odbc/odbc.stub.php @@ -215,7 +215,7 @@ */ const SQL_TIMESTAMP = UNKNOWN; -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) /** * @var int * @cvalue SQL_TYPE_DATE diff --git a/ext/odbc/odbc_arginfo.h b/ext/odbc/odbc_arginfo.h index df3c7248f045e..8d00ed2125ea7 100644 --- a/ext/odbc/odbc_arginfo.h +++ b/ext/odbc/odbc_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 06660ff7830809c9c11efc8edac13ebbb102b33c */ + * Stub hash: 64fbf9feef2929640a5e8615df6a085c504b7914 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_odbc_close_all, 0, 0, IS_VOID, 0) ZEND_END_ARG_INFO() @@ -434,55 +434,55 @@ static void register_odbc_symbols(int module_number) REGISTER_LONG_CONSTANT("SQL_DATE", SQL_DATE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TIME", SQL_TIME, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SQL_TIMESTAMP", SQL_TIMESTAMP, CONST_PERSISTENT); -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_TYPE_DATE", SQL_TYPE_DATE, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_TYPE_TIME", SQL_TYPE_TIME, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_TYPE_TIMESTAMP", SQL_TYPE_TIMESTAMP, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_WCHAR", SQL_WCHAR, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_WVARCHAR", SQL_WVARCHAR, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_WLONGVARCHAR", SQL_WLONGVARCHAR, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_BEST_ROWID", SQL_BEST_ROWID, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_ROWVER", SQL_ROWVER, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_SCOPE_CURROW", SQL_SCOPE_CURROW, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_SCOPE_TRANSACTION", SQL_SCOPE_TRANSACTION, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_SCOPE_SESSION", SQL_SCOPE_SESSION, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_NO_NULLS", SQL_NO_NULLS, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_NULLABLE", SQL_NULLABLE, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_INDEX_UNIQUE", SQL_INDEX_UNIQUE, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_INDEX_ALL", SQL_INDEX_ALL, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_ENSURE", SQL_ENSURE, CONST_PERSISTENT); #endif -#if defined(ODBCVER) && (ODBCVER >= 0x0300) +#if (defined(ODBCVER) && (ODBCVER >= 0x0300)) REGISTER_LONG_CONSTANT("SQL_QUICK", SQL_QUICK, CONST_PERSISTENT); #endif diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php index 86492c8c2ae11..997d3eb2f7ec7 100644 --- a/ext/sockets/sockets.stub.php +++ b/ext/sockets/sockets.stub.php @@ -1588,7 +1588,7 @@ const SOL_LOCAL = UNKNOWN; #endif -#if defined(IPV6_RECVPKTINFO) && HAVE_IPV6 +#if (defined(IPV6_RECVPKTINFO) && HAVE_IPV6) /** * IPv6 ancillary data * @var int @@ -1601,7 +1601,7 @@ */ const IPV6_PKTINFO = UNKNOWN; #endif -#if defined(IPV6_RECVHOPLIMIT) && HAVE_IPV6 +#if (defined(IPV6_RECVHOPLIMIT) && HAVE_IPV6) /** * @var int * @cvalue IPV6_RECVHOPLIMIT @@ -1614,7 +1614,7 @@ const IPV6_HOPLIMIT = UNKNOWN; #endif -#if defined(IPV6_RECVTCLASS) && HAVE_IPV6 +#if (defined(IPV6_RECVTCLASS) && HAVE_IPV6) /** * @var int * @cvalue IPV6_RECVTCLASS diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h index 38da81269be80..ff76685e2ae88 100644 --- a/ext/sockets/sockets_arginfo.h +++ b/ext/sockets/sockets_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: f89c10cc9feb4c7c3d3fc5172412e9f0ffb476a4 */ + * Stub hash: c4fe33bd6d665f80be942c9cc9c0ce954d719c0d */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) @@ -925,22 +925,22 @@ static void register_sockets_symbols(int module_number) #if defined(SOL_LOCAL) REGISTER_LONG_CONSTANT("SOL_LOCAL", SOL_LOCAL, CONST_PERSISTENT); #endif -#if defined(IPV6_RECVPKTINFO) && HAVE_IPV6 +#if (defined(IPV6_RECVPKTINFO) && HAVE_IPV6) REGISTER_LONG_CONSTANT("IPV6_RECVPKTINFO", IPV6_RECVPKTINFO, CONST_PERSISTENT); #endif -#if defined(IPV6_RECVPKTINFO) && HAVE_IPV6 +#if (defined(IPV6_RECVPKTINFO) && HAVE_IPV6) REGISTER_LONG_CONSTANT("IPV6_PKTINFO", IPV6_PKTINFO, CONST_PERSISTENT); #endif -#if defined(IPV6_RECVHOPLIMIT) && HAVE_IPV6 +#if (defined(IPV6_RECVHOPLIMIT) && HAVE_IPV6) REGISTER_LONG_CONSTANT("IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT, CONST_PERSISTENT); #endif -#if defined(IPV6_RECVHOPLIMIT) && HAVE_IPV6 +#if (defined(IPV6_RECVHOPLIMIT) && HAVE_IPV6) REGISTER_LONG_CONSTANT("IPV6_HOPLIMIT", IPV6_HOPLIMIT, CONST_PERSISTENT); #endif -#if defined(IPV6_RECVTCLASS) && HAVE_IPV6 +#if (defined(IPV6_RECVTCLASS) && HAVE_IPV6) REGISTER_LONG_CONSTANT("IPV6_RECVTCLASS", IPV6_RECVTCLASS, CONST_PERSISTENT); #endif -#if defined(IPV6_RECVTCLASS) && HAVE_IPV6 +#if (defined(IPV6_RECVTCLASS) && HAVE_IPV6) REGISTER_LONG_CONSTANT("IPV6_TCLASS", IPV6_TCLASS, CONST_PERSISTENT); #endif #if defined(SCM_RIGHTS) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 596f32b4e4b06..f55e4e5b9d291 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -1340,7 +1340,7 @@ function gethostbyname(string $hostname): string {} */ function gethostbynamel(string $hostname): array|false {} -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) function dns_check_record(string $hostname, string $type = "MX"): bool {} /** @alias dns_check_record */ @@ -1370,7 +1370,7 @@ function getmxrr(string $hostname, &$hosts, &$weights = null): bool {} /* net.c */ -#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) +#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)) function net_get_interfaces(): array|false {} #endif @@ -1769,7 +1769,7 @@ function closedir($dir_handle = null): void {} function chdir(string $directory): bool {} -#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) +#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC)) function chroot(string $directory): bool {} #endif @@ -2186,7 +2186,7 @@ function levenshtein(string $string1, string $string2, int $insertion_cost = 1, /* link.c */ -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) /** @refcount 1 */ function readlink(string $path): string|false {} @@ -2590,7 +2590,7 @@ function sapi_windows_vt100_support($stream, ?bool $enable = null): bool {} /** @param resource $stream */ function stream_set_chunk_size($stream, int $size): int {} -#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32)) /** @param resource $stream */ function stream_set_timeout($stream, int $seconds, int $microseconds = 0): bool {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 570dbe9a85c8c..51879da2059ca 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 1921468762d3df7f36d22f27db02f22caa36238a */ + * Stub hash: 9c86ed1487132d15715ddbfcb5abd6ac52d629eb */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -632,18 +632,18 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gethostbynamel, 0, 1, MAY_BE_ARR ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_END_ARG_INFO() -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_check_record, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 0, "\"MX\"") ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) #define arginfo_checkdnsrr arginfo_dns_check_record #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_LONG, 0, "DNS_ANY") @@ -653,7 +653,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_dns_get_record, 0, 1, MAY_BE_ARR ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, hostname, IS_STRING, 0) ZEND_ARG_INFO(1, hosts) @@ -661,11 +661,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_dns_get_mx, 0, 2, _IS_BOOL, 0) ZEND_END_ARG_INFO() #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) #define arginfo_getmxrr arginfo_dns_get_mx #endif -#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) +#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_net_get_interfaces, 0, 0, MAY_BE_ARRAY|MAY_BE_FALSE) ZEND_END_ARG_INFO() #endif @@ -1119,7 +1119,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chdir, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() -#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) +#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_chroot, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, directory, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -1573,26 +1573,26 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_levenshtein, 0, 2, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, deletion_cost, IS_LONG, 0, "1") ZEND_END_ARG_INFO() -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_readlink, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_linkinfo, 0, 1, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, path, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_symlink, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, target, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, link, IS_STRING, 0) ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) #define arginfo_link arginfo_symlink #endif @@ -2001,7 +2001,7 @@ ZEND_END_ARG_INFO() #define arginfo_stream_set_chunk_size arginfo_stream_set_write_buffer -#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32)) ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, stream) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -2009,7 +2009,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stream_set_timeout, 0, 2, _IS_BO ZEND_END_ARG_INFO() #endif -#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32)) #define arginfo_socket_set_timeout arginfo_stream_set_timeout #endif @@ -2380,16 +2380,16 @@ ZEND_FUNCTION(gethostname); ZEND_FUNCTION(gethostbyaddr); ZEND_FUNCTION(gethostbyname); ZEND_FUNCTION(gethostbynamel); -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FUNCTION(dns_check_record); #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FUNCTION(dns_get_record); #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FUNCTION(dns_get_mx); #endif -#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) +#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)) ZEND_FUNCTION(net_get_interfaces); #endif #if defined(HAVE_FTOK) @@ -2509,7 +2509,7 @@ ZEND_FUNCTION(opendir); ZEND_FUNCTION(dir); ZEND_FUNCTION(closedir); ZEND_FUNCTION(chdir); -#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) +#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC)) ZEND_FUNCTION(chroot); #endif ZEND_FUNCTION(getcwd); @@ -2626,16 +2626,16 @@ ZEND_FUNCTION(php_ini_loaded_file); ZEND_FUNCTION(iptcembed); ZEND_FUNCTION(iptcparse); ZEND_FUNCTION(levenshtein); -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FUNCTION(readlink); #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FUNCTION(linkinfo); #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FUNCTION(symlink); #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FUNCTION(link); #endif ZEND_FUNCTION(mail); @@ -2753,7 +2753,7 @@ ZEND_FUNCTION(stream_isatty); ZEND_FUNCTION(sapi_windows_vt100_support); #endif ZEND_FUNCTION(stream_set_chunk_size); -#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32)) ZEND_FUNCTION(stream_set_timeout); #endif ZEND_FUNCTION(gettype); @@ -3006,22 +3006,22 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(gethostbyaddr, arginfo_gethostbyaddr) ZEND_FE(gethostbyname, arginfo_gethostbyname) ZEND_FE(gethostbynamel, arginfo_gethostbynamel) -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FE(dns_check_record, arginfo_dns_check_record) #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FALIAS(checkdnsrr, dns_check_record, arginfo_checkdnsrr) #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FE(dns_get_record, arginfo_dns_get_record) #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FE(dns_get_mx, arginfo_dns_get_mx) #endif -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) ZEND_FALIAS(getmxrr, dns_get_mx, arginfo_getmxrr) #endif -#if defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__) +#if (defined(PHP_WIN32) || HAVE_GETIFADDRS || defined(__PASE__)) ZEND_FE(net_get_interfaces, arginfo_net_get_interfaces) #endif #if defined(HAVE_FTOK) @@ -3144,7 +3144,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(dir, arginfo_dir) ZEND_FE(closedir, arginfo_closedir) ZEND_FE(chdir, arginfo_chdir) -#if defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC) +#if (defined(HAVE_CHROOT) && !defined(ZTS) && defined(ENABLE_CHROOT_FUNC)) ZEND_FE(chroot, arginfo_chroot) #endif ZEND_FE(getcwd, arginfo_getcwd) @@ -3264,16 +3264,16 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(iptcembed, arginfo_iptcembed) ZEND_FE(iptcparse, arginfo_iptcparse) ZEND_FE(levenshtein, arginfo_levenshtein) -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FE(readlink, arginfo_readlink) #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FE(linkinfo, arginfo_linkinfo) #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FE(symlink, arginfo_symlink) #endif -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) ZEND_FE(link, arginfo_link) #endif ZEND_FE(mail, arginfo_mail) @@ -3394,10 +3394,10 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(sapi_windows_vt100_support, arginfo_sapi_windows_vt100_support) #endif ZEND_FE(stream_set_chunk_size, arginfo_stream_set_chunk_size) -#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32)) ZEND_FE(stream_set_timeout, arginfo_stream_set_timeout) #endif -#if defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32) +#if (defined(HAVE_SYS_TIME_H) || defined(PHP_WIN32)) ZEND_FALIAS(socket_set_timeout, stream_set_timeout, arginfo_socket_set_timeout) #endif ZEND_FE(gettype, arginfo_gettype) diff --git a/ext/standard/file.stub.php b/ext/standard/file.stub.php index bd7295567fda4..72cf582b8f1f1 100644 --- a/ext/standard/file.stub.php +++ b/ext/standard/file.stub.php @@ -325,7 +325,7 @@ const STREAM_IPPROTO_IP = UNKNOWN; #endif -#if defined(IPPROTO_TCP) || defined(PHP_WIN32) +#if (defined(IPPROTO_TCP) || defined(PHP_WIN32)) /** * @var int * @cvalue IPPROTO_TCP @@ -333,7 +333,7 @@ const STREAM_IPPROTO_TCP = UNKNOWN; #endif -#if defined(IPPROTO_UDP) || defined(PHP_WIN32) +#if (defined(IPPROTO_UDP) || defined(PHP_WIN32)) /** * @var int * @cvalue IPPROTO_UDP @@ -341,7 +341,7 @@ const STREAM_IPPROTO_UDP = UNKNOWN; #endif -#if defined(IPPROTO_ICMP) || defined(PHP_WIN32) +#if (defined(IPPROTO_ICMP) || defined(PHP_WIN32)) /** * @var int * @cvalue IPPROTO_ICMP @@ -349,7 +349,7 @@ const STREAM_IPPROTO_ICMP = UNKNOWN; #endif -#if defined(IPPROTO_RAW) || defined(PHP_WIN32) +#if (defined(IPPROTO_RAW) || defined(PHP_WIN32)) /** * @var int * @cvalue IPPROTO_RAW diff --git a/ext/standard/file_arginfo.h b/ext/standard/file_arginfo.h index 783eb61bd27d9..ac619b7f00caa 100644 --- a/ext/standard/file_arginfo.h +++ b/ext/standard/file_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d472a7623af41d460417e6399ed829302b60e3c3 */ + * Stub hash: 38c6088c48d8f582ede1363855a867dc4aade34b */ @@ -78,16 +78,16 @@ static void register_file_symbols(int module_number) #if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(IPPROTO_IP) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_IP", IPPROTO_IP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(IPPROTO_TCP) || defined(PHP_WIN32) +#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_TCP) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_TCP", IPPROTO_TCP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(IPPROTO_UDP) || defined(PHP_WIN32) +#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_UDP) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_UDP", IPPROTO_UDP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(IPPROTO_ICMP) || defined(PHP_WIN32) +#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_ICMP) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_ICMP", IPPROTO_ICMP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(IPPROTO_RAW) || defined(PHP_WIN32) +#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_RAW) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_RAW", IPPROTO_RAW, CONST_PERSISTENT); #endif #if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) From 52108727474c385b2423fee05404f8edba4acd7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 2 Sep 2022 17:18:42 +0200 Subject: [PATCH 1216/1346] Regenerate optimizer func info after preprocessor condition changes --- Zend/Optimizer/zend_func_infos.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/Optimizer/zend_func_infos.h b/Zend/Optimizer/zend_func_infos.h index 9f6940fcd8e98..10f8d950ee094 100644 --- a/Zend/Optimizer/zend_func_infos.h +++ b/Zend/Optimizer/zend_func_infos.h @@ -518,7 +518,7 @@ static const func_info_t func_infos[] = { F1("gethostbyaddr", MAY_BE_STRING|MAY_BE_FALSE), F1("gethostbyname", MAY_BE_STRING), F1("gethostbynamel", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING|MAY_BE_FALSE), -#if defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC) +#if (defined(PHP_WIN32) || defined(HAVE_DNS_SEARCH_FUNC)) F1("dns_get_record", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE), #endif F1("md5", MAY_BE_STRING), @@ -621,7 +621,7 @@ static const func_info_t func_infos[] = { F1("php_ini_loaded_file", MAY_BE_STRING|MAY_BE_FALSE), F1("iptcembed", MAY_BE_STRING|MAY_BE_BOOL), F1("iptcparse", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_STRING|MAY_BE_ARRAY_OF_ARRAY|MAY_BE_FALSE), -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) +#if (defined(HAVE_SYMLINK) || defined(PHP_WIN32)) F1("readlink", MAY_BE_STRING|MAY_BE_FALSE), #endif F1("decbin", MAY_BE_STRING), From fb242f41baa08087723939e8fdc68fa034edb8d9 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 3 Sep 2022 11:23:10 +0200 Subject: [PATCH 1217/1346] Fix high opcache.interned_strings_buffer causing shm corruption (#9260) --- ext/opcache/ZendAccelerator.c | 11 ++++++++--- ext/opcache/tests/gh9259_001.phpt | 18 ++++++++++++++++++ ext/opcache/tests/gh9259_002.phpt | 18 ++++++++++++++++++ ext/opcache/tests/gh9259_003.phpt | 15 +++++++++++++++ ext/opcache/zend_accelerator_module.c | 22 +++++++++++++++++++++- ext/opcache/zend_shared_alloc.c | 6 +++++- 6 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 ext/opcache/tests/gh9259_001.phpt create mode 100644 ext/opcache/tests/gh9259_002.phpt create mode 100644 ext/opcache/tests/gh9259_003.phpt diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index fd2792028b1d6..a74ad34ab8ea1 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2840,18 +2840,23 @@ static inline int accel_find_sapi(void) static int zend_accel_init_shm(void) { int i; + size_t accel_shared_globals_size; zend_shared_alloc_lock(); if (ZCG(accel_directives).interned_strings_buffer) { - accel_shared_globals = zend_shared_alloc((ZCG(accel_directives).interned_strings_buffer * 1024 * 1024)); + accel_shared_globals_size = ZCG(accel_directives).interned_strings_buffer * 1024 * 1024; } else { /* Make sure there is always at least one interned string hash slot, * so the table can be queried unconditionally. */ - accel_shared_globals = zend_shared_alloc(sizeof(zend_accel_shared_globals) + sizeof(uint32_t)); + accel_shared_globals_size = sizeof(zend_accel_shared_globals) + sizeof(uint32_t); } + + accel_shared_globals = zend_shared_alloc(accel_shared_globals_size); if (!accel_shared_globals) { - zend_accel_error_noreturn(ACCEL_LOG_FATAL, "Insufficient shared memory!"); + zend_accel_error_noreturn(ACCEL_LOG_FATAL, + "Insufficient shared memory for interned strings buffer! (tried to allocate %zu bytes)", + accel_shared_globals_size); zend_shared_alloc_unlock(); return FAILURE; } diff --git a/ext/opcache/tests/gh9259_001.phpt b/ext/opcache/tests/gh9259_001.phpt new file mode 100644 index 0000000000000..bcc0f113c57f6 --- /dev/null +++ b/ext/opcache/tests/gh9259_001.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug GH-9259 001 (Setting opcache.interned_strings_buffer to a very high value leads to corruption of shm) +--EXTENSIONS-- +opcache +--INI-- +opcache.interned_strings_buffer=131072 +opcache.log_verbosity_level=2 +opcache.enable_cli=1 +--FILE-- + +--EXPECTF-- +%sWarning opcache.interned_strings_buffer must be less than or equal to 4095, 131072 given%s + +OK diff --git a/ext/opcache/tests/gh9259_002.phpt b/ext/opcache/tests/gh9259_002.phpt new file mode 100644 index 0000000000000..8b74949b49469 --- /dev/null +++ b/ext/opcache/tests/gh9259_002.phpt @@ -0,0 +1,18 @@ +--TEST-- +Bug GH-9259 002 (Setting opcache.interned_strings_buffer to a very high value leads to corruption of shm) +--EXTENSIONS-- +opcache +--INI-- +opcache.interned_strings_buffer=-1 +opcache.log_verbosity_level=2 +opcache.enable_cli=1 +--FILE-- + +--EXPECTF-- +%sWarning opcache.interned_strings_buffer must be greater than or equal to 0, -1 given%s + +OK diff --git a/ext/opcache/tests/gh9259_003.phpt b/ext/opcache/tests/gh9259_003.phpt new file mode 100644 index 0000000000000..91bfcad917b36 --- /dev/null +++ b/ext/opcache/tests/gh9259_003.phpt @@ -0,0 +1,15 @@ +--TEST-- +Bug GH-9259 003 (Setting opcache.interned_strings_buffer to a very high value leads to corruption of shm) +--EXTENSIONS-- +opcache +--INI-- +opcache.interned_strings_buffer=500 +opcache.enable_cli=1 +--FILE-- + +--EXPECTF-- +%sFatal Error Insufficient shared memory for interned strings buffer! (tried to allocate %d bytes) diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index 6a5eb2b69b344..270ceda7c6293 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -40,6 +40,7 @@ #define STRING_NOT_NULL(s) (NULL == (s)?"":s) #define MIN_ACCEL_FILES 200 #define MAX_ACCEL_FILES 1000000 +#define MAX_INTERNED_STRINGS_BUFFER_SIZE ((zend_long)((UINT32_MAX-PLATFORM_ALIGNMENT)/(1024*1024))) #define TOKENTOSTR(X) #X static zif_handler orig_file_exists = NULL; @@ -78,6 +79,25 @@ static ZEND_INI_MH(OnUpdateMemoryConsumption) return SUCCESS; } +static ZEND_INI_MH(OnUpdateInternedStringsBuffer) +{ + zend_long *p = (zend_long *) ZEND_INI_GET_ADDR(); + zend_long size = zend_ini_parse_quantity_warn(new_value, entry->name); + + if (size < 0) { + zend_accel_error(ACCEL_LOG_WARNING, "opcache.interned_strings_buffer must be greater than or equal to 0, " ZEND_LONG_FMT " given.\n", size); + return FAILURE; + } + if (size > MAX_INTERNED_STRINGS_BUFFER_SIZE) { + zend_accel_error(ACCEL_LOG_WARNING, "opcache.interned_strings_buffer must be less than or equal to " ZEND_LONG_FMT ", " ZEND_LONG_FMT " given.\n", MAX_INTERNED_STRINGS_BUFFER_SIZE, size); + return FAILURE; + } + + *p = size; + + return SUCCESS; +} + static ZEND_INI_MH(OnUpdateMaxAcceleratedFiles) { zend_long *p = (zend_long *) ZEND_INI_GET_ADDR(); @@ -239,7 +259,7 @@ ZEND_INI_BEGIN() STD_PHP_INI_ENTRY("opcache.log_verbosity_level" , "1" , PHP_INI_SYSTEM, OnUpdateLong, accel_directives.log_verbosity_level, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.memory_consumption" , "128" , PHP_INI_SYSTEM, OnUpdateMemoryConsumption, accel_directives.memory_consumption, zend_accel_globals, accel_globals) - STD_PHP_INI_ENTRY("opcache.interned_strings_buffer", "8" , PHP_INI_SYSTEM, OnUpdateLong, accel_directives.interned_strings_buffer, zend_accel_globals, accel_globals) + STD_PHP_INI_ENTRY("opcache.interned_strings_buffer", "8" , PHP_INI_SYSTEM, OnUpdateInternedStringsBuffer, accel_directives.interned_strings_buffer, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.max_accelerated_files" , "10000", PHP_INI_SYSTEM, OnUpdateMaxAcceleratedFiles, accel_directives.max_accelerated_files, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.max_wasted_percentage" , "5" , PHP_INI_SYSTEM, OnUpdateMaxWastedPercentage, accel_directives.max_wasted_percentage, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.consistency_checks" , "0" , PHP_INI_ALL , OnUpdateLong, accel_directives.consistency_checks, zend_accel_globals, accel_globals) diff --git a/ext/opcache/zend_shared_alloc.c b/ext/opcache/zend_shared_alloc.c index 7f820fcdc27b0..3f18a4db6040e 100644 --- a/ext/opcache/zend_shared_alloc.c +++ b/ext/opcache/zend_shared_alloc.c @@ -328,7 +328,7 @@ static size_t zend_shared_alloc_get_largest_free_block(void) #define MIN_FREE_MEMORY 64*1024 #define SHARED_ALLOC_FAILED() do { \ - zend_accel_error(ACCEL_LOG_WARNING, "Not enough free shared space to allocate "ZEND_LONG_FMT" bytes ("ZEND_LONG_FMT" bytes free)", (zend_long)size, (zend_long)ZSMMG(shared_free)); \ + zend_accel_error(ACCEL_LOG_WARNING, "Not enough free shared space to allocate %zu bytes (%zu bytes free)", size, ZSMMG(shared_free)); \ if (zend_shared_alloc_get_largest_free_block() < MIN_FREE_MEMORY) { \ ZSMMG(memory_exhausted) = 1; \ } \ @@ -339,6 +339,10 @@ void *zend_shared_alloc(size_t size) int i; unsigned int block_size = ZEND_ALIGNED_SIZE(size); + if (UNEXPECTED(block_size < size)) { + zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Possible integer overflow in shared memory allocation (%zu + %zu)", size, PLATFORM_ALIGNMENT); + } + #if 1 if (!ZCG(locked)) { zend_accel_error_noreturn(ACCEL_LOG_ERROR, "Shared memory lock not obtained"); From ea1287b015b713909096b5469ecc7fa569b13b45 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 3 Sep 2022 11:23:43 +0200 Subject: [PATCH 1218/1346] Log the cause of error when opcache cannot write to file cache (#9258) --- ext/opcache/tests/file_cache_error.phpt | 42 +++++++++++++++++++++ ext/opcache/zend_file_cache.c | 49 +++++++++++++++++++++---- 2 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 ext/opcache/tests/file_cache_error.phpt diff --git a/ext/opcache/tests/file_cache_error.phpt b/ext/opcache/tests/file_cache_error.phpt new file mode 100644 index 0000000000000..75b63cd21cce0 --- /dev/null +++ b/ext/opcache/tests/file_cache_error.phpt @@ -0,0 +1,42 @@ +--TEST-- +File cache error 001 +--EXTENSIONS-- +opcache +posix +pcntl +--INI-- +opcache.enable_cli=1 +opcache.file_cache={TMP} +opcache.log_verbosity_level=2 +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +bool(true) +%sWarning opcache cannot write to file %s: %s + +OK diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index badbac2185535..a15736b72e5fe 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -1004,10 +1004,13 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path) /** * Helper function for zend_file_cache_script_store(). * - * @return true on success, false on error + * @return true on success, false on error and errno is set to indicate the cause of the error */ static bool zend_file_cache_script_write(int fd, const zend_persistent_script *script, const zend_file_cache_metainfo *info, const void *buf, const zend_string *s) { + ssize_t written; + const ssize_t total_size = (ssize_t)(sizeof(*info) + script->size + info->str_size); + #ifdef HAVE_SYS_UIO_H const struct iovec vec[] = { { .iov_base = (void *)info, .iov_len = sizeof(*info) }, @@ -1015,12 +1018,42 @@ static bool zend_file_cache_script_write(int fd, const zend_persistent_script *s { .iov_base = (void *)ZSTR_VAL(s), .iov_len = info->str_size }, }; - return writev(fd, vec, sizeof(vec) / sizeof(vec[0])) == (ssize_t)(sizeof(*info) + script->size + info->str_size); + written = writev(fd, vec, sizeof(vec) / sizeof(vec[0])); + if (EXPECTED(written == total_size)) { + return true; + } + + errno = written == -1 ? errno : EAGAIN; + return false; #else - return ZEND_LONG_MAX >= (zend_long)(sizeof(*info) + script->size + info->str_size) && - write(fd, info, sizeof(*info)) == sizeof(*info) && - write(fd, buf, script->size) == script->size && - write(fd, ZSTR_VAL(s), info->str_size) == info->str_size; + if (UNEXPECTED(ZEND_LONG_MAX < (zend_long)total_size)) { +# ifdef EFBIG + errno = EFBIG; +# else + errno = ERANGE; +# endif + return false; + } + + written = write(fd, info, sizeof(*info)); + if (UNEXPECTED(written != sizeof(*info))) { + errno = written == -1 ? errno : EAGAIN; + return false; + } + + written = write(fd, buf, script->size); + if (UNEXPECTED(written != script->size)) { + errno = written == -1 ? errno : EAGAIN; + return false; + } + + written = write(fd, ZSTR_VAL(s), info->str_size); + if (UNEXPECTED(written != info->str_size)) { + errno = written == -1 ? errno : EAGAIN; + return false; + } + + return true; #endif } @@ -1095,7 +1128,7 @@ int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm) #endif if (!zend_file_cache_script_write(fd, script, &info, buf, s)) { - zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s'\n", filename); + zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot write to file '%s': %s\n", filename, strerror(errno)); zend_string_release_ex(s, 0); close(fd); efree(mem); @@ -1107,7 +1140,7 @@ int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm) zend_string_release_ex(s, 0); efree(mem); if (zend_file_cache_flock(fd, LOCK_UN) != 0) { - zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s'\n", filename); + zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s': %s\n", filename, strerror(errno)); } close(fd); efree(filename); From 349fdc9042883e67b59950972fa1c5776515dde6 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 3 Sep 2022 11:28:18 +0200 Subject: [PATCH 1219/1346] [ci skip] NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index b10c23ee4869e..4cab719fb8f88 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC2 +- Opcache: + . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer + overflow). (Arnaud) + - Standard: . Marked crypt()'s $string parameter as #[\SensitiveParameter]. (timwolla) From f098193d150bc26e3c13d0253f6d2fc3d6f45a96 Mon Sep 17 00:00:00 2001 From: David Bohman Date: Sat, 3 Sep 2022 13:58:10 -0700 Subject: [PATCH 1220/1346] GH-9464: Fix build on older macOs releases. A simple check for CommonCrypto/CommonRandom.h does not work on earlier macOS. Must also pull in sys/types.h for size_t, Availability.h for __OSX_AVAILABLE_STARTING, and CommonCrypto/CommonCryptoError.h for CCCryptorStatus. Closes GH-9479. --- NEWS | 4 ++++ ext/random/config.m4 | 7 ++++++- ext/standard/config.m4 | 7 ++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 4cab719fb8f88..98d6384fd49e5 100644 --- a/NEWS +++ b/NEWS @@ -6,8 +6,12 @@ PHP NEWS . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer overflow). (Arnaud) +- Random: + . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) + - Standard: . Marked crypt()'s $string parameter as #[\SensitiveParameter]. (timwolla) + . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) 01 Sep 2022, PHP 8.2.0RC1 diff --git a/ext/random/config.m4 b/ext/random/config.m4 index 7bd432c9110c2..a8e6d5a568991 100644 --- a/ext/random/config.m4 +++ b/ext/random/config.m4 @@ -7,7 +7,12 @@ dnl dnl Check for CCRandomGenerateBytes dnl header absent in previous macOs releases dnl -AC_CHECK_HEADERS([CommonCrypto/CommonRandom.h]) +AC_CHECK_HEADERS([CommonCrypto/CommonRandom.h], [], [], +[ + #include + #include + #include +]) dnl dnl Setup extension diff --git a/ext/standard/config.m4 b/ext/standard/config.m4 index fb9d8e5415871..8e77e75134c9e 100644 --- a/ext/standard/config.m4 +++ b/ext/standard/config.m4 @@ -407,7 +407,12 @@ dnl dnl Check for CCRandomGenerateBytes dnl header absent in previous macOs releases dnl -AC_CHECK_HEADERS([CommonCrypto/CommonRandom.h]) +AC_CHECK_HEADERS([CommonCrypto/CommonRandom.h], [], [], +[ + #include + #include + #include +]) dnl dnl Check for argon2 From c547fc183cd6d564a158f0b4db684c77ae6d9b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 5 Sep 2022 14:21:15 +0200 Subject: [PATCH 1221/1346] Add support for validation of missing class synopses (#9472) --- build/gen_stub.php | 41 +++++++++++++++++++++----- ext/pdo_pgsql/pgsql_driver.stub.php | 5 +++- ext/pdo_pgsql/pgsql_driver_arginfo.h | 2 +- ext/pdo_sqlite/sqlite_driver.stub.php | 5 +++- ext/pdo_sqlite/sqlite_driver_arginfo.h | 2 +- ext/standard/basic_functions.stub.php | 1 + ext/standard/basic_functions_arginfo.h | 2 +- ext/zend_test/fiber.stub.php | 5 +++- ext/zend_test/fiber_arginfo.h | 2 +- ext/zend_test/test.stub.php | 1 + ext/zend_test/test_arginfo.h | 2 +- 11 files changed, 53 insertions(+), 15 deletions(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index 6b1556d735196..bbaa251ed695a 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -2453,6 +2453,8 @@ class ClassInfo { public $cond; /** @var int|null */ public $phpVersionIdMinimumCompatibility; + /** @var bool */ + public $isUndocumentable; /** * @param AttributeInfo[] $attributes @@ -2480,7 +2482,8 @@ public function __construct( array $funcInfos, array $enumCaseInfos, ?string $cond, - ?int $minimumPhpVersionIdCompatibility + ?int $minimumPhpVersionIdCompatibility, + bool $isUndocumentable ) { $this->name = $name; $this->flags = $flags; @@ -2499,6 +2502,7 @@ public function __construct( $this->enumCaseInfos = $enumCaseInfos; $this->cond = $cond; $this->phpVersionIdMinimumCompatibility = $minimumPhpVersionIdCompatibility; + $this->isUndocumentable = $isUndocumentable; } /** @@ -3088,6 +3092,8 @@ class FileInfo { public $generateLegacyArginfoForPhpVersionId; /** @var bool */ public $generateClassEntries = false; + /** @var bool */ + public $isUndocumentable = false; /** * @return iterable @@ -3499,7 +3505,8 @@ function parseClass( array $methods, array $enumCases, ?string $cond, - ?int $minimumPhpVersionIdCompatibility + ?int $minimumPhpVersionIdCompatibility, + bool $isUndocumentable ): ClassInfo { $flags = $class instanceof Class_ ? $class->flags : 0; $comment = $class->getDocComment(); @@ -3521,6 +3528,8 @@ function parseClass( $isStrictProperties = true; } else if ($tag->name === 'not-serializable') { $isNotSerializable = true; + } else if ($tag->name === 'undocumentable') { + $isUndocumentable = true; } } } @@ -3579,7 +3588,8 @@ function parseClass( $methods, $enumCases, $cond, - $minimumPhpVersionIdCompatibility + $minimumPhpVersionIdCompatibility, + $isUndocumentable ); } @@ -3732,7 +3742,7 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac } $fileInfo->classInfos[] = parseClass( - $className, $stmt, $constInfos, $propertyInfos, $methodInfos, $enumCaseInfos, $cond, $fileInfo->generateLegacyArginfoForPhpVersionId + $className, $stmt, $constInfos, $propertyInfos, $methodInfos, $enumCaseInfos, $cond, $fileInfo->generateLegacyArginfoForPhpVersionId, $fileInfo->isUndocumentable ); continue; } @@ -3783,6 +3793,8 @@ protected function pName_FullyQualified(Name\FullyQualified $node) { } else if ($tag->name === 'generate-class-entries') { $fileInfo->generateClassEntries = true; $fileInfo->declarationPrefix = $tag->value ? $tag->value . " " : ""; + } else if ($tag->name === 'undocumentable') { + $fileInfo->isUndocumentable = true; } } } @@ -4219,12 +4231,14 @@ function generateClassSynopses(array $classMap, iterable $allConstInfos): array } /** - * @param ClassInfo[] $classMap + * @param array $classMap * $param iterable $allConstInfos * @return array */ -function replaceClassSynopses(string $targetDirectory, array $classMap, iterable $allConstInfos): array +function replaceClassSynopses(string $targetDirectory, array $classMap, iterable $allConstInfos, bool $isVerify): array { + $existingClassSynopses = []; + $classSynopses = []; $it = new RecursiveIteratorIterator( @@ -4281,6 +4295,9 @@ function replaceClassSynopses(string $targetDirectory, array $classMap, iterable if (!isset($classMap[$className])) { continue; } + + $existingClassSynopses[$className] = $className; + $classInfo = $classMap[$className]; $newClassSynopsis = $classInfo->getClassSynopsisElement($doc, $classMap, $allConstInfos); @@ -4320,6 +4337,16 @@ function replaceClassSynopses(string $targetDirectory, array $classMap, iterable } } + if ($isVerify) { + $missingClassSynopses = array_diff_key($classMap, $existingClassSynopses); + foreach ($missingClassSynopses as $className => $info) { + /** @var ClassInfo $info */ + if (!$info->isUndocumentable) { + echo "Warning: Missing class synopsis page for $className\n"; + } + } + } + return $classSynopses; } @@ -4791,7 +4818,7 @@ function(?ArgInfo $aliasArg, ?ArgInfo $aliasedArg) use ($aliasFunc, $aliasedFunc } if ($replaceClassSynopses) { - $classSynopses = replaceClassSynopses($targetSynopses, $classMap, $context->allConstInfos); + $classSynopses = replaceClassSynopses($targetSynopses, $classMap, $context->allConstInfos, $verify); foreach ($classSynopses as $filename => $content) { if (file_put_contents($filename, $content)) { diff --git a/ext/pdo_pgsql/pgsql_driver.stub.php b/ext/pdo_pgsql/pgsql_driver.stub.php index 6daa55c7b873a..4206dbea636b9 100644 --- a/ext/pdo_pgsql/pgsql_driver.stub.php +++ b/ext/pdo_pgsql/pgsql_driver.stub.php @@ -2,7 +2,10 @@ /** @generate-function-entries */ -// These are extension methods for PDO. This is not a real class. +/** + * These are extension methods for PDO. This is not a real class. + * @undocumentable + */ class PDO_PGSql_Ext { /** @tentative-return-type */ public function pgsqlCopyFromArray(string $tableName, array $rows, 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 a3ec5196fad2c..3f84d4d8e5b9d 100644 --- a/ext/pdo_pgsql/pgsql_driver_arginfo.h +++ b/ext/pdo_pgsql/pgsql_driver_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 5dfd421cf9ba9eb043c4b4f3c9b9c09c81cc3ccb */ + * Stub hash: b30fa6327876dc1090ee5397253c935e4566a8fe */ 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) diff --git a/ext/pdo_sqlite/sqlite_driver.stub.php b/ext/pdo_sqlite/sqlite_driver.stub.php index 58fb41c9b950e..add395f2b99a5 100644 --- a/ext/pdo_sqlite/sqlite_driver.stub.php +++ b/ext/pdo_sqlite/sqlite_driver.stub.php @@ -2,7 +2,10 @@ /** @generate-function-entries */ -// These are extension methods for PDO. This is not a real class. +/** + * These are extension methods for PDO. This is not a real class. + * @undocumentable + */ class PDO_SQLite_Ext { /** @tentative-return-type */ public function sqliteCreateFunction(string $name, callable $callback, int $numArgs = -1, int $flags = 0): bool {} diff --git a/ext/pdo_sqlite/sqlite_driver_arginfo.h b/ext/pdo_sqlite/sqlite_driver_arginfo.h index 2b9b1aea1e0ba..5ba745e55cf3e 100644 --- a/ext/pdo_sqlite/sqlite_driver_arginfo.h +++ b/ext/pdo_sqlite/sqlite_driver_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 8cc3c173f5a442ab80f240a568489b023aabd7ef */ + * Stub hash: dc901bd60d17c1a2cdb40a118e2c6cd6eb0396e3 */ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_PDO_SQLite_Ext_sqliteCreateFunction, 0, 2, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index f55e4e5b9d291..7e6f9d8afbec3 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -740,6 +740,7 @@ const LOG_PERROR = UNKNOWN; #endif +/** @undocumentable */ #[AllowDynamicProperties] final class __PHP_Incomplete_Class { diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 51879da2059ca..e76e056f3e81e 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 9c86ed1487132d15715ddbfcb5abd6ac52d629eb */ + * Stub hash: 9e0016895111851aa2c635e1380a18cd7963e58e */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) diff --git a/ext/zend_test/fiber.stub.php b/ext/zend_test/fiber.stub.php index 4cfe97137d86e..0f6ccf898e29d 100644 --- a/ext/zend_test/fiber.stub.php +++ b/ext/zend_test/fiber.stub.php @@ -1,6 +1,9 @@ Date: Mon, 5 Sep 2022 17:33:36 +0200 Subject: [PATCH 1222/1346] random: Validate that the arrays do not contain extra elements when unserializing (#9458) * Apply `var_dump()` in 02_engine/all_serialize_error.phpt This ensures that an undetected serialization error is clear identifiable in the output. * random: Validate that the arrays do not contain extra elements when unserializing --- ext/random/engine_mt19937.c | 11 +++++++ ext/random/engine_pcgoneseq128xslrr64.c | 5 +++ ext/random/engine_xoshiro256starstar.c | 5 +++ ext/random/randomizer.c | 6 ++++ .../tests/02_engine/all_serialize_error.phpt | 32 ++++++++++++++----- 5 files changed, 51 insertions(+), 8 deletions(-) diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c index a2aed76a39d76..227c1ac02540d 100644 --- a/ext/random/engine_mt19937.c +++ b/ext/random/engine_mt19937.c @@ -203,6 +203,11 @@ static bool unserialize(php_random_status *status, HashTable *data) php_random_status_state_mt19937 *s = status->state; zval *t; + /* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */ + if (zend_hash_num_elements(data) != (MT_N + 2)) { + return false; + } + for (uint32_t i = 0; i < MT_N; i++) { t = zend_hash_index_find(data, i); if (!t || Z_TYPE_P(t) != IS_STRING || Z_STRLEN_P(t) != (2 * sizeof(uint32_t))) { @@ -358,6 +363,12 @@ PHP_METHOD(Random_Engine_Mt19937, __unserialize) Z_PARAM_ARRAY_HT(d); ZEND_PARSE_PARAMETERS_END(); + /* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */ + if (zend_hash_num_elements(d) != 2) { + zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(engine->std.ce->name)); + RETURN_THROWS(); + } + /* members */ t = zend_hash_index_find(d, 0); if (!t || Z_TYPE_P(t) != IS_ARRAY) { diff --git a/ext/random/engine_pcgoneseq128xslrr64.c b/ext/random/engine_pcgoneseq128xslrr64.c index 41bbdad98a422..243e296bbe890 100644 --- a/ext/random/engine_pcgoneseq128xslrr64.c +++ b/ext/random/engine_pcgoneseq128xslrr64.c @@ -83,6 +83,11 @@ static bool unserialize(php_random_status *status, HashTable *data) uint64_t u[2]; zval *t; + /* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */ + if (zend_hash_num_elements(data) != 2) { + return false; + } + for (uint32_t i = 0; i < 2; i++) { t = zend_hash_index_find(data, i); if (!t || Z_TYPE_P(t) != IS_STRING || Z_STRLEN_P(t) != (2 * sizeof(uint64_t))) { diff --git a/ext/random/engine_xoshiro256starstar.c b/ext/random/engine_xoshiro256starstar.c index fa5fcea80d6eb..52617adb10565 100644 --- a/ext/random/engine_xoshiro256starstar.c +++ b/ext/random/engine_xoshiro256starstar.c @@ -131,6 +131,11 @@ static bool unserialize(php_random_status *status, HashTable *data) php_random_status_state_xoshiro256starstar *s = status->state; zval *t; + /* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */ + if (zend_hash_num_elements(data) != 4) { + return false; + } + for (uint32_t i = 0; i < 4; i++) { t = zend_hash_index_find(data, i); if (!t || Z_TYPE_P(t) != IS_STRING || Z_STRLEN_P(t) != (2 * sizeof(uint64_t))) { diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index f26231b997722..b66a88169cbe2 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -272,6 +272,12 @@ PHP_METHOD(Random_Randomizer, __unserialize) Z_PARAM_ARRAY_HT(d); ZEND_PARSE_PARAMETERS_END(); + /* Verify the expected number of elements, this implicitly ensures that no additional elements are present. */ + if (zend_hash_num_elements(d) != 1) { + zend_throw_exception(NULL, "Invalid serialization data for Random\\Randomizer object", 0); + RETURN_THROWS(); + } + members_zv = zend_hash_index_find(d, 0); if (!members_zv || Z_TYPE_P(members_zv) != IS_ARRAY) { zend_throw_exception(NULL, "Invalid serialization data for Random\\Randomizer object", 0); diff --git a/ext/random/tests/02_engine/all_serialize_error.phpt b/ext/random/tests/02_engine/all_serialize_error.phpt index 152396ade2b98..0569415145665 100644 --- a/ext/random/tests/02_engine/all_serialize_error.phpt +++ b/ext/random/tests/02_engine/all_serialize_error.phpt @@ -6,28 +6,28 @@ Random: Engine: serialize error pattern echo \Random\Engine\Mt19937::class, PHP_EOL; // malformed hex try { - unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:7:"5aa6b98";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:0;i:625;i:0;}}'); + var_dump(unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:7:"5aa6b98";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:0;i:625;i:0;}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } // invalid hex try { - unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"5aa6b98g";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:0;i:625;i:0;}}'); + var_dump(unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"5aa6b98g";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:0;i:625;i:0;}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } // invalid count try { - unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"5aa6b986";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:1000;i:625;i:0;}}'); + var_dump(unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"5aa6b986";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:1000;i:625;i:0;}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } // invalid mode try { - unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"5aa6b986";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:0;i:625;i:2;}}'); + var_dump(unserialize('O:21:"Random\Engine\Mt19937":2:{i:0;a:0:{}i:1;a:626:{i:0;s:8:"5aa6b986";i:1;s:8:"8660cc14";i:2;s:8:"c0b631ca";i:3;s:8:"e85464ad";i:4;s:8:"70fa6108";i:5;s:8:"c5ed9c3c";i:6;s:8:"b05b7ff1";i:7;s:8:"faf33a3a";i:8;s:8:"ab7c0e61";i:9;s:8:"2d4c9c37";i:10;s:8:"daffe918";i:11;s:8:"644f25b9";i:12;s:8:"fdb352e5";i:13;s:8:"434dafa9";i:14;s:8:"a3c9826e";i:15;s:8:"923dfd8c";i:16;s:8:"f641a225";i:17;s:8:"d87134b3";i:18;s:8:"c3b7926e";i:19;s:8:"c880b60d";i:20;s:8:"975f362d";i:21;s:8:"48192b77";i:22;s:8:"6f7dd08b";i:23;s:8:"7d4ad4f8";i:24;s:8:"d805b910";i:25;s:8:"8c98b365";i:26;s:8:"89e54af9";i:27;s:8:"e5257a3c";i:28;s:8:"8f596624";i:29;s:8:"3f42f88a";i:30;s:8:"6a7e95cc";i:31;s:8:"e1349e4d";i:32;s:8:"4539bc92";i:33;s:8:"045a3148";i:34;s:8:"c27cf7b9";i:35;s:8:"c64e8009";i:36;s:8:"dc5ed02e";i:37;s:8:"5753c741";i:38;s:8:"50be0a82";i:39;s:8:"822da0ee";i:40;s:8:"42fdb3c6";i:41;s:8:"c668fc80";i:42;s:8:"262376c6";i:43;s:8:"17b998c6";i:44;s:8:"1f3aac02";i:45;s:8:"6f939c7e";i:46;s:8:"21c099f4";i:47;s:8:"0f4b5c76";i:48;s:8:"64799ac0";i:49;s:8:"45d3bb99";i:50;s:8:"8ff3eb79";i:51;s:8:"61996264";i:52;s:8:"2b9ab1f4";i:53;s:8:"a0d0c50f";i:54;s:8:"f08713ce";i:55;s:8:"6b1cf9d8";i:56;s:8:"52d92cc5";i:57;s:8:"34bcec6f";i:58;s:8:"83ffa063";i:59;s:8:"a002321d";i:60;s:8:"386c46d9";i:61;s:8:"45e2c63e";i:62;s:8:"f481bdf4";i:63;s:8:"df58facb";i:64;s:8:"1781e49b";i:65;s:8:"1d968a6b";i:66;s:8:"8aa7fdd2";i:67;s:8:"631ac8cd";i:68;s:8:"8090ff8e";i:69;s:8:"4ddd4a5d";i:70;s:8:"ff6d8193";i:71;s:8:"39e18244";i:72;s:8:"4efe15db";i:73;s:8:"3fe64cd5";i:74;s:8:"e693a97f";i:75;s:8:"807a34e9";i:76;s:8:"6dc16ae7";i:77;s:8:"a1e1ed1d";i:78;s:8:"605bdc86";i:79;s:8:"abb1830e";i:80;s:8:"2baabeda";i:81;s:8:"fc0f66ad";i:82;s:8:"9cf4fb96";i:83;s:8:"b50ff764";i:84;s:8:"67c37a3d";i:85;s:8:"15253035";i:86;s:8:"387fce47";i:87;s:8:"5c3299a5";i:88;s:8:"125602b9";i:89;s:8:"daeb445c";i:90;s:8:"289e5a8d";i:91;s:8:"b47cd48c";i:92;s:8:"8664db23";i:93;s:8:"b9352af8";i:94;s:8:"51684d88";i:95;s:8:"b204cbc9";i:96;s:8:"e1b6becc";i:97;s:8:"dbbe0ee6";i:98;s:8:"89e54027";i:99;s:8:"a6512564";i:100;s:8:"3aab8d17";i:101;s:8:"7cab5272";i:102;s:8:"1804e981";i:103;s:8:"0bfebe2c";i:104;s:8:"7c082a4c";i:105;s:8:"06bc80c3";i:106;s:8:"c63db839";i:107;s:8:"59edb59d";i:108;s:8:"b52d9655";i:109;s:8:"efce041b";i:110;s:8:"57c1f890";i:111;s:8:"15499697";i:112;s:8:"e0ad3e3a";i:113;s:8:"408d4c16";i:114;s:8:"e53cf468";i:115;s:8:"6ea3d84f";i:116;s:8:"0a2bc4f2";i:117;s:8:"27b59259";i:118;s:8:"d223514b";i:119;s:8:"434c4185";i:120;s:8:"999c71df";i:121;s:8:"46134706";i:122;s:8:"f7f048d0";i:123;s:8:"7f5cfe34";i:124;s:8:"9bdc475c";i:125;s:8:"c1cf42ea";i:126;s:8:"65be324b";i:127;s:8:"68c7a1dc";i:128;s:8:"a7c8c5a2";i:129;s:8:"ecc4cd8a";i:130;s:8:"a761615c";i:131;s:8:"718ec534";i:132;s:8:"c8b086fc";i:133;s:8:"ead759f9";i:134;s:8:"eb9df4a0";i:135;s:8:"ec5b25f9";i:136;s:8:"3a6ff94e";i:137;s:8:"4511a3de";i:138;s:8:"9034f1c6";i:139;s:8:"5c1c6d14";i:140;s:8:"a228ed46";i:141;s:8:"ffe19f2f";i:142;s:8:"f21f68cf";i:143;s:8:"6c2235a4";i:144;s:8:"e0aed51a";i:145;s:8:"2ade527b";i:146;s:8:"65f3c758";i:147;s:8:"f6e868b7";i:148;s:8:"49b770a5";i:149;s:8:"48ab9158";i:150;s:8:"ab07a671";i:151;s:8:"4ef74251";i:152;s:8:"f4cad644";i:153;s:8:"1576c59e";i:154;s:8:"3882bbd1";i:155;s:8:"e49f32c0";i:156;s:8:"c67b757c";i:157;s:8:"3528c5d8";i:158;s:8:"371c3e34";i:159;s:8:"7f1d614f";i:160;s:8:"b9e19e66";i:161;s:8:"80a1d97f";i:162;s:8:"7f93c9f3";i:163;s:8:"4e82ea48";i:164;s:8:"9675e170";i:165;s:8:"aa54caef";i:166;s:8:"3bb9838e";i:167;s:8:"9c0d0a2b";i:168;s:8:"2595d91f";i:169;s:8:"84cc7ff2";i:170;s:8:"9457c4ee";i:171;s:8:"405b6bc8";i:172;s:8:"5aa668a4";i:173;s:8:"e94dfca2";i:174;s:8:"89c0d739";i:175;s:8:"459f8eb3";i:176;s:8:"76b95b42";i:177;s:8:"0e5ceafb";i:178;s:8:"55d4eaee";i:179;s:8:"a55a4784";i:180;s:8:"8c23e133";i:181;s:8:"0994f794";i:182;s:8:"a8d4d1b7";i:183;s:8:"0a50b177";i:184;s:8:"65409f44";i:185;s:8:"acf34e81";i:186;s:8:"e32f278e";i:187;s:8:"7aa21660";i:188;s:8:"9da66881";i:189;s:8:"5c4df7c5";i:190;s:8:"b21f8a4e";i:191;s:8:"d2cc6756";i:192;s:8:"8716f97d";i:193;s:8:"aabd84c5";i:194;s:8:"2e0a965a";i:195;s:8:"b4acc29c";i:196;s:8:"ed3be992";i:197;s:8:"867d9400";i:198;s:8:"a696ba3e";i:199;s:8:"8e2af3d9";i:200;s:8:"8fd95ea9";i:201;s:8:"930903d8";i:202;s:8:"4508dbb1";i:203;s:8:"80598d21";i:204;s:8:"df87fb74";i:205;s:8:"9d019d24";i:206;s:8:"05d5ce2e";i:207;s:8:"ed69bcfe";i:208;s:8:"f83a8d70";i:209;s:8:"750b10bd";i:210;s:8:"c0df892c";i:211;s:8:"df41f215";i:212;s:8:"03df46e3";i:213;s:8:"4e6dce66";i:214;s:8:"ea45a428";i:215;s:8:"cbbf3ff6";i:216;s:8:"f931c7b2";i:217;s:8:"80d19eab";i:218;s:8:"0e2c13da";i:219;s:8:"4b99ee8b";i:220;s:8:"2311d69e";i:221;s:8:"ca9050a7";i:222;s:8:"a4d9eec1";i:223;s:8:"ee665c77";i:224;s:8:"0714f961";i:225;s:8:"81f5be46";i:226;s:8:"420ea4bf";i:227;s:8:"281c28f0";i:228;s:8:"9936ab3f";i:229;s:8:"e4ca8936";i:230;s:8:"224d247b";i:231;s:8:"a564dffe";i:232;s:8:"d15045d2";i:233;s:8:"97d01e8f";i:234;s:8:"71793232";i:235;s:8:"43fe461e";i:236;s:8:"3b50916b";i:237;s:8:"ff242439";i:238;s:8:"a748a0a9";i:239;s:8:"ff51a2a6";i:240;s:8:"dec0ad0d";i:241;s:8:"4bcf2a2e";i:242;s:8:"2be6a97f";i:243;s:8:"eb3e636a";i:244;s:8:"81e31d64";i:245;s:8:"6ca4db9d";i:246;s:8:"bc5bd290";i:247;s:8:"ed2d2ba4";i:248;s:8:"00c46d55";i:249;s:8:"27578407";i:250;s:8:"bedbbcd8";i:251;s:8:"18172abc";i:252;s:8:"eaa5b9cf";i:253;s:8:"9e87ab84";i:254;s:8:"a0e2741c";i:255;s:8:"3bb931ae";i:256;s:8:"3a7b75cd";i:257;s:8:"1052cbf5";i:258;s:8:"b7afd060";i:259;s:8:"1d143d51";i:260;s:8:"17fb7422";i:261;s:8:"523fd346";i:262;s:8:"50429afd";i:263;s:8:"308ece7b";i:264;s:8:"285aa5c1";i:265;s:8:"d8afd736";i:266;s:8:"2e30512e";i:267;s:8:"af78ce36";i:268;s:8:"5967e738";i:269;s:8:"e19795de";i:270;s:8:"6d416e39";i:271;s:8:"23570261";i:272;s:8:"23106924";i:273;s:8:"a4b9add9";i:274;s:8:"baa83e79";i:275;s:8:"97ca48d3";i:276;s:8:"f369a004";i:277;s:8:"fa521bf6";i:278;s:8:"312e9e5e";i:279;s:8:"3acdb850";i:280;s:8:"485cbad7";i:281;s:8:"ddc2d365";i:282;s:8:"d8b87c13";i:283;s:8:"51f6aa7a";i:284;s:8:"b1c231ce";i:285;s:8:"926b9e57";i:286;s:8:"32bd5241";i:287;s:8:"b72cf0a0";i:288;s:8:"0cd99f51";i:289;s:8:"80815c0e";i:290;s:8:"a3459115";i:291;s:8:"5bb05439";i:292;s:8:"ee67a282";i:293;s:8:"65e533c5";i:294;s:8:"62e57b7a";i:295;s:8:"0f4a42fe";i:296;s:8:"ff5b8045";i:297;s:8:"cb9d60cf";i:298;s:8:"ffc891cd";i:299;s:8:"514d6027";i:300;s:8:"5b92df3b";i:301;s:8:"1fb47b1a";i:302;s:8:"a2382db8";i:303;s:8:"6f8b23cd";i:304;s:8:"db72737a";i:305;s:8:"d2d5022b";i:306;s:8:"eef762a7";i:307;s:8:"771fc2ed";i:308;s:8:"6581afb1";i:309;s:8:"64d7ffbd";i:310;s:8:"93a15a65";i:311;s:8:"fdc8b81b";i:312;s:8:"6369357b";i:313;s:8:"a8a58d2e";i:314;s:8:"d9ab2ed6";i:315;s:8:"0465340d";i:316;s:8:"eed4e3f1";i:317;s:8:"7e15ef9d";i:318;s:8:"99444e57";i:319;s:8:"959a6881";i:320;s:8:"e7498e10";i:321;s:8:"d7d0699e";i:322;s:8:"12372566";i:323;s:8:"b9f97c89";i:324;s:8:"5e688172";i:325;s:8:"8105e3b8";i:326;s:8:"627e9227";i:327;s:8:"67edb47d";i:328;s:8:"74e69d5f";i:329;s:8:"b8c5df2c";i:330;s:8:"14f06e80";i:331;s:8:"1a0af27f";i:332;s:8:"fa6ad68b";i:333;s:8:"d5938b0d";i:334;s:8:"2df9b8cc";i:335;s:8:"d90bd16c";i:336;s:8:"18779d24";i:337;s:8:"e1b81866";i:338;s:8:"dc51e106";i:339;s:8:"5078c0ce";i:340;s:8:"8fde3be3";i:341;s:8:"85939b08";i:342;s:8:"50f5565d";i:343;s:8:"281ec5f0";i:344;s:8:"ee2c4dfb";i:345;s:8:"89df2863";i:346;s:8:"0444ef85";i:347;s:8:"d52671b6";i:348;s:8:"84695c5d";i:349;s:8:"ceb19fc9";i:350;s:8:"8cd19595";i:351;s:8:"9773504b";i:352;s:8:"72031351";i:353;s:8:"285de56c";i:354;s:8:"08d949a1";i:355;s:8:"d1d24d60";i:356;s:8:"41c57eff";i:357;s:8:"ded22dfc";i:358;s:8:"9f799eb2";i:359;s:8:"ac14c164";i:360;s:8:"23ab3dac";i:361;s:8:"76de10e0";i:362;s:8:"72c2ac0b";i:363;s:8:"cce93127";i:364;s:8:"32bbb7e5";i:365;s:8:"b8af671a";i:366;s:8:"24dfc65a";i:367;s:8:"d7c8431f";i:368;s:8:"5cf3dffd";i:369;s:8:"7a93645c";i:370;s:8:"36bb66f8";i:371;s:8:"dc055709";i:372;s:8:"93c58efc";i:373;s:8:"11b9a1e6";i:374;s:8:"e487f36b";i:375;s:8:"7c3bcb46";i:376;s:8:"e4d724a3";i:377;s:8:"b732d653";i:378;s:8:"afc9c219";i:379;s:8:"ea658830";i:380;s:8:"b9052af6";i:381;s:8:"aa46a473";i:382;s:8:"1b37a35e";i:383;s:8:"0ba14ee9";i:384;s:8:"c7e150ac";i:385;s:8:"055ffa96";i:386;s:8:"e2bf88fb";i:387;s:8:"88f1f936";i:388;s:8:"488c7bdb";i:389;s:8:"a9dacbd1";i:390;s:8:"aaeea26f";i:391;s:8:"237af1cb";i:392;s:8:"e3dbdb50";i:393;s:8:"c8e5949e";i:394;s:8:"e70a989a";i:395;s:8:"fa540d6d";i:396;s:8:"f055b2f2";i:397;s:8:"1fc8acd4";i:398;s:8:"accb1a9b";i:399;s:8:"bedfb89c";i:400;s:8:"3d243ec0";i:401;s:8:"d2f3f2d8";i:402;s:8:"d83e7c53";i:403;s:8:"4f12e12d";i:404;s:8:"f48f33d1";i:405;s:8:"9555d943";i:406;s:8:"db853a55";i:407;s:8:"506a95b4";i:408;s:8:"408155d1";i:409;s:8:"32a384a0";i:410;s:8:"21c34eb4";i:411;s:8:"93e2e1ae";i:412;s:8:"88582a10";i:413;s:8:"1f065648";i:414;s:8:"96c3c81b";i:415;s:8:"412bc358";i:416;s:8:"11a4e990";i:417;s:8:"805ead73";i:418;s:8:"ec8ca56e";i:419;s:8:"a2ed4bdc";i:420;s:8:"ac408a10";i:421;s:8:"4ca98f96";i:422;s:8:"0686b6df";i:423;s:8:"9e9f7ae4";i:424;s:8:"07d5f658";i:425;s:8:"1c121a0c";i:426;s:8:"c11c8e82";i:427;s:8:"13f2c6d7";i:428;s:8:"e9f6ad9c";i:429;s:8:"bc1dc285";i:430;s:8:"e271fe4b";i:431;s:8:"34114ee5";i:432;s:8:"92ad1c39";i:433;s:8:"5ab5504b";i:434;s:8:"4f7118a7";i:435;s:8:"d1ceec2f";i:436;s:8:"adfd7622";i:437;s:8:"f4f4a9c0";i:438;s:8:"2d4f21e3";i:439;s:8:"3b4bed9e";i:440;s:8:"42ac5810";i:441;s:8:"7eae8db5";i:442;s:8:"09dc329e";i:443;s:8:"3c723314";i:444;s:8:"7fb50c08";i:445;s:8:"71fd69dd";i:446;s:8:"013ce542";i:447;s:8:"0add0d73";i:448;s:8:"465d495a";i:449;s:8:"9f8ddb9d";i:450;s:8:"f293e79e";i:451;s:8:"d6f59d72";i:452;s:8:"ac22e38f";i:453;s:8:"e96d5751";i:454;s:8:"fba79717";i:455;s:8:"39fedf2f";i:456;s:8:"3fb25196";i:457;s:8:"fcdaa825";i:458;s:8:"9a960022";i:459;s:8:"5371af3d";i:460;s:8:"df7faf0a";i:461;s:8:"82c22c85";i:462;s:8:"dfbbae9f";i:463;s:8:"403a4b84";i:464;s:8:"bc938282";i:465;s:8:"d2355fbc";i:466;s:8:"8d72b179";i:467;s:8:"dced02b2";i:468;s:8:"227b82e3";i:469;s:8:"24c60db6";i:470;s:8:"45092b73";i:471;s:8:"767c0e1d";i:472;s:8:"7eb5c592";i:473;s:8:"d0b356d9";i:474;s:8:"dc95ee45";i:475;s:8:"39aa5820";i:476;s:8:"9e6e1868";i:477;s:8:"ffe72d78";i:478;s:8:"82ae0503";i:479;s:8:"2ea981ad";i:480;s:8:"6935faba";i:481;s:8:"69c2ba98";i:482;s:8:"69dd219f";i:483;s:8:"860e0d0d";i:484;s:8:"5f451aa3";i:485;s:8:"a9d5f07d";i:486;s:8:"ec623682";i:487;s:8:"04d8adba";i:488;s:8:"717e8c76";i:489;s:8:"f9c1fb75";i:490;s:8:"ab4c9e06";i:491;s:8:"3895ef4d";i:492;s:8:"37c09060";i:493;s:8:"f3b7c652";i:494;s:8:"74dc421e";i:495;s:8:"97d458be";i:496;s:8:"1a1ddea1";i:497;s:8:"001c68ad";i:498;s:8:"680f033f";i:499;s:8:"b2e9bd38";i:500;s:8:"54192958";i:501;s:8:"b6dd0693";i:502;s:8:"9d149906";i:503;s:8:"9ba5479a";i:504;s:8:"18ba25e8";i:505;s:8:"16fa3e51";i:506;s:8:"1e74b698";i:507;s:8:"c5932028";i:508;s:8:"5a6cf6cd";i:509;s:8:"6fa90e13";i:510;s:8:"bcabdecb";i:511;s:8:"ae23af9a";i:512;s:8:"76b297eb";i:513;s:8:"d1332632";i:514;s:8:"693a55c3";i:515;s:8:"7c4beb9b";i:516;s:8:"409a0a15";i:517;s:8:"60f68335";i:518;s:8:"febcb934";i:519;s:8:"f32c6f8c";i:520;s:8:"aacacf0d";i:521;s:8:"d1f56e99";i:522;s:8:"d65bcf00";i:523;s:8:"361c9633";i:524;s:8:"cd34d7f4";i:525;s:8:"37d38e62";i:526;s:8:"942dee9d";i:527;s:8:"f41c9445";i:528;s:8:"7e9a8b5d";i:529;s:8:"4b941ed7";i:530;s:8:"c6256dce";i:531;s:8:"6c285146";i:532;s:8:"5920147e";i:533;s:8:"934d59ed";i:534;s:8:"5f400a1d";i:535;s:8:"1a5de58c";i:536;s:8:"11e601de";i:537;s:8:"cf4da287";i:538;s:8:"756a54e4";i:539;s:8:"9f2b1015";i:540;s:8:"3a3df642";i:541;s:8:"5d024d64";i:542;s:8:"2d617393";i:543;s:8:"e1b4ec53";i:544;s:8:"24996b5e";i:545;s:8:"7a271bf1";i:546;s:8:"68d7da60";i:547;s:8:"06d3bc73";i:548;s:8:"f21095f7";i:549;s:8:"93e6bfd9";i:550;s:8:"e80b015b";i:551;s:8:"4ddd4ede";i:552;s:8:"cec3d813";i:553;s:8:"281f2a65";i:554;s:8:"ffa068fb";i:555;s:8:"60e712e7";i:556;s:8:"4abcecac";i:557;s:8:"eef01060";i:558;s:8:"8e79e897";i:559;s:8:"b0cd39fe";i:560;s:8:"28cc9604";i:561;s:8:"c7bd58e0";i:562;s:8:"c73b1765";i:563;s:8:"e87d5e07";i:564;s:8:"03b7710d";i:565;s:8:"5f64c5dc";i:566;s:8:"4ae7b6f1";i:567;s:8:"401b9876";i:568;s:8:"9a162522";i:569;s:8:"2a1d6390";i:570;s:8:"c115eeff";i:571;s:8:"e549f7df";i:572;s:8:"a159c579";i:573;s:8:"48a44ff6";i:574;s:8:"e65fd1fc";i:575;s:8:"bb74cd7b";i:576;s:8:"87cc0383";i:577;s:8:"052755ee";i:578;s:8:"eba29b21";i:579;s:8:"88e2efa9";i:580;s:8:"a1a521b9";i:581;s:8:"ffb6f27b";i:582;s:8:"4fea3248";i:583;s:8:"0f46ad03";i:584;s:8:"58902f76";i:585;s:8:"cfb3f87e";i:586;s:8:"efb3d85c";i:587;s:8:"1e0f4648";i:588;s:8:"f95eda47";i:589;s:8:"c5220b0b";i:590;s:8:"e6574ef8";i:591;s:8:"f34b162e";i:592;s:8:"09b08b14";i:593;s:8:"dae53353";i:594;s:8:"ccc600dd";i:595;s:8:"b3ae8f4f";i:596;s:8:"daed379c";i:597;s:8:"113f5973";i:598;s:8:"6a66bb0a";i:599;s:8:"697817f3";i:600;s:8:"00b78167";i:601;s:8:"1e7c2ed9";i:602;s:8:"65f8a3c5";i:603;s:8:"c50f5c14";i:604;s:8:"a1665ca7";i:605;s:8:"d31c5017";i:606;s:8:"2e421193";i:607;s:8:"cb8d29a9";i:608;s:8:"fa9723b5";i:609;s:8:"8a4d18e4";i:610;s:8:"88081a19";i:611;s:8:"242623e4";i:612;s:8:"86202155";i:613;s:8:"ab55982f";i:614;s:8:"f1a3c261";i:615;s:8:"c44eaa91";i:616;s:8:"06c4716f";i:617;s:8:"60a25216";i:618;s:8:"dcce86a3";i:619;s:8:"bfcec0cd";i:620;s:8:"fb4170ed";i:621;s:8:"9bf5e563";i:622;s:8:"04fa51af";i:623;s:8:"dd86eeb1";i:624;i:0;i:625;i:2;}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } @@ -36,14 +36,14 @@ echo PHP_EOL, PHP_EOL; echo \Random\Engine\PcgOneseq128XslRr64::class, PHP_EOL; // malformed hex try { - unserialize('O:33:"Random\Engine\PcgOneseq128XslRr64":2:{i:0;a:0:{}i:1;a:2:{i:0;s:15:"c6d571c37c41a8d";i:1;s:16:"345e7e82265d6e27";}}'); + var_dump(unserialize('O:33:"Random\Engine\PcgOneseq128XslRr64":2:{i:0;a:0:{}i:1;a:2:{i:0;s:15:"c6d571c37c41a8d";i:1;s:16:"345e7e82265d6e27";}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } // invalid hex try { - unserialize('O:33:"Random\Engine\PcgOneseq128XslRr64":2:{i:0;a:0:{}i:1;a:2:{i:0;s:16:"c6d571c37c41a8d1";i:1;s:16:"345e7e82265d6e2g";}}'); + var_dump(unserialize('O:33:"Random\Engine\PcgOneseq128XslRr64":2:{i:0;a:0:{}i:1;a:2:{i:0;s:16:"c6d571c37c41a8d1";i:1;s:16:"345e7e82265d6e2g";}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } @@ -52,14 +52,28 @@ echo PHP_EOL, PHP_EOL; echo \Random\Engine\Xoshiro256StarStar::class, PHP_EOL; // malformed hex try { - unserialize('O:32:"Random\Engine\Xoshiro256StarStar":2:{i:0;a:0:{}i:1;a:4:{i:0;s:15:"db1c182f1bf60cb";i:1;s:16:"2465f04d36a1c797";i:2;s:16:"da25c09be4fabe33";i:3;s:16:"33a0d052f241624e";}}'); + var_dump(unserialize('O:32:"Random\Engine\Xoshiro256StarStar":2:{i:0;a:0:{}i:1;a:4:{i:0;s:15:"db1c182f1bf60cb";i:1;s:16:"2465f04d36a1c797";i:2;s:16:"da25c09be4fabe33";i:3;s:16:"33a0d052f241624e";}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } // invalid hex try { - unserialize('O:32:"Random\Engine\Xoshiro256StarStar":2:{i:0;a:0:{}i:1;a:4:{i:0;s:16:"db1c182f1bf60cbb";i:1;s:16:"2465f04d36a1c797";i:2;s:16:"da25c09be4fabe33";i:3;s:16:"33a0d052f241624g";}}'); + var_dump(unserialize('O:32:"Random\Engine\Xoshiro256StarStar":2:{i:0;a:0:{}i:1;a:4:{i:0;s:16:"db1c182f1bf60cbb";i:1;s:16:"2465f04d36a1c797";i:2;s:16:"da25c09be4fabe33";i:3;s:16:"33a0d052f241624g";}}')); +} catch (\Exception $e) { + echo $e->getMessage(), PHP_EOL; +} + +// additional array values (1) +try { + var_dump(unserialize('O:32:"Random\Engine\Xoshiro256StarStar":3:{i:0;a:0:{}i:1;a:4:{i:0;s:16:"db1c182f1bf60cbb";i:1;s:16:"2465f04d36a1c797";i:2;s:16:"da25c09be4fabe33";i:3;s:16:"33a0d052f241624e";}i:2;N;}')); +} catch (\Exception $e) { + echo $e->getMessage(), PHP_EOL; +} + +// additional array values (2) +try { + var_dump(unserialize('O:32:"Random\Engine\Xoshiro256StarStar":2:{i:0;a:0:{}i:1;a:5:{i:0;s:16:"db1c182f1bf60cbb";i:1;s:16:"2465f04d36a1c797";i:2;s:16:"da25c09be4fabe33";i:3;s:16:"33a0d052f241624e";i:4;N;}}')); } catch (\Exception $e) { echo $e->getMessage(), PHP_EOL; } @@ -81,3 +95,5 @@ Invalid serialization data for Random\Engine\PcgOneseq128XslRr64 object Random\Engine\Xoshiro256StarStar Invalid serialization data for Random\Engine\Xoshiro256StarStar object Invalid serialization data for Random\Engine\Xoshiro256StarStar object +Invalid serialization data for Random\Engine\Xoshiro256StarStar object +Invalid serialization data for Random\Engine\Xoshiro256StarStar object From 1ad59b32c20386e11d23ade7abf16bebb0bf60e8 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 30 Aug 2022 15:51:21 +0100 Subject: [PATCH 1223/1346] Update INI validator and displayers depending on INI type Closes GH-9451 --- ext/dl_test/dl_test.c | 4 ++-- ext/ffi/ffi.c | 2 +- ext/gd/gd.c | 2 +- ext/mysqli/mysqli.c | 4 ++-- ext/odbc/php_odbc.c | 4 ++-- ext/pcre/php_pcre.c | 2 +- ext/session/session.c | 10 +++++----- ext/tidy/tidy.c | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/dl_test/dl_test.c b/ext/dl_test/dl_test.c index 4b693fae43163..5d4833c741acb 100644 --- a/ext/dl_test/dl_test.c +++ b/ext/dl_test/dl_test.c @@ -71,8 +71,8 @@ static const zend_function_entry php_dl_test_use_register_functions_directly_fun /* {{{ INI */ PHP_INI_BEGIN() - STD_PHP_INI_BOOLEAN("dl_test.long", "0", PHP_INI_ALL, OnUpdateLong, long_value, zend_dl_test_globals, dl_test_globals) - STD_PHP_INI_ENTRY("dl_test.string", "hello", PHP_INI_ALL, OnUpdateString, string_value, zend_dl_test_globals, dl_test_globals) + STD_PHP_INI_ENTRY("dl_test.long", "0", PHP_INI_ALL, OnUpdateLong, long_value, zend_dl_test_globals, dl_test_globals) + STD_PHP_INI_ENTRY("dl_test.string", "hello", PHP_INI_ALL, OnUpdateString, string_value, zend_dl_test_globals, dl_test_globals) PHP_INI_END() /* }}} */ diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index edad7465f8cfa..35c4f6ec1af18 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -5179,7 +5179,7 @@ static ZEND_INI_DISP(zend_ffi_enable_displayer_cb) /* {{{ */ /* }}} */ ZEND_INI_BEGIN() - ZEND_INI_ENTRY3_EX("ffi.enable", "preload", ZEND_INI_SYSTEM, OnUpdateFFIEnable, NULL, NULL, NULL, zend_ffi_enable_displayer_cb) + ZEND_INI_ENTRY_EX("ffi.enable", "preload", ZEND_INI_SYSTEM, OnUpdateFFIEnable, zend_ffi_enable_displayer_cb) STD_ZEND_INI_ENTRY("ffi.preload", NULL, ZEND_INI_SYSTEM, OnUpdateString, preload, zend_ffi_globals, ffi_globals) ZEND_INI_END() diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 31e8fd9eb0872..97c8d360a2155 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -307,7 +307,7 @@ ZEND_GET_MODULE(gd) /* {{{ PHP_INI_BEGIN */ PHP_INI_BEGIN() - PHP_INI_ENTRY("gd.jpeg_ignore_warning", "1", PHP_INI_ALL, NULL) + PHP_INI_ENTRY_EX("gd.jpeg_ignore_warning", "1", PHP_INI_ALL, NULL, zend_ini_boolean_displayer_cb) PHP_INI_END() /* }}} */ diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index 8d2d2b8847b0e..9fa46acbb7d29 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -430,7 +430,7 @@ static const MYSQLND_REVERSE_API mysqli_reverse_api = { PHP_INI_BEGIN() STD_PHP_INI_ENTRY_EX("mysqli.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_links, zend_mysqli_globals, mysqli_globals, display_link_numbers) STD_PHP_INI_ENTRY_EX("mysqli.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_persistent, zend_mysqli_globals, mysqli_globals, display_link_numbers) - STD_PHP_INI_BOOLEAN("mysqli.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_persistent, zend_mysqli_globals, mysqli_globals) + STD_PHP_INI_BOOLEAN("mysqli.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_persistent, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_BOOLEAN("mysqli.rollback_on_cached_plink", "0",PHP_INI_SYSTEM, OnUpdateBool, rollback_on_cached_plink, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_ENTRY("mysqli.default_host", NULL, PHP_INI_ALL, OnUpdateString, default_host, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_ENTRY("mysqli.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, zend_mysqli_globals, mysqli_globals) @@ -441,7 +441,7 @@ PHP_INI_BEGIN() #else STD_PHP_INI_ENTRY("mysqli.default_socket", NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_socket, zend_mysqli_globals, mysqli_globals) #endif - STD_PHP_INI_BOOLEAN("mysqli.allow_local_infile", "0", PHP_INI_SYSTEM, OnUpdateLong, allow_local_infile, zend_mysqli_globals, mysqli_globals) + STD_PHP_INI_BOOLEAN("mysqli.allow_local_infile", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_local_infile, zend_mysqli_globals, mysqli_globals) STD_PHP_INI_ENTRY("mysqli.local_infile_directory", NULL, PHP_INI_SYSTEM, OnUpdateString, local_infile_directory, zend_mysqli_globals, mysqli_globals) PHP_INI_END() /* }}} */ diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 5e0945e0a43de..cf25ef7cdee4e 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -349,7 +349,7 @@ static PHP_INI_DISP(display_cursortype) /* {{{ PHP_INI_BEGIN */ PHP_INI_BEGIN() - STD_PHP_INI_BOOLEAN("odbc.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateLong, + STD_PHP_INI_BOOLEAN("odbc.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, allow_persistent, zend_odbc_globals, odbc_globals) STD_PHP_INI_ENTRY_EX("odbc.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_persistent, zend_odbc_globals, odbc_globals, display_link_nums) @@ -365,7 +365,7 @@ PHP_INI_BEGIN() defaultlrl, zend_odbc_globals, odbc_globals, display_lrl) STD_PHP_INI_ENTRY_EX("odbc.defaultbinmode", "1", PHP_INI_ALL, OnUpdateLong, defaultbinmode, zend_odbc_globals, odbc_globals, display_binmode) - STD_PHP_INI_BOOLEAN("odbc.check_persistent", "1", PHP_INI_SYSTEM, OnUpdateLong, + STD_PHP_INI_BOOLEAN("odbc.check_persistent", "1", PHP_INI_SYSTEM, OnUpdateBool, check_persistent, zend_odbc_globals, odbc_globals) STD_PHP_INI_ENTRY_EX("odbc.default_cursortype", "3", PHP_INI_ALL, OnUpdateLong, default_cursortype, zend_odbc_globals, odbc_globals, display_cursortype) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index f1d821e050692..f4fd60e96ebef 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -369,7 +369,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("pcre.backtrack_limit", "1000000", PHP_INI_ALL, OnUpdateBacktrackLimit, backtrack_limit, zend_pcre_globals, pcre_globals) STD_PHP_INI_ENTRY("pcre.recursion_limit", "100000", PHP_INI_ALL, OnUpdateRecursionLimit, recursion_limit, zend_pcre_globals, pcre_globals) #ifdef HAVE_PCRE_JIT_SUPPORT - STD_PHP_INI_ENTRY("pcre.jit", "1", PHP_INI_ALL, OnUpdateJit, jit, zend_pcre_globals, pcre_globals) + STD_PHP_INI_BOOLEAN("pcre.jit", "1", PHP_INI_ALL, OnUpdateJit, jit, zend_pcre_globals, pcre_globals) #endif PHP_INI_END() diff --git a/ext/session/session.c b/ext/session/session.c index 745532f1626f1..e56c15dcbe37d 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -782,12 +782,12 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("session.cookie_lifetime", "0", PHP_INI_ALL, OnUpdateCookieLifetime,cookie_lifetime, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.cookie_path", "/", PHP_INI_ALL, OnUpdateSessionString, cookie_path, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.cookie_domain", "", PHP_INI_ALL, OnUpdateSessionString, cookie_domain, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.cookie_secure", "0", PHP_INI_ALL, OnUpdateSessionBool, cookie_secure, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.cookie_httponly", "0", PHP_INI_ALL, OnUpdateSessionBool, cookie_httponly, php_ps_globals, ps_globals) + STD_PHP_INI_BOOLEAN("session.cookie_secure", "0", PHP_INI_ALL, OnUpdateSessionBool, cookie_secure, php_ps_globals, ps_globals) + STD_PHP_INI_BOOLEAN("session.cookie_httponly", "0", PHP_INI_ALL, OnUpdateSessionBool, cookie_httponly, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.cookie_samesite", "", PHP_INI_ALL, OnUpdateSessionString, cookie_samesite, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.use_cookies", "1", PHP_INI_ALL, OnUpdateSessionBool, use_cookies, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.use_only_cookies", "1", PHP_INI_ALL, OnUpdateSessionBool, use_only_cookies, php_ps_globals, ps_globals) - STD_PHP_INI_ENTRY("session.use_strict_mode", "0", PHP_INI_ALL, OnUpdateSessionBool, use_strict_mode, php_ps_globals, ps_globals) + STD_PHP_INI_BOOLEAN("session.use_cookies", "1", PHP_INI_ALL, OnUpdateSessionBool, use_cookies, php_ps_globals, ps_globals) + STD_PHP_INI_BOOLEAN("session.use_only_cookies", "1", PHP_INI_ALL, OnUpdateSessionBool, use_only_cookies, php_ps_globals, ps_globals) + STD_PHP_INI_BOOLEAN("session.use_strict_mode", "0", PHP_INI_ALL, OnUpdateSessionBool, use_strict_mode, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.referer_check", "", PHP_INI_ALL, OnUpdateSessionString, extern_referer_chk, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.cache_limiter", "nocache", PHP_INI_ALL, OnUpdateSessionString, cache_limiter, php_ps_globals, ps_globals) STD_PHP_INI_ENTRY("session.cache_expire", "180", PHP_INI_ALL, OnUpdateSessionLong, cache_expire, php_ps_globals, ps_globals) diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c index a4ed9c505efba..535ac785cacac 100644 --- a/ext/tidy/tidy.c +++ b/ext/tidy/tidy.c @@ -168,7 +168,7 @@ ZEND_DECLARE_MODULE_GLOBALS(tidy) PHP_INI_BEGIN() STD_PHP_INI_ENTRY("tidy.default_config", "", PHP_INI_SYSTEM, OnUpdateString, default_config, zend_tidy_globals, tidy_globals) -STD_PHP_INI_ENTRY("tidy.clean_output", "0", PHP_INI_USER, php_tidy_set_clean_output, clean_output, zend_tidy_globals, tidy_globals) +STD_PHP_INI_BOOLEAN("tidy.clean_output", "0", PHP_INI_USER, php_tidy_set_clean_output, clean_output, zend_tidy_globals, tidy_globals) PHP_INI_END() static zend_class_entry *tidy_ce_doc, *tidy_ce_node; From 5011a185b5018592a15fee926ea95153817d9191 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 30 Aug 2022 18:03:16 +0100 Subject: [PATCH 1224/1346] Update globals to use bool type --- ext/mysqli/php_mysqli_structs.h | 4 ++-- ext/odbc/php_odbc_includes.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/mysqli/php_mysqli_structs.h b/ext/mysqli/php_mysqli_structs.h index c57a26603c49c..7495cc8bda733 100644 --- a/ext/mysqli/php_mysqli_structs.h +++ b/ext/mysqli/php_mysqli_structs.h @@ -241,13 +241,13 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqli) zend_long num_active_persistent; zend_long num_inactive_persistent; zend_long max_persistent; - zend_long allow_persistent; + bool allow_persistent; zend_ulong default_port; char *default_host; char *default_user; char *default_pw; char *default_socket; - zend_long allow_local_infile; + bool allow_local_infile; char *local_infile_directory; zend_long error_no; char *error_msg; diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h index 78dffeda438d7..21c74d317c68c 100644 --- a/ext/odbc/php_odbc_includes.h +++ b/ext/odbc/php_odbc_includes.h @@ -228,8 +228,8 @@ ZEND_BEGIN_MODULE_GLOBALS(odbc) char *defDB; char *defUser; char *defPW; - zend_long allow_persistent; - zend_long check_persistent; + bool allow_persistent; + bool check_persistent; zend_long max_persistent; zend_long max_links; zend_long num_persistent; From 3e362f51ac29c21423db2f946c3d103980cd1c7b Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 13 Aug 2022 15:32:25 +0100 Subject: [PATCH 1225/1346] Add zend_string INI validators Currently we only have validators for char* which is rather annoying as INI settings are saved as zend_string* in the first place Closes GH-9328 --- Zend/zend_ini.c | 20 +++++++++++ Zend/zend_ini.h | 4 +++ ext/zend_test/php_test.h | 2 ++ ext/zend_test/test.c | 9 +++++ ext/zend_test/test.stub.php | 2 ++ ext/zend_test/test_arginfo.h | 6 +++- .../tests/zend_ini_str_validator_basic.phpt | 33 +++++++++++++++++++ ...nd_ini_str_validator_return_from_func.phpt | 10 ++++++ 8 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 ext/zend_test/tests/zend_ini_str_validator_basic.phpt create mode 100644 ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index ee42093c988b0..2086665e04fb3 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -876,3 +876,23 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */ return SUCCESS; } /* }}} */ + +ZEND_API ZEND_INI_MH(OnUpdateStr) /* {{{ */ +{ + zend_string **p = (zend_string **) ZEND_INI_GET_ADDR(); + *p = new_value; + return SUCCESS; +} +/* }}} */ + +ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty) /* {{{ */ +{ + if (new_value && ZSTR_LEN(new_value) == 0) { + return FAILURE; + } + + zend_string **p = (zend_string **) ZEND_INI_GET_ADDR(); + *p = new_value; + return SUCCESS; +} +/* }}} */ diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h index a371b285764d6..56939fa9ea8cb 100644 --- a/Zend/zend_ini.h +++ b/Zend/zend_ini.h @@ -209,8 +209,12 @@ ZEND_API ZEND_INI_MH(OnUpdateBool); ZEND_API ZEND_INI_MH(OnUpdateLong); ZEND_API ZEND_INI_MH(OnUpdateLongGEZero); ZEND_API ZEND_INI_MH(OnUpdateReal); +/* char* versions */ ZEND_API ZEND_INI_MH(OnUpdateString); ZEND_API ZEND_INI_MH(OnUpdateStringUnempty); +/* zend_string* versions */ +ZEND_API ZEND_INI_MH(OnUpdateStr); +ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty); END_EXTERN_C() #define ZEND_INI_DISPLAY_ORIG 1 diff --git a/ext/zend_test/php_test.h b/ext/zend_test/php_test.h index 70ec15ec0dc8f..a5b11a6041dd6 100644 --- a/ext/zend_test/php_test.h +++ b/ext/zend_test/php_test.h @@ -55,6 +55,8 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test) bool print_stderr_mshutdown; zend_test_fiber *active_fiber; zend_long quantity_value; + zend_string *str_test; + zend_string *not_empty_str_test; ZEND_END_MODULE_GLOBALS(zend_test) extern ZEND_DECLARE_MODULE_GLOBALS(zend_test) diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index a4a6ba07fc444..5b5ac04c45807 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -415,6 +415,13 @@ static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity) } } +static ZEND_FUNCTION(zend_test_zend_ini_str) +{ + ZEND_PARSE_PARAMETERS_NONE(); + + RETURN_STR(ZT_G(str_test)); +} + static ZEND_FUNCTION(ZendTestNS2_namespaced_func) { ZEND_PARSE_PARAMETERS_NONE(); @@ -632,6 +639,8 @@ PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_BOOLEAN("zend_test.print_stderr_mshutdown", "0", PHP_INI_SYSTEM, OnUpdateBool, print_stderr_mshutdown, zend_zend_test_globals, zend_test_globals) STD_PHP_INI_ENTRY("zend_test.quantity_value", "0", PHP_INI_ALL, OnUpdateLong, quantity_value, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_ENTRY("zend_test.str_test", "", PHP_INI_ALL, OnUpdateStr, str_test, zend_zend_test_globals, zend_test_globals) + STD_PHP_INI_ENTRY("zend_test.not_empty_str_test", "val", PHP_INI_ALL, OnUpdateStrNotEmpty, not_empty_str_test, zend_zend_test_globals, zend_test_globals) PHP_INI_END() void (*old_zend_execute_ex)(zend_execute_data *execute_data); diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 49efae473dd4a..47442dcaab48d 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -152,6 +152,8 @@ function zend_call_method(object|string $obj_or_class, string $method, mixed $ar function zend_test_zend_ini_parse_quantity(string $str): int {} function zend_test_zend_ini_parse_uquantity(string $str): int {} + + function zend_test_zend_ini_str(): string {} } namespace ZendTestNS { diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 0451daab66e3f..84b73abbc5516 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: 05927aba1708d8718cb59dcadc7b4067323956d2 */ + * Stub hash: d8c0689141c897c3f31d00550128df7b8c00274f */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -95,6 +95,8 @@ ZEND_END_ARG_INFO() #define arginfo_zend_test_zend_ini_parse_uquantity arginfo_zend_test_zend_ini_parse_quantity +#define arginfo_zend_test_zend_ini_str arginfo_zend_get_current_func_name + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ZendTestNS2_namespaced_func, 0, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() @@ -180,6 +182,7 @@ static ZEND_FUNCTION(zend_get_current_func_name); static ZEND_FUNCTION(zend_call_method); static ZEND_FUNCTION(zend_test_zend_ini_parse_quantity); static ZEND_FUNCTION(zend_test_zend_ini_parse_uquantity); +static ZEND_FUNCTION(zend_test_zend_ini_str); static ZEND_FUNCTION(ZendTestNS2_namespaced_func); static ZEND_FUNCTION(ZendTestNS2_namespaced_deprecated_func); static ZEND_FUNCTION(ZendTestNS2_ZendSubNS_namespaced_func); @@ -228,6 +231,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(zend_call_method, arginfo_zend_call_method) ZEND_FE(zend_test_zend_ini_parse_quantity, arginfo_zend_test_zend_ini_parse_quantity) ZEND_FE(zend_test_zend_ini_parse_uquantity, arginfo_zend_test_zend_ini_parse_uquantity) + ZEND_FE(zend_test_zend_ini_str, arginfo_zend_test_zend_ini_str) ZEND_NS_FALIAS("ZendTestNS2", namespaced_func, ZendTestNS2_namespaced_func, arginfo_ZendTestNS2_namespaced_func) ZEND_NS_DEP_FALIAS("ZendTestNS2", namespaced_deprecated_func, ZendTestNS2_namespaced_deprecated_func, arginfo_ZendTestNS2_namespaced_deprecated_func) ZEND_NS_FALIAS("ZendTestNS2", namespaced_aliased_func, zend_test_void_return, arginfo_ZendTestNS2_namespaced_aliased_func) diff --git a/ext/zend_test/tests/zend_ini_str_validator_basic.phpt b/ext/zend_test/tests/zend_ini_str_validator_basic.phpt new file mode 100644 index 0000000000000..ab1133dd6d2e8 --- /dev/null +++ b/ext/zend_test/tests/zend_ini_str_validator_basic.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test OnUpdateStr and OnUpdateStrNotEmpty validators. +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +str_test INI +string(0) "" +string(0) "" +string(4) "Test" +string(4) "Test" +string(0) "" +not_empty_str_test INI +string(3) "val" +string(3) "val" +string(4) "Test" +bool(false) +string(4) "Test" diff --git a/ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt b/ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt new file mode 100644 index 0000000000000..a02748f6d8a5a --- /dev/null +++ b/ext/zend_test/tests/zend_ini_str_validator_return_from_func.phpt @@ -0,0 +1,10 @@ +--TEST-- +Test zend_test_zend_ini_str() to check for GC refcount on global returned +--EXTENSIONS-- +zend_test +--FILE-- + +--EXPECT-- +string(0) "" From 05aa3b3e0af2789e29e402652b95f51c4ce041ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Tue, 6 Sep 2022 14:09:47 +0200 Subject: [PATCH 1226/1346] Upgrade PHP parser to 4.15.1 It contains some useful fixes --- build/gen_stub.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index bbaa251ed695a..9dff45649671e 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -4609,7 +4609,7 @@ function initPhpParser() { } $isInitialized = true; - $version = "4.14.0"; + $version = "4.15.1"; $phpParserDir = __DIR__ . "/PHP-Parser-$version"; if (!is_dir($phpParserDir)) { installPhpParser($version, $phpParserDir); From ce058273ba20a4187298e03aaccaa0c974b591ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Wed, 7 Sep 2022 17:40:36 +0200 Subject: [PATCH 1227/1346] Add support for validation of missing method synopses (#9491) --- build/gen_stub.php | 68 +++++++++++++++++++++++++++++---- ext/dl_test/dl_test.stub.php | 5 ++- ext/dl_test/dl_test_arginfo.h | 2 +- ext/skeleton/skeleton.stub.php | 5 ++- ext/skeleton/skeleton_arginfo.h | 2 +- ext/zlib/zlib.stub.php | 1 + ext/zlib/zlib_arginfo.h | 2 +- 7 files changed, 72 insertions(+), 13 deletions(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index 9dff45649671e..c199dde15b45a 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1222,6 +1222,8 @@ class FuncInfo { public $numRequiredArgs; /** @var string|null */ public $cond; + /** @var bool */ + public $isUndocumentable; /** * @param ArgInfo[] $args @@ -1238,7 +1240,8 @@ public function __construct( array $args, ReturnInfo $return, int $numRequiredArgs, - ?string $cond + ?string $cond, + bool $isUndocumentable ) { $this->name = $name; $this->classFlags = $classFlags; @@ -1252,6 +1255,7 @@ public function __construct( $this->return = $return; $this->numRequiredArgs = $numRequiredArgs; $this->cond = $cond; + $this->isUndocumentable = $isUndocumentable; } public function isMethod(): bool @@ -3218,7 +3222,8 @@ function parseFunctionLike( int $classFlags, int $flags, Node\FunctionLike $func, - ?string $cond + ?string $cond, + bool $isUndocumentable ): FuncInfo { try { $comment = $func->getDocComment(); @@ -3283,6 +3288,10 @@ function parseFunctionLike( } $paramMeta[$varName][$tag->name] = true; break; + + case 'undocumentable': + $isUndocumentable = true; + break; } } } @@ -3383,7 +3392,8 @@ function parseFunctionLike( $args, $return, $numRequiredArgs, - $cond + $cond, + $isUndocumentable ); } catch (Exception $e) { throw new Exception($name . "(): " .$e->getMessage()); @@ -3570,6 +3580,12 @@ function parseClass( throw new Exception("Unknown class kind " . get_class($class)); } + if ($isUndocumentable) { + foreach ($methods as $method) { + $method->isUndocumentable = true; + } + } + return new ClassInfo( $name, $flags, @@ -3674,7 +3690,8 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac 0, 0, $stmt, - $cond + $cond, + $fileInfo->isUndocumentable ); continue; } @@ -3731,7 +3748,8 @@ function handleStatements(FileInfo $fileInfo, array $stmts, PrettyPrinterAbstrac $classFlags, $classStmt->flags | $abstractFlag, $classStmt, - $cond + $cond, + $fileInfo->isUndocumentable ); } else if ($classStmt instanceof Stmt\EnumCase) { $enumCaseInfos[] = new EnumCaseInfo( @@ -4342,7 +4360,7 @@ function replaceClassSynopses(string $targetDirectory, array $classMap, iterable foreach ($missingClassSynopses as $className => $info) { /** @var ClassInfo $info */ if (!$info->isUndocumentable) { - echo "Warning: Missing class synopsis page for $className\n"; + echo "Warning: Missing class synopsis for $className\n"; } } } @@ -4388,7 +4406,8 @@ function generateMethodSynopses(array $funcMap, array $aliasMap): array { * @param array $aliasMap * @return array */ -function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $aliasMap): array { +function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $aliasMap, bool $isVerify): array { + $existingMethodSynopses = []; $methodSynopses = []; $it = new RecursiveIteratorIterator( @@ -4407,6 +4426,27 @@ function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $a continue; } + if ($isVerify) { + $matches = []; + preg_match("/\s*([\w:]+)\s*<\/refname>\s*\s*&Alias;\s*<(?:function|methodname)>\s*([\w:]+)\s*<\/(?:function|methodname)>\s*<\/refpurpose>/i", $xml, $matches); + $aliasName = $matches[1] ?? null; + $alias = $funcMap[$aliasName] ?? null; + $funcName = $matches[2] ?? null; + $func = $funcMap[$funcName] ?? null; + + if ($alias && + !$alias->isUndocumentable && + ($func === null || $func->alias === null || $func->alias->__toString() !== $aliasName) && + ($alias->alias === null || $alias->alias->__toString() !== $funcName) + ) { + echo "Warning: $aliasName()" . ($alias->alias ? " is an alias of " . $alias->alias->__toString() . "(), but it" : "") . " is incorrectly documented as an alias for $funcName()\n"; + } + + if ($aliasName) { + $existingMethodSynopses[$aliasName] = $aliasName; + } + } + if (stripos($xml, "name->__toString()] = $funcInfo->name->__toString(); $newMethodSynopsis = $funcInfo->getMethodSynopsisElement($funcMap, $aliasMap, $doc); if ($newMethodSynopsis === null) { @@ -4534,6 +4576,16 @@ function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $a } } + if ($isVerify) { + $missingMethodSynopses = array_diff_key($funcMap, $existingMethodSynopses); + foreach ($missingMethodSynopses as $functionName => $info) { + /** @var FuncInfo $info */ + if (!$info->isUndocumentable) { + echo "Warning: Missing method synopsis for $functionName()\n"; + } + } + } + return $methodSynopses; } @@ -4845,7 +4897,7 @@ function(?ArgInfo $aliasArg, ?ArgInfo $aliasedArg) use ($aliasFunc, $aliasedFunc } if ($replaceMethodSynopses) { - $methodSynopses = replaceMethodSynopses($targetSynopses, $funcMap, $aliasMap); + $methodSynopses = replaceMethodSynopses($targetSynopses, $funcMap, $aliasMap, $verify); foreach ($methodSynopses as $filename => $content) { if (file_put_contents($filename, $content)) { diff --git a/ext/dl_test/dl_test.stub.php b/ext/dl_test/dl_test.stub.php index 36d59480a8d25..524c8206365b8 100644 --- a/ext/dl_test/dl_test.stub.php +++ b/ext/dl_test/dl_test.stub.php @@ -1,6 +1,9 @@ Date: Thu, 8 Sep 2022 09:10:16 +0100 Subject: [PATCH 1228/1346] Fix GH-9493: fix ancillary data build for FreeBSD prior to the 13 release. (#9496) the legacy sockcred struct does not hold the process id, thus sockcred2 had been added from FreeBSD 13 in conjunction with LOCAL_CREDS_PERSISTENT to address this thus we disable the feature for earlier releases. --- ext/sockets/conversions.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ext/sockets/conversions.h b/ext/sockets/conversions.h index 41c22135cea76..1f1fd29c5c05c 100644 --- a/ext/sockets/conversions.h +++ b/ext/sockets/conversions.h @@ -8,6 +8,13 @@ # include # if defined(__FreeBSD__) || defined(__NetBSD__) # include +# if defined(__FreeBSD__) + // we can't fully implement the ancillary data feature with + // the legacy sockcred/LOCAL_CREDS pair (due to lack of process + // id handling), so we disable it since only the + // sockcred2/LOCAL_CREDS_PERSISTENT pair can address it. +# undef LOCAL_CREDS +# endif # endif #else # include From 3227d04fa9055f488571efbe6e30a72ba9ac2b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Thu, 8 Sep 2022 13:57:07 +0200 Subject: [PATCH 1229/1346] Declare ext/standard constants in stubs - part 7 (#9505) --- ext/standard/basic_functions.c | 1 - ext/standard/basic_functions.stub.php | 87 ++++++++++++++++++++++++++ ext/standard/basic_functions_arginfo.h | 20 +++++- ext/standard/php_string.h | 12 +++- ext/standard/string.c | 57 +++-------------- 5 files changed, 126 insertions(+), 51 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 713af33e0674f..00713766fde60 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -304,7 +304,6 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */ register_phpinfo_constants(INIT_FUNC_ARGS_PASSTHRU); register_html_constants(INIT_FUNC_ARGS_PASSTHRU); - register_string_constants(INIT_FUNC_ARGS_PASSTHRU); BASIC_MINIT_SUBMODULE(var) BASIC_MINIT_SUBMODULE(file) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 7e6f9d8afbec3..335974b44c609 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -740,6 +740,93 @@ const LOG_PERROR = UNKNOWN; #endif +/* string.c */ + +/** + * @var int + * @cvalue PHP_STR_PAD_LEFT + */ +const STR_PAD_LEFT = UNKNOWN; +/** + * @var int + * @cvalue PHP_STR_PAD_RIGHT + */ +const STR_PAD_RIGHT = UNKNOWN; +/** + * @var int + * @cvalue PHP_STR_PAD_BOTH + */ +const STR_PAD_BOTH = UNKNOWN; +/** + * @var int + * @cvalue PHP_PATHINFO_DIRNAME + */ +const PATHINFO_DIRNAME = UNKNOWN; +/** + * @var int + * @cvalue PHP_PATHINFO_BASENAME + */ +const PATHINFO_BASENAME = UNKNOWN; +/** + * @var int + * @cvalue PHP_PATHINFO_EXTENSION + */ +const PATHINFO_EXTENSION = UNKNOWN; +/** + * @var int + * @cvalue PHP_PATHINFO_FILENAME + */ +const PATHINFO_FILENAME = UNKNOWN; +/** + * @var int + * @cvalue PHP_PATHINFO_ALL + */ +const PATHINFO_ALL = UNKNOWN; + +/** + * If last members of struct lconv equal CHAR_MAX, no grouping is done + * @var int + * @cvalue CHAR_MAX + */ +const CHAR_MAX = UNKNOWN; +/** + * @var int + * @cvalue LC_CTYPE + */ +const LC_CTYPE = UNKNOWN; +/** + * @var int + * @cvalue LC_NUMERIC + */ +const LC_NUMERIC = UNKNOWN; +/** + * @var int + * @cvalue LC_TIME + */ +const LC_TIME = UNKNOWN; +/** + * @var int + * @cvalue LC_COLLATE + */ +const LC_COLLATE = UNKNOWN; +/** + * @var int + * @cvalue LC_MONETARY + */ +const LC_MONETARY = UNKNOWN; +/** + * @var int + * @cvalue LC_ALL + */ +const LC_ALL = UNKNOWN; +#ifdef LC_MESSAGES +/** + * @var int + * @cvalue LC_MESSAGES + */ +const LC_MESSAGES = UNKNOWN; +#endif + /** @undocumentable */ #[AllowDynamicProperties] final class __PHP_Incomplete_Class diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index e76e056f3e81e..a5b7b9a0dcff8 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 9e0016895111851aa2c635e1380a18cd7963e58e */ + * Stub hash: e46c8ef36dc0f29d877ae6e4096135414d0a4412 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) @@ -3695,6 +3695,24 @@ static void register_basic_functions_symbols(int module_number) #if defined(LOG_PERROR) REGISTER_LONG_CONSTANT("LOG_PERROR", LOG_PERROR, CONST_PERSISTENT); #endif + REGISTER_LONG_CONSTANT("STR_PAD_LEFT", PHP_STR_PAD_LEFT, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STR_PAD_RIGHT", PHP_STR_PAD_RIGHT, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("STR_PAD_BOTH", PHP_STR_PAD_BOTH, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PATHINFO_DIRNAME", PHP_PATHINFO_DIRNAME, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PATHINFO_BASENAME", PHP_PATHINFO_BASENAME, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PATHINFO_EXTENSION", PHP_PATHINFO_EXTENSION, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PATHINFO_FILENAME", PHP_PATHINFO_FILENAME, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("PATHINFO_ALL", PHP_PATHINFO_ALL, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CHAR_MAX", CHAR_MAX, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LC_CTYPE", LC_CTYPE, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LC_NUMERIC", LC_NUMERIC, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LC_TIME", LC_TIME, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LC_COLLATE", LC_COLLATE, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LC_MONETARY", LC_MONETARY, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("LC_ALL", LC_ALL, CONST_PERSISTENT); +#if defined(LC_MESSAGES) + REGISTER_LONG_CONSTANT("LC_MESSAGES", LC_MESSAGES, CONST_PERSISTENT); +#endif zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "crypt", sizeof("crypt") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0); diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 3759e61a6ac32..11bf37420a660 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -78,6 +78,16 @@ PHPAPI bool php_binary_string_shuffle(const php_random_algo *algo, php_random_st # define php_mb_reset() php_ignore_value(mblen(NULL, 0)) #endif -void register_string_constants(INIT_FUNC_ARGS); +#define PHP_STR_PAD_LEFT 0 +#define PHP_STR_PAD_RIGHT 1 +#define PHP_STR_PAD_BOTH 2 +#define PHP_PATHINFO_DIRNAME 1 +#define PHP_PATHINFO_BASENAME 2 +#define PHP_PATHINFO_EXTENSION 4 +#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/string.c b/ext/standard/string.c index 236abfae45b2c..a47687667a470 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -50,45 +50,6 @@ #include #endif -#define STR_PAD_LEFT 0 -#define STR_PAD_RIGHT 1 -#define STR_PAD_BOTH 2 -#define PHP_PATHINFO_DIRNAME 1 -#define PHP_PATHINFO_BASENAME 2 -#define PHP_PATHINFO_EXTENSION 4 -#define PHP_PATHINFO_FILENAME 8 -#define PHP_PATHINFO_ALL (PHP_PATHINFO_DIRNAME | PHP_PATHINFO_BASENAME | PHP_PATHINFO_EXTENSION | PHP_PATHINFO_FILENAME) - -#define STR_STRSPN 0 -#define STR_STRCSPN 1 - -/* {{{ register_string_constants */ -void register_string_constants(INIT_FUNC_ARGS) -{ - REGISTER_LONG_CONSTANT("STR_PAD_LEFT", STR_PAD_LEFT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STR_PAD_RIGHT", STR_PAD_RIGHT, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("STR_PAD_BOTH", STR_PAD_BOTH, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PATHINFO_DIRNAME", PHP_PATHINFO_DIRNAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PATHINFO_BASENAME", PHP_PATHINFO_BASENAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PATHINFO_EXTENSION", PHP_PATHINFO_EXTENSION, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PATHINFO_FILENAME", PHP_PATHINFO_FILENAME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PATHINFO_ALL", PHP_PATHINFO_ALL, CONST_CS | CONST_PERSISTENT); - - /* If last members of struct lconv equal CHAR_MAX, no grouping is done */ - REGISTER_LONG_CONSTANT("CHAR_MAX", CHAR_MAX, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LC_CTYPE", LC_CTYPE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LC_NUMERIC", LC_NUMERIC, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LC_TIME", LC_TIME, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LC_COLLATE", LC_COLLATE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LC_MONETARY", LC_MONETARY, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("LC_ALL", LC_ALL, CONST_CS | CONST_PERSISTENT); -# ifdef LC_MESSAGES - REGISTER_LONG_CONSTANT("LC_MESSAGES", LC_MESSAGES, CONST_CS | CONST_PERSISTENT); -# endif - -} -/* }}} */ - /* this is read-only, so it's ok */ ZEND_SET_ALIGNED(16, static const char hexconvtab[]) = "0123456789abcdef"; @@ -288,13 +249,13 @@ static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) / RETURN_LONG(0); } - if (behavior == STR_STRSPN) { + if (behavior == PHP_STR_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 == STR_STRCSPN); + 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*/, @@ -306,14 +267,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, STR_STRSPN); + php_spn_common_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_STR_STRSPN); } /* }}} */ /* {{{ 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, STR_STRCSPN); + php_spn_common_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_STR_STRCSPN); } /* }}} */ @@ -5550,7 +5511,7 @@ PHP_FUNCTION(str_pad) size_t num_pad_chars; /* Number of padding characters (total - input size) */ char *pad_str = " "; /* Pointer to padding string */ size_t pad_str_len = 1; - zend_long pad_type_val = STR_PAD_RIGHT; /* The padding type value */ + zend_long pad_type_val = PHP_STR_PAD_RIGHT; /* The padding type value */ size_t i, left_pad=0, right_pad=0; zend_string *result = NULL; /* Resulting string */ @@ -5573,7 +5534,7 @@ PHP_FUNCTION(str_pad) RETURN_THROWS(); } - if (pad_type_val < STR_PAD_LEFT || pad_type_val > STR_PAD_BOTH) { + if (pad_type_val < PHP_STR_PAD_LEFT || pad_type_val > PHP_STR_PAD_BOTH) { zend_argument_value_error(4, "must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH"); RETURN_THROWS(); } @@ -5584,17 +5545,17 @@ PHP_FUNCTION(str_pad) /* We need to figure out the left/right padding lengths. */ switch (pad_type_val) { - case STR_PAD_RIGHT: + case PHP_STR_PAD_RIGHT: left_pad = 0; right_pad = num_pad_chars; break; - case STR_PAD_LEFT: + case PHP_STR_PAD_LEFT: left_pad = num_pad_chars; right_pad = 0; break; - case STR_PAD_BOTH: + case PHP_STR_PAD_BOTH: left_pad = num_pad_chars / 2; right_pad = num_pad_chars - left_pad; break; From 8cdfffb7537084e3f8a691fc13428425f559566c Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 7 Sep 2022 16:59:02 +0100 Subject: [PATCH 1230/1346] Fixed MemorySanitizer: use-of-uninitialized-value warning introduced by 932586c426d7f016e5d0e0d95579f9503ec70a89 --- ext/date/php_date.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index c64ef6afe112a..a8ec40a0c89c1 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2263,17 +2263,20 @@ PHPAPI zval *php_date_instantiate(zend_class_entry *pce, zval *object) /* {{{ */ /* Helper function used to store the latest found warnings and errors while * parsing, from either strtotime or parse_from_format. */ -static void update_errors_warnings(timelib_error_container *last_errors) /* {{{ */ +static timelib_error_container* update_errors_warnings(timelib_error_container **last_errors) /* {{{ */ { if (DATEG(last_errors)) { timelib_error_container_dtor(DATEG(last_errors)); DATEG(last_errors) = NULL; } - if (last_errors->warning_count || last_errors->error_count) { - DATEG(last_errors) = last_errors; - } else { - timelib_error_container_dtor(last_errors); + + if ((*last_errors)->warning_count || (*last_errors)->error_count) { + DATEG(last_errors) = *last_errors; + return *last_errors; } + + timelib_error_container_dtor(*last_errors); + return NULL; } /* }}} */ static void php_date_set_time_fraction(timelib_time *time, int microseconds) @@ -2324,7 +2327,7 @@ PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, siz } /* update last errors and warnings */ - update_errors_warnings(err); + err = update_errors_warnings(&err); /* If called from a constructor throw an exception */ if ((flags & PHP_DATE_INIT_CTOR) && err && err->error_count) { @@ -3002,7 +3005,8 @@ static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{ tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); /* update last errors and warnings */ - update_errors_warnings(err); + err = update_errors_warnings(&err); + if (err && err->error_count) { /* spit out the first library error message, at least */ php_error_docref(NULL, E_WARNING, "Failed to parse time string (%s) at position %d (%c): %s", modify, From f799bc4eca0ef46a7e5e35779a1d8828b85e577b Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Thu, 8 Sep 2022 09:23:23 +0100 Subject: [PATCH 1231/1346] Don't return existing error_container/NULL, but use by-ref instead --- ext/date/php_date.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index a8ec40a0c89c1..abda2a305c795 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2263,20 +2263,23 @@ PHPAPI zval *php_date_instantiate(zend_class_entry *pce, zval *object) /* {{{ */ /* Helper function used to store the latest found warnings and errors while * parsing, from either strtotime or parse_from_format. */ -static timelib_error_container* update_errors_warnings(timelib_error_container **last_errors) /* {{{ */ +static void update_errors_warnings(timelib_error_container **last_errors) /* {{{ */ { if (DATEG(last_errors)) { timelib_error_container_dtor(DATEG(last_errors)); DATEG(last_errors) = NULL; } + if (last_errors == NULL || (*last_errors) == NULL) { + return; + } + if ((*last_errors)->warning_count || (*last_errors)->error_count) { DATEG(last_errors) = *last_errors; - return *last_errors; } timelib_error_container_dtor(*last_errors); - return NULL; + *last_errors = NULL; } /* }}} */ static void php_date_set_time_fraction(timelib_time *time, int microseconds) @@ -2327,7 +2330,7 @@ PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, siz } /* update last errors and warnings */ - err = update_errors_warnings(&err); + update_errors_warnings(&err); /* If called from a constructor throw an exception */ if ((flags & PHP_DATE_INIT_CTOR) && err && err->error_count) { @@ -3005,7 +3008,7 @@ static bool php_date_modify(zval *object, char *modify, size_t modify_len) /* {{ tmp_time = timelib_strtotime(modify, modify_len, &err, DATE_TIMEZONEDB, php_date_parse_tzfile_wrapper); /* update last errors and warnings */ - err = update_errors_warnings(&err); + update_errors_warnings(&err); if (err && err->error_count) { /* spit out the first library error message, at least */ From 49c029858b371c718da9982c524848edc88a85dc Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 9 Sep 2022 09:16:24 +0100 Subject: [PATCH 1232/1346] Fixed error updating once more --- ext/date/php_date.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index abda2a305c795..e226b4b4bbf93 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -2276,6 +2276,7 @@ static void update_errors_warnings(timelib_error_container **last_errors) /* {{{ if ((*last_errors)->warning_count || (*last_errors)->error_count) { DATEG(last_errors) = *last_errors; + return; } timelib_error_container_dtor(*last_errors); From e0422979f6c64804496852d9a1022d3e622bbd06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Fri, 9 Sep 2022 11:54:38 +0200 Subject: [PATCH 1233/1346] Validate if the refpurpose and the description is in sync (#9510) --- build/gen_stub.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build/gen_stub.php b/build/gen_stub.php index c199dde15b45a..985ba59b766b2 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -4442,6 +4442,14 @@ function replaceMethodSynopses(string $targetDirectory, array $funcMap, array $a echo "Warning: $aliasName()" . ($alias->alias ? " is an alias of " . $alias->alias->__toString() . "(), but it" : "") . " is incorrectly documented as an alias for $funcName()\n"; } + $matches = []; + preg_match("/<(?:para|simpara)>\s*(?:&info.function.alias;|&info.method.alias;|&Alias;)\s+<(?:function|methodname)>\s*([\w:]+)\s*<\/(?:function|methodname)>/i", $xml, $matches); + $descriptionFuncName = $matches[1] ?? null; + $descriptionFunc = $funcMap[$descriptionFuncName] ?? null; + if ($descriptionFunc && $funcName !== $descriptionFuncName) { + echo "Warning: Alias in the method synopsis description of $pathName doesn't match the alias in the \n"; + } + if ($aliasName) { $existingMethodSynopses[$aliasName] = $aliasName; } From 80315edd580ceb2fd7cf21aef2130c4c265acc90 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 10 Sep 2022 11:03:10 +0100 Subject: [PATCH 1234/1346] Introduce PROGRESS_CACHE_SLOT() macro --- Zend/zend_execute.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 785626adfe7ac..97da6efb805fe 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1001,6 +1001,8 @@ static zend_always_inline bool zend_value_instanceof_static(zval *zv) { # define HAVE_CACHE_SLOT 1 #endif +#define PROGRESS_CACHE_SLOT() if (HAVE_CACHE_SLOT) {cache_slot++;} + static zend_always_inline zend_class_entry *zend_fetch_ce_from_cache_slot( void **cache_slot, zend_type *type) { @@ -1065,9 +1067,7 @@ static zend_always_inline bool zend_check_type_slow( if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce)) { return false; } - if (HAVE_CACHE_SLOT) { - cache_slot++; - } + PROGRESS_CACHE_SLOT(); } ZEND_TYPE_LIST_FOREACH_END(); return true; } else { @@ -1085,9 +1085,7 @@ static zend_always_inline bool zend_check_type_slow( } } - if (HAVE_CACHE_SLOT) { - cache_slot++; - } + PROGRESS_CACHE_SLOT(); } ZEND_TYPE_LIST_FOREACH_END(); } } else { From 9286101da4732d82345cacd618ce0eab78b7b729 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 10 Sep 2022 10:59:57 +0100 Subject: [PATCH 1235/1346] Fix GH-9516: (A&B)|D as a param should allow AB or D. Not just A. The issue was that we didn't compute enough cache slots for DNF types. Nor progressed throught the CE's in the cache slot, meaning we were only checking if the value passed satisfied the first type of the nested intersection type. --- .../type_declarations/dnf_types/gh9516.phpt | 157 ++++++++++++++++++ Zend/zend_compile.c | 18 +- Zend/zend_execute.c | 18 +- 3 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/dnf_types/gh9516.phpt diff --git a/Zend/tests/type_declarations/dnf_types/gh9516.phpt b/Zend/tests/type_declarations/dnf_types/gh9516.phpt new file mode 100644 index 0000000000000..3d91932ebd452 --- /dev/null +++ b/Zend/tests/type_declarations/dnf_types/gh9516.phpt @@ -0,0 +1,157 @@ +--TEST-- +GH-9516: (A&B)|D as a param should allow AB or D. Not just A. +--FILE-- +method1(new A_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method1(new B_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method1(new AB_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method1(new D_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +// Lets try in reverse? +try { + $t->method2(new A_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method2(new B_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method2(new AB_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method2(new D_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +/* Single before intersection */ +try { + $t->method3(new A_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method3(new B_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method3(new AB_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method3(new D_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +// Lets try in reverse? +try { + $t->method4(new A_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method4(new B_); + echo 'Fail', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method4(new AB_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + +try { + $t->method4(new D_); + echo 'Pass', \PHP_EOL; +} catch (\Throwable $throwable) { + echo $throwable->getMessage(), \PHP_EOL; +} + + +?> +--EXPECTF-- +T::method1(): Argument #1 ($arg) must be of type (A&B)|D, A_ given, called in %s on line %d +T::method1(): Argument #1 ($arg) must be of type (A&B)|D, B_ given, called in %s on line %d +Pass +Pass +T::method2(): Argument #1 ($arg) must be of type (B&A)|D, A_ given, called in %s on line %d +T::method2(): Argument #1 ($arg) must be of type (B&A)|D, B_ given, called in %s on line %d +Pass +Pass +T::method3(): Argument #1 ($arg) must be of type D|(A&B), A_ given, called in %s on line %d +T::method3(): Argument #1 ($arg) must be of type D|(A&B), B_ given, called in %s on line %d +Pass +Pass +T::method4(): Argument #1 ($arg) must be of type D|(B&A), A_ given, called in %s on line %d +T::method4(): Argument #1 ($arg) must be of type D|(B&A), B_ given, called in %s on line %d +Pass +Pass diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 19ff1b08862a2..b0aebed581835 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2380,7 +2380,23 @@ static size_t zend_type_get_num_classes(zend_type type) { return 0; } if (ZEND_TYPE_HAS_LIST(type)) { - return ZEND_TYPE_LIST(type)->num_types; + /* Intersection types cannot have nested list types */ + if (ZEND_TYPE_IS_INTERSECTION(type)) { + return ZEND_TYPE_LIST(type)->num_types; + } + ZEND_ASSERT(ZEND_TYPE_IS_UNION(type)); + size_t count = 0; + zend_type *list_type; + + ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(type), list_type) { + if (ZEND_TYPE_IS_INTERSECTION(*list_type)) { + count += ZEND_TYPE_LIST(*list_type)->num_types; + } else { + ZEND_ASSERT(!ZEND_TYPE_HAS_LIST(*list_type)); + count += 1; + } + } ZEND_TYPE_LIST_FOREACH_END(); + return count; } return 1; } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 97da6efb805fe..657b453b8384f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1035,19 +1035,25 @@ static zend_always_inline zend_class_entry *zend_fetch_ce_from_cache_slot( } static bool zend_check_intersection_type_from_cache_slot(zend_type_list *intersection_type_list, - zend_class_entry *arg_ce, void **cache_slot) + zend_class_entry *arg_ce, void ***cache_slot_ptr) { + void **cache_slot = *cache_slot_ptr; zend_class_entry *ce; zend_type *list_type; + bool status = true; ZEND_TYPE_LIST_FOREACH(intersection_type_list, list_type) { ce = zend_fetch_ce_from_cache_slot(cache_slot, list_type); /* If type is not an instance of one of the types taking part in the * intersection it cannot be a valid instance of the whole intersection type. */ if (!ce || !instanceof_function(arg_ce, ce)) { - return false; + status = false; } + PROGRESS_CACHE_SLOT(); } ZEND_TYPE_LIST_FOREACH_END(); - return true; + if (HAVE_CACHE_SLOT) { + *cache_slot_ptr = cache_slot; + } + return status; } static zend_always_inline bool zend_check_type_slow( @@ -1073,9 +1079,10 @@ static zend_always_inline bool zend_check_type_slow( } else { ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(*type), list_type) { if (ZEND_TYPE_IS_INTERSECTION(*list_type)) { - if (zend_check_intersection_type_from_cache_slot(ZEND_TYPE_LIST(*list_type), Z_OBJCE_P(arg), cache_slot)) { + if (zend_check_intersection_type_from_cache_slot(ZEND_TYPE_LIST(*list_type), Z_OBJCE_P(arg), &cache_slot)) { return true; } + /* The cache_slot is progressed in zend_check_intersection_type_from_cache_slot() */ } else { ZEND_ASSERT(!ZEND_TYPE_HAS_LIST(*list_type)); ce = zend_fetch_ce_from_cache_slot(cache_slot, list_type); @@ -1083,9 +1090,8 @@ static zend_always_inline bool zend_check_type_slow( if (ce && instanceof_function(Z_OBJCE_P(arg), ce)) { return true; } + PROGRESS_CACHE_SLOT(); } - - PROGRESS_CACHE_SLOT(); } ZEND_TYPE_LIST_FOREACH_END(); } } else { From c70a8281e375acd0d0d315836ac7bf511067276e Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 10 Sep 2022 11:39:01 +0100 Subject: [PATCH 1236/1346] Use DNF intersection type check also for simple intersection types --- Zend/zend_execute.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 657b453b8384f..35f2f3c6151c3 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1066,16 +1066,7 @@ static zend_always_inline bool zend_check_type_slow( if (UNEXPECTED(ZEND_TYPE_HAS_LIST(*type))) { zend_type *list_type; if (ZEND_TYPE_IS_INTERSECTION(*type)) { - ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(*type), list_type) { - ce = zend_fetch_ce_from_cache_slot(cache_slot, list_type); - /* If type is not an instance of one of the types taking part in the - * intersection it cannot be a valid instance of the whole intersection type. */ - if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce)) { - return false; - } - PROGRESS_CACHE_SLOT(); - } ZEND_TYPE_LIST_FOREACH_END(); - return true; + return zend_check_intersection_type_from_cache_slot(ZEND_TYPE_LIST(*type), Z_OBJCE_P(arg), &cache_slot); } else { ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(*type), list_type) { if (ZEND_TYPE_IS_INTERSECTION(*list_type)) { From 6c4d24e4f03e4362751cd771a81b2976c67d405f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 10 Sep 2022 13:20:59 +0100 Subject: [PATCH 1237/1346] Update cache slot size calculation in compact_literals.c --- Zend/Optimizer/compact_literals.c | 18 +++++++++++++++++- Zend/zend_compile.c | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Zend/Optimizer/compact_literals.c b/Zend/Optimizer/compact_literals.c index 1d136dc682d13..8b571c6d848a2 100644 --- a/Zend/Optimizer/compact_literals.c +++ b/Zend/Optimizer/compact_literals.c @@ -63,7 +63,23 @@ static size_t type_num_classes(const zend_op_array *op_array, uint32_t arg_num) if (ZEND_TYPE_IS_COMPLEX(arg_info->type)) { if (ZEND_TYPE_HAS_LIST(arg_info->type)) { - return ZEND_TYPE_LIST(arg_info->type)->num_types; + /* Intersection types cannot have nested list types */ + if (ZEND_TYPE_IS_INTERSECTION(arg_info->type)) { + return ZEND_TYPE_LIST(arg_info->type)->num_types; + } + ZEND_ASSERT(ZEND_TYPE_IS_UNION(arg_info->type)); + size_t count = 0; + zend_type *list_type; + + ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(arg_info->type), list_type) { + if (ZEND_TYPE_IS_INTERSECTION(*list_type)) { + count += ZEND_TYPE_LIST(*list_type)->num_types; + } else { + ZEND_ASSERT(!ZEND_TYPE_HAS_LIST(*list_type)); + count += 1; + } + } ZEND_TYPE_LIST_FOREACH_END(); + return count; } return 1; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b0aebed581835..8631bb3ea4b2e 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2375,6 +2375,7 @@ static void zend_compile_memoized_expr(znode *result, zend_ast *expr) /* {{{ */ } /* }}} */ +/* Remember to update type_num_classes() in compact_literals.c when changing this function */ static size_t zend_type_get_num_classes(zend_type type) { if (!ZEND_TYPE_IS_COMPLEX(type)) { return 0; From 76dccd820710bf3f37d41e2cbab079fded5b8c11 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Sat, 10 Sep 2022 13:27:24 +0200 Subject: [PATCH 1238/1346] Fix GH-9518: Disabling IPv6 support disables unrelated constants We need to properly terminate the "conditional compilation" in stub files. Closes GH-9520. --- NEWS | 2 ++ ext/standard/file.stub.php | 4 +++ ext/standard/file_arginfo.h | 62 +++++++++++-------------------------- 3 files changed, 24 insertions(+), 44 deletions(-) diff --git a/NEWS b/NEWS index c3daf3621f85a..c5cb59f0184ec 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,8 @@ PHP NEWS - Standard: . Marked crypt()'s $string parameter as #[\SensitiveParameter]. (timwolla) . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) + . Fixed bug GH-9518 (Disabling IPv6 support disables unrelated constants). + (cmb) 01 Sep 2022, PHP 8.2.0RC1 diff --git a/ext/standard/file.stub.php b/ext/standard/file.stub.php index 72cf582b8f1f1..591169a37e001 100644 --- a/ext/standard/file.stub.php +++ b/ext/standard/file.stub.php @@ -278,6 +278,7 @@ * @cvalue PF_INET */ const STREAM_PF_INET = UNKNOWN; +#endif #if (!defined(PF_INET) && defined(AF_INET)) /** * @var int @@ -286,6 +287,7 @@ const STREAM_PF_INET = UNKNOWN; #endif + #ifdef HAVE_IPV6 #ifdef PF_INET6 /** @@ -293,6 +295,7 @@ * @cvalue PF_INET6 */ const STREAM_PF_INET6 = UNKNOWN; +#endif #if (!defined(PF_INET6) && defined(AF_INET6)) /** * @var int @@ -308,6 +311,7 @@ * @cvalue PF_UNIX */ const STREAM_PF_UNIX = UNKNOWN; +#endif #if (!defined(PF_UNIX) && defined(AF_UNIX)) /** * @var int diff --git a/ext/standard/file_arginfo.h b/ext/standard/file_arginfo.h index ac619b7f00caa..b7ecefe330090 100644 --- a/ext/standard/file_arginfo.h +++ b/ext/standard/file_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 38c6088c48d8f582ede1363855a867dc4aade34b */ + * Stub hash: e9a566d5ef96f781074027b1b3ff1824d0208b47 */ @@ -60,94 +60,68 @@ static void register_file_symbols(int module_number) #if defined(PF_INET) REGISTER_LONG_CONSTANT("STREAM_PF_INET", PF_INET, CONST_PERSISTENT); #endif -#if defined(PF_INET) && (!defined(PF_INET) && defined(AF_INET)) +#if (!defined(PF_INET) && defined(AF_INET)) REGISTER_LONG_CONSTANT("STREAM_PF_INET", AF_INET, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_INET6) +#if defined(HAVE_IPV6) && defined(PF_INET6) REGISTER_LONG_CONSTANT("STREAM_PF_INET6", PF_INET6, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_INET6) && (!defined(PF_INET6) && defined(AF_INET6)) +#if defined(HAVE_IPV6) && (!defined(PF_INET6) && defined(AF_INET6)) REGISTER_LONG_CONSTANT("STREAM_PF_INET6", AF_INET6, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) +#if defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_PF_UNIX", PF_UNIX, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (!defined(PF_UNIX) && defined(AF_UNIX)) +#if (!defined(PF_UNIX) && defined(AF_UNIX)) REGISTER_LONG_CONSTANT("STREAM_PF_UNIX", AF_UNIX, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(IPPROTO_IP) +#if defined(IPPROTO_IP) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_IP", IPPROTO_IP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_TCP) || defined(PHP_WIN32)) +#if (defined(IPPROTO_TCP) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_TCP", IPPROTO_TCP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_UDP) || defined(PHP_WIN32)) +#if (defined(IPPROTO_UDP) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_UDP", IPPROTO_UDP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_ICMP) || defined(PHP_WIN32)) +#if (defined(IPPROTO_ICMP) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_ICMP", IPPROTO_ICMP, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && (defined(IPPROTO_RAW) || defined(PHP_WIN32)) +#if (defined(IPPROTO_RAW) || defined(PHP_WIN32)) REGISTER_LONG_CONSTANT("STREAM_IPPROTO_RAW", IPPROTO_RAW, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_SOCK_STREAM", SOCK_STREAM, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_SOCK_DGRAM", SOCK_DGRAM, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(SOCK_RAW) +#if defined(SOCK_RAW) REGISTER_LONG_CONSTANT("STREAM_SOCK_RAW", SOCK_RAW, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(SOCK_SEQPACKET) +#if defined(SOCK_SEQPACKET) REGISTER_LONG_CONSTANT("STREAM_SOCK_SEQPACKET", SOCK_SEQPACKET, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(SOCK_RDM) +#if defined(SOCK_RDM) REGISTER_LONG_CONSTANT("STREAM_SOCK_RDM", SOCK_RDM, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_PEEK", STREAM_PEEK, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_OOB", STREAM_OOB, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_SERVER_BIND", STREAM_XPORT_BIND, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("STREAM_SERVER_LISTEN", STREAM_XPORT_LISTEN, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_USE_INCLUDE_PATH", PHP_FILE_USE_INCLUDE_PATH, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_IGNORE_NEW_LINES", PHP_FILE_IGNORE_NEW_LINES, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_SKIP_EMPTY_LINES", PHP_FILE_SKIP_EMPTY_LINES, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_APPEND", PHP_FILE_APPEND, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_NO_DEFAULT_CONTEXT", PHP_FILE_NO_DEFAULT_CONTEXT, CONST_PERSISTENT); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_TEXT", 0, CONST_PERSISTENT | CONST_DEPRECATED); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) REGISTER_LONG_CONSTANT("FILE_BINARY", 0, CONST_PERSISTENT | CONST_DEPRECATED); -#endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(HAVE_FNMATCH) +#if defined(HAVE_FNMATCH) REGISTER_LONG_CONSTANT("FNM_NOESCAPE", FNM_NOESCAPE, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(HAVE_FNMATCH) +#if defined(HAVE_FNMATCH) REGISTER_LONG_CONSTANT("FNM_PATHNAME", FNM_PATHNAME, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(HAVE_FNMATCH) +#if defined(HAVE_FNMATCH) REGISTER_LONG_CONSTANT("FNM_PERIOD", FNM_PERIOD, CONST_PERSISTENT); #endif -#if defined(PF_INET) && defined(HAVE_IPV6) && defined(PF_UNIX) && defined(HAVE_FNMATCH) && defined(FNM_CASEFOLD) +#if defined(HAVE_FNMATCH) && defined(FNM_CASEFOLD) REGISTER_LONG_CONSTANT("FNM_CASEFOLD", FNM_CASEFOLD, CONST_PERSISTENT); #endif } From 4af695e908fcd712537c39be288ab990da2f58dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Sat, 10 Sep 2022 18:31:43 +0200 Subject: [PATCH 1239/1346] Require PHP 7.4 at least for running the build system (#9519) --- UPGRADING.INTERNALS | 2 ++ build/php.m4 | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index 6b5fe08f7e5dd..e122bb0e67ec7 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -62,6 +62,8 @@ PHP 8.2 INTERNALS UPGRADE NOTES 2. Build system changes ======================== +* The build system now requires PHP 7.4.0 at least. Previously PHP 7.1 was + required. * Unsupported libxml2 2.10.0 symbols are no longer exported on Windows. * Identifier names for namespaced functions generated from stub files through gen_stub.php have been changed. This requires that namespaced functions diff --git a/build/php.m4 b/build/php.m4 index fb28f462396fc..637b2a180160f 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -1900,8 +1900,8 @@ AC_DEFUN([PHP_PROG_PHP],[ set $php_version IFS=$ac_IFS php_version_num=`expr [$]{1:-0} \* 10000 + [$]{2:-0} \* 100 + [$]{3:-0}` - dnl Minimum supported version for gen_stubs.php is PHP 7.1. - if test "$php_version_num" -lt 70100; then + dnl Minimum supported version for gen_stub.php is PHP 7.4. + if test "$php_version_num" -lt 70400; then AC_MSG_RESULT([$php_version (too old)]) unset PHP else From 8b632749d7d989b58f86dacf8c7213a2f8a81dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Sun, 11 Sep 2022 07:46:53 +0200 Subject: [PATCH 1240/1346] Use PHP 7.4 syntax in gen_stub.php --- build/gen_stub.php | 277 ++++++++++++++++----------------------------- 1 file changed, 97 insertions(+), 180 deletions(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index 985ba59b766b2..3ec47f45c4309 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -160,21 +160,17 @@ function extractStubHash(string $arginfoFile): ?string { } class Context { - /** @var bool */ - public $forceParse = false; - /** @var bool */ - public $forceRegeneration = false; + public bool $forceParse = false; + public bool $forceRegeneration = false; /** @var iterable */ - public $allConstInfos = []; + public iterable $allConstInfos = []; /** @var FileInfo[] */ - public $parsedFiles = []; + public array $parsedFiles = []; } class ArrayType extends SimpleType { - /** @var Type */ - public $keyType; - /** @var Type */ - public $valueType; + public Type $keyType; + public Type $valueType; public static function createGenericArray(): self { @@ -212,10 +208,8 @@ public function equals(SimpleType $other): bool { } class SimpleType { - /** @var string */ - public $name; - /** @var bool */ - public $isBuiltin; + public string $name; + public bool $isBuiltin; public static function fromNode(Node $node): SimpleType { if ($node instanceof Node\Name) { @@ -552,9 +546,8 @@ public function equals(SimpleType $other): bool { class Type { /** @var SimpleType[] */ - public $types; - /** @var bool */ - public $isIntersection = false; + public array $types; + public bool $isIntersection; public static function fromNode(Node $node): Type { if ($node instanceof Node\UnionType || $node instanceof Node\IntersectionType) { @@ -780,10 +773,9 @@ function ($type) { return $type->name; }, class ArginfoType { /** @var SimpleType[] $classTypes */ - public $classTypes; - + public array $classTypes; /** @var SimpleType[] $builtinTypes */ - private $builtinTypes; + private array $builtinTypes; /** * @param SimpleType[] $classTypes @@ -819,20 +811,14 @@ class ArgInfo { const SEND_BY_REF = 1; const SEND_PREFER_REF = 2; - /** @var string */ - public $name; - /** @var int */ - public $sendBy; - /** @var bool */ - public $isVariadic; - /** @var Type|null */ - public $type; - /** @var Type|null */ - public $phpDocType; - /** @var string|null */ - public $defaultValue; + public string $name; + public int $sendBy; + public bool $isVariadic; + public ?Type $type; + public ?Type $phpDocType; + public ?string $defaultValue; /** @var AttributeInfo[] */ - public $attributes; + public array $attributes; /** * @param AttributeInfo[] $attributes @@ -943,8 +929,7 @@ public function isUnknown(): bool } class ConstName extends AbstractConstName { - /** @var string */ - public $const; + public string $const; public function __construct(string $const) { @@ -963,10 +948,8 @@ public function __toString(): string } class ClassConstName extends AbstractConstName { - /** @var Name */ - public $class; - /** @var string */ - public $const; + public Name $class; + public string $const; public function __construct(Name $class, string $const) { @@ -986,10 +969,8 @@ public function __toString(): string } class PropertyName { - /** @var Name */ - public $class; - /** @var string */ - public $property; + public Name $class; + public string $property; public function __construct(Name $class, string $property) { @@ -1015,8 +996,7 @@ public function isDestructor(): bool; } class FunctionName implements FunctionOrMethodName { - /** @var Name */ - private $name; + private Name $name; public function __construct(Name $name) { $this->name = $name; @@ -1079,10 +1059,8 @@ public function isDestructor(): bool { } class MethodName implements FunctionOrMethodName { - /** @var Name */ - public $className; - /** @var string */ - public $methodName; + public Name $className; + public string $methodName; public function __construct(Name $className, string $methodName) { $this->className = $className; @@ -1137,16 +1115,11 @@ class ReturnInfo { self::REFCOUNT_N, ]; - /** @var bool */ - public $byRef; - /** @var Type|null */ - public $type; - /** @var Type|null */ - public $phpDocType; - /** @var bool */ - public $tentativeReturnType; - /** @var string */ - public $refcount; + public bool $byRef; + public ?Type $type; + public ?Type $phpDocType; + public bool $tentativeReturnType; + public string $refcount; public function __construct(bool $byRef, ?Type $type, ?Type $phpDocType, bool $tentativeReturnType, ?string $refcount) { $this->byRef = $byRef; @@ -1198,32 +1171,20 @@ private function setRefcount(?string $refcount): void } class FuncInfo { - /** @var FunctionOrMethodName */ - public $name; - /** @var int */ - public $classFlags; - /** @var int */ - public $flags; - /** @var string|null */ - public $aliasType; - /** @var FunctionName|null */ - public $alias; - /** @var bool */ - public $isDeprecated; - /** @var bool */ - public $supportsCompileTimeEval; - /** @var bool */ - public $verify; + public FunctionOrMethodName $name; + public int $classFlags; + public int $flags; + public ?string $aliasType; + public ?FunctionOrMethodName $alias; + public bool $isDeprecated; + public bool $supportsCompileTimeEval; + public bool $verify; /** @var ArgInfo[] */ - public $args; - /** @var ReturnInfo */ - public $return; - /** @var int */ - public $numRequiredArgs; - /** @var string|null */ - public $cond; - /** @var bool */ - public $isUndocumentable; + public array $args; + public ReturnInfo $return; + public int $numRequiredArgs; + public ?string $cond; + public bool $isUndocumentable; /** * @param ArgInfo[] $args @@ -1608,18 +1569,10 @@ class EvaluatedValue { /** @var mixed */ public $value; - - /** @var SimpleType */ - public $type; - - /** @var string|null */ - public $cConstValue; - - /** @var bool */ - public $isUnknownConstValue; - - /** @var ConstInfo|null */ - public $originatingConst; + public SimpleType $type; + public ?string $cConstValue; + public bool $isUnknownConstValue; + public ?ConstInfo $originatingConst; /** * @param iterable $allConstInfos @@ -1752,14 +1705,10 @@ public function getCConstValue(iterable $allConstInfos): ?string abstract class VariableLike { - /** @var Type|null */ - public $phpDocType; - /** @var int */ - public $flags; - /** @var string|null */ - public $link; - /** @var int|null */ - public $phpVersionIdMinimumCompatibility; + public ?Type $phpDocType; + public int $flags; + public ?string $link; + public ?int $phpVersionIdMinimumCompatibility; public function __construct( int $flags, @@ -1880,18 +1829,12 @@ protected function addFlagForVersionsAbove(array $flags, string $flag, int $mini class ConstInfo extends VariableLike { - /** @var ConstOrClassConstName */ - public $name; - /** @var Expr */ - public $value; - /** @var bool */ - public $isDeprecated; - /** @var string|null */ - public $valueString; - /** @var string|null */ - public $cond; - /** @var string|null */ - public $cValue; + public ConstOrClassConstName $name; + public Expr $value; + public bool $isDeprecated; + public ?string $valueString; + public ?string $cond; + public ?string $cValue; public function __construct( ConstOrClassConstName $name, @@ -2146,16 +2089,11 @@ protected function addModifiersToFieldSynopsis(DOMDocument $doc, DOMElement $fie class PropertyInfo extends VariableLike { - /** @var PropertyName */ - public $name; - /** @var Type|null */ - public $type; - /** @var Expr|null */ - public $defaultValue; - /** @var string|null */ - public $defaultValueString; - /** @var bool */ - public $isDocReadonly; + public PropertyName $name; + public ?Type $type; + public ?Expr $defaultValue; + public ?string $defaultValueString; + public bool $isDocReadonly; public function __construct( PropertyName $name, @@ -2353,10 +2291,8 @@ public function __clone() } class EnumCaseInfo { - /** @var string */ - public $name; - /** @var Expr|null */ - public $value; + public string $name; + public ?Expr $value; public function __construct(string $name, ?Expr $value) { $this->name = $name; @@ -2383,10 +2319,9 @@ public function getDeclaration(iterable $allConstInfos): string { } class AttributeInfo { - /** @var string */ - public $class; + public string $class; /** @var \PhpParser\Node\Arg[] */ - public $args; + public array $args; /** @param \PhpParser\Node\Arg[] $args */ public function __construct(string $class, array $args) { @@ -2423,42 +2358,31 @@ public function generateCode(string $invocation, string $nameSuffix, iterable $a } class ClassInfo { - /** @var Name */ - public $name; - /** @var int */ - public $flags; - /** @var string */ - public $type; - /** @var string|null */ - public $alias; - /** @var SimpleType|null */ - public $enumBackingType; - /** @var bool */ - public $isDeprecated; - /** @var bool */ - public $isStrictProperties; + public Name $name; + public int $flags; + public string $type; + public ?string $alias; + public ?SimpleType $enumBackingType; + public bool $isDeprecated; + public bool $isStrictProperties; /** @var AttributeInfo[] */ - public $attributes; - /** @var bool */ - public $isNotSerializable; + public array $attributes; + public bool $isNotSerializable; /** @var Name[] */ - public $extends; + public array $extends; /** @var Name[] */ - public $implements; + public array $implements; /** @var ConstInfo[] */ - public $constInfos; + public array $constInfos; /** @var PropertyInfo[] */ - public $propertyInfos; + public array $propertyInfos; /** @var FuncInfo[] */ - public $funcInfos; + public array $funcInfos; /** @var EnumCaseInfo[] */ - public $enumCaseInfos; - /** @var string|null */ - public $cond; - /** @var int|null */ - public $phpVersionIdMinimumCompatibility; - /** @var bool */ - public $isUndocumentable; + public array $enumCaseInfos; + public ?string $cond; + public ?int $phpVersionIdMinimumCompatibility; + public bool $isUndocumentable; /** * @param AttributeInfo[] $attributes @@ -3081,23 +3005,18 @@ private function appendInheritedMemberSectionToClassSynopsis(DOMDocument $doc, D class FileInfo { /** @var string[] */ - public $dependencies = []; + public array $dependencies = []; /** @var ConstInfo[] */ - public $constInfos = []; + public array $constInfos = []; /** @var FuncInfo[] */ - public $funcInfos = []; + public array $funcInfos = []; /** @var ClassInfo[] */ - public $classInfos = []; - /** @var bool */ - public $generateFunctionEntries = false; - /** @var string */ - public $declarationPrefix = ""; - /** @var int|null */ - public $generateLegacyArginfoForPhpVersionId; - /** @var bool */ - public $generateClassEntries = false; - /** @var bool */ - public $isUndocumentable = false; + public array $classInfos = []; + public bool $generateFunctionEntries = false; + public string $declarationPrefix = ""; + public ?int $generateLegacyArginfoForPhpVersionId = null; + public bool $generateClassEntries = false; + public bool $isUndocumentable = false; /** * @return iterable @@ -3144,10 +3063,8 @@ public function __clone() } class DocCommentTag { - /** @var string */ - public $name; - /** @var string|null */ - public $value; + public string $name; + public ?string $value; public function __construct(string $name, ?string $value) { $this->name = $name; From 08b75395838b4b42a41e3c70684fa6c6b113eee0 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 8 Sep 2022 17:41:53 +0200 Subject: [PATCH 1241/1346] Fix syntax error when dnf type in parens after readonly Fixes GH-9500 Closes GH-9512 --- NEWS | 4 ++++ Zend/tests/gh9500.phpt | 25 +++++++++++++++++++++++++ Zend/tests/readonly_function.phpt | 28 ++++++++++++++++++++++++++-- Zend/zend_language_parser.y | 17 ++++++++++++++++- Zend/zend_language_scanner.l | 6 ------ 5 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 Zend/tests/gh9500.phpt diff --git a/NEWS b/NEWS index c5cb59f0184ec..a9d5110a41cc0 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC2 +- Core: + . Fixed bug GH-9500 (Using dnf type with parentheses after readonly keyword + results in a parse error). (ilutov) + - Opcache: . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer overflow). (Arnaud) diff --git a/Zend/tests/gh9500.phpt b/Zend/tests/gh9500.phpt new file mode 100644 index 0000000000000..4afc8c579677f --- /dev/null +++ b/Zend/tests/gh9500.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug GH-9500: Disjunctive Normal Form Types - readonly property followed by ( +--FILE-- + +DONE +--EXPECT-- +DONE diff --git a/Zend/tests/readonly_function.phpt b/Zend/tests/readonly_function.phpt index 0262b3b7348ce..35102d36b9dcd 100644 --- a/Zend/tests/readonly_function.phpt +++ b/Zend/tests/readonly_function.phpt @@ -7,10 +7,34 @@ function readonly() { echo "Hi!\n"; } +class A { + const readonly = 'Const hi!'; + + static function readonly() { + echo "Static hi!\n"; + } +} + +class B { + public $readonly = 'Prop hi!'; + + function readonly() { + echo "Instance hi!\n"; + } +} + +$b = new B(); + readonly(); -readonly (); +echo A::readonly, "\n"; +A::readonly(); +$b->readonly(); +echo $b->readonly, "\n"; ?> --EXPECT-- Hi! -Hi! +Const hi! +Static hi! +Instance hi! +Prop hi! diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 7194f70b9d471..f0c6622171ae0 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -278,6 +278,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*); %type attribute_decl attribute attributes attribute_group namespace_declaration_name %type match match_arm_list non_empty_match_arm_list match_arm match_arm_cond_list %type enum_declaration_statement enum_backing_type enum_case enum_case_expr +%type function_name %type returns_ref function fn is_reference is_variadic variable_modifiers %type method_modifiers non_empty_member_modifiers member_modifier @@ -560,8 +561,17 @@ unset_variable: variable { $$ = zend_ast_create(ZEND_AST_UNSET, $1); } ; +function_name: + T_STRING { $$ = $1; } + | T_READONLY { + zval zv; + if (zend_lex_tstring(&zv, $1) == FAILURE) { YYABORT; } + $$ = zend_ast_create_zval(&zv); + } +; + function_declaration_statement: - function returns_ref T_STRING backup_doc_comment '(' parameter_list ')' return_type + function returns_ref function_name backup_doc_comment '(' parameter_list ')' return_type backup_fn_flags '{' inner_statement_list '}' backup_fn_flags { $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2 | $13, $1, $4, zend_ast_get_str($3), $6, NULL, $11, $8, NULL); CG(extra_fn_flags) = $9; } @@ -1270,6 +1280,11 @@ lexical_var: function_call: name argument_list { $$ = zend_ast_create(ZEND_AST_CALL, $1, $2); } + | T_READONLY argument_list { + zval zv; + if (zend_lex_tstring(&zv, $1) == FAILURE) { YYABORT; } + $$ = zend_ast_create(ZEND_AST_CALL, zend_ast_create_zval(&zv), $2); + } | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list { $$ = zend_ast_create(ZEND_AST_STATIC_CALL, $1, $3, $4); } | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index a367c2acb82da..c73a50948d6bc 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -1729,12 +1729,6 @@ NEWLINE ("\r"|"\n"|"\r\n") RETURN_TOKEN_WITH_IDENT(T_READONLY); } -/* Don't treat "readonly(" as a keyword, to allow using it as a function name. */ -"readonly"[ \n\r\t]*"(" { - yyless(strlen("readonly")); - RETURN_TOKEN_WITH_STR(T_STRING, 0); -} - "unset" { RETURN_TOKEN_WITH_IDENT(T_UNSET); } From e9a0d21a067535c80a8776fe3d0f3caf54255d4f Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 11 Sep 2022 12:37:06 +0200 Subject: [PATCH 1242/1346] Mark gh9259_003.phpt as xfail with ASAN The tests reports memory leaks. --- ext/opcache/tests/gh9259_003.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/opcache/tests/gh9259_003.phpt b/ext/opcache/tests/gh9259_003.phpt index 91bfcad917b36..1666f93257ecf 100644 --- a/ext/opcache/tests/gh9259_003.phpt +++ b/ext/opcache/tests/gh9259_003.phpt @@ -2,6 +2,10 @@ Bug GH-9259 003 (Setting opcache.interned_strings_buffer to a very high value leads to corruption of shm) --EXTENSIONS-- opcache +--SKIPIF-- + --INI-- opcache.interned_strings_buffer=500 opcache.enable_cli=1 From f126769a29900bd7af7bf3f44cce0cf01fd93ba7 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sun, 11 Sep 2022 15:40:57 +0100 Subject: [PATCH 1243/1346] Fix bug GH-9517: Compilation error in openssl extension --- NEWS | 4 ++++ ext/openssl/openssl.c | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index a9d5110a41cc0..bccb69b29801f 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ PHP NEWS . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer overflow). (Arnaud) +- OpenSSL: + . Fixed bug GH-9517 (Compilation error openssl extension related to PR + GH-9366). (Jakub Zelenka) + - PDO_PGSQL: . Fixed bug GH-9411 (PgSQL large object resource is incorrectly closed). (Yurunsoft) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 6d10fef971988..a9253f6f45dde 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -7163,14 +7163,14 @@ static void php_openssl_load_cipher_mode(struct php_openssl_cipher_mode *mode, c /* Since OpenSSL 1.1, all AEAD ciphers use a common framework. We check for * EVP_CIPH_OCB_MODE, because LibreSSL does not support it. */ case EVP_CIPH_GCM_MODE: + case EVP_CIPH_CCM_MODE: # ifdef EVP_CIPH_OCB_MODE case EVP_CIPH_OCB_MODE: -# endif - case EVP_CIPH_CCM_MODE: - php_openssl_set_aead_flags(mode); /* For OCB mode, explicitly set the tag length even when decrypting, * see https://github.com/openssl/openssl/issues/8331. */ mode->set_tag_length_always = cipher_mode == EVP_CIPH_OCB_MODE; +# endif + php_openssl_set_aead_flags(mode); mode->set_tag_length_when_encrypting = cipher_mode == EVP_CIPH_CCM_MODE; mode->is_single_run_aead = cipher_mode == EVP_CIPH_CCM_MODE; break; From 5bfceae77074662c11ca8725b8f1d02512d4276d Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Sat, 10 Sep 2022 13:27:36 +0100 Subject: [PATCH 1244/1346] Only check classes in intersection type if the type might be valid Closes GH-9522 --- Zend/zend_execute.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 35f2f3c6151c3..15c356a3b4ebd 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1042,11 +1042,14 @@ static bool zend_check_intersection_type_from_cache_slot(zend_type_list *interse zend_type *list_type; bool status = true; ZEND_TYPE_LIST_FOREACH(intersection_type_list, list_type) { - ce = zend_fetch_ce_from_cache_slot(cache_slot, list_type); - /* If type is not an instance of one of the types taking part in the - * intersection it cannot be a valid instance of the whole intersection type. */ - if (!ce || !instanceof_function(arg_ce, ce)) { - status = false; + /* Only check classes if the type might be valid */ + if (status) { + ce = zend_fetch_ce_from_cache_slot(cache_slot, list_type); + /* If type is not an instance of one of the types taking part in the + * intersection it cannot be a valid instance of the whole intersection type. */ + if (!ce || !instanceof_function(arg_ce, ce)) { + status = false; + } } PROGRESS_CACHE_SLOT(); } ZEND_TYPE_LIST_FOREACH_END(); From 3675041d037472821019b23fa7cabdb3725719d7 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 13 Sep 2022 11:12:18 +0100 Subject: [PATCH 1245/1346] Update NEWS with DNF type check bug fix --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index bccb69b29801f..8acb03d643dce 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed bug GH-9500 (Using dnf type with parentheses after readonly keyword results in a parse error). (ilutov) + . Fixed bug GH-9516 ((A&B)|D as a param should allow AB or D. Not just A). + (Girgias) - Opcache: . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer From 0b8ad94b91baf9b5c5482bf9f2e4219dc7e1064d Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 13 Sep 2022 13:03:48 +0100 Subject: [PATCH 1246/1346] Refactor _xml_add_to_info() Mark char* as const, and compute it's length once to save an expensive strlen() call --- ext/xml/xml.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 5d981c5326189..e0b95a03d896d 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -156,7 +156,7 @@ inline static char xml_decode_us_ascii(unsigned short); static void xml_call_handler(xml_parser *, zval *, zend_function *, int, zval *, zval *); static void _xml_xmlchar_zval(const XML_Char *, int, const XML_Char *, zval *); static int _xml_xmlcharlen(const XML_Char *); -static void _xml_add_to_info(xml_parser *parser,char *name); +static void _xml_add_to_info(xml_parser *parser, const char *name); inline static zend_string *_xml_decode_tag(xml_parser *parser, const char *tag); void _xml_startElementHandler(void *, const XML_Char *, const XML_Char **); @@ -548,7 +548,7 @@ static int _xml_xmlcharlen(const XML_Char *s) /* }}} */ /* {{{ _xml_add_to_info() */ -static void _xml_add_to_info(xml_parser *parser,char *name) +static void _xml_add_to_info(xml_parser *parser, const char *name) { zval *element; @@ -556,10 +556,11 @@ static void _xml_add_to_info(xml_parser *parser,char *name) return; } - if ((element = zend_hash_str_find(Z_ARRVAL(parser->info), name, strlen(name))) == NULL) { + size_t name_len = strlen(name); + if ((element = zend_hash_str_find(Z_ARRVAL(parser->info), name, name_len)) == NULL) { zval values; array_init(&values); - element = zend_hash_str_update(Z_ARRVAL(parser->info), name, strlen(name), &values); + element = zend_hash_str_update(Z_ARRVAL(parser->info), name, name_len, &values); } add_next_index_long(element, parser->curtag); From 6aef13402e001954f8c44c118e934780e071f13f Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 13 Sep 2022 13:14:15 +0100 Subject: [PATCH 1247/1346] Mark _xml_decode_tag() as taking a const XML_Char* As this is always the case and this removes unnecessary pointer casts --- ext/xml/xml.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/xml/xml.c b/ext/xml/xml.c index e0b95a03d896d..afd7f7f51f85e 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -157,7 +157,7 @@ static void xml_call_handler(xml_parser *, zval *, zend_function *, int, zval *, static void _xml_xmlchar_zval(const XML_Char *, int, const XML_Char *, zval *); static int _xml_xmlcharlen(const XML_Char *); static void _xml_add_to_info(xml_parser *parser, const char *name); -inline static zend_string *_xml_decode_tag(xml_parser *parser, const char *tag); +inline static zend_string *_xml_decode_tag(xml_parser *parser, const XML_Char *tag); void _xml_startElementHandler(void *, const XML_Char *, const XML_Char **); void _xml_endElementHandler(void *, const XML_Char *); @@ -570,11 +570,11 @@ static void _xml_add_to_info(xml_parser *parser, const char *name) /* }}} */ /* {{{ _xml_decode_tag() */ -static zend_string *_xml_decode_tag(xml_parser *parser, const char *tag) +static zend_string *_xml_decode_tag(xml_parser *parser, const XML_Char *tag) { zend_string *str; - str = xml_utf8_decode((const XML_Char *)tag, strlen(tag), parser->target_encoding); + str = xml_utf8_decode(tag, _xml_xmlcharlen(tag), parser->target_encoding); if (parser->case_folding) { zend_str_toupper(ZSTR_VAL(str), ZSTR_LEN(str)); @@ -595,7 +595,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch if (parser) { parser->level++; - tag_name = _xml_decode_tag(parser, (const char *)name); + tag_name = _xml_decode_tag(parser, name); if (!Z_ISUNDEF(parser->startElementHandler)) { ZVAL_COPY(&args[0], &parser->index); @@ -605,7 +605,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch while (attributes && *attributes) { zval tmp; - att = _xml_decode_tag(parser, (const char *)attributes[0]); + att = _xml_decode_tag(parser, attributes[0]); val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); ZVAL_STR(&tmp, val); @@ -642,7 +642,7 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch while (attributes && *attributes) { zval tmp; - att = _xml_decode_tag(parser, (const char *)attributes[0]); + att = _xml_decode_tag(parser, attributes[0]); val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); ZVAL_STR(&tmp, val); @@ -679,7 +679,7 @@ void _xml_endElementHandler(void *userData, const XML_Char *name) if (parser) { zval retval, args[2]; - zend_string *tag_name = _xml_decode_tag(parser, (const char *)name); + zend_string *tag_name = _xml_decode_tag(parser, name); if (!Z_ISUNDEF(parser->endElementHandler)) { ZVAL_COPY(&args[0], &parser->index); From 951bd74038ceb7ff2c33348794f9f6941c132741 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 13 Sep 2022 13:54:36 +0100 Subject: [PATCH 1248/1346] Do early returns in xml.c This reduces nesting clarying what preconditions are needed in each of the handler functions --- ext/xml/xml.c | 482 +++++++++++++++++++++++++------------------------- 1 file changed, 243 insertions(+), 239 deletions(-) diff --git a/ext/xml/xml.c b/ext/xml/xml.c index afd7f7f51f85e..0fd239baf5b80 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -592,82 +592,84 @@ void _xml_startElementHandler(void *userData, const XML_Char *name, const XML_Ch zend_string *att, *tag_name, *val; zval retval, args[3]; - if (parser) { - parser->level++; + if (!parser) { + return; + } - tag_name = _xml_decode_tag(parser, name); + parser->level++; - if (!Z_ISUNDEF(parser->startElementHandler)) { - ZVAL_COPY(&args[0], &parser->index); - ZVAL_STRING(&args[1], SKIP_TAGSTART(ZSTR_VAL(tag_name))); - array_init(&args[2]); + tag_name = _xml_decode_tag(parser, name); - while (attributes && *attributes) { - zval tmp; + if (!Z_ISUNDEF(parser->startElementHandler)) { + ZVAL_COPY(&args[0], &parser->index); + ZVAL_STRING(&args[1], SKIP_TAGSTART(ZSTR_VAL(tag_name))); + array_init(&args[2]); - att = _xml_decode_tag(parser, attributes[0]); - val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); + while (attributes && *attributes) { + zval tmp; - ZVAL_STR(&tmp, val); - zend_symtable_update(Z_ARRVAL(args[2]), att, &tmp); + att = _xml_decode_tag(parser, attributes[0]); + val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); - attributes += 2; + ZVAL_STR(&tmp, val); + zend_symtable_update(Z_ARRVAL(args[2]), att, &tmp); - zend_string_release_ex(att, 0); - } + attributes += 2; - xml_call_handler(parser, &parser->startElementHandler, parser->startElementPtr, 3, args, &retval); - zval_ptr_dtor(&retval); + zend_string_release_ex(att, 0); } - if (!Z_ISUNDEF(parser->data)) { - if (parser->level <= XML_MAXLEVEL) { - zval tag, atr; - int atcnt = 0; + xml_call_handler(parser, &parser->startElementHandler, parser->startElementPtr, 3, args, &retval); + zval_ptr_dtor(&retval); + } - array_init(&tag); - array_init(&atr); + if (!Z_ISUNDEF(parser->data)) { + if (parser->level <= XML_MAXLEVEL) { + zval tag, atr; + int atcnt = 0; - _xml_add_to_info(parser, ZSTR_VAL(tag_name) + parser->toffset); + array_init(&tag); + array_init(&atr); - add_assoc_string(&tag, "tag", SKIP_TAGSTART(ZSTR_VAL(tag_name))); /* cast to avoid gcc-warning */ - add_assoc_string(&tag, "type", "open"); - add_assoc_long(&tag, "level", parser->level); + _xml_add_to_info(parser, ZSTR_VAL(tag_name) + parser->toffset); - parser->ltags[parser->level-1] = estrdup(ZSTR_VAL(tag_name)); - parser->lastwasopen = 1; + add_assoc_string(&tag, "tag", SKIP_TAGSTART(ZSTR_VAL(tag_name))); /* cast to avoid gcc-warning */ + add_assoc_string(&tag, "type", "open"); + add_assoc_long(&tag, "level", parser->level); - attributes = (const XML_Char **) attrs; + parser->ltags[parser->level-1] = estrdup(ZSTR_VAL(tag_name)); + parser->lastwasopen = 1; - while (attributes && *attributes) { - zval tmp; + attributes = (const XML_Char **) attrs; - att = _xml_decode_tag(parser, attributes[0]); - val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); + while (attributes && *attributes) { + zval tmp; - ZVAL_STR(&tmp, val); - zend_symtable_update(Z_ARRVAL(atr), att, &tmp); + att = _xml_decode_tag(parser, attributes[0]); + val = xml_utf8_decode(attributes[1], strlen((char *)attributes[1]), parser->target_encoding); - atcnt++; - attributes += 2; + ZVAL_STR(&tmp, val); + zend_symtable_update(Z_ARRVAL(atr), att, &tmp); - zend_string_release_ex(att, 0); - } + atcnt++; + attributes += 2; - if (atcnt) { - zend_hash_str_add(Z_ARRVAL(tag), "attributes", sizeof("attributes") - 1, &atr); - } else { - zval_ptr_dtor(&atr); - } + zend_string_release_ex(att, 0); + } - parser->ctag = zend_hash_next_index_insert(Z_ARRVAL(parser->data), &tag); - } else if (parser->level == (XML_MAXLEVEL + 1)) { - php_error_docref(NULL, E_WARNING, "Maximum depth exceeded - Results truncated"); + if (atcnt) { + zend_hash_str_add(Z_ARRVAL(tag), "attributes", sizeof("attributes") - 1, &atr); + } else { + zval_ptr_dtor(&atr); } - } - zend_string_release_ex(tag_name, 0); + parser->ctag = zend_hash_next_index_insert(Z_ARRVAL(parser->data), &tag); + } else if (parser->level == (XML_MAXLEVEL + 1)) { + php_error_docref(NULL, E_WARNING, "Maximum depth exceeded - Results truncated"); + } } + + zend_string_release_ex(tag_name, 0); } /* }}} */ @@ -676,47 +678,49 @@ void _xml_endElementHandler(void *userData, const XML_Char *name) { xml_parser *parser = (xml_parser *)userData; - if (parser) { - zval retval, args[2]; + if (!parser) { + return; + } - zend_string *tag_name = _xml_decode_tag(parser, name); + zval retval, args[2]; - if (!Z_ISUNDEF(parser->endElementHandler)) { - ZVAL_COPY(&args[0], &parser->index); - ZVAL_STRING(&args[1], SKIP_TAGSTART(ZSTR_VAL(tag_name))); + zend_string *tag_name = _xml_decode_tag(parser, name); - xml_call_handler(parser, &parser->endElementHandler, parser->endElementPtr, 2, args, &retval); - zval_ptr_dtor(&retval); - } + if (!Z_ISUNDEF(parser->endElementHandler)) { + ZVAL_COPY(&args[0], &parser->index); + ZVAL_STRING(&args[1], SKIP_TAGSTART(ZSTR_VAL(tag_name))); - if (!Z_ISUNDEF(parser->data)) { - zval tag; + xml_call_handler(parser, &parser->endElementHandler, parser->endElementPtr, 2, args, &retval); + zval_ptr_dtor(&retval); + } - if (parser->lastwasopen) { - add_assoc_string(parser->ctag, "type", "complete"); - } else { - array_init(&tag); + if (!Z_ISUNDEF(parser->data)) { + zval tag; - _xml_add_to_info(parser, ZSTR_VAL(tag_name) + parser->toffset); + if (parser->lastwasopen) { + add_assoc_string(parser->ctag, "type", "complete"); + } else { + array_init(&tag); - add_assoc_string(&tag, "tag", SKIP_TAGSTART(ZSTR_VAL(tag_name))); /* cast to avoid gcc-warning */ - add_assoc_string(&tag, "type", "close"); - add_assoc_long(&tag, "level", parser->level); + _xml_add_to_info(parser, ZSTR_VAL(tag_name) + parser->toffset); - zend_hash_next_index_insert(Z_ARRVAL(parser->data), &tag); - } + add_assoc_string(&tag, "tag", SKIP_TAGSTART(ZSTR_VAL(tag_name))); /* cast to avoid gcc-warning */ + add_assoc_string(&tag, "type", "close"); + add_assoc_long(&tag, "level", parser->level); - parser->lastwasopen = 0; + zend_hash_next_index_insert(Z_ARRVAL(parser->data), &tag); } - zend_string_release_ex(tag_name, 0); + parser->lastwasopen = 0; + } - if ((parser->ltags) && (parser->level <= XML_MAXLEVEL)) { - efree(parser->ltags[parser->level-1]); - } + zend_string_release_ex(tag_name, 0); - parser->level--; + if ((parser->ltags) && (parser->level <= XML_MAXLEVEL)) { + efree(parser->ltags[parser->level-1]); } + + parser->level--; } /* }}} */ @@ -725,94 +729,88 @@ void _xml_characterDataHandler(void *userData, const XML_Char *s, int len) { xml_parser *parser = (xml_parser *)userData; - if (parser) { - zval retval, args[2]; + if (!parser) { + return; + } - if (!Z_ISUNDEF(parser->characterDataHandler)) { - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]); - xml_call_handler(parser, &parser->characterDataHandler, parser->characterDataPtr, 2, args, &retval); - zval_ptr_dtor(&retval); - } + zval retval, args[2]; - if (!Z_ISUNDEF(parser->data)) { - size_t i; - int doprint = 0; - zend_string *decoded_value; - - decoded_value = xml_utf8_decode(s, len, parser->target_encoding); - if (parser->skipwhite) { - for (i = 0; i < ZSTR_LEN(decoded_value); i++) { - switch (ZSTR_VAL(decoded_value)[i]) { - case ' ': - case '\t': - case '\n': - continue; - default: - doprint = 1; - break; - } - if (doprint) { - break; - } - } - } + if (!Z_ISUNDEF(parser->characterDataHandler)) { + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]); + xml_call_handler(parser, &parser->characterDataHandler, parser->characterDataPtr, 2, args, &retval); + zval_ptr_dtor(&retval); + } - if (parser->lastwasopen) { - zval *myval; - - /* check if the current tag already has a value - if yes append to that! */ - if ((myval = zend_hash_str_find(Z_ARRVAL_P(parser->ctag), "value", sizeof("value") - 1))) { - size_t newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value); - Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0); - strncpy(Z_STRVAL_P(myval) + Z_STRLEN_P(myval) - ZSTR_LEN(decoded_value), - ZSTR_VAL(decoded_value), ZSTR_LEN(decoded_value) + 1); - zend_string_release_ex(decoded_value, 0); - } else { - if (doprint || (! parser->skipwhite)) { - add_assoc_str(parser->ctag, "value", decoded_value); - } else { - zend_string_release_ex(decoded_value, 0); - } - } + if (Z_ISUNDEF(parser->data)) { + return; + } + bool doprint = 0; + zend_string *decoded_value; + decoded_value = xml_utf8_decode(s, len, parser->target_encoding); + if (parser->skipwhite) { + for (size_t i = 0; i < ZSTR_LEN(decoded_value); i++) { + switch (ZSTR_VAL(decoded_value)[i]) { + case ' ': + case '\t': + case '\n': + continue; + default: + doprint = 1; + break; + } + if (doprint) { + break; + } + } + } + if (parser->lastwasopen) { + zval *myval; + /* check if the current tag already has a value - if yes append to that! */ + if ((myval = zend_hash_str_find(Z_ARRVAL_P(parser->ctag), "value", sizeof("value") - 1))) { + size_t newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value); + Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0); + strncpy(Z_STRVAL_P(myval) + Z_STRLEN_P(myval) - ZSTR_LEN(decoded_value), + ZSTR_VAL(decoded_value), ZSTR_LEN(decoded_value) + 1); + zend_string_release_ex(decoded_value, 0); + } else { + if (doprint || (! parser->skipwhite)) { + add_assoc_str(parser->ctag, "value", decoded_value); } else { - zval tag; - zval *curtag, *mytype, *myval; - - ZEND_HASH_REVERSE_FOREACH_VAL(Z_ARRVAL(parser->data), curtag) { - if ((mytype = zend_hash_str_find(Z_ARRVAL_P(curtag),"type", sizeof("type") - 1))) { - if (zend_string_equals_literal(Z_STR_P(mytype), "cdata")) { - if ((myval = zend_hash_str_find(Z_ARRVAL_P(curtag), "value", sizeof("value") - 1))) { - size_t newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value); - Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0); - strncpy(Z_STRVAL_P(myval) + Z_STRLEN_P(myval) - ZSTR_LEN(decoded_value), - ZSTR_VAL(decoded_value), ZSTR_LEN(decoded_value) + 1); - zend_string_release_ex(decoded_value, 0); - return; - } - } + zend_string_release_ex(decoded_value, 0); + } + } + } else { + zval tag; + zval *curtag, *mytype, *myval; + ZEND_HASH_REVERSE_FOREACH_VAL(Z_ARRVAL(parser->data), curtag) { + if ((mytype = zend_hash_str_find(Z_ARRVAL_P(curtag),"type", sizeof("type") - 1))) { + if (zend_string_equals_literal(Z_STR_P(mytype), "cdata")) { + if ((myval = zend_hash_str_find(Z_ARRVAL_P(curtag), "value", sizeof("value") - 1))) { + size_t newlen = Z_STRLEN_P(myval) + ZSTR_LEN(decoded_value); + Z_STR_P(myval) = zend_string_extend(Z_STR_P(myval), newlen, 0); + strncpy(Z_STRVAL_P(myval) + Z_STRLEN_P(myval) - ZSTR_LEN(decoded_value), + ZSTR_VAL(decoded_value), ZSTR_LEN(decoded_value) + 1); + zend_string_release_ex(decoded_value, 0); + return; } - break; - } ZEND_HASH_FOREACH_END(); - - if (parser->level <= XML_MAXLEVEL && parser->level > 0 && (doprint || (! parser->skipwhite))) { - array_init(&tag); - - _xml_add_to_info(parser,SKIP_TAGSTART(parser->ltags[parser->level-1])); - - add_assoc_string(&tag, "tag", SKIP_TAGSTART(parser->ltags[parser->level-1])); - add_assoc_str(&tag, "value", decoded_value); - add_assoc_string(&tag, "type", "cdata"); - add_assoc_long(&tag, "level", parser->level); - - zend_hash_next_index_insert(Z_ARRVAL(parser->data), &tag); - } else if (parser->level == (XML_MAXLEVEL + 1)) { - php_error_docref(NULL, E_WARNING, "Maximum depth exceeded - Results truncated"); - } else { - zend_string_release_ex(decoded_value, 0); } } + break; + } ZEND_HASH_FOREACH_END(); + if (parser->level <= XML_MAXLEVEL && parser->level > 0 && (doprint || (! parser->skipwhite))) { + array_init(&tag); + _xml_add_to_info(parser,SKIP_TAGSTART(parser->ltags[parser->level-1])); + add_assoc_string(&tag, "tag", SKIP_TAGSTART(parser->ltags[parser->level-1])); + add_assoc_str(&tag, "value", decoded_value); + add_assoc_string(&tag, "type", "cdata"); + add_assoc_long(&tag, "level", parser->level); + zend_hash_next_index_insert(Z_ARRVAL(parser->data), &tag); + } else if (parser->level == (XML_MAXLEVEL + 1)) { + php_error_docref(NULL, E_WARNING, "Maximum depth exceeded - Results truncated"); + } else { + zend_string_release_ex(decoded_value, 0); } } } @@ -823,15 +821,17 @@ void _xml_processingInstructionHandler(void *userData, const XML_Char *target, c { xml_parser *parser = (xml_parser *)userData; - if (parser && !Z_ISUNDEF(parser->processingInstructionHandler)) { - zval retval, args[3]; - - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(target, 0, parser->target_encoding, &args[1]); - _xml_xmlchar_zval(data, 0, parser->target_encoding, &args[2]); - xml_call_handler(parser, &parser->processingInstructionHandler, parser->processingInstructionPtr, 3, args, &retval); - zval_ptr_dtor(&retval); + if (!parser || Z_ISUNDEF(parser->processingInstructionHandler)) { + return; } + + zval retval, args[3]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(target, 0, parser->target_encoding, &args[1]); + _xml_xmlchar_zval(data, 0, parser->target_encoding, &args[2]); + xml_call_handler(parser, &parser->processingInstructionHandler, parser->processingInstructionPtr, 3, args, &retval); + zval_ptr_dtor(&retval); } /* }}} */ @@ -840,91 +840,91 @@ void _xml_defaultHandler(void *userData, const XML_Char *s, int len) { xml_parser *parser = (xml_parser *)userData; - if (parser && !Z_ISUNDEF(parser->defaultHandler)) { - zval retval, args[2]; - - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]); - xml_call_handler(parser, &parser->defaultHandler, parser->defaultPtr, 2, args, &retval); - zval_ptr_dtor(&retval); + if (!parser || Z_ISUNDEF(parser->defaultHandler)) { + return; } + + zval retval, args[2]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(s, len, parser->target_encoding, &args[1]); + xml_call_handler(parser, &parser->defaultHandler, parser->defaultPtr, 2, args, &retval); + zval_ptr_dtor(&retval); } /* }}} */ /* {{{ _xml_unparsedEntityDeclHandler() */ void _xml_unparsedEntityDeclHandler(void *userData, - const XML_Char *entityName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId, - const XML_Char *notationName) + const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, + const XML_Char *publicId, const XML_Char *notationName) { xml_parser *parser = (xml_parser *)userData; - if (parser && !Z_ISUNDEF(parser->unparsedEntityDeclHandler)) { - zval retval, args[6]; - - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(entityName, 0, parser->target_encoding, &args[1]); - _xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]); - _xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]); - _xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]); - _xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[5]); - xml_call_handler(parser, &parser->unparsedEntityDeclHandler, parser->unparsedEntityDeclPtr, 6, args, &retval); - zval_ptr_dtor(&retval); + if (!parser || Z_ISUNDEF(parser->unparsedEntityDeclHandler)) { + return; } + + zval retval, args[6]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(entityName, 0, parser->target_encoding, &args[1]); + _xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]); + _xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]); + _xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]); + _xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[5]); + xml_call_handler(parser, &parser->unparsedEntityDeclHandler, parser->unparsedEntityDeclPtr, 6, args, &retval); + zval_ptr_dtor(&retval); } /* }}} */ /* {{{ _xml_notationDeclHandler() */ -void _xml_notationDeclHandler(void *userData, - const XML_Char *notationName, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) +void _xml_notationDeclHandler(void *userData, const XML_Char *notationName, + const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { xml_parser *parser = (xml_parser *)userData; - if (parser && !Z_ISUNDEF(parser->notationDeclHandler)) { - zval retval, args[5]; - - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[1]); - _xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]); - _xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]); - _xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]); - xml_call_handler(parser, &parser->notationDeclHandler, parser->notationDeclPtr, 5, args, &retval); - zval_ptr_dtor(&retval); + if (!parser || Z_ISUNDEF(parser->notationDeclHandler)) { + return; } + + zval retval, args[5]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(notationName, 0, parser->target_encoding, &args[1]); + _xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]); + _xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]); + _xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]); + xml_call_handler(parser, &parser->notationDeclHandler, parser->notationDeclPtr, 5, args, &retval); + zval_ptr_dtor(&retval); } /* }}} */ /* {{{ _xml_externalEntityRefHandler() */ -int _xml_externalEntityRefHandler(XML_Parser parserPtr, - const XML_Char *openEntityNames, - const XML_Char *base, - const XML_Char *systemId, - const XML_Char *publicId) +int _xml_externalEntityRefHandler(XML_Parser parserPtr, const XML_Char *openEntityNames, + const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId) { xml_parser *parser = XML_GetUserData(parserPtr); - int ret = 0; /* abort if no handler is set (should be configurable?) */ - if (parser && !Z_ISUNDEF(parser->externalEntityRefHandler)) { - zval retval, args[5]; + if (!parser || Z_ISUNDEF(parser->externalEntityRefHandler)) { + return 0; + } - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(openEntityNames, 0, parser->target_encoding, &args[1]); - _xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]); - _xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]); - _xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]); - xml_call_handler(parser, &parser->externalEntityRefHandler, parser->externalEntityRefPtr, 5, args, &retval); - if (!Z_ISUNDEF(retval)) { - convert_to_long(&retval); - ret = Z_LVAL(retval); - } else { - ret = 0; - } + int ret = 0; /* abort if no handler is set (should be configurable?) */ + zval retval, args[5]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(openEntityNames, 0, parser->target_encoding, &args[1]); + _xml_xmlchar_zval(base, 0, parser->target_encoding, &args[2]); + _xml_xmlchar_zval(systemId, 0, parser->target_encoding, &args[3]); + _xml_xmlchar_zval(publicId, 0, parser->target_encoding, &args[4]); + xml_call_handler(parser, &parser->externalEntityRefHandler, parser->externalEntityRefPtr, 5, args, &retval); + if (!Z_ISUNDEF(retval)) { + convert_to_long(&retval); + ret = Z_LVAL(retval); + } else { + ret = 0; } + return ret; } /* }}} */ @@ -934,15 +934,17 @@ void _xml_startNamespaceDeclHandler(void *userData,const XML_Char *prefix, const { xml_parser *parser = (xml_parser *)userData; - if (parser && !Z_ISUNDEF(parser->startNamespaceDeclHandler)) { - zval retval, args[3]; - - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]); - _xml_xmlchar_zval(uri, 0, parser->target_encoding, &args[2]); - xml_call_handler(parser, &parser->startNamespaceDeclHandler, parser->startNamespaceDeclPtr, 3, args, &retval); - zval_ptr_dtor(&retval); + if (!parser || Z_ISUNDEF(parser->startNamespaceDeclHandler)) { + return; } + + zval retval, args[3]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]); + _xml_xmlchar_zval(uri, 0, parser->target_encoding, &args[2]); + xml_call_handler(parser, &parser->startNamespaceDeclHandler, parser->startNamespaceDeclPtr, 3, args, &retval); + zval_ptr_dtor(&retval); } /* }}} */ @@ -951,14 +953,16 @@ void _xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix) { xml_parser *parser = (xml_parser *)userData; - if (parser && !Z_ISUNDEF(parser->endNamespaceDeclHandler)) { - zval retval, args[2]; - - ZVAL_COPY(&args[0], &parser->index); - _xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]); - xml_call_handler(parser, &parser->endNamespaceDeclHandler, parser->endNamespaceDeclPtr, 2, args, &retval); - zval_ptr_dtor(&retval); + if (!parser || Z_ISUNDEF(parser->endNamespaceDeclHandler)) { + return; } + + zval retval, args[2]; + + ZVAL_COPY(&args[0], &parser->index); + _xml_xmlchar_zval(prefix, 0, parser->target_encoding, &args[1]); + xml_call_handler(parser, &parser->endNamespaceDeclHandler, parser->endNamespaceDeclPtr, 2, args, &retval); + zval_ptr_dtor(&retval); } /* }}} */ From 450d28d315bf820c96f6faa0cd97e70d175a88ef Mon Sep 17 00:00:00 2001 From: Sergey Panteleev Date: Tue, 13 Sep 2022 18:25:42 +0300 Subject: [PATCH 1249/1346] [ci skip] Update NEWS for PHP 8.2.0RC3 --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 921114196d1bc..0469f51c61bbd 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.2.0RC2 +?? ??? ????, PHP 8.2.0RC3 + + +15 Sep 2022, PHP 8.2.0RC2 - Core: . Fixed bug GH-9500 (Using dnf type with parentheses after readonly keyword From a01dd9fedaecd2e5b95bc5c2e8d6542116addeae Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 14 Sep 2022 11:12:19 +0200 Subject: [PATCH 1250/1346] Revert "Port all internally used classes to use default_object_handlers" This reverts commit 94ee4f9834743ca74f6c9653863273277ce6c61a. The commit was a bit too late to be included in PHP 8.2 RC1. Given it's a massive ABI break, we decide to postpone the change to PHP 8.3. --- Zend/zend_inheritance.c | 1 - Zend/zend_iterators.c | 2 +- ext/com_dotnet/com_extension.c | 4 ---- ext/com_dotnet/com_handlers.c | 1 + ext/com_dotnet/com_misc.c | 2 ++ ext/com_dotnet/com_persist.c | 2 +- ext/com_dotnet/com_saproxy.c | 1 + ext/com_dotnet/php_com_dotnet_internal.h | 1 - ext/curl/interface.c | 2 +- ext/curl/multi.c | 6 ++--- ext/curl/share.c | 6 ++--- ext/date/php_date.c | 10 ++++----- ext/dom/php_dom.c | 4 ++-- ext/enchant/enchant.c | 4 ++-- ext/ffi/ffi.c | 9 ++++---- ext/fileinfo/fileinfo.c | 2 +- ext/gd/gd.c | 2 +- ext/gmp/gmp.c | 2 +- .../breakiterator/breakiterator_class.cpp | 3 ++- ext/intl/calendar/calendar_class.cpp | 4 +++- ext/intl/collator/collator_class.c | 3 ++- ext/intl/common/common_enum.cpp | 3 ++- ext/intl/converter/converter.c | 2 +- ext/intl/dateformat/dateformat_class.c | 3 ++- .../dateformat/datepatterngenerator_class.cpp | 3 ++- ext/intl/formatter/formatter_class.c | 3 ++- ext/intl/msgformat/msgformat_class.c | 3 ++- .../resourcebundle/resourcebundle_class.c | 3 ++- ext/intl/spoofchecker/spoofchecker_class.c | 3 ++- ext/intl/timezone/timezone_class.cpp | 3 ++- .../transliterator/transliterator_class.c | 3 ++- ext/ldap/ldap.c | 6 ++--- ext/openssl/openssl.c | 6 ++--- ext/pdo/pdo_dbh.c | 3 ++- ext/pdo/pdo_stmt.c | 6 +++-- ext/pgsql/pgsql.c | 6 ++--- ext/random/random.c | 3 ++- ext/reflection/php_reflection.c | 22 +------------------ ext/shmop/shmop.c | 2 +- ext/simplexml/simplexml.c | 2 +- ext/snmp/snmp.c | 3 ++- ext/soap/soap.c | 2 +- ext/sockets/sockets.c | 4 ++-- ext/spl/spl_directory.c | 19 +++++++++++----- ext/spl/spl_iterators.c | 4 ++-- ext/spl/spl_observer.c | 4 ++-- ext/sqlite3/sqlite3.c | 9 +++++--- ext/sysvmsg/sysvmsg.c | 2 +- ext/sysvsem/sysvsem.c | 2 +- ext/sysvshm/sysvshm.c | 2 +- ext/xml/xml.c | 2 +- ext/xmlreader/php_xmlreader.c | 2 +- ext/xmlwriter/php_xmlwriter.c | 2 +- ext/xsl/php_xsl.c | 2 +- ext/zend_test/fiber.c | 2 +- ext/zip/php_zip.c | 2 +- ext/zlib/zlib.c | 4 ++-- 57 files changed, 115 insertions(+), 108 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 0dbdaa2b35ec4..3eaaca3409a78 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1472,7 +1472,6 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par zend_string_release_ex(ce->parent_name, 0); } ce->parent = parent_ce; - ce->default_object_handlers = parent_ce->default_object_handlers; ce->ce_flags |= ZEND_ACC_RESOLVED_PARENT; /* Inherit properties */ diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index f67033b11161c..aa4391f2caa99 100644 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -57,7 +57,6 @@ static const zend_object_handlers iterator_object_handlers = { ZEND_API void zend_register_iterator_wrapper(void) { INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL); - zend_iterator_class_entry.default_object_handlers = &iterator_object_handlers; } static void iter_wrapper_free(zend_object *object) @@ -84,6 +83,7 @@ static HashTable *iter_wrapper_get_gc(zend_object *object, zval **table, int *n) ZEND_API void zend_iterator_init(zend_object_iterator *iter) { zend_object_std_init(&iter->std, &zend_iterator_class_entry); + iter->std.handlers = &iterator_object_handlers; } ZEND_API void zend_iterator_dtor(zend_object_iterator *iter) diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c index fcf9b3bd95ced..95361a4b9a9ed 100644 --- a/ext/com_dotnet/com_extension.c +++ b/ext/com_dotnet/com_extension.c @@ -184,22 +184,18 @@ 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->default_object_handlers = &php_com_saproxy_handlers; php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get; php_com_variant_class_entry = register_class_variant(); - php_com_variant_class_entry->default_object_handlers = &php_com_object_handlers; php_com_variant_class_entry->create_object = php_com_object_new; php_com_variant_class_entry->get_iterator = php_com_iter_get; tmp = register_class_com(php_com_variant_class_entry); - tmp->default_object_handlers = &php_com_object_handlers; tmp->create_object = php_com_object_new; tmp->get_iterator = php_com_iter_get; #if HAVE_MSCOREE_H tmp = register_class_dotnet(php_com_variant_class_entry); - tmp->default_object_handlers = &php_com_object_handlers; tmp->create_object = php_com_object_new; tmp->get_iterator = php_com_iter_get; #endif diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 0c73d8c4a3a72..db96118ea31c6 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -627,6 +627,7 @@ zend_object* php_com_object_new(zend_class_entry *ce) obj->ce = ce; zend_object_std_init(&obj->zo, ce); + obj->zo.handlers = &php_com_object_handlers; obj->typeinfo = NULL; diff --git a/ext/com_dotnet/com_misc.c b/ext/com_dotnet/com_misc.c index 39d245b7d01a7..b2920ddba62c2 100644 --- a/ext/com_dotnet/com_misc.c +++ b/ext/com_dotnet/com_misc.c @@ -61,6 +61,7 @@ PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp, IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo); zend_object_std_init(&obj->zo, php_com_variant_class_entry); + obj->zo.handlers = &php_com_object_handlers; ZVAL_OBJ(z, &obj->zo); } @@ -84,6 +85,7 @@ PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v, } zend_object_std_init(&obj->zo, php_com_variant_class_entry); + obj->zo.handlers = &php_com_object_handlers; ZVAL_OBJ(z, &obj->zo); } diff --git a/ext/com_dotnet/com_persist.c b/ext/com_dotnet/com_persist.c index ececdd87aaba8..ec5271c908c6b 100644 --- a/ext/com_dotnet/com_persist.c +++ b/ext/com_dotnet/com_persist.c @@ -709,6 +709,7 @@ static zend_object* helper_new(zend_class_entry *ce) memset(helper, 0, sizeof(*helper)); zend_object_std_init(&helper->std, helper_ce); + helper->std.handlers = &helper_handlers; return &helper->std; } @@ -721,7 +722,6 @@ void php_com_persist_minit(INIT_FUNC_ARGS) helper_ce = register_class_COMPersistHelper(); helper_ce->create_object = helper_new; - helper_ce->default_object_handlers = &helper_handlers; le_istream = zend_register_list_destructors_ex(istream_dtor, NULL, "com_dotnet_istream_wrapper", module_number); diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index c99a622070ec2..6ad4680c0fe65 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -440,6 +440,7 @@ void php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *inde ZVAL_DUP(&proxy->indices[proxy->dimensions-1], index); zend_object_std_init(&proxy->std, php_com_saproxy_class_entry); + proxy->std.handlers = &php_com_saproxy_handlers; ZVAL_OBJ(proxy_out, &proxy->std); } diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h index 18982e56ccfa0..d09db6a13bc82 100644 --- a/ext/com_dotnet/php_com_dotnet_internal.h +++ b/ext/com_dotnet/php_com_dotnet_internal.h @@ -78,7 +78,6 @@ void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable); /* com_saproxy.c */ 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; /* com_olechar.c */ PHP_COM_DOTNET_API zend_string *php_com_olestring_to_string(OLECHAR *olestring, int codepage); diff --git a/ext/curl/interface.c b/ext/curl/interface.c index e1da59a6c16da..66f19f0def72a 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -398,7 +398,6 @@ PHP_MINIT_FUNCTION(curl) curl_ce = register_class_CurlHandle(); curl_ce->create_object = curl_create_object; - curl_ce->default_object_handlers = &curl_object_handlers; memcpy(&curl_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_object_handlers.offset = XtOffsetOf(php_curl, std); @@ -427,6 +426,7 @@ static zend_object *curl_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &curl_object_handlers; return &intern->std; } diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 4998a2ffa365b..fb8f08ccdbaa4 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -512,11 +512,14 @@ PHP_FUNCTION(curl_multi_setopt) /* CurlMultiHandle class */ +static zend_object_handlers curl_multi_handlers; + static zend_object *curl_multi_create_object(zend_class_entry *class_type) { php_curlm *intern = zend_object_alloc(sizeof(php_curlm), class_type); zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &curl_multi_handlers; return &intern->std; } @@ -579,11 +582,8 @@ static HashTable *curl_multi_get_gc(zend_object *object, zval **table, int *n) return zend_std_get_properties(object); } -static zend_object_handlers curl_multi_handlers; - void curl_multi_register_handlers(void) { curl_multi_ce->create_object = curl_multi_create_object; - curl_multi_ce->default_object_handlers = &curl_multi_handlers; memcpy(&curl_multi_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_multi_handlers.offset = XtOffsetOf(php_curlm, std); diff --git a/ext/curl/share.c b/ext/curl/share.c index f30790250e0ca..7f65cb4a27a94 100644 --- a/ext/curl/share.c +++ b/ext/curl/share.c @@ -136,11 +136,14 @@ PHP_FUNCTION(curl_share_strerror) /* CurlShareHandle class */ +static zend_object_handlers curl_share_handlers; + static zend_object *curl_share_create_object(zend_class_entry *class_type) { php_curlsh *intern = zend_object_alloc(sizeof(php_curlsh), class_type); zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &curl_share_handlers; return &intern->std; } @@ -158,11 +161,8 @@ void curl_share_free_obj(zend_object *object) zend_object_std_dtor(&sh->std); } -static zend_object_handlers curl_share_handlers; - void curl_share_register_handlers(void) { curl_share_ce->create_object = curl_share_create_object; - curl_share_ce->default_object_handlers = &curl_share_handlers; memcpy(&curl_share_handlers, &std_object_handlers, sizeof(zend_object_handlers)); curl_share_handlers.offset = XtOffsetOf(php_curlsh, std); diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e226b4b4bbf93..321817235dd36 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1722,7 +1722,6 @@ static void date_register_classes(void) /* {{{ */ date_ce_date = register_class_DateTime(date_ce_interface); date_ce_date->create_object = date_object_new_date; - date_ce_date->default_object_handlers = &date_object_handlers_date; memcpy(&date_object_handlers_date, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_date.offset = XtOffsetOf(php_date_obj, std); date_object_handlers_date.free_obj = date_object_free_storage_date; @@ -1733,7 +1732,6 @@ static void date_register_classes(void) /* {{{ */ date_ce_immutable = register_class_DateTimeImmutable(date_ce_interface); date_ce_immutable->create_object = date_object_new_date; - date_ce_immutable->default_object_handlers = &date_object_handlers_date; memcpy(&date_object_handlers_immutable, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_immutable.clone_obj = date_object_clone_date; date_object_handlers_immutable.compare = date_object_compare_date; @@ -1742,7 +1740,6 @@ static void date_register_classes(void) /* {{{ */ date_ce_timezone = register_class_DateTimeZone(); date_ce_timezone->create_object = date_object_new_timezone; - date_ce_timezone->default_object_handlers = &date_object_handlers_timezone; memcpy(&date_object_handlers_timezone, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_timezone.offset = XtOffsetOf(php_timezone_obj, std); date_object_handlers_timezone.free_obj = date_object_free_storage_timezone; @@ -1754,7 +1751,6 @@ static void date_register_classes(void) /* {{{ */ date_ce_interval = register_class_DateInterval(); date_ce_interval->create_object = date_object_new_interval; - date_ce_interval->default_object_handlers = &date_object_handlers_interval; memcpy(&date_object_handlers_interval, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std); date_object_handlers_interval.free_obj = date_object_free_storage_interval; @@ -1769,7 +1765,6 @@ static void date_register_classes(void) /* {{{ */ date_ce_period = register_class_DatePeriod(zend_ce_aggregate); date_ce_period->create_object = date_object_new_period; - date_ce_period->default_object_handlers = &date_object_handlers_period; date_ce_period->get_iterator = date_object_period_get_iterator; memcpy(&date_object_handlers_period, &std_object_handlers, sizeof(zend_object_handlers)); date_object_handlers_period.offset = XtOffsetOf(php_period_obj, std); @@ -1787,6 +1782,7 @@ static zend_object *date_object_new_date(zend_class_entry *class_type) /* {{{ */ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &date_object_handlers_date; return &intern->std; } /* }}} */ @@ -1927,6 +1923,7 @@ static zend_object *date_object_new_timezone(zend_class_entry *class_type) /* {{ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &date_object_handlers_timezone; return &intern->std; } /* }}} */ @@ -2079,6 +2076,7 @@ static zend_object *date_object_new_interval(zend_class_entry *class_type) /* {{ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &date_object_handlers_interval; return &intern->std; } /* }}} */ @@ -2171,6 +2169,8 @@ static zend_object *date_object_new_period(zend_class_entry *class_type) /* {{{ zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &date_object_handlers_period; + return &intern->std; } /* }}} */ diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index d9463012f146b..3d3260aee82f7 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -660,7 +660,6 @@ PHP_MINIT_FUNCTION(dom) dom_nodelist_class_entry = register_class_DOMNodeList(zend_ce_aggregate, zend_ce_countable); dom_nodelist_class_entry->create_object = dom_nnodemap_objects_new; - dom_nodelist_class_entry->default_object_handlers = &dom_nnodemap_object_handlers; dom_nodelist_class_entry->get_iterator = php_dom_get_iterator; zend_hash_init(&dom_nodelist_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1); @@ -669,7 +668,6 @@ PHP_MINIT_FUNCTION(dom) dom_namednodemap_class_entry = register_class_DOMNamedNodeMap(zend_ce_aggregate, zend_ce_countable); dom_namednodemap_class_entry->create_object = dom_nnodemap_objects_new; - dom_namednodemap_class_entry->default_object_handlers = &dom_nnodemap_object_handlers; dom_namednodemap_class_entry->get_iterator = php_dom_get_iterator; zend_hash_init(&dom_namednodemap_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1); @@ -1041,6 +1039,8 @@ zend_object *dom_nnodemap_objects_new(zend_class_entry *class_type) /* {{{ */ objmap->local = NULL; objmap->ns = NULL; + intern->std.handlers = &dom_nnodemap_object_handlers; + return &intern->std; } /* }}} */ diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 5c209705d776b..2ddf5f041003e 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -61,6 +61,7 @@ static zend_object *enchant_broker_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &enchant_broker_handlers; return &intern->std; } @@ -79,6 +80,7 @@ static zend_object *enchant_dict_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &enchant_dict_handlers; return &intern->std; } @@ -189,7 +191,6 @@ PHP_MINIT_FUNCTION(enchant) { enchant_broker_ce = register_class_EnchantBroker(); enchant_broker_ce->create_object = enchant_broker_create_object; - enchant_broker_ce->default_object_handlers = &enchant_broker_handlers; memcpy(&enchant_broker_handlers, &std_object_handlers, sizeof(zend_object_handlers)); enchant_broker_handlers.offset = XtOffsetOf(enchant_broker, std); @@ -199,7 +200,6 @@ PHP_MINIT_FUNCTION(enchant) enchant_dict_ce = register_class_EnchantDictionary(); enchant_dict_ce->create_object = enchant_dict_create_object; - enchant_dict_ce->default_object_handlers = &enchant_dict_handlers; memcpy(&enchant_dict_handlers, &std_object_handlers, sizeof(zend_object_handlers)); enchant_dict_handlers.offset = XtOffsetOf(enchant_dict, std); diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 35c4f6ec1af18..7cc81eb3188fc 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -234,7 +234,6 @@ static zend_always_inline void zend_ffi_object_init(zend_object *object, zend_cl GC_SET_REFCOUNT(object, 1); GC_TYPE_INFO(object) = GC_OBJECT | (IS_OBJ_DESTRUCTOR_CALLED << GC_FLAGS_SHIFT); object->ce = ce; - object->handlers = ce->default_object_handlers; object->properties = NULL; zend_objects_store_put(object); } @@ -247,6 +246,7 @@ static zend_object *zend_ffi_cdata_new(zend_class_entry *class_type) /* {{{ */ cdata = emalloc(sizeof(zend_ffi_cdata)); zend_ffi_object_init(&cdata->std, class_type); + cdata->std.handlers = &zend_ffi_cdata_handlers; cdata->type = NULL; cdata->ptr = NULL; @@ -495,6 +495,7 @@ static zend_never_inline zend_ffi_cdata *zend_ffi_cdata_to_zval_slow_ptr(void *p zend_ffi_cdata *cdata = emalloc(sizeof(zend_ffi_cdata)); zend_ffi_object_init(&cdata->std, zend_ffi_cdata_ce); + cdata->std.handlers = &zend_ffi_cdata_handlers; cdata->type = type; cdata->flags = flags; cdata->ptr = (void*)&cdata->ptr_holder; @@ -2173,6 +2174,7 @@ static zend_object *zend_ffi_ctype_new(zend_class_entry *class_type) /* {{{ */ ctype = emalloc(sizeof(zend_ffi_ctype)); zend_ffi_object_init(&ctype->std, class_type); + ctype->std.handlers = &zend_ffi_ctype_handlers; ctype->type = NULL; @@ -2259,6 +2261,7 @@ static zend_object *zend_ffi_new(zend_class_entry *class_type) /* {{{ */ ffi = emalloc(sizeof(zend_ffi)); zend_ffi_object_init(&ffi->std, class_type); + ffi->std.handlers = &zend_ffi_handlers; ffi->lib = NULL; ffi->symbols = NULL; @@ -2470,6 +2473,7 @@ static zval *zend_ffi_read_var(zend_object *obj, zend_string *var_name, int read cdata = emalloc(sizeof(zend_ffi_cdata)); zend_ffi_object_init(&cdata->std, zend_ffi_cdata_ce); + cdata->std.handlers = &zend_ffi_cdata_handlers; cdata->type = ZEND_FFI_TYPE_MAKE_OWNED(new_type); cdata->flags = ZEND_FFI_FLAG_CONST; cdata->ptr_holder = sym->addr; @@ -5301,7 +5305,6 @@ ZEND_MINIT_FUNCTION(ffi) zend_ffi_ce = register_class_FFI(); zend_ffi_ce->create_object = zend_ffi_new; - zend_ffi_ce->default_object_handlers = &zend_ffi_handlers; memcpy(&zend_ffi_new_fn, zend_hash_str_find_ptr(&zend_ffi_ce->function_table, "new", sizeof("new")-1), sizeof(zend_internal_function)); zend_ffi_new_fn.fn_flags &= ~ZEND_ACC_STATIC; @@ -5333,7 +5336,6 @@ ZEND_MINIT_FUNCTION(ffi) zend_ffi_cdata_ce = register_class_FFI_CData(); zend_ffi_cdata_ce->create_object = zend_ffi_cdata_new; - zend_ffi_cdata_ce->default_object_handlers = &zend_ffi_cdata_handlers; zend_ffi_cdata_ce->get_iterator = zend_ffi_cdata_get_iterator; memcpy(&zend_ffi_cdata_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); @@ -5408,7 +5410,6 @@ ZEND_MINIT_FUNCTION(ffi) zend_ffi_ctype_ce = register_class_FFI_CType(); zend_ffi_ctype_ce->create_object = zend_ffi_ctype_new; - zend_ffi_ctype_ce->default_object_handlers = &zend_ffi_ctype_handlers; memcpy(&zend_ffi_ctype_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zend_ffi_ctype_handlers.get_constructor = zend_fake_get_constructor; diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c index 90af9baa3d08a..8163884577ad6 100644 --- a/ext/fileinfo/fileinfo.c +++ b/ext/fileinfo/fileinfo.c @@ -89,6 +89,7 @@ PHP_FILEINFO_API zend_object *finfo_objects_new(zend_class_entry *class_type) zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &finfo_object_handlers; return &intern->zo; } @@ -107,7 +108,6 @@ PHP_MINIT_FUNCTION(finfo) { finfo_class_entry = register_class_finfo(); finfo_class_entry->create_object = finfo_objects_new; - finfo_class_entry->default_object_handlers = &finfo_object_handlers; /* copy the standard object handlers to you handler table */ memcpy(&finfo_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 97c8d360a2155..e365fa3d42129 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -177,6 +177,7 @@ zend_object *php_gd_image_object_create(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &php_gd_image_object_handlers; return &intern->std; } @@ -206,7 +207,6 @@ static void php_gd_object_minit_helper(void) { gd_image_ce = register_class_GdImage(); gd_image_ce->create_object = php_gd_image_object_create; - gd_image_ce->default_object_handlers = &php_gd_image_object_handlers; /* setting up the object handlers for the GdImage class */ memcpy(&php_gd_image_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index a15cd0ebb56de..29974c63862f3 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -256,6 +256,7 @@ static inline zend_object *gmp_create_object_ex(zend_class_entry *ce, mpz_ptr *g mpz_init(intern->num); *gmpnum_target = intern->num; + intern->std.handlers = &gmp_object_handlers; return &intern->std; } @@ -532,7 +533,6 @@ ZEND_MINIT_FUNCTION(gmp) { gmp_ce = register_class_GMP(); gmp_ce->create_object = gmp_create_object; - gmp_ce->default_object_handlers = &gmp_object_handlers; gmp_ce->serialize = gmp_serialize; gmp_ce->unserialize = gmp_unserialize; diff --git a/ext/intl/breakiterator/breakiterator_class.cpp b/ext/intl/breakiterator/breakiterator_class.cpp index d4dec4f31d7a5..761fcfcfccc65 100644 --- a/ext/intl/breakiterator/breakiterator_class.cpp +++ b/ext/intl/breakiterator/breakiterator_class.cpp @@ -209,6 +209,8 @@ static zend_object *BreakIterator_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); breakiterator_object_init(intern); + intern->zo.handlers = &BreakIterator_handlers; + return &intern->zo; } /* }}} */ @@ -222,7 +224,6 @@ U_CFUNC void breakiterator_register_BreakIterator_class(void) BreakIterator_ce_ptr = register_class_IntlBreakIterator(zend_ce_aggregate); BreakIterator_ce_ptr->create_object = BreakIterator_object_create; - BreakIterator_ce_ptr->default_object_handlers = &BreakIterator_handlers; BreakIterator_ce_ptr->get_iterator = _breakiterator_get_iterator; memcpy(&BreakIterator_handlers, &std_object_handlers, diff --git a/ext/intl/calendar/calendar_class.cpp b/ext/intl/calendar/calendar_class.cpp index 8a2c7904a2d26..f114c9b0fe57c 100644 --- a/ext/intl/calendar/calendar_class.cpp +++ b/ext/intl/calendar/calendar_class.cpp @@ -256,6 +256,9 @@ static zend_object *Calendar_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); calendar_object_init(intern); + + intern->zo.handlers = &Calendar_handlers; + return &intern->zo; } /* }}} */ @@ -267,7 +270,6 @@ void calendar_register_IntlCalendar_class(void) { /* Create and register 'IntlCalendar' class. */ Calendar_ce_ptr = register_class_IntlCalendar(); - Calendar_ce_ptr->default_object_handlers = &Calendar_handlers; Calendar_ce_ptr->create_object = Calendar_object_create; memcpy( &Calendar_handlers, &std_object_handlers, diff --git a/ext/intl/collator/collator_class.c b/ext/intl/collator/collator_class.c index db974b8748ec6..709691123ed35 100644 --- a/ext/intl/collator/collator_class.c +++ b/ext/intl/collator/collator_class.c @@ -50,6 +50,8 @@ zend_object *Collator_object_create(zend_class_entry *ce ) zend_object_std_init(&intern->zo, ce ); object_properties_init(&intern->zo, ce); + intern->zo.handlers = &Collator_handlers; + return &intern->zo; } /* }}} */ @@ -68,7 +70,6 @@ void collator_register_Collator_symbols(int module_number) /* Create and register 'Collator' class. */ Collator_ce_ptr = register_class_Collator(); Collator_ce_ptr->create_object = Collator_object_create; - Collator_ce_ptr->default_object_handlers = &Collator_handlers; memcpy(&Collator_handlers, &std_object_handlers, sizeof Collator_handlers); diff --git a/ext/intl/common/common_enum.cpp b/ext/intl/common/common_enum.cpp index 874c748d58b70..e0ddce7bfa5b0 100644 --- a/ext/intl/common/common_enum.cpp +++ b/ext/intl/common/common_enum.cpp @@ -200,6 +200,8 @@ static zend_object *IntlIterator_object_create(zend_class_entry *ce) intern->iterator = NULL; + intern->zo.handlers = &IntlIterator_handlers; + return &intern->zo; } @@ -285,7 +287,6 @@ U_CFUNC void intl_register_common_symbols(int module_number) /* Create and register 'IntlIterator' class. */ IntlIterator_ce_ptr = register_class_IntlIterator(zend_ce_iterator); IntlIterator_ce_ptr->create_object = IntlIterator_object_create; - IntlIterator_ce_ptr->default_object_handlers = &IntlIterator_handlers; IntlIterator_ce_ptr->get_iterator = IntlIterator_get_iterator; memcpy(&IntlIterator_handlers, &std_object_handlers, diff --git a/ext/intl/converter/converter.c b/ext/intl/converter/converter.c index 6f65cfc2eea69..04a34e207cce1 100644 --- a/ext/intl/converter/converter.c +++ b/ext/intl/converter/converter.c @@ -911,6 +911,7 @@ static zend_object *php_converter_object_ctor(zend_class_entry *ce, php_converte object_properties_init(&objval->obj, ce); intl_error_init(&(objval->error)); + objval->obj.handlers = &php_converter_object_handlers; *pobjval = objval; return &objval->obj; @@ -972,7 +973,6 @@ static zend_object *php_converter_clone_object(zend_object *object) { int php_converter_minit(INIT_FUNC_ARGS) { php_converter_ce = register_class_UConverter(); php_converter_ce->create_object = php_converter_create_object; - php_converter_ce->default_object_handlers = &php_converter_object_handlers; memcpy(&php_converter_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_converter_object_handlers.offset = XtOffsetOf(php_converter_object, obj); php_converter_object_handlers.clone_obj = php_converter_clone_object; diff --git a/ext/intl/dateformat/dateformat_class.c b/ext/intl/dateformat/dateformat_class.c index f547640efbb0c..c020d69d5976f 100644 --- a/ext/intl/dateformat/dateformat_class.c +++ b/ext/intl/dateformat/dateformat_class.c @@ -57,6 +57,8 @@ zend_object *IntlDateFormatter_object_create(zend_class_entry *ce) intern->calendar = -1; intern->requested_locale = NULL; + intern->zo.handlers = &IntlDateFormatter_handlers; + return &intern->zo; } /* }}} */ @@ -102,7 +104,6 @@ void dateformat_register_IntlDateFormatter_class( void ) /* Create and register 'IntlDateFormatter' class. */ IntlDateFormatter_ce_ptr = register_class_IntlDateFormatter(); IntlDateFormatter_ce_ptr->create_object = IntlDateFormatter_object_create; - IntlDateFormatter_ce_ptr->default_object_handlers = &IntlDateFormatter_handlers; memcpy(&IntlDateFormatter_handlers, &std_object_handlers, sizeof IntlDateFormatter_handlers); diff --git a/ext/intl/dateformat/datepatterngenerator_class.cpp b/ext/intl/dateformat/datepatterngenerator_class.cpp index c77398deb983f..4c567beb1a206 100644 --- a/ext/intl/dateformat/datepatterngenerator_class.cpp +++ b/ext/intl/dateformat/datepatterngenerator_class.cpp @@ -98,6 +98,8 @@ static zend_object *IntlDatePatternGenerator_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); IntlDatePatternGenerator_object_init(intern); + intern->zo.handlers = &IntlDatePatternGenerator_handlers; + return &intern->zo; } @@ -113,7 +115,6 @@ void dateformat_register_IntlDatePatternGenerator_class( void ) /* Create and register 'IntlDatePatternGenerator' class. */ IntlDatePatternGenerator_ce_ptr = register_class_IntlDatePatternGenerator(); IntlDatePatternGenerator_ce_ptr->create_object = IntlDatePatternGenerator_object_create; - IntlDatePatternGenerator_ce_ptr->default_object_handlers = &IntlDatePatternGenerator_handlers; memcpy(&IntlDatePatternGenerator_handlers, &std_object_handlers, sizeof IntlDatePatternGenerator_handlers); diff --git a/ext/intl/formatter/formatter_class.c b/ext/intl/formatter/formatter_class.c index 0c2d8e418153d..ce71f43a816a2 100644 --- a/ext/intl/formatter/formatter_class.c +++ b/ext/intl/formatter/formatter_class.c @@ -51,6 +51,8 @@ zend_object *NumberFormatter_object_create(zend_class_entry *ce) zend_object_std_init( &intern->zo, ce ); object_properties_init(&intern->zo, ce); + intern->zo.handlers = &NumberFormatter_handlers; + return &intern->zo; } /* }}} */ @@ -97,7 +99,6 @@ void formatter_register_class( void ) /* Create and register 'NumberFormatter' class. */ NumberFormatter_ce_ptr = register_class_NumberFormatter(); NumberFormatter_ce_ptr->create_object = NumberFormatter_object_create; - NumberFormatter_ce_ptr->default_object_handlers = &NumberFormatter_handlers; memcpy(&NumberFormatter_handlers, &std_object_handlers, sizeof(NumberFormatter_handlers)); diff --git a/ext/intl/msgformat/msgformat_class.c b/ext/intl/msgformat/msgformat_class.c index 57378f19bb010..3d7241b0da58e 100644 --- a/ext/intl/msgformat/msgformat_class.c +++ b/ext/intl/msgformat/msgformat_class.c @@ -49,6 +49,8 @@ zend_object *MessageFormatter_object_create(zend_class_entry *ce) zend_object_std_init( &intern->zo, ce ); object_properties_init(&intern->zo, ce); + intern->zo.handlers = &MessageFormatter_handlers; + return &intern->zo; } /* }}} */ @@ -96,7 +98,6 @@ void msgformat_register_class( void ) /* Create and register 'MessageFormatter' class. */ MessageFormatter_ce_ptr = register_class_MessageFormatter(); MessageFormatter_ce_ptr->create_object = MessageFormatter_object_create; - MessageFormatter_ce_ptr->default_object_handlers = &MessageFormatter_handlers; memcpy(&MessageFormatter_handlers, &std_object_handlers, sizeof MessageFormatter_handlers); diff --git a/ext/intl/resourcebundle/resourcebundle_class.c b/ext/intl/resourcebundle/resourcebundle_class.c index 9e86b41e761a2..5e1e9e5312e29 100644 --- a/ext/intl/resourcebundle/resourcebundle_class.c +++ b/ext/intl/resourcebundle/resourcebundle_class.c @@ -67,6 +67,8 @@ static zend_object *ResourceBundle_object_create( zend_class_entry *ce ) rb->me = NULL; rb->child = NULL; + rb->zend.handlers = &ResourceBundle_object_handlers; + return &rb->zend; } /* }}} */ @@ -373,7 +375,6 @@ void resourcebundle_register_class( void ) { ResourceBundle_ce_ptr = register_class_ResourceBundle(zend_ce_aggregate, zend_ce_countable); ResourceBundle_ce_ptr->create_object = ResourceBundle_object_create; - ResourceBundle_ce_ptr->default_object_handlers = &ResourceBundle_object_handlers; ResourceBundle_ce_ptr->get_iterator = resourcebundle_get_iterator; ResourceBundle_object_handlers = std_object_handlers; diff --git a/ext/intl/spoofchecker/spoofchecker_class.c b/ext/intl/spoofchecker/spoofchecker_class.c index 176917ed4edec..ed343ec1bed01 100644 --- a/ext/intl/spoofchecker/spoofchecker_class.c +++ b/ext/intl/spoofchecker/spoofchecker_class.c @@ -47,6 +47,8 @@ zend_object *Spoofchecker_object_create(zend_class_entry *ce) zend_object_std_init(&intern->zo, ce); object_properties_init(&intern->zo, ce); + intern->zo.handlers = &Spoofchecker_handlers; + return &intern->zo; } /* }}} */ @@ -91,7 +93,6 @@ void spoofchecker_register_Spoofchecker_class(void) /* Create and register 'Spoofchecker' class. */ Spoofchecker_ce_ptr = register_class_Spoofchecker(); Spoofchecker_ce_ptr->create_object = Spoofchecker_object_create; - Spoofchecker_ce_ptr->default_object_handlers = &Spoofchecker_handlers; memcpy(&Spoofchecker_handlers, &std_object_handlers, sizeof Spoofchecker_handlers); diff --git a/ext/intl/timezone/timezone_class.cpp b/ext/intl/timezone/timezone_class.cpp index df1da4c021daa..559086365ceb8 100644 --- a/ext/intl/timezone/timezone_class.cpp +++ b/ext/intl/timezone/timezone_class.cpp @@ -377,6 +377,8 @@ static zend_object *TimeZone_object_create(zend_class_entry *ce) object_properties_init(&intern->zo, ce); TimeZone_object_init(intern); + intern->zo.handlers = &TimeZone_handlers; + return &intern->zo; } /* }}} */ @@ -389,7 +391,6 @@ U_CFUNC void timezone_register_IntlTimeZone_class(void) /* Create and register 'IntlTimeZone' class. */ TimeZone_ce_ptr = register_class_IntlTimeZone(); TimeZone_ce_ptr->create_object = TimeZone_object_create; - TimeZone_ce_ptr->default_object_handlers = &TimeZone_handlers; memcpy(&TimeZone_handlers, &std_object_handlers, sizeof TimeZone_handlers); diff --git a/ext/intl/transliterator/transliterator_class.c b/ext/intl/transliterator/transliterator_class.c index 78c6d562d2f93..552505e19c9a0 100644 --- a/ext/intl/transliterator/transliterator_class.c +++ b/ext/intl/transliterator/transliterator_class.c @@ -117,6 +117,8 @@ static zend_object *Transliterator_object_create( zend_class_entry *ce ) object_properties_init( &intern->zo, ce ); transliterator_object_init( intern ); + intern->zo.handlers = &Transliterator_handlers; + return &intern->zo; } /* }}} */ @@ -182,7 +184,6 @@ void transliterator_register_Transliterator_class( void ) /* Create and register 'Transliterator' class. */ Transliterator_ce_ptr = register_class_Transliterator(); Transliterator_ce_ptr->create_object = Transliterator_object_create; - Transliterator_ce_ptr->default_object_handlers = &Transliterator_handlers; memcpy( &Transliterator_handlers, &std_object_handlers, sizeof Transliterator_handlers ); Transliterator_handlers.offset = XtOffsetOf(Transliterator_object, zo); Transliterator_handlers.free_obj = Transliterator_objects_free; diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index ecd94c2da509e..b8fb4274215ff 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -115,6 +115,7 @@ static zend_object *ldap_link_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &ldap_link_object_handlers; return &intern->std; } @@ -160,6 +161,7 @@ static zend_object *ldap_result_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &ldap_result_object_handlers; return &intern->std; } @@ -197,6 +199,7 @@ static zend_object *ldap_result_entry_create_object(zend_class_entry *class_type zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &ldap_result_entry_object_handlers; return &intern->std; } @@ -825,7 +828,6 @@ PHP_MINIT_FUNCTION(ldap) ldap_link_ce = register_class_LDAP_Connection(); ldap_link_ce->create_object = ldap_link_create_object; - ldap_link_ce->default_object_handlers = &ldap_link_object_handlers; memcpy(&ldap_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); ldap_link_object_handlers.offset = XtOffsetOf(ldap_linkdata, std); @@ -836,7 +838,6 @@ PHP_MINIT_FUNCTION(ldap) ldap_result_ce = register_class_LDAP_Result(); ldap_result_ce->create_object = ldap_result_create_object; - ldap_result_ce->default_object_handlers = &ldap_result_object_handlers; memcpy(&ldap_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); ldap_result_object_handlers.offset = XtOffsetOf(ldap_resultdata, std); @@ -847,7 +848,6 @@ PHP_MINIT_FUNCTION(ldap) ldap_result_entry_ce = register_class_LDAP_ResultEntry(); ldap_result_entry_ce->create_object = ldap_result_entry_create_object; - ldap_result_entry_ce->default_object_handlers = &ldap_result_entry_object_handlers; memcpy(&ldap_result_entry_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); ldap_result_entry_object_handlers.offset = XtOffsetOf(ldap_result_entry, std); diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index a9253f6f45dde..81cef7edbfca5 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -144,6 +144,7 @@ static zend_object *php_openssl_certificate_create_object(zend_class_entry *clas zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &php_openssl_certificate_object_handlers; return &intern->std; } @@ -183,6 +184,7 @@ static zend_object *php_openssl_request_create_object(zend_class_entry *class_ty zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &php_openssl_request_object_handlers; return &intern->std; } @@ -223,6 +225,7 @@ static zend_object *php_openssl_pkey_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &php_openssl_pkey_object_handlers; return &intern->std; } @@ -1187,7 +1190,6 @@ PHP_MINIT_FUNCTION(openssl) php_openssl_certificate_ce = register_class_OpenSSLCertificate(); php_openssl_certificate_ce->create_object = php_openssl_certificate_create_object; - php_openssl_certificate_ce->default_object_handlers = &php_openssl_certificate_object_handlers; memcpy(&php_openssl_certificate_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_openssl_certificate_object_handlers.offset = XtOffsetOf(php_openssl_certificate_object, std); @@ -1198,7 +1200,6 @@ PHP_MINIT_FUNCTION(openssl) php_openssl_request_ce = register_class_OpenSSLCertificateSigningRequest(); php_openssl_request_ce->create_object = php_openssl_request_create_object; - php_openssl_request_ce->default_object_handlers = &php_openssl_request_object_handlers; memcpy(&php_openssl_request_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_openssl_request_object_handlers.offset = XtOffsetOf(php_openssl_request_object, std); @@ -1209,7 +1210,6 @@ PHP_MINIT_FUNCTION(openssl) php_openssl_pkey_ce = register_class_OpenSSLAsymmetricKey(); php_openssl_pkey_ce->create_object = php_openssl_pkey_create_object; - php_openssl_pkey_ce->default_object_handlers = &php_openssl_pkey_object_handlers; memcpy(&php_openssl_pkey_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); php_openssl_pkey_object_handlers.offset = XtOffsetOf(php_openssl_pkey_object, std); diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 1f291def5b835..26d4e9bf85870 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1333,7 +1333,6 @@ void pdo_dbh_init(int module_number) { pdo_dbh_ce = register_class_PDO(); pdo_dbh_ce->create_object = pdo_dbh_new; - pdo_dbh_ce->default_object_handlers = &pdo_dbh_object_handlers; memcpy(&pdo_dbh_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pdo_dbh_object_handlers.offset = XtOffsetOf(pdo_dbh_object_t, std); @@ -1420,6 +1419,8 @@ zend_object *pdo_dbh_new(zend_class_entry *ce) dbh->inner = ecalloc(1, sizeof(pdo_dbh_t)); dbh->inner->def_stmt_ce = pdo_dbstmt_ce; + dbh->std.handlers = &pdo_dbh_object_handlers; + return &dbh->std; } diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index 65f0900075af0..453933607f38e 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -218,6 +218,7 @@ static void get_lazy_object(pdo_stmt_t *stmt, zval *return_value) /* {{{ */ row->stmt = stmt; zend_object_std_init(&row->std, pdo_row_ce); ZVAL_OBJ(&stmt->lazy_object_ref, &row->std); + row->std.handlers = &pdo_row_object_handlers; GC_ADDREF(&stmt->std); GC_DELREF(&row->std); } @@ -2136,6 +2137,8 @@ zend_object *pdo_dbstmt_new(zend_class_entry *ce) zend_object_std_init(&stmt->std, ce); object_properties_init(&stmt->std, ce); + stmt->std.handlers = &pdo_dbstmt_object_handlers; + return &stmt->std; } /* }}} */ @@ -2461,6 +2464,7 @@ zend_object *pdo_row_new(zend_class_entry *ce) { pdo_row_t *row = ecalloc(1, sizeof(pdo_row_t)); zend_object_std_init(&row->std, ce); + row->std.handlers = &pdo_row_object_handlers; return &row->std; } @@ -2470,7 +2474,6 @@ void pdo_stmt_init(void) pdo_dbstmt_ce = register_class_PDOStatement(zend_ce_aggregate); pdo_dbstmt_ce->get_iterator = pdo_stmt_iter_get; pdo_dbstmt_ce->create_object = pdo_dbstmt_new; - pdo_dbstmt_ce->default_object_handlers = &pdo_dbstmt_object_handlers; memcpy(&pdo_dbstmt_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pdo_dbstmt_object_handlers.offset = XtOffsetOf(pdo_stmt_t, std); @@ -2483,7 +2486,6 @@ void pdo_stmt_init(void) pdo_row_ce = register_class_PDORow(); pdo_row_ce->create_object = pdo_row_new; - pdo_row_ce->default_object_handlers = &pdo_row_object_handlers; memcpy(&pdo_row_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pdo_row_object_handlers.free_obj = pdo_row_free_storage; diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 94b53df711f1c..b5c4b77ad3f71 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -157,6 +157,7 @@ static zend_object *pgsql_link_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &pgsql_link_object_handlers; return &intern->std; } @@ -212,6 +213,7 @@ static zend_object *pgsql_result_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &pgsql_result_object_handlers; return &intern->std; } @@ -249,6 +251,7 @@ static zend_object *pgsql_lob_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &pgsql_lob_object_handlers; return &intern->std; } @@ -437,7 +440,6 @@ PHP_MINIT_FUNCTION(pgsql) pgsql_link_ce = register_class_PgSql_Connection(); pgsql_link_ce->create_object = pgsql_link_create_object; - pgsql_link_ce->default_object_handlers = &pgsql_link_object_handlers; memcpy(&pgsql_link_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pgsql_link_object_handlers.offset = XtOffsetOf(pgsql_link_handle, std); @@ -448,7 +450,6 @@ PHP_MINIT_FUNCTION(pgsql) pgsql_result_ce = register_class_PgSql_Result(); pgsql_result_ce->create_object = pgsql_result_create_object; - pgsql_result_ce->default_object_handlers = &pgsql_result_object_handlers; memcpy(&pgsql_result_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pgsql_result_object_handlers.offset = XtOffsetOf(pgsql_result_handle, std); @@ -459,7 +460,6 @@ PHP_MINIT_FUNCTION(pgsql) pgsql_lob_ce = register_class_PgSql_Lob(); pgsql_lob_ce->create_object = pgsql_lob_create_object; - pgsql_lob_ce->default_object_handlers = &pgsql_lob_object_handlers; memcpy(&pgsql_lob_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); pgsql_lob_object_handlers.offset = XtOffsetOf(pgLofp, std); diff --git a/ext/random/random.c b/ext/random/random.c index 5afc7680d7ddd..2380a83b75890 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -227,6 +227,8 @@ static zend_object *php_random_randomizer_new(zend_class_entry *ce) zend_object_std_init(&randomizer->std, ce); object_properties_init(&randomizer->std, ce); + randomizer->std.handlers = &random_randomizer_object_handlers; + return &randomizer->std; } @@ -878,7 +880,6 @@ PHP_MINIT_FUNCTION(random) /* Random\Randomizer */ random_ce_Random_Randomizer = register_class_Random_Randomizer(); random_ce_Random_Randomizer->create_object = php_random_randomizer_new; - random_ce_Random_Randomizer->default_object_handlers = &random_randomizer_object_handlers; memcpy(&random_randomizer_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); random_randomizer_object_handlers.offset = XtOffsetOf(php_random_randomizer, std); random_randomizer_object_handlers.free_obj = randomizer_free_obj; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b49ee57ba5fbe..212dda61bae7f 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -283,6 +283,7 @@ static zend_object *reflection_objects_new(zend_class_entry *class_type) /* {{{ zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &reflection_object_handlers; return &intern->zo; } /* }}} */ @@ -7148,88 +7149,67 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */ reflector_ptr = register_class_Reflector(zend_ce_stringable); reflection_function_abstract_ptr = register_class_ReflectionFunctionAbstract(reflector_ptr); - reflection_function_abstract_ptr->default_object_handlers = &reflection_object_handlers; reflection_function_abstract_ptr->create_object = reflection_objects_new; reflection_function_ptr = register_class_ReflectionFunction(reflection_function_abstract_ptr); reflection_function_ptr->create_object = reflection_objects_new; - reflection_function_ptr->default_object_handlers = &reflection_object_handlers; reflection_generator_ptr = register_class_ReflectionGenerator(); reflection_generator_ptr->create_object = reflection_objects_new; - reflection_generator_ptr->default_object_handlers = &reflection_object_handlers; reflection_parameter_ptr = register_class_ReflectionParameter(reflector_ptr); reflection_parameter_ptr->create_object = reflection_objects_new; - reflection_parameter_ptr->default_object_handlers = &reflection_object_handlers; reflection_type_ptr = register_class_ReflectionType(zend_ce_stringable); reflection_type_ptr->create_object = reflection_objects_new; - reflection_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_named_type_ptr = register_class_ReflectionNamedType(reflection_type_ptr); reflection_named_type_ptr->create_object = reflection_objects_new; - reflection_named_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_union_type_ptr = register_class_ReflectionUnionType(reflection_type_ptr); reflection_union_type_ptr->create_object = reflection_objects_new; - reflection_union_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_intersection_type_ptr = register_class_ReflectionIntersectionType(reflection_type_ptr); reflection_intersection_type_ptr->create_object = reflection_objects_new; - reflection_intersection_type_ptr->default_object_handlers = &reflection_object_handlers; reflection_method_ptr = register_class_ReflectionMethod(reflection_function_abstract_ptr); reflection_method_ptr->create_object = reflection_objects_new; - reflection_method_ptr->default_object_handlers = &reflection_object_handlers; reflection_class_ptr = register_class_ReflectionClass(reflector_ptr); reflection_class_ptr->create_object = reflection_objects_new; - reflection_class_ptr->default_object_handlers = &reflection_object_handlers; reflection_object_ptr = register_class_ReflectionObject(reflection_class_ptr); reflection_object_ptr->create_object = reflection_objects_new; - reflection_object_ptr->default_object_handlers = &reflection_object_handlers; reflection_property_ptr = register_class_ReflectionProperty(reflector_ptr); reflection_property_ptr->create_object = reflection_objects_new; - reflection_property_ptr->default_object_handlers = &reflection_object_handlers; reflection_class_constant_ptr = register_class_ReflectionClassConstant(reflector_ptr); reflection_class_constant_ptr->create_object = reflection_objects_new; - reflection_class_constant_ptr->default_object_handlers = &reflection_object_handlers; reflection_extension_ptr = register_class_ReflectionExtension(reflector_ptr); reflection_extension_ptr->create_object = reflection_objects_new; - reflection_extension_ptr->default_object_handlers = &reflection_object_handlers; reflection_zend_extension_ptr = register_class_ReflectionZendExtension(reflector_ptr); reflection_zend_extension_ptr->create_object = reflection_objects_new; - reflection_zend_extension_ptr->default_object_handlers = &reflection_object_handlers; reflection_reference_ptr = register_class_ReflectionReference(); reflection_reference_ptr->create_object = reflection_objects_new; - reflection_reference_ptr->default_object_handlers = &reflection_object_handlers; reflection_attribute_ptr = register_class_ReflectionAttribute(reflector_ptr); reflection_attribute_ptr->create_object = reflection_objects_new; - reflection_attribute_ptr->default_object_handlers = &reflection_object_handlers; reflection_enum_ptr = register_class_ReflectionEnum(reflection_class_ptr); reflection_enum_ptr->create_object = reflection_objects_new; - reflection_enum_ptr->default_object_handlers = &reflection_object_handlers; reflection_enum_unit_case_ptr = register_class_ReflectionEnumUnitCase(reflection_class_constant_ptr); reflection_enum_unit_case_ptr->create_object = reflection_objects_new; - reflection_enum_unit_case_ptr->default_object_handlers = &reflection_object_handlers; reflection_enum_backed_case_ptr = register_class_ReflectionEnumBackedCase(reflection_enum_unit_case_ptr); reflection_enum_backed_case_ptr->create_object = reflection_objects_new; - reflection_enum_backed_case_ptr->default_object_handlers = &reflection_object_handlers; reflection_fiber_ptr = register_class_ReflectionFiber(); reflection_fiber_ptr->create_object = reflection_objects_new; - reflection_fiber_ptr->default_object_handlers = &reflection_object_handlers; REFLECTION_G(key_initialized) = 0; diff --git a/ext/shmop/shmop.c b/ext/shmop/shmop.c index be4f57ad27162..ce810a782391e 100644 --- a/ext/shmop/shmop.c +++ b/ext/shmop/shmop.c @@ -84,6 +84,7 @@ static zend_object *shmop_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &shmop_object_handlers; return &intern->std; } @@ -108,7 +109,6 @@ PHP_MINIT_FUNCTION(shmop) { shmop_ce = register_class_Shmop(); shmop_ce->create_object = shmop_create_object; - shmop_ce->default_object_handlers = &shmop_object_handlers; memcpy(&shmop_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); shmop_object_handlers.offset = XtOffsetOf(php_shmop, std); diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 20537989d0711..763886730158b 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -2222,6 +2222,7 @@ static php_sxe_object* php_sxe_object_new(zend_class_entry *ce, zend_function *f zend_object_std_init(&intern->zo, ce); object_properties_init(&intern->zo, ce); + intern->zo.handlers = &sxe_object_handlers; return intern; } @@ -2672,7 +2673,6 @@ PHP_MINIT_FUNCTION(simplexml) { sxe_class_entry = register_class_SimpleXMLElement(zend_ce_stringable, zend_ce_countable, spl_ce_RecursiveIterator); sxe_class_entry->create_object = sxe_object_new; - sxe_class_entry->default_object_handlers = &sxe_object_handlers; sxe_class_entry->get_iterator = php_sxe_get_iterator; memcpy(&sxe_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index 6c7a6f42e968c..299d2d8fd08c8 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -185,6 +185,8 @@ static zend_object *php_snmp_object_new(zend_class_entry *class_type) /* {{{ */ zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &php_snmp_object_handlers; + return &intern->zo; } @@ -2022,7 +2024,6 @@ PHP_MINIT_FUNCTION(snmp) /* Register SNMP Class */ php_snmp_ce = register_class_SNMP(); php_snmp_ce->create_object = php_snmp_object_new; - php_snmp_ce->default_object_handlers = &php_snmp_object_handlers; php_snmp_object_handlers.offset = XtOffsetOf(php_snmp_object, zo); php_snmp_object_handlers.clone_obj = NULL; php_snmp_object_handlers.free_obj = php_snmp_object_free_storage; diff --git a/ext/soap/soap.c b/ext/soap/soap.c index a318ae896f4fd..5d89825f91c30 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -194,6 +194,7 @@ static zend_object *soap_server_object_create(zend_class_entry *ce) soap_server_object *obj = zend_object_alloc(sizeof(soap_server_object), ce); zend_object_std_init(&obj->std, ce); object_properties_init(&obj->std, ce); + obj->std.handlers = &soap_server_object_handlers; return &obj->std; } @@ -406,7 +407,6 @@ PHP_MINIT_FUNCTION(soap) /* Register SoapServer class */ soap_server_class_entry = register_class_SoapServer(); soap_server_class_entry->create_object = soap_server_object_create; - soap_server_class_entry->default_object_handlers = &soap_server_object_handlers; memcpy(&soap_server_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); soap_server_object_handlers.offset = XtOffsetOf(soap_server_object, std); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 8dd8265d7341c..b54859ad4a20d 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -101,6 +101,7 @@ static zend_object *socket_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &socket_object_handlers; intern->bsd_socket = -1; /* invalid socket */ intern->type = PF_UNSPEC; @@ -162,6 +163,7 @@ static zend_object *address_info_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &address_info_object_handlers; return &intern->std; } @@ -426,7 +428,6 @@ static PHP_MINIT_FUNCTION(sockets) socket_ce = register_class_Socket(); socket_ce->create_object = socket_create_object; - socket_ce->default_object_handlers = &socket_object_handlers; memcpy(&socket_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); socket_object_handlers.offset = XtOffsetOf(php_socket, std); @@ -438,7 +439,6 @@ static PHP_MINIT_FUNCTION(sockets) address_info_ce = register_class_AddressInfo(); address_info_ce->create_object = address_info_create_object; - address_info_ce->default_object_handlers = &address_info_object_handlers; memcpy(&address_info_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); address_info_object_handlers.offset = XtOffsetOf(php_addrinfo, std); diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index ff840e6ad3619..c8cd8f684d406 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -199,6 +199,7 @@ static zend_object *spl_filesystem_object_new_ex(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &spl_filesystem_object_handlers; return &intern->std; } @@ -212,6 +213,15 @@ static zend_object *spl_filesystem_object_new(zend_class_entry *class_type) } /* }}} */ +/* {{{ spl_filesystem_object_new_check */ +static zend_object *spl_filesystem_object_new_check(zend_class_entry *class_type) +{ + spl_filesystem_object *ret = spl_filesystem_from_obj(spl_filesystem_object_new_ex(class_type)); + ret->std.handlers = &spl_filesystem_object_check_handlers; + return &ret->std; +} +/* }}} */ + PHPAPI zend_string *spl_filesystem_object_get_path(spl_filesystem_object *intern) /* {{{ */ { #ifdef HAVE_GLOB @@ -2746,7 +2756,6 @@ PHP_MINIT_FUNCTION(spl_directory) { spl_ce_SplFileInfo = register_class_SplFileInfo(zend_ce_stringable); spl_ce_SplFileInfo->create_object = spl_filesystem_object_new; - spl_ce_SplFileInfo->default_object_handlers = &spl_filesystem_object_handlers; memcpy(&spl_filesystem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); spl_filesystem_object_handlers.offset = XtOffsetOf(spl_filesystem_object, std); @@ -2772,16 +2781,14 @@ PHP_MINIT_FUNCTION(spl_directory) #ifdef HAVE_GLOB spl_ce_GlobIterator = register_class_GlobIterator(spl_ce_FilesystemIterator, zend_ce_countable); - spl_ce_GlobIterator->create_object = spl_filesystem_object_new; - spl_ce_GlobIterator->default_object_handlers = &spl_filesystem_object_check_handlers; + spl_ce_GlobIterator->create_object = spl_filesystem_object_new_check; #endif spl_ce_SplFileObject = register_class_SplFileObject(spl_ce_SplFileInfo, spl_ce_RecursiveIterator, spl_ce_SeekableIterator); - spl_ce_SplFileObject->default_object_handlers = &spl_filesystem_object_check_handlers; - spl_ce_SplFileObject->create_object = spl_filesystem_object_new; + spl_ce_SplFileObject->create_object = spl_filesystem_object_new_check; spl_ce_SplTempFileObject = register_class_SplTempFileObject(spl_ce_SplFileObject); - spl_ce_SplTempFileObject->create_object = spl_filesystem_object_new; + spl_ce_SplTempFileObject->create_object = spl_filesystem_object_new_check; return SUCCESS; } diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index b468a0a5468f4..ccbb871269b12 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1019,6 +1019,7 @@ static zend_object *spl_RecursiveIteratorIterator_new_ex(zend_class_entry *class zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &spl_handlers_rec_it_it; return &intern->std; } /* }}} */ @@ -2205,6 +2206,7 @@ static zend_object *spl_dual_it_new(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &spl_handlers_dual_it; return &intern->std; } /* }}} */ @@ -3259,7 +3261,6 @@ PHP_MINIT_FUNCTION(spl_iterators) spl_ce_RecursiveIteratorIterator = register_class_RecursiveIteratorIterator(spl_ce_OuterIterator); spl_ce_RecursiveIteratorIterator->create_object = spl_RecursiveIteratorIterator_new; - spl_ce_RecursiveIteratorIterator->default_object_handlers = &spl_handlers_rec_it_it; spl_ce_RecursiveIteratorIterator->get_iterator = spl_recursive_it_get_iterator; memcpy(&spl_handlers_rec_it_it, &std_object_handlers, sizeof(zend_object_handlers)); @@ -3278,7 +3279,6 @@ PHP_MINIT_FUNCTION(spl_iterators) spl_ce_IteratorIterator = register_class_IteratorIterator(spl_ce_OuterIterator); spl_ce_IteratorIterator->create_object = spl_dual_it_new; - spl_ce_IteratorIterator->default_object_handlers = &spl_handlers_dual_it; spl_ce_FilterIterator = register_class_FilterIterator(spl_ce_IteratorIterator); spl_ce_FilterIterator->create_object = spl_dual_it_new; diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c index ce7852618f875..339bd0b6e5d22 100644 --- a/ext/spl/spl_observer.c +++ b/ext/spl/spl_observer.c @@ -265,6 +265,8 @@ static zend_object *spl_object_storage_new_ex(zend_class_entry *class_type, zend zend_hash_init(&intern->storage, 0, NULL, spl_object_storage_dtor, 0); + intern->std.handlers = &spl_handler_SplObjectStorage; + while (parent) { if (parent == spl_ce_SplObjectStorage) { /* Possible optimization: Cache these results with a map from class entry to IS_NULL/IS_PTR. @@ -1327,7 +1329,6 @@ PHP_MINIT_FUNCTION(spl_observer) spl_ce_SplObjectStorage = register_class_SplObjectStorage(zend_ce_countable, zend_ce_iterator, zend_ce_serializable, zend_ce_arrayaccess); spl_ce_SplObjectStorage->create_object = spl_SplObjectStorage_new; - spl_ce_SplObjectStorage->default_object_handlers = &spl_handler_SplObjectStorage; memcpy(&spl_handler_SplObjectStorage, &std_object_handlers, sizeof(zend_object_handlers)); @@ -1343,7 +1344,6 @@ PHP_MINIT_FUNCTION(spl_observer) spl_ce_MultipleIterator = register_class_MultipleIterator(zend_ce_iterator); spl_ce_MultipleIterator->create_object = spl_SplObjectStorage_new; - spl_ce_MultipleIterator->default_object_handlers = &spl_handler_SplObjectStorage; return SUCCESS; } diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index 03dc225d22d39..4b9119d79cd35 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -2298,6 +2298,8 @@ static zend_object *php_sqlite3_object_new(zend_class_entry *class_type) /* {{{ zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &sqlite3_object_handlers; + return &intern->zo; } /* }}} */ @@ -2312,6 +2314,8 @@ static zend_object *php_sqlite3_stmt_object_new(zend_class_entry *class_type) /* zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &sqlite3_stmt_object_handlers; + return &intern->zo; } /* }}} */ @@ -2326,6 +2330,8 @@ static zend_object *php_sqlite3_result_object_new(zend_class_entry *class_type) zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &sqlite3_result_object_handlers; + return &intern->zo; } /* }}} */ @@ -2367,7 +2373,6 @@ PHP_MINIT_FUNCTION(sqlite3) sqlite3_object_handlers.free_obj = php_sqlite3_object_free_storage; php_sqlite3_sc_entry = register_class_SQLite3(); php_sqlite3_sc_entry->create_object = php_sqlite3_object_new; - php_sqlite3_sc_entry->default_object_handlers = &sqlite3_object_handlers; /* Register SQLite 3 Prepared Statement Class */ sqlite3_stmt_object_handlers.offset = XtOffsetOf(php_sqlite3_stmt, zo); @@ -2375,7 +2380,6 @@ PHP_MINIT_FUNCTION(sqlite3) sqlite3_stmt_object_handlers.free_obj = php_sqlite3_stmt_object_free_storage; php_sqlite3_stmt_entry = register_class_SQLite3Stmt(); php_sqlite3_stmt_entry->create_object = php_sqlite3_stmt_object_new; - php_sqlite3_stmt_entry->default_object_handlers = &sqlite3_stmt_object_handlers; /* Register SQLite 3 Result Class */ sqlite3_result_object_handlers.offset = XtOffsetOf(php_sqlite3_result, zo); @@ -2383,7 +2387,6 @@ PHP_MINIT_FUNCTION(sqlite3) sqlite3_result_object_handlers.free_obj = php_sqlite3_result_object_free_storage; php_sqlite3_result_entry = register_class_SQLite3Result(); php_sqlite3_result_entry->create_object = php_sqlite3_result_object_new; - php_sqlite3_result_entry->default_object_handlers = &sqlite3_result_object_handlers; REGISTER_INI_ENTRIES(); diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index debb8b675b0c2..d9146f6e78cc3 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -79,6 +79,7 @@ static zend_object *sysvmsg_queue_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &sysvmsg_queue_object_handlers; return &intern->std; } @@ -101,7 +102,6 @@ PHP_MINIT_FUNCTION(sysvmsg) { sysvmsg_queue_ce = register_class_SysvMessageQueue(); sysvmsg_queue_ce->create_object = sysvmsg_queue_create_object; - sysvmsg_queue_ce->default_object_handlers = &sysvmsg_queue_object_handlers; memcpy(&sysvmsg_queue_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); sysvmsg_queue_object_handlers.offset = XtOffsetOf(sysvmsg_queue_t, std); diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index d9369dfa9f6f1..42fb1d96c6fb0 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -100,6 +100,7 @@ static zend_object *sysvsem_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &sysvsem_object_handlers; return &intern->std; } @@ -151,7 +152,6 @@ PHP_MINIT_FUNCTION(sysvsem) { sysvsem_ce = register_class_SysvSemaphore(); sysvsem_ce->create_object = sysvsem_create_object; - sysvsem_ce->default_object_handlers = &sysvsem_object_handlers; memcpy(&sysvsem_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); sysvsem_object_handlers.offset = XtOffsetOf(sysvsem_sem, std); diff --git a/ext/sysvshm/sysvshm.c b/ext/sysvshm/sysvshm.c index bec3af680e0d1..717c75337bb66 100644 --- a/ext/sysvshm/sysvshm.c +++ b/ext/sysvshm/sysvshm.c @@ -47,6 +47,7 @@ static zend_object *sysvshm_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &sysvshm_object_handlers; return &intern->std; } @@ -100,7 +101,6 @@ PHP_MINIT_FUNCTION(sysvshm) { sysvshm_ce = register_class_SysvSharedMemory(); sysvshm_ce->create_object = sysvshm_create_object; - sysvshm_ce->default_object_handlers = &sysvshm_object_handlers; memcpy(&sysvshm_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); sysvshm_object_handlers.offset = XtOffsetOf(sysvshm_shm, std); diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 0fd239baf5b80..d821824e006eb 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -245,7 +245,6 @@ PHP_MINIT_FUNCTION(xml) { xml_parser_ce = register_class_XMLParser(); xml_parser_ce->create_object = xml_parser_create_object; - xml_parser_ce->default_object_handlers = &xml_parser_object_handlers; memcpy(&xml_parser_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); xml_parser_object_handlers.offset = XtOffsetOf(xml_parser, std); @@ -314,6 +313,7 @@ static zend_object *xml_parser_create_object(zend_class_entry *class_type) { zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &xml_parser_object_handlers; return &intern->std; } diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 76ca54d686359..729a1d2c7c3ad 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -368,6 +368,7 @@ zend_object *xmlreader_objects_new(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); intern->prop_handler = &xmlreader_prop_handlers; + intern->std.handlers = &xmlreader_object_handlers; return &intern->std; } @@ -1162,7 +1163,6 @@ PHP_MINIT_FUNCTION(xmlreader) xmlreader_class_entry = register_class_XMLReader(); xmlreader_class_entry->create_object = xmlreader_objects_new; - xmlreader_class_entry->default_object_handlers = &xmlreader_object_handlers; memcpy(&xmlreader_open_fn, zend_hash_str_find_ptr(&xmlreader_class_entry->function_table, "open", sizeof("open")-1), sizeof(zend_internal_function)); xmlreader_open_fn.fn_flags &= ~ZEND_ACC_STATIC; diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c index 5944abf30a98b..8d4abb3d26b06 100644 --- a/ext/xmlwriter/php_xmlwriter.c +++ b/ext/xmlwriter/php_xmlwriter.c @@ -82,6 +82,7 @@ static zend_object *xmlwriter_object_new(zend_class_entry *class_type) intern = zend_object_alloc(sizeof(ze_xmlwriter_object), class_type); zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &xmlwriter_object_handlers; return &intern->std; } @@ -1038,7 +1039,6 @@ static PHP_MINIT_FUNCTION(xmlwriter) xmlwriter_object_handlers.clone_obj = NULL; xmlwriter_class_entry_ce = register_class_XMLWriter(); xmlwriter_class_entry_ce->create_object = xmlwriter_object_new; - xmlwriter_class_entry_ce->default_object_handlers = &xmlwriter_object_handlers; return SUCCESS; } diff --git a/ext/xsl/php_xsl.c b/ext/xsl/php_xsl.c index 82e782d18f9d1..0c9029c9601df 100644 --- a/ext/xsl/php_xsl.c +++ b/ext/xsl/php_xsl.c @@ -103,6 +103,7 @@ zend_object *xsl_objects_new(zend_class_entry *class_type) intern->parameter = zend_new_array(0); intern->registered_phpfunctions = zend_new_array(0); + intern->std.handlers = &xsl_object_handlers; return &intern->std; } /* }}} */ @@ -117,7 +118,6 @@ PHP_MINIT_FUNCTION(xsl) xsl_xsltprocessor_class_entry = register_class_XSLTProcessor(); xsl_xsltprocessor_class_entry->create_object = xsl_objects_new; - xsl_xsltprocessor_class_entry->default_object_handlers = &xsl_object_handlers; #ifdef HAVE_XSL_EXSLT exsltRegisterAll(); diff --git a/ext/zend_test/fiber.c b/ext/zend_test/fiber.c index f67c0217d050f..0254799e2bdb5 100644 --- a/ext/zend_test/fiber.c +++ b/ext/zend_test/fiber.c @@ -150,6 +150,7 @@ static zend_object *zend_test_fiber_object_create(zend_class_entry *ce) memset(fiber, 0, sizeof(zend_test_fiber)); zend_object_std_init(&fiber->std, ce); + fiber->std.handlers = &zend_test_fiber_handlers; return &fiber->std; } @@ -343,7 +344,6 @@ void zend_test_fiber_init(void) { zend_test_fiber_class = register_class__ZendTestFiber(); zend_test_fiber_class->create_object = zend_test_fiber_object_create; - zend_test_fiber_class->default_object_handlers = &zend_test_fiber_handlers; zend_test_fiber_handlers = std_object_handlers; zend_test_fiber_handlers.dtor_obj = zend_test_fiber_object_destroy; diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 10abf4447b083..095fa23fe7746 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -1075,6 +1075,7 @@ static zend_object *php_zip_object_new(zend_class_entry *class_type) /* {{{ */ intern->prop_handler = &zip_prop_handlers; zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); + intern->zo.handlers = &zip_object_handlers; intern->last_id = -1; return &intern->zo; @@ -3100,7 +3101,6 @@ static PHP_MINIT_FUNCTION(zip) zip_class_entry = register_class_ZipArchive(zend_ce_countable); zip_class_entry->create_object = php_zip_object_new; - zip_class_entry->default_object_handlers = &zip_object_handlers; zend_hash_init(&zip_prop_handlers, 0, NULL, php_zip_free_prop_handler, 1); php_zip_register_prop_handler(&zip_prop_handlers, "lastId", php_zip_last_id, NULL, IS_LONG); diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 134892a14f900..d80db3194f0d8 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -60,6 +60,7 @@ static zend_object *inflate_context_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &inflate_context_object_handlers; return &intern->std; } @@ -98,6 +99,7 @@ static zend_object *deflate_context_create_object(zend_class_entry *class_type) zend_object_std_init(&intern->std, class_type); object_properties_init(&intern->std, class_type); + intern->std.handlers = &deflate_context_object_handlers; return &intern->std; } @@ -1338,7 +1340,6 @@ static PHP_MINIT_FUNCTION(zlib) inflate_context_ce = register_class_InflateContext(); inflate_context_ce->create_object = inflate_context_create_object; - inflate_context_ce->default_object_handlers = &inflate_context_object_handlers; memcpy(&inflate_context_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); inflate_context_object_handlers.offset = XtOffsetOf(php_zlib_context, std); @@ -1349,7 +1350,6 @@ static PHP_MINIT_FUNCTION(zlib) deflate_context_ce = register_class_DeflateContext(); deflate_context_ce->create_object = deflate_context_create_object; - deflate_context_ce->default_object_handlers = &deflate_context_object_handlers; memcpy(&deflate_context_object_handlers, &std_object_handlers, sizeof(zend_object_handlers)); deflate_context_object_handlers.offset = XtOffsetOf(php_zlib_context, std); From 5a0b68bed74e90aacdee316040dad99d14486a6c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 14 Sep 2022 11:18:14 +0200 Subject: [PATCH 1251/1346] Revert "Store default object handlers alongside the class entry" This reverts commit 9e6eab3c139b41dc976dd5305fd1a6e387e5e27f. Reverted along a01dd9fedaecd2e5b95bc5c2e8d6542116addeae. --- Zend/zend.h | 2 -- Zend/zend_API.h | 2 -- Zend/zend_attributes.c | 14 ++++++++++++- Zend/zend_closures.c | 2 +- Zend/zend_compile.c | 1 - Zend/zend_enum.c | 4 ++-- Zend/zend_exceptions.c | 45 +++++++++++++++++++++++++----------------- Zend/zend_fibers.c | 4 +++- Zend/zend_generators.c | 7 +++++-- Zend/zend_interfaces.c | 2 +- Zend/zend_objects.c | 2 +- Zend/zend_weakrefs.c | 6 ++++-- ext/dom/php_dom.c | 2 +- 13 files changed, 58 insertions(+), 35 deletions(-) diff --git a/Zend/zend.h b/Zend/zend.h index 5a31ee6562172..bea23cf40ba0d 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -182,8 +182,6 @@ struct _zend_class_entry { zend_function *__serialize; zend_function *__unserialize; - const zend_object_handlers *default_object_handlers; - /* allocated only if class implements Iterator or IteratorAggregate interface */ zend_class_iterator_funcs *iterator_funcs_ptr; /* allocated only if class implements ArrayAccess interface */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 7cb10f6a1d5a4..fa8c1162788f1 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -272,13 +272,11 @@ typedef struct _zend_fcall_info_cache { { \ memset(&class_container, 0, sizeof(zend_class_entry)); \ class_container.name = zend_string_init_interned(class_name, class_name_len, 1); \ - class_container.default_object_handlers = &std_object_handlers; \ class_container.info.internal.builtin_functions = functions; \ } #define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions) \ { \ - class_container.default_object_handlers = &std_object_handlers; \ class_container.constructor = NULL; \ class_container.destructor = NULL; \ class_container.clone = NULL; \ diff --git a/Zend/zend_attributes.c b/Zend/zend_attributes.c index b34092be038a2..5a446c8c2859e 100644 --- a/Zend/zend_attributes.c +++ b/Zend/zend_attributes.c @@ -131,6 +131,18 @@ ZEND_METHOD(SensitiveParameterValue, __debugInfo) RETURN_EMPTY_ARRAY(); } +static zend_object *attributes_sensitive_parameter_value_new(zend_class_entry *ce) +{ + zend_object *object; + + object = zend_objects_new(ce); + object->handlers = &attributes_object_handlers_sensitive_parameter_value; + + object_properties_init(object, ce); + + return object; +} + static HashTable *attributes_sensitive_parameter_value_get_properties_for(zend_object *zobj, zend_prop_purpose purpose) { return NULL; @@ -370,7 +382,7 @@ void zend_register_attribute_ce(void) /* This is not an actual attribute, thus the zend_mark_internal_attribute() call is missing. */ zend_ce_sensitive_parameter_value = register_class_SensitiveParameterValue(); - zend_ce_sensitive_parameter_value->default_object_handlers = &attributes_object_handlers_sensitive_parameter_value; + zend_ce_sensitive_parameter_value->create_object = attributes_sensitive_parameter_value_new; } void zend_attributes_shutdown(void) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 1f9285ef04468..f697f25a0f802 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -521,6 +521,7 @@ static zend_object *zend_closure_new(zend_class_entry *class_type) /* {{{ */ memset(closure, 0, sizeof(zend_closure)); zend_object_std_init(&closure->std, class_type); + closure->std.handlers = &closure_handlers; return (zend_object*)closure; } @@ -677,7 +678,6 @@ void zend_register_closure_ce(void) /* {{{ */ { zend_ce_closure = register_class_Closure(); zend_ce_closure->create_object = zend_closure_new; - zend_ce_closure->default_object_handlers = &closure_handlers; memcpy(&closure_handlers, &std_object_handlers, sizeof(zend_object_handlers)); closure_handlers.free_obj = zend_closure_free_storage; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 8631bb3ea4b2e..b84a9a45bc65e 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1829,7 +1829,6 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, bool nullify_hand ZEND_MAP_PTR_INIT(ce->static_members_table, NULL); ZEND_MAP_PTR_INIT(ce->mutable_data, NULL); - ce->default_object_handlers = &std_object_handlers; ce->default_properties_count = 0; ce->default_static_members_count = 0; ce->properties_info_table = NULL; diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index 192d0eca99131..59befde732194 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -47,6 +47,8 @@ zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case ZVAL_COPY(OBJ_PROP_NUM(zobj, 1), backing_value_zv); } + zobj->handlers = &enum_handlers; + return zobj; } @@ -182,8 +184,6 @@ void zend_enum_add_interfaces(zend_class_entry *ce) ce->interface_names[num_interfaces_before + 1].name = zend_string_copy(zend_ce_backed_enum->name); ce->interface_names[num_interfaces_before + 1].lc_name = zend_string_init("backedenum", sizeof("backedenum") - 1, 0); } - - ce->default_object_handlers = &enum_handlers; } zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 5a8ebdd0384c1..3934a3cef0717 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -240,7 +240,7 @@ ZEND_API void zend_clear_exception(void) /* {{{ */ } /* }}} */ -static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* {{{ */ +static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type, bool skip_top_traces) /* {{{ */ { zval tmp; zval trace; @@ -248,11 +248,13 @@ static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* zend_string *filename; zend_object *object = zend_objects_new(class_type); + object->handlers = &default_exception_handlers; + object_properties_init(object, class_type); if (EG(current_execute_data)) { zend_fetch_debug_backtrace(&trace, - 0, + skip_top_traces, EG(exception_ignore_args) ? DEBUG_BACKTRACE_IGNORE_ARGS : 0, 0); } else { array_init(&trace); @@ -280,6 +282,18 @@ static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* } /* }}} */ +static zend_object *zend_default_exception_new(zend_class_entry *class_type) /* {{{ */ +{ + return zend_default_exception_new_ex(class_type, 0); +} +/* }}} */ + +static zend_object *zend_error_exception_new(zend_class_entry *class_type) /* {{{ */ +{ + return zend_default_exception_new_ex(class_type, 0); +} +/* }}} */ + /* {{{ Clone the exception object */ ZEND_COLD ZEND_METHOD(Exception, __clone) { @@ -725,11 +739,6 @@ ZEND_METHOD(Exception, __toString) } /* }}} */ -static void zend_init_exception_class_entry(zend_class_entry *ce) { - ce->create_object = zend_default_exception_new; - ce->default_object_handlers = &default_exception_handlers; -} - void zend_register_default_exception(void) /* {{{ */ { zend_ce_throwable = register_class_Throwable(zend_ce_stringable); @@ -739,37 +748,37 @@ void zend_register_default_exception(void) /* {{{ */ default_exception_handlers.clone_obj = NULL; zend_ce_exception = register_class_Exception(zend_ce_throwable); - zend_init_exception_class_entry(zend_ce_exception); + zend_ce_exception->create_object = zend_default_exception_new; zend_ce_error_exception = register_class_ErrorException(zend_ce_exception); - zend_init_exception_class_entry(zend_ce_error_exception); + zend_ce_error_exception->create_object = zend_error_exception_new; zend_ce_error = register_class_Error(zend_ce_throwable); - zend_init_exception_class_entry(zend_ce_error); + zend_ce_error->create_object = zend_default_exception_new; zend_ce_compile_error = register_class_CompileError(zend_ce_error); - zend_init_exception_class_entry(zend_ce_compile_error); + zend_ce_compile_error->create_object = zend_default_exception_new; zend_ce_parse_error = register_class_ParseError(zend_ce_compile_error); - zend_init_exception_class_entry(zend_ce_parse_error); + zend_ce_parse_error->create_object = zend_default_exception_new; zend_ce_type_error = register_class_TypeError(zend_ce_error); - zend_init_exception_class_entry(zend_ce_type_error); + zend_ce_type_error->create_object = zend_default_exception_new; zend_ce_argument_count_error = register_class_ArgumentCountError(zend_ce_type_error); - zend_init_exception_class_entry(zend_ce_argument_count_error); + zend_ce_argument_count_error->create_object = zend_default_exception_new; zend_ce_value_error = register_class_ValueError(zend_ce_error); - zend_init_exception_class_entry(zend_ce_value_error); + zend_ce_value_error->create_object = zend_default_exception_new; zend_ce_arithmetic_error = register_class_ArithmeticError(zend_ce_error); - zend_init_exception_class_entry(zend_ce_arithmetic_error); + zend_ce_arithmetic_error->create_object = zend_default_exception_new; zend_ce_division_by_zero_error = register_class_DivisionByZeroError(zend_ce_arithmetic_error); - zend_init_exception_class_entry(zend_ce_division_by_zero_error); + zend_ce_division_by_zero_error->create_object = zend_default_exception_new; zend_ce_unhandled_match_error = register_class_UnhandledMatchError(zend_ce_error); - zend_init_exception_class_entry(zend_ce_unhandled_match_error); + zend_ce_unhandled_match_error->create_object = zend_default_exception_new; INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL); diff --git a/Zend/zend_fibers.c b/Zend/zend_fibers.c index 2df1f0917b32e..0bb45d1c3dc9c 100644 --- a/Zend/zend_fibers.c +++ b/Zend/zend_fibers.c @@ -589,9 +589,12 @@ static zend_always_inline zend_fiber_transfer zend_fiber_suspend(zend_fiber *fib static zend_object *zend_fiber_object_create(zend_class_entry *ce) { zend_fiber *fiber = emalloc(sizeof(zend_fiber)); + memset(fiber, 0, sizeof(zend_fiber)); zend_object_std_init(&fiber->std, ce); + fiber->std.handlers = &zend_fiber_handlers; + return &fiber->std; } @@ -900,7 +903,6 @@ void zend_register_fiber_ce(void) { zend_ce_fiber = register_class_Fiber(); zend_ce_fiber->create_object = zend_fiber_object_create; - zend_ce_fiber->default_object_handlers = &zend_fiber_handlers; zend_fiber_handlers = std_object_handlers; zend_fiber_handlers.dtor_obj = zend_fiber_object_destroy; diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 0d3c74b35bbc8..99c888ee09e93 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -404,7 +404,9 @@ static HashTable *zend_generator_get_gc(zend_object *object, zval **table, int * static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ */ { - zend_generator *generator = emalloc(sizeof(zend_generator)); + zend_generator *generator; + + generator = emalloc(sizeof(zend_generator)); memset(generator, 0, sizeof(zend_generator)); /* The key will be incremented on first use, so it'll start at 0 */ @@ -419,6 +421,8 @@ static zend_object *zend_generator_create(zend_class_entry *class_type) /* {{{ * generator->node.ptr.root = NULL; zend_object_std_init(&generator->std, class_type); + generator->std.handlers = &zend_generator_handlers; + return (zend_object*)generator; } /* }}} */ @@ -1128,7 +1132,6 @@ void zend_register_generator_ce(void) /* {{{ */ zend_ce_generator->create_object = zend_generator_create; /* get_iterator has to be assigned *after* implementing the interface */ zend_ce_generator->get_iterator = zend_generator_get_iterator; - zend_ce_generator->default_object_handlers = &zend_generator_handlers; memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers)); zend_generator_handlers.free_obj = zend_generator_free_storage; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index ec14b1a99a03f..1fa2493f17af5 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -480,6 +480,7 @@ typedef struct { static zend_object *zend_internal_iterator_create(zend_class_entry *ce) { zend_internal_iterator *intern = emalloc(sizeof(zend_internal_iterator)); zend_object_std_init(&intern->std, ce); + intern->std.handlers = &zend_internal_iterator_handlers; intern->iter = NULL; intern->rewind_called = 0; return &intern->std; @@ -654,7 +655,6 @@ ZEND_API void zend_register_interfaces(void) zend_ce_internal_iterator = register_class_InternalIterator(zend_ce_iterator); zend_ce_internal_iterator->create_object = zend_internal_iterator_create; - zend_ce_internal_iterator->default_object_handlers = &zend_internal_iterator_handlers; memcpy(&zend_internal_iterator_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index df76fa0bb8dc3..b09ce3b990d5c 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -31,7 +31,6 @@ static zend_always_inline void _zend_object_std_init(zend_object *object, zend_c GC_SET_REFCOUNT(object, 1); GC_TYPE_INFO(object) = GC_OBJECT; object->ce = ce; - object->handlers = ce->default_object_handlers; object->properties = NULL; zend_objects_store_put(object); if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) { @@ -187,6 +186,7 @@ ZEND_API zend_object* ZEND_FASTCALL zend_objects_new(zend_class_entry *ce) zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); _zend_object_std_init(object, ce); + object->handlers = &std_object_handlers; return object; } diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index db95b13a7254a..3f2e517f3fe4e 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -210,6 +210,9 @@ static zend_object* zend_weakref_new(zend_class_entry *ce) { zend_weakref *wr = zend_object_alloc(sizeof(zend_weakref), zend_ce_weakref); zend_object_std_init(&wr->std, zend_ce_weakref); + + wr->std.handlers = &zend_weakref_handlers; + return &wr->std; } @@ -301,6 +304,7 @@ static zend_object *zend_weakmap_create_object(zend_class_entry *ce) { zend_weakmap *wm = zend_object_alloc(sizeof(zend_weakmap), ce); zend_object_std_init(&wm->std, ce); + wm->std.handlers = &zend_weakmap_handlers; zend_hash_init(&wm->ht, 0, NULL, ZVAL_PTR_DTOR, 0); return &wm->std; @@ -647,7 +651,6 @@ void zend_register_weakref_ce(void) /* {{{ */ zend_ce_weakref = register_class_WeakReference(); zend_ce_weakref->create_object = zend_weakref_new; - zend_ce_weakref->default_object_handlers = &zend_weakref_handlers; memcpy(&zend_weakref_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std); @@ -659,7 +662,6 @@ void zend_register_weakref_ce(void) /* {{{ */ zend_ce_weakmap->create_object = zend_weakmap_create_object; zend_ce_weakmap->get_iterator = zend_weakmap_get_iterator; - zend_ce_weakmap->default_object_handlers = &zend_weakmap_handlers; memcpy(&zend_weakmap_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); zend_weakmap_handlers.offset = XtOffsetOf(zend_weakmap, std); diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 3d3260aee82f7..18b0bce90d3b8 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -782,7 +782,6 @@ PHP_MINIT_FUNCTION(dom) dom_xpath_class_entry = register_class_DOMXPath(); dom_xpath_class_entry->create_object = dom_xpath_objects_new; - dom_xpath_class_entry->default_object_handlers = &dom_xpath_object_handlers; zend_hash_init(&dom_xpath_prop_handlers, 0, NULL, dom_dtor_prop_handler, 1); dom_register_prop_handler(&dom_xpath_prop_handlers, "document", sizeof("document")-1, dom_xpath_document_read, NULL); @@ -990,6 +989,7 @@ zend_object *dom_xpath_objects_new(zend_class_entry *class_type) intern->register_node_ns = 1; intern->dom.prop_handler = &dom_xpath_prop_handlers; + intern->dom.std.handlers = &dom_xpath_object_handlers; zend_object_std_init(&intern->dom.std, class_type); object_properties_init(&intern->dom.std, class_type); From d1fc0017c9b18f8e389583f1c4e469e030f2bead Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 14 Sep 2022 11:28:06 +0200 Subject: [PATCH 1252/1346] Revert "Fix compilation on MacOS" This reverts commit 800c6672e57a01d68dcaba36f8f7d65c6871aafc. Reverted along with a01dd9fedaecd2e5b95bc5c2e8d6542116addeae. --- ext/spl/spl_array.c | 8 +++++--- ext/spl/spl_dllist.c | 4 +++- ext/spl/spl_fixedarray.c | 2 +- ext/spl/spl_heap.c | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 4098382c61c17..991fa88ded64a 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -177,7 +177,11 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o } while (parent) { - if (parent == spl_ce_ArrayIterator || parent == spl_ce_RecursiveArrayIterator || parent == spl_ce_ArrayObject) { + if (parent == spl_ce_ArrayIterator || parent == spl_ce_RecursiveArrayIterator) { + intern->std.handlers = &spl_handler_ArrayIterator; + break; + } else if (parent == spl_ce_ArrayObject) { + intern->std.handlers = &spl_handler_ArrayObject; break; } parent = parent->parent; @@ -1777,7 +1781,6 @@ PHP_MINIT_FUNCTION(spl_array) { spl_ce_ArrayObject = register_class_ArrayObject(zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable); spl_ce_ArrayObject->create_object = spl_array_object_new; - spl_ce_ArrayObject->default_object_handlers = &spl_handler_ArrayObject; memcpy(&spl_handler_ArrayObject, &std_object_handlers, sizeof(zend_object_handlers)); @@ -1803,7 +1806,6 @@ PHP_MINIT_FUNCTION(spl_array) spl_ce_ArrayIterator = register_class_ArrayIterator(spl_ce_SeekableIterator, zend_ce_arrayaccess, zend_ce_serializable, zend_ce_countable); spl_ce_ArrayIterator->create_object = spl_array_object_new; - spl_ce_ArrayIterator->default_object_handlers = &spl_handler_ArrayIterator; spl_ce_ArrayIterator->get_iterator = spl_array_get_iterator; memcpy(&spl_handler_ArrayIterator, &spl_handler_ArrayObject, sizeof(zend_object_handlers)); diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index a3c17d59668c0..186b9a34c7efa 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -344,11 +344,14 @@ static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zend_ while (parent) { if (parent == spl_ce_SplStack) { intern->flags |= (SPL_DLLIST_IT_FIX | SPL_DLLIST_IT_LIFO); + intern->std.handlers = &spl_handler_SplDoublyLinkedList; } else if (parent == spl_ce_SplQueue) { intern->flags |= SPL_DLLIST_IT_FIX; + intern->std.handlers = &spl_handler_SplDoublyLinkedList; } if (parent == spl_ce_SplDoublyLinkedList) { + intern->std.handlers = &spl_handler_SplDoublyLinkedList; break; } @@ -1254,7 +1257,6 @@ PHP_MINIT_FUNCTION(spl_dllist) /* {{{ */ zend_ce_iterator, zend_ce_countable, zend_ce_arrayaccess, zend_ce_serializable ); spl_ce_SplDoublyLinkedList->create_object = spl_dllist_object_new; - spl_ce_SplDoublyLinkedList->default_object_handlers = &spl_handler_SplDoublyLinkedList; spl_ce_SplDoublyLinkedList->get_iterator = spl_dllist_get_iterator; memcpy(&spl_handler_SplDoublyLinkedList, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 5c013408ea9f2..a00bb8965af65 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -282,6 +282,7 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z while (parent) { if (parent == spl_ce_SplFixedArray) { + intern->std.handlers = &spl_handler_SplFixedArray; break; } @@ -958,7 +959,6 @@ PHP_MINIT_FUNCTION(spl_fixedarray) spl_ce_SplFixedArray = register_class_SplFixedArray( zend_ce_aggregate, zend_ce_arrayaccess, zend_ce_countable, php_json_serializable_ce); spl_ce_SplFixedArray->create_object = spl_fixedarray_new; - spl_ce_SplFixedArray->default_object_handlers = &spl_handler_SplFixedArray; spl_ce_SplFixedArray->get_iterator = spl_fixedarray_get_iterator; memcpy(&spl_handler_SplFixedArray, &std_object_handlers, sizeof(zend_object_handlers)); diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 64fe962ee2de3..db35511f08d2d 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -428,6 +428,7 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zend_ob while (parent) { if (parent == spl_ce_SplPriorityQueue) { intern->heap = spl_ptr_heap_init(spl_ptr_pqueue_elem_cmp, spl_ptr_heap_pqueue_elem_ctor, spl_ptr_heap_pqueue_elem_dtor, sizeof(spl_pqueue_elem)); + intern->std.handlers = &spl_handler_SplPriorityQueue; intern->flags = SPL_PQUEUE_EXTR_DATA; break; } @@ -437,6 +438,7 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zend_ob intern->heap = spl_ptr_heap_init( parent == spl_ce_SplMinHeap ? spl_ptr_heap_zval_min_cmp : spl_ptr_heap_zval_max_cmp, spl_ptr_heap_zval_ctor, spl_ptr_heap_zval_dtor, sizeof(zval)); + intern->std.handlers = &spl_handler_SplHeap; break; } @@ -1127,7 +1129,6 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ { spl_ce_SplHeap = register_class_SplHeap(zend_ce_iterator, zend_ce_countable); spl_ce_SplHeap->create_object = spl_heap_object_new; - spl_ce_SplHeap->default_object_handlers = &spl_handler_SplHeap; spl_ce_SplHeap->get_iterator = spl_heap_get_iterator; memcpy(&spl_handler_SplHeap, &std_object_handlers, sizeof(zend_object_handlers)); @@ -1148,7 +1149,6 @@ PHP_MINIT_FUNCTION(spl_heap) /* {{{ */ spl_ce_SplPriorityQueue = register_class_SplPriorityQueue(zend_ce_iterator, zend_ce_countable); spl_ce_SplPriorityQueue->create_object = spl_heap_object_new; - spl_ce_SplPriorityQueue->default_object_handlers = &spl_handler_SplPriorityQueue; spl_ce_SplPriorityQueue->get_iterator = spl_pqueue_get_iterator; memcpy(&spl_handler_SplPriorityQueue, &std_object_handlers, sizeof(zend_object_handlers)); From 9f7e27a86bb0b3934696fbc8e3161e53d460a1d8 Mon Sep 17 00:00:00 2001 From: Bruce Dou Date: Tue, 13 Sep 2022 18:59:09 +0100 Subject: [PATCH 1253/1346] Fix: sockets constants Closes GH-9533. --- NEWS | 2 ++ ext/sockets/php_sockets.h | 26 ++++++++++++-------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index 0469f51c61bbd..33692a181811e 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,8 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC3 +- Sockets: + . Fixed socket constants regression as of PHP 8.2.0beta3. (Bruce Dou) 15 Sep 2022, PHP 8.2.0RC2 diff --git a/ext/sockets/php_sockets.h b/ext/sockets/php_sockets.h index 0e4623846ed8b..fdbc636538cf7 100644 --- a/ext/sockets/php_sockets.h +++ b/ext/sockets/php_sockets.h @@ -183,10 +183,14 @@ PHP_SOCKETS_API int socket_import_file_descriptor(PHP_SOCKET socket, php_socket #define PHP_SOCKET_EINVAL EINVAL #endif +#ifdef ENFILE +#define PHP_SOCKET_ENFILE ENFILE +#endif + #ifdef WIN32 #define PHP_SOCKET_EMFILE WSAEMFILE #elif defined(EMFILE) -#define PHP_SOCKET_ENFILE EMFILE +#define PHP_SOCKET_EMFILE EMFILE #endif #ifdef WIN32 @@ -257,7 +261,7 @@ PHP_SOCKETS_API int socket_import_file_descriptor(PHP_SOCKET socket, php_socket #ifdef WIN32 #define PHP_SOCKET_EPFNOSUPPORT WSAEPFNOSUPPORT -#elif defined(EOPNOTSUPP) +#elif defined(EPFNOSUPPORT) #define PHP_SOCKET_EPFNOSUPPORT EPFNOSUPPORT #endif @@ -293,8 +297,8 @@ PHP_SOCKETS_API int socket_import_file_descriptor(PHP_SOCKET socket, php_socket #ifdef WIN32 #define PHP_SOCKET_ENETRESET WSAENETRESET -#elif defined(WSAENETRESET) -#define PHP_SOCKET_ENETRESET ENETUNREACH +#elif defined(ENETRESET) +#define PHP_SOCKET_ENETRESET ENETRESET #endif #ifdef WIN32 @@ -304,9 +308,9 @@ PHP_SOCKETS_API int socket_import_file_descriptor(PHP_SOCKET socket, php_socket #endif #ifdef WIN32 -#define PHP_SOCKET_ECONNRESET WSAECONNABORTED -#elif defined(ECONNABORTED) -#define PHP_SOCKET_ECONNRESET ECONNABORTED +#define PHP_SOCKET_ECONNRESET WSAECONNRESET +#elif defined(ECONNRESET) +#define PHP_SOCKET_ECONNRESET ECONNRESET #endif #ifdef WIN32 @@ -329,16 +333,10 @@ PHP_SOCKETS_API int socket_import_file_descriptor(PHP_SOCKET socket, php_socket #ifdef WIN32 #define PHP_SOCKET_ESHUTDOWN WSAESHUTDOWN -#elif defined(EISCONN) +#elif defined(ESHUTDOWN) #define PHP_SOCKET_ESHUTDOWN ESHUTDOWN #endif -#ifdef WIN32 -#define PHP_SOCKET_ETOOMANYREFS WSAETOOMANYREFS -#elif defined(EISCONN) -#define PHP_SOCKET_ETOOMANYREFS ETOOMANYREFS -#endif - #ifdef WIN32 #define PHP_SOCKET_ETOOMANYREFS WSAETOOMANYREFS #elif defined(ETOOMANYREFS) From 06d4c70e5179baab2311c4b6e77760a101715de6 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 14 Sep 2022 16:33:05 +0100 Subject: [PATCH 1254/1346] Integrate timelib 2022.02 - Fixed #124: Can't parse INT_MIN - Added a new API, timelib_get_time_zone_offset_info, which reduces allocation speeding up algorithms (Alberto Massari) - Accelerate the do_range_limit_days algorythm by advancing multiple months in a single call (Alberto Massari) Including fixes from 2021.17: - Fixed 'const' and other compiler warnings - Use new 'PACKRAT' format to prevent old timestamps from becoming incorrect - New 2022b data file - Fixed PHP GH-9165: strtotime translates a date-time with DST/non-DST hour differently --- ext/date/lib/README.rst | 2 +- ext/date/lib/interval.c | 50 +++--- ext/date/lib/parse_date.c | 265 +++++++++++++++------------- ext/date/lib/parse_date.re | 61 +++++-- ext/date/lib/parse_iso_intervals.c | 4 +- ext/date/lib/parse_iso_intervals.re | 2 +- ext/date/lib/parse_tz.c | 37 +++- ext/date/lib/timelib.h | 27 ++- ext/date/lib/timelib_private.h | 14 ++ ext/date/lib/tm2unixtime.c | 97 +++++----- ext/date/lib/unixtime2tm.c | 7 +- 11 files changed, 336 insertions(+), 230 deletions(-) diff --git a/ext/date/lib/README.rst b/ext/date/lib/README.rst index 7a6d856c6ed6e..80b959b579abe 100644 --- a/ext/date/lib/README.rst +++ b/ext/date/lib/README.rst @@ -11,4 +11,4 @@ support. Build Requirements ------------------ -On Debian: ``apt install libcpputest-dev`` +On Debian: ``apt install libcpputest-dev re2c`` diff --git a/ext/date/lib/interval.c b/ext/date/lib/interval.c index d7a05d16ea915..ee4451b6acae1 100644 --- a/ext/date/lib/interval.c +++ b/ext/date/lib/interval.c @@ -90,8 +90,9 @@ static void sort_old_to_new(timelib_time **one, timelib_time **two, timelib_rel_ static timelib_rel_time *timelib_diff_with_tzid(timelib_time *one, timelib_time *two) { timelib_rel_time *rt; - timelib_sll dst_corr = 0, dst_h_corr = 0, dst_m_corr = 0; - timelib_time_offset *trans = NULL; + timelib_sll dst_corr = 0, dst_h_corr = 0, dst_m_corr = 0; + int32_t trans_offset; + timelib_sll trans_transition_time; rt = timelib_rel_time_ctor(); rt->invert = 0; @@ -117,16 +118,16 @@ static timelib_rel_time *timelib_diff_with_tzid(timelib_time *one, timelib_time if (one->dst == 1 && two->dst == 0) { /* First for two "Type 3" times */ if (one->zone_type == TIMELIB_ZONETYPE_ID && two->zone_type == TIMELIB_ZONETYPE_ID) { - trans = timelib_get_time_zone_info(two->sse, two->tz_info); - if (trans) { - if (one->sse < trans->transition_time && one->sse >= trans->transition_time + dst_corr) { + int success = timelib_get_time_zone_offset_info(two->sse, two->tz_info, &trans_offset, &trans_transition_time, NULL); + if ( + success && + one->sse < trans_transition_time && + one->sse >= trans_transition_time + dst_corr + ) { timelib_sll flipped = SECS_PER_HOUR + (rt->i * 60) + (rt->s); rt->h = flipped / SECS_PER_HOUR; rt->i = (flipped - rt->h * SECS_PER_HOUR) / 60; rt->s = flipped % 60; - } - timelib_time_offset_dtor(trans); - trans = NULL; } } else if (rt->h == 0 && (rt->i < 0 || rt->s < 0)) { /* Then for all the others */ @@ -145,12 +146,12 @@ static timelib_rel_time *timelib_diff_with_tzid(timelib_time *one, timelib_time if (one->zone_type == TIMELIB_ZONETYPE_ID && two->zone_type == TIMELIB_ZONETYPE_ID && strcmp(one->tz_info->name, two->tz_info->name) == 0) { if (one->dst == 1 && two->dst == 0) { /* Fall Back */ if (two->tz_info) { - trans = timelib_get_time_zone_info(two->sse, two->tz_info); + int success = timelib_get_time_zone_offset_info(two->sse, two->tz_info, &trans_offset, &trans_transition_time, NULL); if ( - trans && - two->sse >= trans->transition_time && - ((two->sse - one->sse + dst_corr) % SECS_PER_DAY) > (two->sse - trans->transition_time) + success && + two->sse >= trans_transition_time && + ((two->sse - one->sse + dst_corr) % SECS_PER_DAY) > (two->sse - trans_transition_time) ) { rt->h -= dst_h_corr; rt->i -= dst_m_corr; @@ -158,13 +159,13 @@ static timelib_rel_time *timelib_diff_with_tzid(timelib_time *one, timelib_time } } else if (one->dst == 0 && two->dst == 1) { /* Spring Forward */ if (two->tz_info) { - trans = timelib_get_time_zone_info(two->sse, two->tz_info); + int success = timelib_get_time_zone_offset_info(two->sse, two->tz_info, &trans_offset, &trans_transition_time, NULL); if ( - trans && - !((one->sse + SECS_PER_DAY > trans->transition_time) && (one->sse + SECS_PER_DAY <= (trans->transition_time + dst_corr))) && - two->sse >= trans->transition_time && - ((two->sse - one->sse + dst_corr) % SECS_PER_DAY) > (two->sse - trans->transition_time) + success && + !((one->sse + SECS_PER_DAY > trans_transition_time) && (one->sse + SECS_PER_DAY <= (trans_transition_time + dst_corr))) && + two->sse >= trans_transition_time && + ((two->sse - one->sse + dst_corr) % SECS_PER_DAY) > (two->sse - trans_transition_time) ) { rt->h -= dst_h_corr; rt->i -= dst_m_corr; @@ -172,12 +173,13 @@ static timelib_rel_time *timelib_diff_with_tzid(timelib_time *one, timelib_time } } else if (two->sse - one->sse >= SECS_PER_DAY) { /* Check whether we're in the period to the next transition time */ - trans = timelib_get_time_zone_info(two->sse - two->z, two->tz_info); - dst_corr = one->z - trans->offset; + if (timelib_get_time_zone_offset_info(two->sse - two->z, two->tz_info, &trans_offset, &trans_transition_time, NULL)) { + dst_corr = one->z - trans_offset; - if (two->sse >= trans->transition_time - dst_corr && two->sse < trans->transition_time) { - rt->d--; - rt->h = 24; + if (two->sse >= trans_transition_time - dst_corr && two->sse < trans_transition_time) { + rt->d--; + rt->h = 24; + } } } } else { @@ -189,10 +191,6 @@ static timelib_rel_time *timelib_diff_with_tzid(timelib_time *one, timelib_time timelib_do_rel_normalize(rt->invert ? one : two, rt); } - if (trans) { - timelib_time_offset_dtor(trans); - } - return rt; } diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 62fdc0d90dd88..06d0039b70007 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.15.3 on Fri Jul 22 15:29:55 2022 */ +/* Generated by re2c 0.15.3 on Wed Sep 14 16:31:52 2022 */ #line 1 "ext/date/lib/parse_date.re" /* * The MIT License (MIT) @@ -362,7 +362,7 @@ static timelib_error_message *alloc_error_message(timelib_error_message **messag return *messages + (*count)++; } -static void add_warning(Scanner *s, int error_code, char *error) +static void add_warning(Scanner *s, int error_code, const char *error) { timelib_error_message *message = alloc_error_message(&s->errors->warning_messages, &s->errors->warning_count); @@ -372,7 +372,7 @@ static void add_warning(Scanner *s, int error_code, char *error) message->message = timelib_strdup(error); } -static void add_error(Scanner *s, int error_code, char *error) +static void add_error(Scanner *s, int error_code, const char *error) { timelib_error_message *message = alloc_error_message(&s->errors->error_messages, &s->errors->error_count); @@ -382,7 +382,7 @@ static void add_error(Scanner *s, int error_code, char *error) message->message = timelib_strdup(error); } -static void add_pbf_warning(Scanner *s, int error_code, char *error, const char *sptr, const char *cptr) +static void add_pbf_warning(Scanner *s, int error_code, const char *error, const char *sptr, const char *cptr) { timelib_error_message *message = alloc_error_message(&s->errors->warning_messages, &s->errors->warning_count); @@ -392,7 +392,7 @@ static void add_pbf_warning(Scanner *s, int error_code, char *error, const char message->message = timelib_strdup(error); } -static void add_pbf_error(Scanner *s, int error_code, char *error, const char *sptr, const char *cptr) +static void add_pbf_error(Scanner *s, int error_code, const char *error, const char *sptr, const char *cptr) { timelib_error_message *message = alloc_error_message(&s->errors->error_messages, &s->errors->error_count); @@ -486,6 +486,7 @@ static timelib_sll timelib_get_nr_ex(const char **ptr, int max_length, int *scan } ++*ptr; } + begin = *ptr; while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) { ++*ptr; @@ -543,24 +544,49 @@ static timelib_sll timelib_get_frac_nr(const char **ptr) static timelib_ull timelib_get_signed_nr(Scanner *s, const char **ptr, int max_length) { - timelib_ull dir = 1; + char *str, *str_ptr; + timelib_sll tmp_nr = 0; + int len = 0; + + str = timelib_calloc(1, max_length + 2); // for sign and \0 + str_ptr = str; 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; } - while (**ptr == '+' || **ptr == '-') - { - if (**ptr == '-') { - dir *= -1; + if ((**ptr == '+') || (**ptr == '-')) { + *str_ptr = **ptr; + ++*ptr; + ++str_ptr; + } + + while (((**ptr < '0') || (**ptr > '9'))) { + if (**ptr == '\0') { + timelib_free(str); + add_error(s, TIMELIB_ERR_UNEXPECTED_DATA, "Found unexpected data"); + return 0; } ++*ptr; } - return dir * timelib_get_nr(ptr, max_length); + + while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) { + *str_ptr = **ptr; + ++*ptr; + ++str_ptr; + ++len; + } + + tmp_nr = strtoll(str, NULL, 10); + + timelib_free(str); + + return tmp_nr; } static timelib_sll timelib_lookup_relative_text(const char **ptr, int *behavior) @@ -952,11 +978,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) std: s->tok = cursor; s->len = 0; -#line 1085 "ext/date/lib/parse_date.re" +#line 1109 "ext/date/lib/parse_date.re" -#line 962 "" +#line 986 "" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1094,7 +1120,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy3: YYDEBUG(3, *YYCURSOR); -#line 1819 "ext/date/lib/parse_date.re" +#line 1843 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("tzcorrection | tz"); @@ -1107,7 +1133,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIMEZONE; } -#line 1113 "" +#line 1137 "" yy4: YYDEBUG(4, *YYCURSOR); yych = *++YYCURSOR; @@ -1414,12 +1440,12 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy1483; yy12: YYDEBUG(12, *YYCURSOR); -#line 1914 "ext/date/lib/parse_date.re" +#line 1938 "ext/date/lib/parse_date.re" { add_error(s, TIMELIB_ERR_UNEXPECTED_CHARACTER, "Unexpected character"); goto std; } -#line 1425 "" +#line 1449 "" yy13: YYDEBUG(13, *YYCURSOR); yych = *++YYCURSOR; @@ -2663,11 +2689,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy54; yy49: YYDEBUG(49, *YYCURSOR); -#line 1903 "ext/date/lib/parse_date.re" +#line 1927 "ext/date/lib/parse_date.re" { goto std; } -#line 2673 "" +#line 2697 "" yy50: YYDEBUG(50, *YYCURSOR); yych = *++YYCURSOR; @@ -2676,12 +2702,12 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(51, *YYCURSOR); ++YYCURSOR; YYDEBUG(52, *YYCURSOR); -#line 1908 "ext/date/lib/parse_date.re" +#line 1932 "ext/date/lib/parse_date.re" { s->pos = cursor; s->line++; goto std; } -#line 2687 "" +#line 2711 "" yy53: YYDEBUG(53, *YYCURSOR); yych = *++YYCURSOR; @@ -3103,7 +3129,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych == 's') goto yy85; yy84: YYDEBUG(84, *YYCURSOR); -#line 1887 "ext/date/lib/parse_date.re" +#line 1911 "ext/date/lib/parse_date.re" { timelib_ull i; DEBUG_OUTPUT("relative"); @@ -3118,7 +3144,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 3124 "" +#line 3148 "" yy85: YYDEBUG(85, *YYCURSOR); yych = *++YYCURSOR; @@ -4127,7 +4153,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy219: YYDEBUG(219, *YYCURSOR); -#line 1750 "ext/date/lib/parse_date.re" +#line 1774 "ext/date/lib/parse_date.re" { const timelib_relunit* relunit; DEBUG_OUTPUT("daytext"); @@ -4144,7 +4170,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_WEEKDAY; } -#line 4150 "" +#line 4174 "" yy220: YYDEBUG(220, *YYCURSOR); yych = *++YYCURSOR; @@ -4690,7 +4716,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy248: YYDEBUG(248, *YYCURSOR); -#line 1809 "ext/date/lib/parse_date.re" +#line 1833 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("monthtext"); TIMELIB_INIT; @@ -4699,7 +4725,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4705 "" +#line 4729 "" yy249: YYDEBUG(249, *YYCURSOR); ++YYCURSOR; @@ -4948,7 +4974,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) goto yy267; yy262: YYDEBUG(262, *YYCURSOR); -#line 1555 "ext/date/lib/parse_date.re" +#line 1579 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datetextual | datenoyear"); @@ -4961,7 +4987,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 4967 "" +#line 4991 "" yy263: YYDEBUG(263, *YYCURSOR); yyaccept = 6; @@ -5088,7 +5114,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy276: YYDEBUG(276, *YYCURSOR); -#line 1857 "ext/date/lib/parse_date.re" +#line 1881 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz"); @@ -5117,7 +5143,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 5123 "" +#line 5147 "" yy277: YYDEBUG(277, *YYCURSOR); yyaccept = 7; @@ -5415,7 +5441,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(300, *YYCURSOR); ++YYCURSOR; YYDEBUG(301, *YYCURSOR); -#line 1833 "ext/date/lib/parse_date.re" +#line 1857 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12"); TIMELIB_INIT; @@ -5438,7 +5464,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 5444 "" +#line 5468 "" yy302: YYDEBUG(302, *YYCURSOR); yych = *++YYCURSOR; @@ -6116,7 +6142,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(362, *YYCURSOR); ++YYCURSOR; YYDEBUG(363, *YYCURSOR); -#line 1527 "ext/date/lib/parse_date.re" +#line 1551 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenoday"); @@ -6129,7 +6155,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 6135 "" +#line 6159 "" yy364: YYDEBUG(364, *YYCURSOR); yych = *++YYCURSOR; @@ -6360,7 +6386,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy372; yy371: YYDEBUG(371, *YYCURSOR); -#line 1671 "ext/date/lib/parse_date.re" +#line 1695 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextshort"); @@ -6373,7 +6399,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 6379 "" +#line 6403 "" yy372: YYDEBUG(372, *YYCURSOR); yych = *++YYCURSOR; @@ -6955,7 +6981,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy398: YYDEBUG(398, *YYCURSOR); -#line 1729 "ext/date/lib/parse_date.re" +#line 1753 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("ago"); TIMELIB_INIT; @@ -6975,7 +7001,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_AGO; } -#line 6981 "" +#line 7005 "" yy399: YYDEBUG(399, *YYCURSOR); yyaccept = 5; @@ -8764,7 +8790,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy461: YYDEBUG(461, *YYCURSOR); -#line 1420 "ext/date/lib/parse_date.re" +#line 1444 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash"); TIMELIB_INIT; @@ -8775,7 +8801,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 8781 "" +#line 8805 "" yy462: YYDEBUG(462, *YYCURSOR); yych = *++YYCURSOR; @@ -8897,7 +8923,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(484, *YYCURSOR); ++YYCURSOR; YYDEBUG(485, *YYCURSOR); -#line 1446 "ext/date/lib/parse_date.re" +#line 1470 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("iso8601datex"); TIMELIB_INIT; @@ -8908,7 +8934,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 8914 "" +#line 8938 "" yy486: YYDEBUG(486, *YYCURSOR); yyaccept = 1; @@ -9662,7 +9688,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy509: YYDEBUG(509, *YYCURSOR); -#line 1569 "ext/date/lib/parse_date.re" +#line 1593 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenoyearrev"); TIMELIB_INIT; @@ -9673,7 +9699,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_TEXT; } -#line 9679 "" +#line 9703 "" yy510: YYDEBUG(510, *YYCURSOR); yyaccept = 9; @@ -9814,7 +9840,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(521, *YYCURSOR); ++YYCURSOR; YYDEBUG(522, *YYCURSOR); -#line 1273 "ext/date/lib/parse_date.re" +#line 1297 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12"); TIMELIB_INIT; @@ -9830,7 +9856,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIME12; } -#line 9836 "" +#line 9860 "" yy523: YYDEBUG(523, *YYCURSOR); yyaccept = 10; @@ -9843,7 +9869,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy524: YYDEBUG(524, *YYCURSOR); -#line 1310 "ext/date/lib/parse_date.re" +#line 1334 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("timetiny24 | timeshort24 | timelong24 | iso8601long"); @@ -9870,7 +9896,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 9876 "" +#line 9900 "" yy525: YYDEBUG(525, *YYCURSOR); yyaccept = 10; @@ -10183,7 +10209,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(556, *YYCURSOR); ++YYCURSOR; YYDEBUG(557, *YYCURSOR); -#line 1290 "ext/date/lib/parse_date.re" +#line 1314 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("mssqltime"); TIMELIB_INIT; @@ -10202,7 +10228,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 10208 "" +#line 10232 "" yy558: YYDEBUG(558, *YYCURSOR); yyaccept = 10; @@ -10308,7 +10334,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy574; yy568: YYDEBUG(568, *YYCURSOR); -#line 1486 "ext/date/lib/parse_date.re" +#line 1510 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datefull"); @@ -10322,7 +10348,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_FULL; } -#line 10328 "" +#line 10352 "" yy569: YYDEBUG(569, *YYCURSOR); yych = *++YYCURSOR; @@ -11058,7 +11084,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(639, *YYCURSOR); ++YYCURSOR; YYDEBUG(640, *YYCURSOR); -#line 1501 "ext/date/lib/parse_date.re" +#line 1525 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("pointed date YYYY"); TIMELIB_INIT; @@ -11069,7 +11095,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 11075 "" +#line 11099 "" yy641: YYDEBUG(641, *YYCURSOR); yyaccept = 10; @@ -11105,7 +11131,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy638; yy645: YYDEBUG(645, *YYCURSOR); -#line 1513 "ext/date/lib/parse_date.re" +#line 1537 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pointed date YY"); @@ -11118,7 +11144,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 11124 "" +#line 11148 "" yy646: YYDEBUG(646, *YYCURSOR); yyaccept = 10; @@ -11759,7 +11785,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy690: YYDEBUG(690, *YYCURSOR); -#line 1472 "ext/date/lib/parse_date.re" +#line 1496 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshort"); @@ -11772,7 +11798,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 11778 "" +#line 11802 "" yy691: YYDEBUG(691, *YYCURSOR); yyaccept = 12; @@ -11878,7 +11904,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy700: YYDEBUG(700, *YYCURSOR); -#line 1404 "ext/date/lib/parse_date.re" +#line 1428 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("americanshort | american"); @@ -11893,7 +11919,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_AMERICAN; } -#line 11899 "" +#line 11923 "" yy701: YYDEBUG(701, *YYCURSOR); yyaccept = 13; @@ -12127,7 +12153,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= ':') goto yy737; yy734: YYDEBUG(734, *YYCURSOR); -#line 1699 "ext/date/lib/parse_date.re" +#line 1723 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("clf"); @@ -12147,7 +12173,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 12153 "" +#line 12177 "" yy735: YYDEBUG(735, *YYCURSOR); yyaccept = 14; @@ -12767,7 +12793,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy808: YYDEBUG(808, *YYCURSOR); -#line 1432 "ext/date/lib/parse_date.re" +#line 1456 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("iso8601date2"); @@ -12780,7 +12806,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12786 "" +#line 12810 "" yy809: YYDEBUG(809, *YYCURSOR); yych = *++YYCURSOR; @@ -12819,7 +12845,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(815, *YYCURSOR); ++YYCURSOR; YYDEBUG(816, *YYCURSOR); -#line 1685 "ext/date/lib/parse_date.re" +#line 1709 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgtextreverse"); @@ -12832,7 +12858,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12838 "" +#line 12862 "" yy817: YYDEBUG(817, *YYCURSOR); yych = *++YYCURSOR; @@ -12997,7 +13023,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy828: YYDEBUG(828, *YYCURSOR); -#line 1720 "ext/date/lib/parse_date.re" +#line 1744 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("year4"); TIMELIB_INIT; @@ -13005,7 +13031,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 13011 "" +#line 13035 "" yy829: YYDEBUG(829, *YYCURSOR); yych = *++YYCURSOR; @@ -13210,7 +13236,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy838: YYDEBUG(838, *YYCURSOR); -#line 1541 "ext/date/lib/parse_date.re" +#line 1565 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("datenodayrev"); @@ -13223,7 +13249,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 13229 "" +#line 13253 "" yy839: YYDEBUG(839, *YYCURSOR); yych = *++YYCURSOR; @@ -13444,7 +13470,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '7') goto yy861; yy859: YYDEBUG(859, *YYCURSOR); -#line 1652 "ext/date/lib/parse_date.re" +#line 1676 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweek"); @@ -13462,7 +13488,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13468 "" +#line 13492 "" yy860: YYDEBUG(860, *YYCURSOR); yych = *++YYCURSOR; @@ -13472,7 +13498,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(861, *YYCURSOR); ++YYCURSOR; YYDEBUG(862, *YYCURSOR); -#line 1633 "ext/date/lib/parse_date.re" +#line 1657 "ext/date/lib/parse_date.re" { timelib_sll w, d; DEBUG_OUTPUT("isoweekday"); @@ -13490,7 +13516,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 13496 "" +#line 13520 "" yy863: YYDEBUG(863, *YYCURSOR); yych = *++YYCURSOR; @@ -13562,7 +13588,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy866: YYDEBUG(866, *YYCURSOR); -#line 1619 "ext/date/lib/parse_date.re" +#line 1643 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("pgydotd"); @@ -13575,7 +13601,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 13581 "" +#line 13605 "" yy867: YYDEBUG(867, *YYCURSOR); yych = *++YYCURSOR; @@ -13678,7 +13704,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy887: YYDEBUG(887, *YYCURSOR); -#line 1593 "ext/date/lib/parse_date.re" +#line 1617 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif"); @@ -13703,7 +13729,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 13709 "" +#line 13733 "" yy888: YYDEBUG(888, *YYCURSOR); yych = *++YYCURSOR; @@ -13999,7 +14025,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy893: YYDEBUG(893, *YYCURSOR); -#line 1581 "ext/date/lib/parse_date.re" +#line 1605 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("datenocolon"); TIMELIB_INIT; @@ -14010,7 +14036,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 14016 "" +#line 14040 "" yy894: YYDEBUG(894, *YYCURSOR); yych = *++YYCURSOR; @@ -14932,7 +14958,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1018: YYDEBUG(1018, *YYCURSOR); -#line 1458 "ext/date/lib/parse_date.re" +#line 1482 "ext/date/lib/parse_date.re" { int length = 0; DEBUG_OUTPUT("gnudateshorter"); @@ -14945,7 +14971,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 14951 "" +#line 14975 "" yy1019: YYDEBUG(1019, *YYCURSOR); yyaccept = 22; @@ -16153,7 +16179,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1127: YYDEBUG(1127, *YYCURSOR); -#line 1338 "ext/date/lib/parse_date.re" +#line 1362 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("gnunocolon"); TIMELIB_INIT; @@ -16175,7 +16201,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_GNU_NOCOLON; } -#line 16181 "" +#line 16205 "" yy1128: YYDEBUG(1128, *YYCURSOR); yych = *++YYCURSOR; @@ -16275,7 +16301,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1135: YYDEBUG(1135, *YYCURSOR); -#line 1384 "ext/date/lib/parse_date.re" +#line 1408 "ext/date/lib/parse_date.re" { int tz_not_found; DEBUG_OUTPUT("iso8601nocolon"); @@ -16294,7 +16320,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 16300 "" +#line 16324 "" yy1136: YYDEBUG(1136, *YYCURSOR); yyaccept = 25; @@ -17270,7 +17296,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1179: YYDEBUG(1179, *YYCURSOR); -#line 1792 "ext/date/lib/parse_date.re" +#line 1816 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -17286,7 +17312,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 17292 "" +#line 17316 "" yy1180: YYDEBUG(1180, *YYCURSOR); ++YYCURSOR; @@ -17352,7 +17378,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(1188, *YYCURSOR); ++YYCURSOR; YYDEBUG(1189, *YYCURSOR); -#line 1251 "ext/date/lib/parse_date.re" +#line 1275 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -17373,7 +17399,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_WEEK_DAY_OF_MONTH; } -#line 17379 "" +#line 17403 "" yy1190: YYDEBUG(1190, *YYCURSOR); yyaccept = 26; @@ -17513,7 +17539,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1206: YYDEBUG(1206, *YYCURSOR); -#line 1768 "ext/date/lib/parse_date.re" +#line 1792 "ext/date/lib/parse_date.re" { timelib_sll i; int behavior = 0; @@ -17536,7 +17562,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 17542 "" +#line 17566 "" yy1207: YYDEBUG(1207, *YYCURSOR); yych = *++YYCURSOR; @@ -20485,7 +20511,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1388: YYDEBUG(1388, *YYCURSOR); -#line 1228 "ext/date/lib/parse_date.re" +#line 1252 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("backof | frontof"); TIMELIB_INIT; @@ -20507,7 +20533,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 20513 "" +#line 20537 "" yy1389: YYDEBUG(1389, *YYCURSOR); yyaccept = 28; @@ -20806,7 +20832,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) YYDEBUG(1410, *YYCURSOR); ++YYCURSOR; YYDEBUG(1411, *YYCURSOR); -#line 1211 "ext/date/lib/parse_date.re" +#line 1235 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("firstdayof | lastdayof"); TIMELIB_INIT; @@ -20822,7 +20848,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 20828 "" +#line 20852 "" yy1412: YYDEBUG(1412, *YYCURSOR); yyaccept = 1; @@ -22344,7 +22370,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy1483; yy1485: YYDEBUG(1485, *YYCURSOR); -#line 1145 "ext/date/lib/parse_date.re" +#line 1169 "ext/date/lib/parse_date.re" { timelib_ull i; @@ -22369,7 +22395,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22375 "" +#line 22399 "" yy1486: YYDEBUG(1486, *YYCURSOR); ++YYCURSOR; @@ -22377,7 +22403,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) if (yych <= '9') goto yy1488; yy1487: YYDEBUG(1487, *YYCURSOR); -#line 1171 "ext/date/lib/parse_date.re" +#line 1195 "ext/date/lib/parse_date.re" { timelib_sll i; timelib_ull us; @@ -22416,7 +22442,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22422 "" +#line 22446 "" yy1488: YYDEBUG(1488, *YYCURSOR); yych = *++YYCURSOR; @@ -22885,7 +22911,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy1524: YYDEBUG(1524, *YYCURSOR); -#line 1133 "ext/date/lib/parse_date.re" +#line 1157 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("tomorrow"); TIMELIB_INIT; @@ -22896,7 +22922,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22902 "" +#line 22926 "" yy1525: YYDEBUG(1525, *YYCURSOR); yych = *++YYCURSOR; @@ -22931,7 +22957,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1527: YYDEBUG(1527, *YYCURSOR); -#line 1123 "ext/date/lib/parse_date.re" +#line 1147 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("midnight | today"); TIMELIB_INIT; @@ -22940,7 +22966,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22946 "" +#line 22970 "" yy1528: YYDEBUG(1528, *YYCURSOR); yych = *++YYCURSOR; @@ -25035,7 +25061,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1612: YYDEBUG(1612, *YYCURSOR); -#line 1102 "ext/date/lib/parse_date.re" +#line 1126 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("now"); TIMELIB_INIT; @@ -25043,7 +25069,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 25049 "" +#line 25073 "" yy1613: YYDEBUG(1613, *YYCURSOR); yych = *++YYCURSOR; @@ -25182,7 +25208,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) } yy1620: YYDEBUG(1620, *YYCURSOR); -#line 1111 "ext/date/lib/parse_date.re" +#line 1135 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("noon"); TIMELIB_INIT; @@ -25193,7 +25219,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 25199 "" +#line 25223 "" yy1621: YYDEBUG(1621, *YYCURSOR); yyaccept = 1; @@ -25726,7 +25752,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) ++YYCURSOR; yy1643: YYDEBUG(1643, *YYCURSOR); -#line 1090 "ext/date/lib/parse_date.re" +#line 1114 "ext/date/lib/parse_date.re" { DEBUG_OUTPUT("yesterday"); TIMELIB_INIT; @@ -25737,7 +25763,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 25743 "" +#line 25767 "" yy1644: YYDEBUG(1644, *YYCURSOR); yyaccept = 1; @@ -25910,7 +25936,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper) goto yy1643; } } -#line 1918 "ext/date/lib/parse_date.re" +#line 1942 "ext/date/lib/parse_date.re" } @@ -26618,15 +26644,18 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options) if (parsed->h == TIMELIB_UNSET) parsed->h = now->h != TIMELIB_UNSET ? now->h : 0; if (parsed->i == TIMELIB_UNSET) parsed->i = now->i != TIMELIB_UNSET ? now->i : 0; if (parsed->s == TIMELIB_UNSET) parsed->s = now->s != TIMELIB_UNSET ? now->s : 0; - if (parsed->z == TIMELIB_UNSET) parsed->z = now->z != TIMELIB_UNSET ? now->z : 0; - if (parsed->dst == TIMELIB_UNSET) parsed->dst = now->dst != TIMELIB_UNSET ? now->dst : 0; - if (!parsed->tz_abbr) { - parsed->tz_abbr = now->tz_abbr ? timelib_strdup(now->tz_abbr) : NULL; - } if (!parsed->tz_info) { parsed->tz_info = now->tz_info ? (!(options & TIMELIB_NO_CLONE) ? timelib_tzinfo_clone(now->tz_info) : now->tz_info) : NULL; + + if (parsed->z == TIMELIB_UNSET) parsed->z = now->z != TIMELIB_UNSET ? now->z : 0; + if (parsed->dst == TIMELIB_UNSET) parsed->dst = now->dst != TIMELIB_UNSET ? now->dst : 0; + + if (!parsed->tz_abbr) { + parsed->tz_abbr = now->tz_abbr ? timelib_strdup(now->tz_abbr) : NULL; + } } + if (parsed->zone_type == 0 && now->zone_type != 0) { parsed->zone_type = now->zone_type; /* parsed->tz_abbr = now->tz_abbr ? timelib_strdup(now->tz_abbr) : NULL; @@ -26638,7 +26667,7 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options) */ } -char *timelib_timezone_id_from_abbr(const char *abbr, timelib_long gmtoffset, int isdst) +const char *timelib_timezone_id_from_abbr(const char *abbr, timelib_long gmtoffset, int isdst) { const timelib_tz_lookup_table *tp; diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index ee2d1d8f5bf9a..db5540a020ebe 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -360,7 +360,7 @@ static timelib_error_message *alloc_error_message(timelib_error_message **messag return *messages + (*count)++; } -static void add_warning(Scanner *s, int error_code, char *error) +static void add_warning(Scanner *s, int error_code, const char *error) { timelib_error_message *message = alloc_error_message(&s->errors->warning_messages, &s->errors->warning_count); @@ -370,7 +370,7 @@ static void add_warning(Scanner *s, int error_code, char *error) message->message = timelib_strdup(error); } -static void add_error(Scanner *s, int error_code, char *error) +static void add_error(Scanner *s, int error_code, const char *error) { timelib_error_message *message = alloc_error_message(&s->errors->error_messages, &s->errors->error_count); @@ -380,7 +380,7 @@ static void add_error(Scanner *s, int error_code, char *error) message->message = timelib_strdup(error); } -static void add_pbf_warning(Scanner *s, int error_code, char *error, const char *sptr, const char *cptr) +static void add_pbf_warning(Scanner *s, int error_code, const char *error, const char *sptr, const char *cptr) { timelib_error_message *message = alloc_error_message(&s->errors->warning_messages, &s->errors->warning_count); @@ -390,7 +390,7 @@ static void add_pbf_warning(Scanner *s, int error_code, char *error, const char message->message = timelib_strdup(error); } -static void add_pbf_error(Scanner *s, int error_code, char *error, const char *sptr, const char *cptr) +static void add_pbf_error(Scanner *s, int error_code, const char *error, const char *sptr, const char *cptr) { timelib_error_message *message = alloc_error_message(&s->errors->error_messages, &s->errors->error_count); @@ -484,6 +484,7 @@ static timelib_sll timelib_get_nr_ex(const char **ptr, int max_length, int *scan } ++*ptr; } + begin = *ptr; while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) { ++*ptr; @@ -541,24 +542,49 @@ static timelib_sll timelib_get_frac_nr(const char **ptr) static timelib_ull timelib_get_signed_nr(Scanner *s, const char **ptr, int max_length) { - timelib_ull dir = 1; + char *str, *str_ptr; + timelib_sll tmp_nr = 0; + int len = 0; + + str = timelib_calloc(1, max_length + 2); // for sign and \0 + str_ptr = str; 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; } - while (**ptr == '+' || **ptr == '-') - { - if (**ptr == '-') { - dir *= -1; + if ((**ptr == '+') || (**ptr == '-')) { + *str_ptr = **ptr; + ++*ptr; + ++str_ptr; + } + + while (((**ptr < '0') || (**ptr > '9'))) { + if (**ptr == '\0') { + timelib_free(str); + add_error(s, TIMELIB_ERR_UNEXPECTED_DATA, "Found unexpected data"); + return 0; } ++*ptr; } - return dir * timelib_get_nr(ptr, max_length); + + while ((**ptr >= '0') && (**ptr <= '9') && len < max_length) { + *str_ptr = **ptr; + ++*ptr; + ++str_ptr; + ++len; + } + + tmp_nr = strtoll(str, NULL, 10); + + timelib_free(str); + + return tmp_nr; } static timelib_sll timelib_lookup_relative_text(const char **ptr, int *behavior) @@ -2620,15 +2646,18 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options) if (parsed->h == TIMELIB_UNSET) parsed->h = now->h != TIMELIB_UNSET ? now->h : 0; if (parsed->i == TIMELIB_UNSET) parsed->i = now->i != TIMELIB_UNSET ? now->i : 0; if (parsed->s == TIMELIB_UNSET) parsed->s = now->s != TIMELIB_UNSET ? now->s : 0; - if (parsed->z == TIMELIB_UNSET) parsed->z = now->z != TIMELIB_UNSET ? now->z : 0; - if (parsed->dst == TIMELIB_UNSET) parsed->dst = now->dst != TIMELIB_UNSET ? now->dst : 0; - if (!parsed->tz_abbr) { - parsed->tz_abbr = now->tz_abbr ? timelib_strdup(now->tz_abbr) : NULL; - } if (!parsed->tz_info) { parsed->tz_info = now->tz_info ? (!(options & TIMELIB_NO_CLONE) ? timelib_tzinfo_clone(now->tz_info) : now->tz_info) : NULL; + + if (parsed->z == TIMELIB_UNSET) parsed->z = now->z != TIMELIB_UNSET ? now->z : 0; + if (parsed->dst == TIMELIB_UNSET) parsed->dst = now->dst != TIMELIB_UNSET ? now->dst : 0; + + if (!parsed->tz_abbr) { + parsed->tz_abbr = now->tz_abbr ? timelib_strdup(now->tz_abbr) : NULL; + } } + if (parsed->zone_type == 0 && now->zone_type != 0) { parsed->zone_type = now->zone_type; /* parsed->tz_abbr = now->tz_abbr ? timelib_strdup(now->tz_abbr) : NULL; @@ -2640,7 +2669,7 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options) */ } -char *timelib_timezone_id_from_abbr(const char *abbr, timelib_long gmtoffset, int isdst) +const char *timelib_timezone_id_from_abbr(const char *abbr, timelib_long gmtoffset, int isdst) { const timelib_tz_lookup_table *tp; diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c index 8643859239b69..6715d5cee525f 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 Fri Jul 22 15:30:08 2022 */ +/* Generated by re2c 0.15.3 on Wed Sep 14 16:32:05 2022 */ #line 1 "ext/date/lib/parse_iso_intervals.re" /* * The MIT License (MIT) @@ -88,7 +88,7 @@ typedef struct _Scanner { int have_end_date; } Scanner; -static void add_error(Scanner *s, char *error) +static void add_error(Scanner *s, const char *error) { s->errors->error_count++; s->errors->error_messages = timelib_realloc(s->errors->error_messages, s->errors->error_count * sizeof(timelib_error_message)); diff --git a/ext/date/lib/parse_iso_intervals.re b/ext/date/lib/parse_iso_intervals.re index bd4015a323a39..2a394156f98df 100644 --- a/ext/date/lib/parse_iso_intervals.re +++ b/ext/date/lib/parse_iso_intervals.re @@ -86,7 +86,7 @@ typedef struct _Scanner { int have_end_date; } Scanner; -static void add_error(Scanner *s, char *error) +static void add_error(Scanner *s, const char *error) { s->errors->error_count++; s->errors->error_messages = timelib_realloc(s->errors->error_messages, s->errors->error_count * sizeof(timelib_error_message)); diff --git a/ext/date/lib/parse_tz.c b/ext/date/lib/parse_tz.c index e41315efdbf75..c7f93580d725f 100644 --- a/ext/date/lib/parse_tz.c +++ b/ext/date/lib/parse_tz.c @@ -910,21 +910,42 @@ timelib_time_offset *timelib_get_time_zone_info(timelib_sll ts, timelib_tzinfo * return tmp; } -timelib_sll timelib_get_current_offset(timelib_time *t) +int timelib_get_time_zone_offset_info(timelib_sll ts, timelib_tzinfo *tz, int32_t* offset, timelib_sll* transition_time, unsigned int* is_dst) { - timelib_time_offset *gmt_offset; - timelib_sll retval; + ttinfo *to; + timelib_sll tmp_transition_time; + + if (tz == NULL) { + return 0; + } + + if ((to = timelib_fetch_timezone_offset(tz, ts, &tmp_transition_time))) { + if (offset) { + *offset = to->offset; + } + if (is_dst) { + *is_dst = to->isdst; + } + if (transition_time) { + *transition_time = tmp_transition_time; + } + return 1; + } + return 0; +} +timelib_sll timelib_get_current_offset(timelib_time *t) +{ switch (t->zone_type) { case TIMELIB_ZONETYPE_ABBR: case TIMELIB_ZONETYPE_OFFSET: return t->z + (t->dst * 3600); - case TIMELIB_ZONETYPE_ID: - gmt_offset = timelib_get_time_zone_info(t->sse, t->tz_info); - retval = gmt_offset->offset; - timelib_time_offset_dtor(gmt_offset); - return retval; + case TIMELIB_ZONETYPE_ID: { + int32_t offset = 0; + timelib_get_time_zone_offset_info(t->sse, t->tz_info, &offset, NULL, NULL); + return offset; + } default: return 0; diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h index 7751ed218e4bc..3b559b95f4743 100644 --- a/ext/date/lib/timelib.h +++ b/ext/date/lib/timelib.h @@ -30,9 +30,9 @@ # include "timelib_config.h" #endif -#define TIMELIB_VERSION 202201 -#define TIMELIB_EXTENDED_VERSION 20220101 -#define TIMELIB_ASCII_VERSION "2022.01" +#define TIMELIB_VERSION 202202 +#define TIMELIB_EXTENDED_VERSION 20220102 +#define TIMELIB_ASCII_VERSION "2022.02" #include #include @@ -342,10 +342,10 @@ typedef struct _timelib_error_container { } timelib_error_container; typedef struct _timelib_tz_lookup_table { - char *name; + const char *name; int type; float gmtoffset; - char *full_tz_name; + const char *full_tz_name; } timelib_tz_lookup_table; typedef struct _timelib_tzdb_index_entry { @@ -354,7 +354,7 @@ typedef struct _timelib_tzdb_index_entry { } timelib_tzdb_index_entry; typedef struct _timelib_tzdb { - char *version; + const char *version; int index_size; const timelib_tzdb_index_entry *index; const unsigned char *data; @@ -584,7 +584,7 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options); * * The returned char* is not duplicated, and should not be freed. */ -char *timelib_timezone_id_from_abbr(const char *abbr, timelib_long gmtoffset, int isdst); +const char *timelib_timezone_id_from_abbr(const char *abbr, timelib_long gmtoffset, int isdst); /* Returns an array of known time zone abbreviations * @@ -793,6 +793,19 @@ int timelib_timestamp_is_in_dst(timelib_sll ts, timelib_tzinfo *tz); */ timelib_time_offset *timelib_get_time_zone_info(timelib_sll ts, timelib_tzinfo *tz); +/** + * Returns offset information with time zone 'tz' for the time stamp 'ts'. + * + * The returned information contains: the offset in seconds East of UTC (in + * the output parameter 'offset'), whether DST is active (in the output + * parameter 'is_dst'), and the transition time that got to this state (in + * the output parameter 'transition_time'); if NULL is passed, the value is + * not retrieved + * + * Returns 1 if successful, 0 for failure. + */ +int timelib_get_time_zone_offset_info(timelib_sll ts, timelib_tzinfo *tz, int32_t* offset, timelib_sll* transition_time, unsigned int* is_dst); + /** * Returns the UTC offset currently applicable for the information stored in 't'. * diff --git a/ext/date/lib/timelib_private.h b/ext/date/lib/timelib_private.h index 2015a15dbf76f..65ec6b014b894 100644 --- a/ext/date/lib/timelib_private.h +++ b/ext/date/lib/timelib_private.h @@ -112,6 +112,20 @@ m = NULL; \ } +#if defined (__GNUC__) +# define TIMELIB_GNUC_CHECK_VERSION(major, minor) \ + ((__GNUC__ > (major)) || \ + ((__GNUC__ == (major)) && (__GNUC_MINOR__ >= (minor)))) +#else +# define TIMELIB_GNUC_CHECK_VERSION(major, minor) 0 +#endif + +#if TIMELIB_GNUC_CHECK_VERSION(7, 0) +# define TIMELIB_BREAK_INTENTIONALLY_MISSING __attribute__ ((fallthrough)); +#else +# define TIMELIB_BREAK_INTENTIONALLY_MISSING +#endif + struct _ttinfo { int32_t offset; diff --git a/ext/date/lib/tm2unixtime.c b/ext/date/lib/tm2unixtime.c index 7740b25e97eb6..08332bb470624 100644 --- a/ext/date/lib/tm2unixtime.c +++ b/ext/date/lib/tm2unixtime.c @@ -104,9 +104,10 @@ static void do_range_limit_days_relative(timelib_sll *base_y, timelib_sll *base_ static int do_range_limit_days(timelib_sll *y, timelib_sll *m, timelib_sll *d) { timelib_sll leapyear; - timelib_sll days_this_month; - timelib_sll last_month, last_year; - timelib_sll days_last_month; + timelib_sll previous_month, previous_year; + timelib_sll days_in_previous_month; + int retval = 0; + int *days_per_month_current_year; /* can jump an entire leap year period quickly */ if (*d >= DAYS_PER_ERA || *d <= -DAYS_PER_ERA) { @@ -117,29 +118,29 @@ static int do_range_limit_days(timelib_sll *y, timelib_sll *m, timelib_sll *d) do_range_limit(1, 13, 12, m, y); leapyear = timelib_is_leap(*y); - days_this_month = leapyear ? days_in_month_leap[*m] : days_in_month[*m]; - last_month = (*m) - 1; - - if (last_month < 1) { - last_month += 12; - last_year = (*y) - 1; - } else { - last_year = (*y); - } - leapyear = timelib_is_leap(last_year); - days_last_month = leapyear ? days_in_month_leap[last_month] : days_in_month[last_month]; + days_per_month_current_year = leapyear ? days_in_month_leap : days_in_month; + + while (*d <= 0 && *m > 0) { + previous_month = (*m) - 1; + if (previous_month < 1) { + previous_month += 12; + previous_year = (*y) - 1; + } else { + previous_year = (*y); + } + leapyear = timelib_is_leap(previous_year); + days_in_previous_month = leapyear ? days_in_month_leap[previous_month] : days_in_month[previous_month]; - if (*d <= 0) { - *d += days_last_month; + *d += days_in_previous_month; (*m)--; - return 1; + retval = 1; } - if (*d > days_this_month) { - *d -= days_this_month; + while (*d > 0 && *m <= 12 && *d > days_per_month_current_year[*m]) { + *d -= days_per_month_current_year[*m]; (*m)++; - return 1; + retval = 1; } - return 0; + return retval; } static void do_adjust_for_weekday(timelib_time* time) @@ -372,11 +373,15 @@ static void do_adjust_timezone(timelib_time *tz, timelib_tzinfo *tzi) case TIMELIB_ZONETYPE_ID: tzi = tz->tz_info; - /* Break intentionally missing */ + TIMELIB_BREAK_INTENTIONALLY_MISSING default: { /* No timezone in struct, fallback to reference if possible */ - timelib_time_offset *current, *after; + int32_t current_offset = 0; + timelib_sll current_transition_time = 0; + unsigned int current_is_dst = 0; + int32_t after_offset = 0; + timelib_sll after_transition_time = 0; timelib_sll adjustment; int in_transition; int32_t actual_offset; @@ -386,49 +391,47 @@ static void do_adjust_timezone(timelib_time *tz, timelib_tzinfo *tzi) return; } - current = timelib_get_time_zone_info(tz->sse, tzi); - after = timelib_get_time_zone_info(tz->sse - current->offset, tzi); - actual_offset = after->offset; - actual_transition_time = after->transition_time; - if (current->offset == after->offset && tz->have_zone) { + timelib_get_time_zone_offset_info(tz->sse, tzi, ¤t_offset, ¤t_transition_time, ¤t_is_dst); + timelib_get_time_zone_offset_info(tz->sse - current_offset, tzi, &after_offset, &after_transition_time, NULL); + actual_offset = after_offset; + actual_transition_time = after_transition_time; + if (current_offset == after_offset && tz->have_zone) { /* Make sure we're not missing a DST change because we don't know the actual offset yet */ - if (current->offset >= 0 && tz->dst && !current->is_dst) { + if (current_offset >= 0 && tz->dst && !current_is_dst) { /* Timezone or its DST at or east of UTC, so the local time, interpreted as UTC, leaves DST (as defined in the actual timezone) before the actual local time */ - timelib_time_offset *earlier; - earlier = timelib_get_time_zone_info(tz->sse - current->offset - 7200, tzi); - if ((earlier->offset != after->offset) && (tz->sse - earlier->offset < after->transition_time)) { + int32_t earlier_offset; + timelib_sll earlier_transition_time; + timelib_get_time_zone_offset_info(tz->sse - current_offset - 7200, tzi, &earlier_offset, &earlier_transition_time, NULL); + if ((earlier_offset != after_offset) && (tz->sse - earlier_offset < after_transition_time)) { /* Looking behind a bit clarified the actual offset to use */ - actual_offset = earlier->offset; - actual_transition_time = earlier->transition_time; + actual_offset = earlier_offset; + actual_transition_time = earlier_transition_time; } - timelib_time_offset_dtor(earlier); - } else if (current->offset <= 0 && current->is_dst && !tz->dst) { + } else if (current_offset <= 0 && current_is_dst && !tz->dst) { /* Timezone west of UTC, so the local time, interpreted as UTC, leaves DST (as defined in the actual timezone) after the actual local time */ - timelib_time_offset *later; - later = timelib_get_time_zone_info(tz->sse - current->offset + 7200, tzi); - if ((later->offset != after->offset) && (tz->sse - later->offset >= later->transition_time)) { + int32_t later_offset; + timelib_sll later_transition_time; + timelib_get_time_zone_offset_info(tz->sse - current_offset + 7200, tzi, &later_offset, &later_transition_time, NULL); + if ((later_offset != after_offset) && (tz->sse - later_offset >= later_transition_time)) { /* Looking ahead a bit clarified the actual offset to use */ - actual_offset = later->offset; - actual_transition_time = later->transition_time; + actual_offset = later_offset; + actual_transition_time = later_transition_time; } - timelib_time_offset_dtor(later); } } tz->is_localtime = 1; in_transition = ( - ((tz->sse - actual_offset) >= (actual_transition_time + (current->offset - actual_offset))) && + ((tz->sse - actual_offset) >= (actual_transition_time + (current_offset - actual_offset))) && ((tz->sse - actual_offset) < actual_transition_time) ); - if ((current->offset != actual_offset) && !in_transition) { + if ((current_offset != actual_offset) && !in_transition) { adjustment = -actual_offset; } else { - adjustment = -current->offset; + adjustment = -current_offset; } - timelib_time_offset_dtor(current); - timelib_time_offset_dtor(after); tz->sse += adjustment; timelib_set_timezone(tz, tzi); diff --git a/ext/date/lib/unixtime2tm.c b/ext/date/lib/unixtime2tm.c index f8ea921663338..30b3d00c7f440 100644 --- a/ext/date/lib/unixtime2tm.c +++ b/ext/date/lib/unixtime2tm.c @@ -97,11 +97,10 @@ void timelib_update_from_sse(timelib_time *tm) } case TIMELIB_ZONETYPE_ID: { - timelib_time_offset *gmt_offset; + int32_t offset = 0; - gmt_offset = timelib_get_time_zone_info(tm->sse, tm->tz_info); - timelib_unixtime2gmt(tm, tm->sse + gmt_offset->offset); - timelib_time_offset_dtor(gmt_offset); + timelib_get_time_zone_offset_info(tm->sse, tm->tz_info, &offset, NULL, NULL); + timelib_unixtime2gmt(tm, tm->sse + offset); goto cleanup; } From f8b27c73c9ba9d747f86c617df93ae46b3b898e2 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 14 Sep 2022 16:40:06 +0100 Subject: [PATCH 1255/1346] Use 'const' for fixed API --- ext/date/php_date.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 321817235dd36..fbdf0082e80c6 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3786,7 +3786,7 @@ PHP_FUNCTION(timezone_name_get) PHP_FUNCTION(timezone_name_from_abbr) { zend_string *abbr; - char *tzid; + const char *tzid; zend_long gmtoffset = -1; zend_long isdst = -1; From 7448ee365c00054bcbf2c0493e6cca152865ba21 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 14 Sep 2022 16:44:46 +0100 Subject: [PATCH 1256/1346] Add test case for timelib #124 --- ext/date/tests/bug40861.phpt | 2 +- ext/date/tests/gh-124.phpt | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ext/date/tests/gh-124.phpt diff --git a/ext/date/tests/bug40861.phpt b/ext/date/tests/bug40861.phpt index d4ef96198c7ff..224d8eb0a71de 100644 --- a/ext/date/tests/bug40861.phpt +++ b/ext/date/tests/bug40861.phpt @@ -28,6 +28,6 @@ echo $result . "\n"; ?> --EXPECT-- 2000-01-01 13:00:00 -2000-01-01 11:00:00 2000-01-01 13:00:00 +2000-01-01 11:00:00 2000-01-01 13:00:00 diff --git a/ext/date/tests/gh-124.phpt b/ext/date/tests/gh-124.phpt new file mode 100644 index 0000000000000..432bf06e80885 --- /dev/null +++ b/ext/date/tests/gh-124.phpt @@ -0,0 +1,21 @@ +--TEST-- +Test for timelib #124: Problem with large negative timestamps +--INI-- +date.timezone=UTC +--FILE-- +getTimestamp()); +var_dump((new DateTime('-292277022657-01-27 08:29:52 UTC'))->getTimestamp()); +var_dump((new DateTime('-292277022657-01-27 08:29:53 UTC'))->getTimestamp()); + +var_dump((new DateTime("@9223372036854775807"))->getTimestamp()); +var_dump((new DateTime('+292277026596-12-04 15:30:07 UTC'))->getTimestamp()); +echo (new DateTime('+2512370164-01-01 00:00:00Z'))->format(DATE_RFC3339_EXTENDED); +?> +--EXPECT-- +int(-9223372036854775808) +int(-9223372036854775808) +int(-9223372036854775807) +int(9223372036854775807) +int(9223372036854775807) +2512370164-01-01T00:00:00.000+00:00 From 0f9351669b44f5bcbd44c5e05f60d292f8137f7d Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 14 Sep 2022 16:44:54 +0100 Subject: [PATCH 1257/1346] Update NEWS --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index 33692a181811e..514c475d9109c 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC3 +- Date: + . Fixed bug with parsing large negative numbers with the @ notation. (Derick) + - Sockets: . Fixed socket constants regression as of PHP 8.2.0beta3. (Bruce Dou) From 52850a4c0f26bd80ac15836f07e07c775b72eda8 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 14 Sep 2022 22:18:59 +0200 Subject: [PATCH 1258/1346] Fix cleaup of fileinfo test --- ext/fileinfo/tests/cve-2014-3538-nojit.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/fileinfo/tests/cve-2014-3538-nojit.phpt b/ext/fileinfo/tests/cve-2014-3538-nojit.phpt index f3a5fa7fb4f73..5ddc2765ee556 100644 --- a/ext/fileinfo/tests/cve-2014-3538-nojit.phpt +++ b/ext/fileinfo/tests/cve-2014-3538-nojit.phpt @@ -34,7 +34,7 @@ if ($t < 1) { Done --CLEAN-- --EXPECTF-- string(%d) "%s" From 2cdf7b91e517170aecee73817bfef5dce09f4717 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 14 Sep 2022 23:03:34 +0200 Subject: [PATCH 1259/1346] Skip 64-bit specific date test on 32-bit --- ext/date/tests/gh-124.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/date/tests/gh-124.phpt b/ext/date/tests/gh-124.phpt index 432bf06e80885..bc77092b12938 100644 --- a/ext/date/tests/gh-124.phpt +++ b/ext/date/tests/gh-124.phpt @@ -2,6 +2,8 @@ Test for timelib #124: Problem with large negative timestamps --INI-- date.timezone=UTC +--SKIPIF-- + --FILE-- getTimestamp()); From 7e860eaef01a8ae5009bc0ed046e4eb1032411fb Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 14 Sep 2022 21:35:44 +0200 Subject: [PATCH 1260/1346] Don't throw CompileError after parsing Aborting parsing is not safe, a fatal error is necessary. See https://github.com/php/php-src/commit/b9f7123c5e4ccdc3c381ab949ff01e3c14f3465c --- .../use_statement/aliasing_builtin_types.phpt | 74 +------------------ Zend/zend_compile.c | 3 +- 2 files changed, 4 insertions(+), 73 deletions(-) diff --git a/Zend/tests/use_statement/aliasing_builtin_types.phpt b/Zend/tests/use_statement/aliasing_builtin_types.phpt index beeab41d7b3b0..681a77c24b28a 100644 --- a/Zend/tests/use_statement/aliasing_builtin_types.phpt +++ b/Zend/tests/use_statement/aliasing_builtin_types.phpt @@ -3,76 +3,8 @@ Aliasing built-in types --FILE-- getMessage(), PHP_EOL; - } - try { - eval("use $type as A; function foo$type(A \$v): A { return \$v; }"); - } catch (\Throwable $e) { - echo $e::class, ': ', $e->getMessage(), PHP_EOL; - } -} +use bool as A; ?> -DONE ---EXPECT-- -CompileError: Cannot alias 'bool' as it is a built-in type -CompileError: Cannot alias 'bool' as it is a built-in type -CompileError: Cannot alias 'false' as it is a built-in type -CompileError: Cannot alias 'false' as it is a built-in type -CompileError: Cannot alias 'float' as it is a built-in type -CompileError: Cannot alias 'float' as it is a built-in type -CompileError: Cannot alias 'int' as it is a built-in type -CompileError: Cannot alias 'int' as it is a built-in type -CompileError: Cannot alias 'null' as it is a built-in type -CompileError: Cannot alias 'null' as it is a built-in type -CompileError: Cannot alias 'parent' as it is a built-in type -CompileError: Cannot alias 'parent' as it is a built-in type -CompileError: Cannot alias 'self' as it is a built-in type -CompileError: Cannot alias 'self' as it is a built-in type -ParseError: syntax error, unexpected token "static" -ParseError: syntax error, unexpected token "static" -CompileError: Cannot alias 'string' as it is a built-in type -CompileError: Cannot alias 'string' as it is a built-in type -CompileError: Cannot alias 'true' as it is a built-in type -CompileError: Cannot alias 'true' as it is a built-in type -CompileError: Cannot alias 'void' as it is a built-in type -CompileError: Cannot alias 'void' as it is a built-in type -CompileError: Cannot alias 'never' as it is a built-in type -CompileError: Cannot alias 'never' as it is a built-in type -CompileError: Cannot alias 'iterable' as it is a built-in type -CompileError: Cannot alias 'iterable' as it is a built-in type -CompileError: Cannot alias 'object' as it is a built-in type -CompileError: Cannot alias 'object' as it is a built-in type -CompileError: Cannot alias 'mixed' as it is a built-in type -CompileError: Cannot alias 'mixed' as it is a built-in type -ParseError: syntax error, unexpected token "array" -ParseError: syntax error, unexpected token "array" -ParseError: syntax error, unexpected token "list" -ParseError: syntax error, unexpected token "list" -DONE +--EXPECTF-- +Fatal error: Cannot alias 'bool' as it is a built-in type in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b84a9a45bc65e..3b686176894b6 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8083,9 +8083,8 @@ static void zend_compile_use(zend_ast *ast) /* {{{ */ /* Check that we are not attempting to alias a built-in type */ if (type == ZEND_SYMBOL_CLASS && zend_is_reserved_class_name(old_name)) { - zend_throw_exception_ex(zend_ce_compile_error, 0, + zend_error_noreturn(E_COMPILE_ERROR, "Cannot alias '%s' as it is a built-in type", ZSTR_VAL(old_name)); - return; } if (new_name_ast) { From 946cdb8ad1c3ba4ea6af92c19394e911c17ebd2b Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 15 Sep 2022 16:03:58 +0200 Subject: [PATCH 1261/1346] remove LIBZIP_VERSION constant def from stub --- ext/zip/php_zip.c | 6 ++++++ ext/zip/php_zip.h | 6 ------ ext/zip/php_zip.stub.php | 6 ------ ext/zip/php_zip_arginfo.h | 9 +-------- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 095fa23fe7746..5e75b85c4ad6e 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -3110,6 +3110,12 @@ static PHP_MINIT_FUNCTION(zip) php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, php_zipobj_get_filename, IS_STRING); php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, IS_STRING); +#ifdef HAVE_LIBZIP_VERSION + zend_declare_class_constant_string(zip_class_entry, "LIBZIP_VERSION", sizeof("LIBZIP_VERSION")-1, zip_libzip_version()); +#else + zend_declare_class_constant_string(zip_class_entry, "LIBZIP_VERSION", sizeof("LIBZIP_VERSION")-1, LIBZIP_VERSION); +#endif + php_register_url_stream_wrapper("zip", &php_stream_zip_wrapper); le_zip_dir = zend_register_list_destructors_ex(php_zip_free_dir, NULL, le_zip_dir_name, module_number); diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index f725752c9afe0..d13df678522d3 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -33,12 +33,6 @@ extern zend_module_entry zip_module_entry; #define PHP_ZIP_VERSION "1.21.0" -#ifdef HAVE_LIBZIP_VERSION -#define LIBZIP_VERSION_STR zip_libzip_version() -#else -#define LIBZIP_VERSION_STR LIBZIP_VERSION -#endif - #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) typedef struct _ze_zip_rsrc { diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php index c225d493cb3d4..8501da223ea5f 100644 --- a/ext/zip/php_zip.stub.php +++ b/ext/zip/php_zip.stub.php @@ -633,12 +633,6 @@ class ZipArchive implements Countable */ public const EM_UNKNOWN = UNKNOWN; - /** - * @var string - * @cvalue LIBZIP_VERSION_STR - */ - public const LIBZIP_VERSION = UNKNOWN; - /** @readonly */ public int $lastId; /** @readonly */ diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h index 208ccb9df692a..58b2bdf534de0 100644 --- a/ext/zip/php_zip_arginfo.h +++ b/ext/zip/php_zip_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: d8c14dfe45c7eff2c18fd3c562488a827f658e12 */ + * Stub hash: 52db51284a16b7664a3f66ea5d8a4a7b23aa5127 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -1154,13 +1154,6 @@ static zend_class_entry *register_class_ZipArchive(zend_class_entry *class_entry zend_declare_class_constant_ex(class_entry, const_EM_UNKNOWN_name, &const_EM_UNKNOWN_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_EM_UNKNOWN_name); - zval const_LIBZIP_VERSION_value; - zend_string *const_LIBZIP_VERSION_value_str = zend_string_init(LIBZIP_VERSION_STR, sizeof(LIBZIP_VERSION_STR) - 1, 1); - ZVAL_STR(&const_LIBZIP_VERSION_value, const_LIBZIP_VERSION_value_str); - zend_string *const_LIBZIP_VERSION_name = zend_string_init_interned("LIBZIP_VERSION", sizeof("LIBZIP_VERSION") - 1, 1); - zend_declare_class_constant_ex(class_entry, const_LIBZIP_VERSION_name, &const_LIBZIP_VERSION_value, ZEND_ACC_PUBLIC, NULL); - zend_string_release(const_LIBZIP_VERSION_name); - zval property_lastId_default_value; ZVAL_UNDEF(&property_lastId_default_value); zend_string *property_lastId_name = zend_string_init("lastId", sizeof("lastId") - 1, 1); From ef4c20dea9bea2121a8820f6b533a221c03b8c02 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Thu, 15 Sep 2022 16:41:54 +0200 Subject: [PATCH 1262/1346] zip version bump to 1.21.1 --- ext/zip/php_zip.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index d13df678522d3..85e2e5f24320d 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -31,7 +31,7 @@ extern zend_module_entry zip_module_entry; #define ZIP_OVERWRITE ZIP_TRUNCATE #endif -#define PHP_ZIP_VERSION "1.21.0" +#define PHP_ZIP_VERSION "1.21.1" #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) From 70ad93dd6e8ba2002773712b234c9378f3c10670 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 15 Sep 2022 22:36:07 +0200 Subject: [PATCH 1263/1346] Fix serialization of empty SplFixedArray Avoid null pointer deref. --- ext/spl/spl_fixedarray.c | 15 +++++++++------ ext/spl/tests/SplFixedArray_serialize.phpt | 6 ++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index a00bb8965af65..cf304e738a4da 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -597,8 +597,9 @@ PHP_METHOD(SplFixedArray, __serialize) RETURN_THROWS(); } - uint32_t property_num = zend_hash_num_elements(intern->std.properties); - array_init_size(return_value, intern->array.size + property_num); + uint32_t num_properties = + intern->std.properties ? zend_hash_num_elements(intern->std.properties) : 0; + array_init_size(return_value, intern->array.size + num_properties); /* elements */ for (zend_long i = 0; i < intern->array.size; i++) { @@ -608,10 +609,12 @@ PHP_METHOD(SplFixedArray, __serialize) } /* members */ - ZEND_HASH_FOREACH_STR_KEY_VAL(intern->std.properties, key, current) { - zend_hash_add(Z_ARRVAL_P(return_value), key, current); - Z_TRY_ADDREF_P(current); - } ZEND_HASH_FOREACH_END(); + if (intern->std.properties) { + ZEND_HASH_FOREACH_STR_KEY_VAL(intern->std.properties, key, current) { + zend_hash_add(Z_ARRVAL_P(return_value), key, current); + Z_TRY_ADDREF_P(current); + } ZEND_HASH_FOREACH_END(); + } } PHP_METHOD(SplFixedArray, __unserialize) diff --git a/ext/spl/tests/SplFixedArray_serialize.phpt b/ext/spl/tests/SplFixedArray_serialize.phpt index da7c212109ecd..bf8cb897f7fc5 100644 --- a/ext/spl/tests/SplFixedArray_serialize.phpt +++ b/ext/spl/tests/SplFixedArray_serialize.phpt @@ -38,6 +38,9 @@ $array->__unserialize([ ]); var_dump($array); +var_dump($s = serialize(new SplFixedArray)); +var_dump(unserialize($s)); + ?> --EXPECTF-- Deprecated: Creation of dynamic property SplFixedArray::$foo is deprecated in %s on line %d @@ -71,3 +74,6 @@ object(SplFixedArray)#5 (1) { [0]=> NULL } +string(25) "O:13:"SplFixedArray":0:{}" +object(SplFixedArray)#1 (0) { +} From dbbb7427beb0c2ce3cd8eff2519a93e851d67c66 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Fri, 16 Sep 2022 01:29:12 +0200 Subject: [PATCH 1264/1346] Backport skipping of ext/date/tests/gh-124.phpt on ASAN --- ext/date/tests/gh-124.phpt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ext/date/tests/gh-124.phpt b/ext/date/tests/gh-124.phpt index bc77092b12938..074e519d4399e 100644 --- a/ext/date/tests/gh-124.phpt +++ b/ext/date/tests/gh-124.phpt @@ -3,7 +3,10 @@ Test for timelib #124: Problem with large negative timestamps --INI-- date.timezone=UTC --SKIPIF-- - + --FILE-- getTimestamp()); From 6622c54c530d6ba163da4eacb3de58ddf6126072 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 15 Sep 2022 20:56:43 +0200 Subject: [PATCH 1265/1346] Fix class link observer with file_cache_only=1 Previously, notify would only get called on classes with CE_CACHE. However, during compilation class names are non-permanent which won't get a CE_CACHE and thus wouldn't not get notified. Closes GH-9550 --- NEWS | 3 +++ ext/opcache/zend_accelerator_util_funcs.c | 8 +++---- .../observer_declarations_file_cache.phpt | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 ext/zend_test/tests/observer_declarations_file_cache.phpt diff --git a/NEWS b/NEWS index 514c475d9109c..b54e7aa33b835 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC3 +- Core: + . Fixed observer class notify with Opcache file_cache_only=1. (ilutov) + - Date: . Fixed bug with parsing large negative numbers with the @ notation. (Derick) diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index aab83bce4ecfc..9a64f92dab6ee 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -232,10 +232,10 @@ static zend_always_inline void _zend_accel_class_hash_copy(HashTable *target, Ha } else { zend_class_entry *ce = Z_PTR(p->val); _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1); - if ((ce->ce_flags & ZEND_ACC_LINKED) - && ZSTR_HAS_CE_CACHE(ce->name) - && ZSTR_VAL(p->key)[0]) { - ZSTR_SET_CE_CACHE_EX(ce->name, ce, 0); + if ((ce->ce_flags & ZEND_ACC_LINKED) && ZSTR_VAL(p->key)[0]) { + if (ZSTR_HAS_CE_CACHE(ce->name)) { + ZSTR_SET_CE_CACHE_EX(ce->name, ce, 0); + } if (UNEXPECTED(call_observers)) { _zend_observer_class_linked_notify(ce, p->key); } diff --git a/ext/zend_test/tests/observer_declarations_file_cache.phpt b/ext/zend_test/tests/observer_declarations_file_cache.phpt new file mode 100644 index 0000000000000..df20e359c0e58 --- /dev/null +++ b/ext/zend_test/tests/observer_declarations_file_cache.phpt @@ -0,0 +1,23 @@ +--TEST-- +Observer: Observe function and class declarations with file_cache_only +--EXTENSIONS-- +zend_test +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_declaring=1 +opcache.enable_cli=1 +opcache.file_cache={TMP} +opcache.file_cache_only=1 +--FILE-- + +--EXPECTF-- + + + + From ac54bfb17c85298c4d1392de6cc3e6c63e78e5a3 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 16 Sep 2022 16:51:27 +0200 Subject: [PATCH 1266/1346] Fix test in "DEBUG_NTS_OPCACHE Without interned strings" build --- ext/opcache/tests/file_cache_error.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/tests/file_cache_error.phpt b/ext/opcache/tests/file_cache_error.phpt index 75b63cd21cce0..1e3d26d49167f 100644 --- a/ext/opcache/tests/file_cache_error.phpt +++ b/ext/opcache/tests/file_cache_error.phpt @@ -8,6 +8,7 @@ pcntl opcache.enable_cli=1 opcache.file_cache={TMP} opcache.log_verbosity_level=2 +opcache.interned_strings_buffer=8 --SKIPIF-- Date: Thu, 15 Sep 2022 11:24:09 +0200 Subject: [PATCH 1267/1346] Fix test with POSIX_RLIMIT_FSIZE and gcov --- ext/opcache/tests/file_cache_error.phpt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ext/opcache/tests/file_cache_error.phpt b/ext/opcache/tests/file_cache_error.phpt index 1e3d26d49167f..6c61a0c2e570e 100644 --- a/ext/opcache/tests/file_cache_error.phpt +++ b/ext/opcache/tests/file_cache_error.phpt @@ -11,8 +11,10 @@ opcache.log_verbosity_level=2 opcache.interned_strings_buffer=8 --SKIPIF-- --FILE-- --EXPECTF-- bool(true) From fe0eaf107af8da9c0149550463d05eeda0b46adb Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Fri, 16 Sep 2022 17:07:52 +0200 Subject: [PATCH 1268/1346] Fix UB pointer arithmetics on NULL Closes GH-9559 --- Zend/zend_opcode.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index aabcac8eb0a27..8d998d03786e2 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -305,12 +305,14 @@ ZEND_API void destroy_zend_class(zval *zv) } } ZEND_HASH_FOREACH_END(); - p = ce->default_properties_table; - end = p + ce->default_properties_count; + if (ce->default_properties_table) { + p = ce->default_properties_table; + end = p + ce->default_properties_count; - while (p < end) { - zval_ptr_dtor_nogc(p); - p++; + while (p < end) { + zval_ptr_dtor_nogc(p); + p++; + } } return; } From eba3be4d3862484d05c4577786ca7283ee90a94e Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sun, 18 Sep 2022 15:43:12 +0200 Subject: [PATCH 1269/1346] NEWS: Add entry for GH-8805 [ci skip] Signed-off-by: Anatol Belski --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index b54e7aa33b835..15c8f1ff881f9 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,10 @@ PHP NEWS - Date: . Fixed bug with parsing large negative numbers with the @ notation. (Derick) +- Fileinfo: + . Fixed bug GH-8805 (finfo returns wrong mime type for woff/woff2 files). + (Anatol) + - Sockets: . Fixed socket constants regression as of PHP 8.2.0beta3. (Bruce Dou) From 33918f999d2d624f1a8dfcdff1d7b3073076ebd1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 19 Sep 2022 13:12:49 +0300 Subject: [PATCH 1270/1346] Fixed warning --- Zend/tests/gc_046.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/tests/gc_046.phpt b/Zend/tests/gc_046.phpt index 74481fb76a7ea..d5024737365b1 100644 --- a/Zend/tests/gc_046.phpt +++ b/Zend/tests/gc_046.phpt @@ -5,6 +5,7 @@ zend.enable_gc=1 --FILE-- iterator = new ArrayIterator($this); } From 4767b0999d79eb41d2a9988dcc186018006d9008 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 19 Sep 2022 13:10:21 +0200 Subject: [PATCH 1271/1346] Fix GH-9574: SOCKET_EPROTO constant missing since PHP 8.2 dev Closes GH-9575. --- ext/sockets/sockets.stub.php | 4 ++-- ext/sockets/sockets_arginfo.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/sockets/sockets.stub.php b/ext/sockets/sockets.stub.php index 997d3eb2f7ec7..9e4664d045139 100644 --- a/ext/sockets/sockets.stub.php +++ b/ext/sockets/sockets.stub.php @@ -1105,11 +1105,11 @@ */ const SOCKET_ECOMM = UNKNOWN; #endif -#ifdef PHP_SOCKET_EPROTO +#ifdef EPROTO /** * Protocol error * @var int - * @cvalue PHP_SOCKET_EPROTO + * @cvalue EPROTO */ const SOCKET_EPROTO = UNKNOWN; #endif diff --git a/ext/sockets/sockets_arginfo.h b/ext/sockets/sockets_arginfo.h index ff76685e2ae88..c2e3c18b2cd65 100644 --- a/ext/sockets/sockets_arginfo.h +++ b/ext/sockets/sockets_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: c4fe33bd6d665f80be942c9cc9c0ce954d719c0d */ + * Stub hash: d28c6b566f4739b1eaefb82032e620aeb59728dc */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_socket_select, 0, 4, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(1, read, IS_ARRAY, 1) @@ -738,8 +738,8 @@ static void register_sockets_symbols(int module_number) #if defined(ECOMM) REGISTER_LONG_CONSTANT("SOCKET_ECOMM", ECOMM, CONST_PERSISTENT); #endif -#if defined(PHP_SOCKET_EPROTO) - REGISTER_LONG_CONSTANT("SOCKET_EPROTO", PHP_SOCKET_EPROTO, CONST_PERSISTENT); +#if defined(EPROTO) + REGISTER_LONG_CONSTANT("SOCKET_EPROTO", EPROTO, CONST_PERSISTENT); #endif #if defined(EMULTIHOP) REGISTER_LONG_CONSTANT("SOCKET_EMULTIHOP", EMULTIHOP, CONST_PERSISTENT); From 7496a400aae122414056f2b1f7294b12b458ae96 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 19 Sep 2022 15:45:34 +0300 Subject: [PATCH 1272/1346] Fix SSA construction and type inference Fixes oss-fuzz #51476 --- Zend/Optimizer/zend_inference.c | 17 ++++++++++++++++- Zend/Optimizer/zend_ssa.c | 12 ++++++------ ext/opcache/tests/opt/inference_020.phpt | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 ext/opcache/tests/opt/inference_020.phpt diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index c1b75a3b743a5..271d9d1811ca4 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2305,7 +2305,13 @@ static zend_always_inline zend_result _zend_update_type_info( * unreachable code. Propagate the empty result early, so that that the following * code may assume that operands have at least one type. */ if (!(t1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS)) - || !(t2 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS))) { + || !(t2 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS)) + || ((opline->opcode == ZEND_ASSIGN_DIM_OP + || opline->opcode == ZEND_ASSIGN_OBJ_OP + || opline->opcode == ZEND_ASSIGN_STATIC_PROP_OP + || opline->opcode == ZEND_ASSIGN_DIM + || opline->opcode == ZEND_ASSIGN_OBJ) + && !(OP1_DATA_INFO() & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS)) /*&& 0*/)) { tmp = 0; if (ssa_op->result_def >= 0 && !(ssa_var_info[ssa_op->result_def].type & MAY_BE_REF)) { UPDATE_SSA_TYPE(tmp, ssa_op->result_def); @@ -2316,6 +2322,15 @@ static zend_always_inline zend_result _zend_update_type_info( if (ssa_op->op2_def >= 0 && !(ssa_var_info[ssa_op->op2_def].type & MAY_BE_REF)) { UPDATE_SSA_TYPE(tmp, ssa_op->op2_def); } + if (opline->opcode == ZEND_ASSIGN_OP + || opline->opcode == ZEND_ASSIGN_DIM_OP + || opline->opcode == ZEND_ASSIGN_OBJ_OP + || opline->opcode == ZEND_ASSIGN_DIM + || opline->opcode == ZEND_ASSIGN_OBJ) { + if ((ssa_op+1)->op1_def >= 0 && !(ssa_var_info[(ssa_op+1)->op1_def].type & MAY_BE_REF)) { + UPDATE_SSA_TYPE(tmp, (ssa_op+1)->op1_def); + } + } return SUCCESS; } diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 11f25b6825fee..d6d0e70eae8a5 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -588,12 +588,6 @@ static zend_always_inline int _zend_ssa_rename_op(const zend_op_array *op_array, break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: - if (opline->op1_type == IS_CV) { - ssa_ops[k].op1_def = ssa_vars_count; - var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; - ssa_vars_count++; - //NEW_SSA_VAR(opline->op1.var) - } next = opline + 1; if (next->op1_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { ssa_ops[k + 1].op1_use = var[EX_VAR_TO_NUM(next->op1.var)]; @@ -605,6 +599,12 @@ static zend_always_inline int _zend_ssa_rename_op(const zend_op_array *op_array, //NEW_SSA_VAR(next->op1.var) } } + if (opline->op1_type == IS_CV) { + ssa_ops[k].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(opline->op1.var) + } break; case ZEND_ASSIGN_OBJ_REF: if (opline->op1_type == IS_CV) { diff --git a/ext/opcache/tests/opt/inference_020.phpt b/ext/opcache/tests/opt/inference_020.phpt new file mode 100644 index 0000000000000..bacb244d96c97 --- /dev/null +++ b/ext/opcache/tests/opt/inference_020.phpt @@ -0,0 +1,17 @@ +--TEST-- +Type inference 020; +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- + +DONE +--EXPECT-- +DONE From d7d6794f94e45b13d00d760f5b6a85fa8ca0edac Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Fri, 16 Sep 2022 11:01:52 +0100 Subject: [PATCH 1273/1346] Use external diff tool if TEST_PHP_DIFF_CMD env var is set --- run-tests.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/run-tests.php b/run-tests.php index 157a821ddfeec..f351564bff978 100755 --- a/run-tests.php +++ b/run-tests.php @@ -2696,7 +2696,12 @@ function run_test(string $php, $file, array $env): string } // write .diff - $diff = generate_diff($wanted, $wanted_re, $output); + if (!empty($environment['TEST_PHP_DIFF_CMD'])) { + $diff = generate_diff_external($environment['TEST_PHP_DIFF_CMD'], $exp_filename, $output_filename); + } else { + $diff = generate_diff($wanted, $wanted_re, $output); + } + if (is_array($IN_REDIRECT)) { $orig_shortname = str_replace(TEST_PHP_SRCDIR . '/', '', $file); $diff = "# original source file: $orig_shortname\n" . $diff; @@ -2959,6 +2964,13 @@ function generate_array_diff(array $ar1, array $ar2, bool $is_reg, array $w): ar return $diff; } +function generate_diff_external(string $diff_cmd, string $exp_file, string $output_file): string +{ + $retval = shell_exec("{$diff_cmd} {$exp_file} {$output_file}"); + + return is_string($retval) ? $retval : 'Could not run external diff tool set through PHP_TEST_DIFF_CMD environment variable'; +} + function generate_diff(string $wanted, ?string $wanted_re, string $output): string { $w = explode("\n", $wanted); From 28a4d7676a3f72bc951198aaff1be65389f36abd Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Mon, 19 Sep 2022 12:43:44 +0200 Subject: [PATCH 1274/1346] declare random globals as public API --- ext/random/php_random.h | 2 ++ ext/random/random.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/random/php_random.h b/ext/random/php_random.h index cc05a03c86932..a2c518af28c0e 100644 --- a/ext/random/php_random.h +++ b/ext/random/php_random.h @@ -319,6 +319,8 @@ ZEND_BEGIN_MODULE_GLOBALS(random) int random_fd; ZEND_END_MODULE_GLOBALS(random) +PHPAPI ZEND_EXTERN_MODULE_GLOBALS(random) + # define RANDOM_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(random, v) #endif /* PHP_RANDOM_H */ diff --git a/ext/random/random.c b/ext/random/random.c index 2380a83b75890..7cd1bfc8c939d 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -64,7 +64,7 @@ #include "random_arginfo.h" -ZEND_DECLARE_MODULE_GLOBALS(random) +PHPAPI ZEND_DECLARE_MODULE_GLOBALS(random) PHPAPI zend_class_entry *random_ce_Random_Engine; PHPAPI zend_class_entry *random_ce_Random_CryptoSafeEngine; From ca399841add27751494d8890301145668968836a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20R=C3=BCsweg?= Date: Tue, 20 Sep 2022 16:41:31 +0100 Subject: [PATCH 1275/1346] Remove superfluous helper variable in `Randomizer::getBytes()` (#9563) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove superfluous helper variable in Randomizer::getBytes() * Reduce the scope of `result` in Randomizer::getBytes() Co-authored-by: Tim Düsterhus --- ext/random/randomizer.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index b66a88169cbe2..0e3d90120b6fc 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -141,8 +141,7 @@ PHP_METHOD(Random_Randomizer, getBytes) php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS); zend_string *retval; zend_long length; - uint64_t result; - size_t total_size = 0, required_size; + size_t total_size = 0; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_LONG(length) @@ -154,17 +153,16 @@ PHP_METHOD(Random_Randomizer, getBytes) } retval = zend_string_alloc(length, 0); - required_size = length; - while (total_size < required_size) { - result = randomizer->algo->generate(randomizer->status); + while (total_size < length) { + uint64_t result = randomizer->algo->generate(randomizer->status); if (EG(exception)) { zend_string_free(retval); RETURN_THROWS(); } for (size_t i = 0; i < randomizer->status->last_generated_size; i++) { ZSTR_VAL(retval)[total_size++] = (result >> (i * 8)) & 0xff; - if (total_size >= required_size) { + if (total_size >= length) { break; } } From 3071d85a6bc40a69c9d3d00cccc5780f46c015d7 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Tue, 20 Sep 2022 22:07:38 +0200 Subject: [PATCH 1276/1346] PS(mod_user_class_name) must not leak into next request Fixes GH-9584 --- NEWS | 4 +++ ext/session/session.c | 5 ++++ ext/session/tests/gh9584.phpt | 55 +++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 ext/session/tests/gh9584.phpt diff --git a/NEWS b/NEWS index 15c8f1ff881f9..dd1fc5c320410 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,10 @@ PHP NEWS - Sockets: . Fixed socket constants regression as of PHP 8.2.0beta3. (Bruce Dou) +- Session: + . Fixed GH-9584 (Avoid memory corruption when not unregistering custom session + handler). (ilutov) + 15 Sep 2022, PHP 8.2.0RC2 - Core: diff --git a/ext/session/session.c b/ext/session/session.c index e56c15dcbe37d..0012f53797c8a 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -142,6 +142,11 @@ static inline void php_rshutdown_session_globals(void) /* {{{ */ PS(session_vars) = NULL; } + if (PS(mod_user_class_name)) { + zend_string_release(PS(mod_user_class_name)); + PS(mod_user_class_name) = NULL; + } + /* User save handlers may end up directly here by misuse, bugs in user script, etc. */ /* Set session status to prevent error while restoring save handler INI value. */ PS(session_status) = php_session_none; diff --git a/ext/session/tests/gh9584.phpt b/ext/session/tests/gh9584.phpt new file mode 100644 index 0000000000000..14fbcb6dbfb07 --- /dev/null +++ b/ext/session/tests/gh9584.phpt @@ -0,0 +1,55 @@ +--TEST-- +GH-9584: PS(mod_user_class_name) must not leak into next request +--EXTENSIONS-- +session +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== From 18cd80c32729137aec533039236fa8534ddcdf5a Mon Sep 17 00:00:00 2001 From: Patrick Allaert Date: Thu, 22 Sep 2022 13:17:02 +0200 Subject: [PATCH 1277/1346] Fixed undefined macros warnings --- Zend/zend_atomic.c | 2 +- Zend/zend_atomic.h | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Zend/zend_atomic.c b/Zend/zend_atomic.c index 7b16f5e485138..fa6aa05e44b5e 100644 --- a/Zend/zend_atomic.c +++ b/Zend/zend_atomic.c @@ -35,7 +35,7 @@ ZEND_API void zend_atomic_bool_store(zend_atomic_bool *obj, bool desired) { zend_atomic_bool_store_ex(obj, desired); } -#if ZEND_WIN32 || HAVE_SYNC_ATOMICS +#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS) /* On these platforms it is non-const due to underlying APIs. */ ZEND_API bool zend_atomic_bool_load(zend_atomic_bool *obj) { return zend_atomic_bool_load_ex(obj); diff --git a/Zend/zend_atomic.h b/Zend/zend_atomic.h index c10bb97e4f71f..617cde0ec5640 100644 --- a/Zend/zend_atomic.h +++ b/Zend/zend_atomic.h @@ -39,11 +39,11 @@ * and alignment purposes. */ -#if ZEND_WIN32 || HAVE_SYNC_ATOMICS +#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS) typedef struct zend_atomic_bool_s { volatile char value; } zend_atomic_bool; -#elif HAVE_C11_ATOMICS +#elif defined(HAVE_C11_ATOMICS) typedef struct zend_atomic_bool_s { _Atomic(bool) value; } zend_atomic_bool; @@ -55,7 +55,7 @@ typedef struct zend_atomic_bool_s { BEGIN_EXTERN_C() -#if ZEND_WIN32 +#ifdef ZEND_WIN32 #ifndef InterlockedExchange8 #define InterlockedExchange8 _InterlockedExchange8 @@ -80,7 +80,7 @@ static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, (void)InterlockedExchange8(&obj->value, desired); } -#elif HAVE_C11_ATOMICS +#elif defined(HAVE_C11_ATOMICS) #define ZEND_ATOMIC_BOOL_INIT(obj, desired) __c11_atomic_init(&(obj)->value, (desired)) @@ -96,7 +96,7 @@ static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, __c11_atomic_store(&obj->value, desired, __ATOMIC_SEQ_CST); } -#elif HAVE_GNUC_ATOMICS +#elif defined(HAVE_GNUC_ATOMICS) #define ZEND_ATOMIC_BOOL_INIT(obj, desired) ((obj)->value = (desired)) @@ -116,7 +116,7 @@ static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, __atomic_store(&obj->value, &desired, __ATOMIC_SEQ_CST); } -#elif HAVE_SYNC_ATOMICS +#elif defined(HAVE_SYNC_ATOMICS) #define ZEND_ATOMIC_BOOL_INIT(obj, desired) ((obj)->value = (desired)) @@ -141,7 +141,7 @@ static zend_always_inline void zend_atomic_bool_store_ex(zend_atomic_bool *obj, __sync_synchronize(); } -#elif HAVE_NO_ATOMICS +#elif defined(HAVE_NO_ATOMICS) #warning No atomics support detected. Please open an issue with platform details. @@ -167,7 +167,7 @@ ZEND_API void zend_atomic_bool_init(zend_atomic_bool *obj, bool desired); ZEND_API bool zend_atomic_bool_exchange(zend_atomic_bool *obj, bool desired); ZEND_API void zend_atomic_bool_store(zend_atomic_bool *obj, bool desired); -#if ZEND_WIN32 || HAVE_SYNC_ATOMICS +#if defined(ZEND_WIN32) || defined(HAVE_SYNC_ATOMICS) /* On these platforms it is non-const due to underlying APIs. */ ZEND_API bool zend_atomic_bool_load(zend_atomic_bool *obj); #else From 95d9e5157fe0cab8baf7bb54127104047658221e Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 23 Sep 2022 13:14:07 +0300 Subject: [PATCH 1278/1346] Check "ssa_op" before dereference (it may be NULL for opcache.jit=51) --- ext/opcache/jit/zend_jit_trace.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 075acf5e6f862..7802a2ab01cb9 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6656,6 +6656,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par && (init_opline->opcode != ZEND_INIT_METHOD_CALL || init_opline->op1_type == IS_UNDEF || (!(p->info & ZEND_JIT_TRACE_FAKE_INIT_CALL) + && ssa_op && (ssa_op-1)->op1_use >=0 && ssa->var_info[(ssa_op-1)->op1_use].delayed_fetch_this)) && (init_opline->opcode != ZEND_INIT_USER_CALL From 85d10cc93d3a94867dd6d2967a998e43109f8bf7 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Wed, 14 Sep 2022 10:49:10 +0100 Subject: [PATCH 1279/1346] Use true return type for XML functions which always return true And fix xml_parser_set_option() which didn't return false on failure. Closes GH-9539 --- UPGRADING | 6 +++++- ext/xml/xml.c | 34 +++++++++++++++++++++++----------- ext/xml/xml.stub.php | 20 ++++++++++---------- ext/xml/xml_arginfo.h | 8 ++++---- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/UPGRADING b/UPGRADING index 505828cb21fc0..00d27ebb5f1d4 100644 --- a/UPGRADING +++ b/UPGRADING @@ -219,6 +219,10 @@ PHP 8.2 UPGRADE NOTES widened to iterable from Iterator, allowing arrays to be passed. RFC: https://wiki.php.net/rfc/iterator_xyz_accept_array +- XML + . xml_parser_set_option() now actually returns false when attempting to set a + negative tag start. Previously it returned true while emitting an E_WARNING. + ======================================== 6. New Functions ======================================== @@ -231,7 +235,7 @@ PHP 8.2 UPGRADE NOTES - OpenSSL: . openssl_cipher_key_length(): Returns a key length for the supplied - cipher. + cipher. - Reflection: . ReflectionFunction::isAnonymous() diff --git a/ext/xml/xml.c b/ext/xml/xml.c index d821824e006eb..30e3b3b480752 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1052,7 +1052,7 @@ PHP_FUNCTION(xml_set_object) zval_ptr_dtor(&parser->object); ZVAL_OBJ_COPY(&parser->object, Z_OBJ_P(mythis)); - RETVAL_TRUE; + RETURN_TRUE; } /* }}} */ @@ -1070,7 +1070,8 @@ PHP_FUNCTION(xml_set_element_handler) xml_set_handler(&parser->startElementHandler, shdl); xml_set_handler(&parser->endElementHandler, ehdl); XML_SetElementHandler(parser->parser, _xml_startElementHandler, _xml_endElementHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1087,7 +1088,8 @@ PHP_FUNCTION(xml_set_character_data_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->characterDataHandler, hdl); XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1104,7 +1106,8 @@ PHP_FUNCTION(xml_set_processing_instruction_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->processingInstructionHandler, hdl); XML_SetProcessingInstructionHandler(parser->parser, _xml_processingInstructionHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1121,7 +1124,8 @@ PHP_FUNCTION(xml_set_default_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->defaultHandler, hdl); XML_SetDefaultHandler(parser->parser, _xml_defaultHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1138,7 +1142,8 @@ PHP_FUNCTION(xml_set_unparsed_entity_decl_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->unparsedEntityDeclHandler, hdl); XML_SetUnparsedEntityDeclHandler(parser->parser, _xml_unparsedEntityDeclHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1155,7 +1160,8 @@ PHP_FUNCTION(xml_set_notation_decl_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->notationDeclHandler, hdl); XML_SetNotationDeclHandler(parser->parser, _xml_notationDeclHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1172,7 +1178,8 @@ PHP_FUNCTION(xml_set_external_entity_ref_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->externalEntityRefHandler, hdl); XML_SetExternalEntityRefHandler(parser->parser, (void *) _xml_externalEntityRefHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1189,7 +1196,8 @@ PHP_FUNCTION(xml_set_start_namespace_decl_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->startNamespaceDeclHandler, hdl); XML_SetStartNamespaceDeclHandler(parser->parser, _xml_startNamespaceDeclHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1206,7 +1214,8 @@ PHP_FUNCTION(xml_set_end_namespace_decl_handler) parser = Z_XMLPARSER_P(pind); xml_set_handler(&parser->endNamespaceDeclHandler, hdl); XML_SetEndNamespaceDeclHandler(parser->parser, _xml_endNamespaceDeclHandler); - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ @@ -1406,6 +1415,8 @@ PHP_FUNCTION(xml_parser_set_option) if (parser->toffset < 0) { php_error_docref(NULL, E_WARNING, "tagstart ignored, because it is out of range"); parser->toffset = 0; + /* TODO Promote to ValueError in PHP 9.0 */ + RETURN_FALSE; } break; case PHP_XML_OPTION_SKIP_WHITE: @@ -1431,7 +1442,8 @@ PHP_FUNCTION(xml_parser_set_option) RETURN_THROWS(); break; } - RETVAL_TRUE; + + RETURN_TRUE; } /* }}} */ diff --git a/ext/xml/xml.stub.php b/ext/xml/xml.stub.php index 9a1f13fa16c65..b650e0cc538a5 100644 --- a/ext/xml/xml.stub.php +++ b/ext/xml/xml.stub.php @@ -138,37 +138,37 @@ function xml_parser_create(?string $encoding = null): XMLParser {} function xml_parser_create_ns(?string $encoding = null, string $separator = ":"): XMLParser {} -function xml_set_object(XMLParser $parser, object $object): bool {} +function xml_set_object(XMLParser $parser, object $object): true {} /** * @param callable $start_handler * @param callable $end_handler */ -function xml_set_element_handler(XMLParser $parser, $start_handler, $end_handler): bool {} +function xml_set_element_handler(XMLParser $parser, $start_handler, $end_handler): true {} /** @param callable $handler */ -function xml_set_character_data_handler(XMLParser $parser, $handler): bool {} +function xml_set_character_data_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_processing_instruction_handler(XMLParser $parser, $handler): bool {} +function xml_set_processing_instruction_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_default_handler(XMLParser $parser, $handler): bool {} +function xml_set_default_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_unparsed_entity_decl_handler(XMLParser $parser, $handler): bool {} +function xml_set_unparsed_entity_decl_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_notation_decl_handler(XMLParser $parser, $handler): bool {} +function xml_set_notation_decl_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_external_entity_ref_handler(XMLParser $parser, $handler): bool {} +function xml_set_external_entity_ref_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_start_namespace_decl_handler(XMLParser $parser, $handler): bool {} +function xml_set_start_namespace_decl_handler(XMLParser $parser, $handler): true {} /** @param callable $handler */ -function xml_set_end_namespace_decl_handler(XMLParser $parser, $handler): bool {} +function xml_set_end_namespace_decl_handler(XMLParser $parser, $handler): true {} function xml_parse(XMLParser $parser, string $data, bool $is_final = false): int {} diff --git a/ext/xml/xml_arginfo.h b/ext/xml/xml_arginfo.h index f6d3be79fefdc..ef67e7f253856 100644 --- a/ext/xml/xml_arginfo.h +++ b/ext/xml/xml_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 97b941147b54b4e1cd3d8fff2cba8a43a3065aad */ + * Stub hash: 97ce33bf2fbe970f7ca1c1845fbf5063dbd118dd */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create, 0, 0, XMLParser, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, encoding, IS_STRING, 1, "null") @@ -10,18 +10,18 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_xml_parser_create_ns, 0, 0, XMLPa ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, separator, IS_STRING, 0, "\":\"") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_object, 0, 2, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_object, 0, 2, IS_TRUE, 0) ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_element_handler, 0, 3, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_element_handler, 0, 3, IS_TRUE, 0) ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_INFO(0, start_handler) ZEND_ARG_INFO(0, end_handler) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_character_data_handler, 0, 2, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_xml_set_character_data_handler, 0, 2, IS_TRUE, 0) ZEND_ARG_OBJ_INFO(0, parser, XMLParser, 0) ZEND_ARG_INFO(0, handler) ZEND_END_ARG_INFO() From 2108d6983f4343a25a6ba0ce758fe938e6c7c99f Mon Sep 17 00:00:00 2001 From: Andy Postnikov Date: Sat, 17 Sep 2022 22:50:21 +0200 Subject: [PATCH 1280/1346] Revert "Fix parse_url(): can not recognize port without scheme" This reverts commit 72d83709d9524945c93012f7bbb222e412df485a. Closes GH-9569 --- NEWS | 4 +++ .../tests/url/parse_url_basic_011.phpt | 30 +++++++++++++++---- ext/standard/url.c | 4 +-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 2db467fc57b38..0d0cbe484e8d0 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,10 @@ PHP NEWS . Fixed GH-9584 (Avoid memory corruption when not unregistering custom session handler). (ilutov) +- Standard: + . Revert "Fixed parse_url(): can not recognize port without scheme." + (andypost) + 15 Sep 2022, PHP 8.2.0RC2 - Core: diff --git a/ext/standard/tests/url/parse_url_basic_011.phpt b/ext/standard/tests/url/parse_url_basic_011.phpt index 90e42d5b3f106..d035299597965 100644 --- a/ext/standard/tests/url/parse_url_basic_011.phpt +++ b/ext/standard/tests/url/parse_url_basic_011.phpt @@ -7,24 +7,42 @@ echo 'parse 127.0.0.1:9999?', PHP_EOL; var_dump(parse_url('https://redirect.github.com/127.0.0.1:9999?')); echo 'parse 127.0.0.1:9999#', PHP_EOL; var_dump(parse_url('https://redirect.github.com/127.0.0.1:9999#')); +echo 'parse internal:#feeding', PHP_EOL; +var_dump(parse_url('/service/internal:#feeding')); +echo 'parse magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C', PHP_EOL; +var_dump(parse_url('/service/magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C')); ?> --EXPECT-- *** Testing parse_url() :can not recognize port without scheme *** parse 127.0.0.1:9999? array(3) { - ["host"]=> + ["scheme"]=> string(9) "127.0.0.1" - ["port"]=> - int(9999) + ["path"]=> + string(4) "9999" ["query"]=> string(0) "" } parse 127.0.0.1:9999# array(3) { - ["host"]=> + ["scheme"]=> string(9) "127.0.0.1" - ["port"]=> - int(9999) + ["path"]=> + string(4) "9999" ["fragment"]=> string(0) "" } +parse internal:#feeding +array(2) { + ["scheme"]=> + string(8) "internal" + ["fragment"]=> + string(7) "feeding" +} +parse magnet:?xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C +array(2) { + ["scheme"]=> + string(6) "magnet" + ["query"]=> + string(44) "xt=urn:sha1:YNCKHTQCWBTRNJIV4WNAE52SJUQCZO5C" +} diff --git a/ext/standard/url.c b/ext/standard/url.c index b268e9b0df276..e3d95768fb019 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -150,7 +150,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port p++; } - if ((p == ue || *p == '/' || *p == '?' || *p == '#') && (p - e) < 7) { + if ((p == ue || *p == '/') && (p - e) < 7) { goto parse_port; } @@ -190,7 +190,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port pp++; } - if (pp - p > 0 && pp - p < 6 && (pp == ue || *pp == '/' || *pp == '?' || *pp == '#')) { + if (pp - p > 0 && pp - p < 6 && (pp == ue || *pp == '/')) { zend_long port; char *end; memcpy(port_buf, p, (pp - p)); From 8c20ad10812a50b9aee557c303d7d602d9707898 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 25 Sep 2022 21:50:24 +0200 Subject: [PATCH 1281/1346] Add travis_wait to travis for test.sh We no longer print skipped tests which can make travis fail due to no output for longer than 20 minutes. --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d5032d20ff5a9..c90dcdeabf71b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,9 +87,9 @@ before_script: # Run PHPs run-tests.php script: - - ./travis/test.sh -d opcache.jit_buffer_size=16M -d opcache.jit=tracing - - if [[ "$ARM64" == 1 ]]; then ./travis/test.sh -d opcache.jit_buffer_size=16M -d opcache.jit=function; fi - - if [[ "$ARM64" == 1 ]]; then ./travis/test.sh -d opcache.jit_buffer_size=16M -d opcache.jit=tracing --repeat 2; fi + - travis_wait ./travis/test.sh -d opcache.jit_buffer_size=16M -d opcache.jit=tracing + - if [[ "$ARM64" == 1 ]]; then travis_wait ./travis/test.sh -d opcache.jit_buffer_size=16M -d opcache.jit=function; fi + - if [[ "$ARM64" == 1 ]]; then travis_wait ./travis/test.sh -d opcache.jit_buffer_size=16M -d opcache.jit=tracing --repeat 2; fi - sapi/cli/php -d extension_dir=`pwd`/modules -r 'dl("zend_test");' after_success: From 94b8c2da9f4fbaf3b2c143ea31c0314bef317da6 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 26 Sep 2022 12:19:12 +0300 Subject: [PATCH 1282/1346] Fixed type inference Fixes oss-fuzz #51640 --- Zend/Optimizer/zend_inference.c | 4 ++-- ext/opcache/tests/opt/inference_021.phpt | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 ext/opcache/tests/opt/inference_021.phpt diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index 271d9d1811ca4..257a4324c7f91 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2322,9 +2322,9 @@ static zend_always_inline zend_result _zend_update_type_info( if (ssa_op->op2_def >= 0 && !(ssa_var_info[ssa_op->op2_def].type & MAY_BE_REF)) { UPDATE_SSA_TYPE(tmp, ssa_op->op2_def); } - if (opline->opcode == ZEND_ASSIGN_OP - || opline->opcode == ZEND_ASSIGN_DIM_OP + if (opline->opcode == ZEND_ASSIGN_DIM_OP || opline->opcode == ZEND_ASSIGN_OBJ_OP + || opline->opcode == ZEND_ASSIGN_STATIC_PROP_OP || opline->opcode == ZEND_ASSIGN_DIM || opline->opcode == ZEND_ASSIGN_OBJ) { if ((ssa_op+1)->op1_def >= 0 && !(ssa_var_info[(ssa_op+1)->op1_def].type & MAY_BE_REF)) { diff --git a/ext/opcache/tests/opt/inference_021.phpt b/ext/opcache/tests/opt/inference_021.phpt new file mode 100644 index 0000000000000..1c4d4fd940a51 --- /dev/null +++ b/ext/opcache/tests/opt/inference_021.phpt @@ -0,0 +1,19 @@ +--TEST-- +Type inference 021; +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- +y++; + $b *= $a; + $a++; + } +} +?> +DONE +--EXPECT-- +DONE From e4f23769193ccf659d6ecff8a95851bc57ef452e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 26 Sep 2022 23:12:34 +0200 Subject: [PATCH 1283/1346] Improve string class constant code generation (#9577) Using strlen() will make sure that non-constant values can also be used. --- build/gen_stub.php | 2 +- ext/date/php_date_arginfo.h | 28 ++++++++++++++-------------- ext/intl/locale/locale_arginfo.h | 14 +++++++------- ext/intl/uchar/uchar_arginfo.h | 2 +- ext/mysqli/mysqli_arginfo.h | 2 +- ext/pdo/pdo_dbh_arginfo.h | 2 +- ext/zend_test/test_arginfo.h | 8 ++++---- ext/zip/php_zip.c | 6 ------ ext/zip/php_zip.h | 6 ++++++ ext/zip/php_zip.stub.php | 6 ++++++ ext/zip/php_zip_arginfo.h | 9 ++++++++- 11 files changed, 49 insertions(+), 36 deletions(-) diff --git a/build/gen_stub.php b/build/gen_stub.php index 3ec47f45c4309..344d5a75cdd59 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1670,7 +1670,7 @@ public function initializeZval(string $zvalName, iterable $allConstInfos): strin $code .= "\tZVAL_EMPTY_STRING(&$zvalName);\n"; } else { $constValue = $cConstValue ?: '"' . addslashes($this->value) . '"'; - $code .= "\tzend_string *{$zvalName}_str = zend_string_init($constValue, sizeof($constValue) - 1, 1);\n"; + $code .= "\tzend_string *{$zvalName}_str = zend_string_init($constValue, strlen($constValue), 1);\n"; $code .= "\tZVAL_STR(&$zvalName, {$zvalName}_str);\n"; } } elseif ($this->type->isArray()) { diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h index cdd31ee7189bc..f7920da2ce4b5 100644 --- a/ext/date/php_date_arginfo.h +++ b/ext/date/php_date_arginfo.h @@ -789,98 +789,98 @@ static zend_class_entry *register_class_DateTimeInterface(void) class_entry = zend_register_internal_interface(&ce); zval const_ATOM_value; - zend_string *const_ATOM_value_str = zend_string_init(DATE_FORMAT_RFC3339, sizeof(DATE_FORMAT_RFC3339) - 1, 1); + zend_string *const_ATOM_value_str = zend_string_init(DATE_FORMAT_RFC3339, strlen(DATE_FORMAT_RFC3339), 1); ZVAL_STR(&const_ATOM_value, const_ATOM_value_str); zend_string *const_ATOM_name = zend_string_init_interned("ATOM", sizeof("ATOM") - 1, 1); zend_declare_class_constant_ex(class_entry, const_ATOM_name, &const_ATOM_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_ATOM_name); zval const_COOKIE_value; - zend_string *const_COOKIE_value_str = zend_string_init(DATE_FORMAT_COOKIE, sizeof(DATE_FORMAT_COOKIE) - 1, 1); + zend_string *const_COOKIE_value_str = zend_string_init(DATE_FORMAT_COOKIE, strlen(DATE_FORMAT_COOKIE), 1); ZVAL_STR(&const_COOKIE_value, const_COOKIE_value_str); zend_string *const_COOKIE_name = zend_string_init_interned("COOKIE", sizeof("COOKIE") - 1, 1); zend_declare_class_constant_ex(class_entry, const_COOKIE_name, &const_COOKIE_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_COOKIE_name); zval const_ISO8601_value; - zend_string *const_ISO8601_value_str = zend_string_init(DATE_FORMAT_ISO8601, sizeof(DATE_FORMAT_ISO8601) - 1, 1); + zend_string *const_ISO8601_value_str = zend_string_init(DATE_FORMAT_ISO8601, strlen(DATE_FORMAT_ISO8601), 1); ZVAL_STR(&const_ISO8601_value, const_ISO8601_value_str); zend_string *const_ISO8601_name = zend_string_init_interned("ISO8601", sizeof("ISO8601") - 1, 1); zend_declare_class_constant_ex(class_entry, const_ISO8601_name, &const_ISO8601_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_ISO8601_name); zval const_ISO8601_EXPANDED_value; - zend_string *const_ISO8601_EXPANDED_value_str = zend_string_init(DATE_FORMAT_ISO8601_EXPANDED, sizeof(DATE_FORMAT_ISO8601_EXPANDED) - 1, 1); + zend_string *const_ISO8601_EXPANDED_value_str = zend_string_init(DATE_FORMAT_ISO8601_EXPANDED, strlen(DATE_FORMAT_ISO8601_EXPANDED), 1); ZVAL_STR(&const_ISO8601_EXPANDED_value, const_ISO8601_EXPANDED_value_str); zend_string *const_ISO8601_EXPANDED_name = zend_string_init_interned("ISO8601_EXPANDED", sizeof("ISO8601_EXPANDED") - 1, 1); zend_declare_class_constant_ex(class_entry, const_ISO8601_EXPANDED_name, &const_ISO8601_EXPANDED_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_ISO8601_EXPANDED_name); zval const_RFC822_value; - zend_string *const_RFC822_value_str = zend_string_init(DATE_FORMAT_RFC822, sizeof(DATE_FORMAT_RFC822) - 1, 1); + zend_string *const_RFC822_value_str = zend_string_init(DATE_FORMAT_RFC822, strlen(DATE_FORMAT_RFC822), 1); ZVAL_STR(&const_RFC822_value, const_RFC822_value_str); zend_string *const_RFC822_name = zend_string_init_interned("RFC822", sizeof("RFC822") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC822_name, &const_RFC822_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC822_name); zval const_RFC850_value; - zend_string *const_RFC850_value_str = zend_string_init(DATE_FORMAT_RFC850, sizeof(DATE_FORMAT_RFC850) - 1, 1); + zend_string *const_RFC850_value_str = zend_string_init(DATE_FORMAT_RFC850, strlen(DATE_FORMAT_RFC850), 1); ZVAL_STR(&const_RFC850_value, const_RFC850_value_str); zend_string *const_RFC850_name = zend_string_init_interned("RFC850", sizeof("RFC850") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC850_name, &const_RFC850_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC850_name); zval const_RFC1036_value; - zend_string *const_RFC1036_value_str = zend_string_init(DATE_FORMAT_RFC1036, sizeof(DATE_FORMAT_RFC1036) - 1, 1); + zend_string *const_RFC1036_value_str = zend_string_init(DATE_FORMAT_RFC1036, strlen(DATE_FORMAT_RFC1036), 1); ZVAL_STR(&const_RFC1036_value, const_RFC1036_value_str); zend_string *const_RFC1036_name = zend_string_init_interned("RFC1036", sizeof("RFC1036") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC1036_name, &const_RFC1036_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC1036_name); zval const_RFC1123_value; - zend_string *const_RFC1123_value_str = zend_string_init(DATE_FORMAT_RFC1123, sizeof(DATE_FORMAT_RFC1123) - 1, 1); + zend_string *const_RFC1123_value_str = zend_string_init(DATE_FORMAT_RFC1123, strlen(DATE_FORMAT_RFC1123), 1); ZVAL_STR(&const_RFC1123_value, const_RFC1123_value_str); zend_string *const_RFC1123_name = zend_string_init_interned("RFC1123", sizeof("RFC1123") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC1123_name, &const_RFC1123_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC1123_name); zval const_RFC7231_value; - zend_string *const_RFC7231_value_str = zend_string_init(DATE_FORMAT_RFC7231, sizeof(DATE_FORMAT_RFC7231) - 1, 1); + zend_string *const_RFC7231_value_str = zend_string_init(DATE_FORMAT_RFC7231, strlen(DATE_FORMAT_RFC7231), 1); ZVAL_STR(&const_RFC7231_value, const_RFC7231_value_str); zend_string *const_RFC7231_name = zend_string_init_interned("RFC7231", sizeof("RFC7231") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC7231_name, &const_RFC7231_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC7231_name); zval const_RFC2822_value; - zend_string *const_RFC2822_value_str = zend_string_init(DATE_FORMAT_RFC2822, sizeof(DATE_FORMAT_RFC2822) - 1, 1); + zend_string *const_RFC2822_value_str = zend_string_init(DATE_FORMAT_RFC2822, strlen(DATE_FORMAT_RFC2822), 1); ZVAL_STR(&const_RFC2822_value, const_RFC2822_value_str); zend_string *const_RFC2822_name = zend_string_init_interned("RFC2822", sizeof("RFC2822") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC2822_name, &const_RFC2822_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC2822_name); zval const_RFC3339_value; - zend_string *const_RFC3339_value_str = zend_string_init(DATE_FORMAT_RFC3339, sizeof(DATE_FORMAT_RFC3339) - 1, 1); + zend_string *const_RFC3339_value_str = zend_string_init(DATE_FORMAT_RFC3339, strlen(DATE_FORMAT_RFC3339), 1); ZVAL_STR(&const_RFC3339_value, const_RFC3339_value_str); zend_string *const_RFC3339_name = zend_string_init_interned("RFC3339", sizeof("RFC3339") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC3339_name, &const_RFC3339_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC3339_name); zval const_RFC3339_EXTENDED_value; - zend_string *const_RFC3339_EXTENDED_value_str = zend_string_init(DATE_FORMAT_RFC3339_EXTENDED, sizeof(DATE_FORMAT_RFC3339_EXTENDED) - 1, 1); + zend_string *const_RFC3339_EXTENDED_value_str = zend_string_init(DATE_FORMAT_RFC3339_EXTENDED, strlen(DATE_FORMAT_RFC3339_EXTENDED), 1); ZVAL_STR(&const_RFC3339_EXTENDED_value, const_RFC3339_EXTENDED_value_str); zend_string *const_RFC3339_EXTENDED_name = zend_string_init_interned("RFC3339_EXTENDED", sizeof("RFC3339_EXTENDED") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RFC3339_EXTENDED_name, &const_RFC3339_EXTENDED_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RFC3339_EXTENDED_name); zval const_RSS_value; - zend_string *const_RSS_value_str = zend_string_init(DATE_FORMAT_RFC1123, sizeof(DATE_FORMAT_RFC1123) - 1, 1); + zend_string *const_RSS_value_str = zend_string_init(DATE_FORMAT_RFC1123, strlen(DATE_FORMAT_RFC1123), 1); ZVAL_STR(&const_RSS_value, const_RSS_value_str); zend_string *const_RSS_name = zend_string_init_interned("RSS", sizeof("RSS") - 1, 1); zend_declare_class_constant_ex(class_entry, const_RSS_name, &const_RSS_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_RSS_name); zval const_W3C_value; - zend_string *const_W3C_value_str = zend_string_init(DATE_FORMAT_RFC3339, sizeof(DATE_FORMAT_RFC3339) - 1, 1); + zend_string *const_W3C_value_str = zend_string_init(DATE_FORMAT_RFC3339, strlen(DATE_FORMAT_RFC3339), 1); ZVAL_STR(&const_W3C_value, const_W3C_value_str); zend_string *const_W3C_name = zend_string_init_interned("W3C", sizeof("W3C") - 1, 1); zend_declare_class_constant_ex(class_entry, const_W3C_name, &const_W3C_value, ZEND_ACC_PUBLIC, NULL); diff --git a/ext/intl/locale/locale_arginfo.h b/ext/intl/locale/locale_arginfo.h index 891fa7e004418..54799f41bcfbc 100644 --- a/ext/intl/locale/locale_arginfo.h +++ b/ext/intl/locale/locale_arginfo.h @@ -131,49 +131,49 @@ static zend_class_entry *register_class_Locale(void) zend_string_release(const_DEFAULT_LOCALE_name); zval const_LANG_TAG_value; - zend_string *const_LANG_TAG_value_str = zend_string_init(LOC_LANG_TAG, sizeof(LOC_LANG_TAG) - 1, 1); + zend_string *const_LANG_TAG_value_str = zend_string_init(LOC_LANG_TAG, strlen(LOC_LANG_TAG), 1); ZVAL_STR(&const_LANG_TAG_value, const_LANG_TAG_value_str); zend_string *const_LANG_TAG_name = zend_string_init_interned("LANG_TAG", sizeof("LANG_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_LANG_TAG_name, &const_LANG_TAG_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_LANG_TAG_name); zval const_EXTLANG_TAG_value; - zend_string *const_EXTLANG_TAG_value_str = zend_string_init(LOC_EXTLANG_TAG, sizeof(LOC_EXTLANG_TAG) - 1, 1); + zend_string *const_EXTLANG_TAG_value_str = zend_string_init(LOC_EXTLANG_TAG, strlen(LOC_EXTLANG_TAG), 1); ZVAL_STR(&const_EXTLANG_TAG_value, const_EXTLANG_TAG_value_str); zend_string *const_EXTLANG_TAG_name = zend_string_init_interned("EXTLANG_TAG", sizeof("EXTLANG_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_EXTLANG_TAG_name, &const_EXTLANG_TAG_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_EXTLANG_TAG_name); zval const_SCRIPT_TAG_value; - zend_string *const_SCRIPT_TAG_value_str = zend_string_init(LOC_SCRIPT_TAG, sizeof(LOC_SCRIPT_TAG) - 1, 1); + zend_string *const_SCRIPT_TAG_value_str = zend_string_init(LOC_SCRIPT_TAG, strlen(LOC_SCRIPT_TAG), 1); ZVAL_STR(&const_SCRIPT_TAG_value, const_SCRIPT_TAG_value_str); zend_string *const_SCRIPT_TAG_name = zend_string_init_interned("SCRIPT_TAG", sizeof("SCRIPT_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_SCRIPT_TAG_name, &const_SCRIPT_TAG_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_SCRIPT_TAG_name); zval const_REGION_TAG_value; - zend_string *const_REGION_TAG_value_str = zend_string_init(LOC_REGION_TAG, sizeof(LOC_REGION_TAG) - 1, 1); + zend_string *const_REGION_TAG_value_str = zend_string_init(LOC_REGION_TAG, strlen(LOC_REGION_TAG), 1); ZVAL_STR(&const_REGION_TAG_value, const_REGION_TAG_value_str); zend_string *const_REGION_TAG_name = zend_string_init_interned("REGION_TAG", sizeof("REGION_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_REGION_TAG_name, &const_REGION_TAG_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_REGION_TAG_name); zval const_VARIANT_TAG_value; - zend_string *const_VARIANT_TAG_value_str = zend_string_init(LOC_VARIANT_TAG, sizeof(LOC_VARIANT_TAG) - 1, 1); + zend_string *const_VARIANT_TAG_value_str = zend_string_init(LOC_VARIANT_TAG, strlen(LOC_VARIANT_TAG), 1); ZVAL_STR(&const_VARIANT_TAG_value, const_VARIANT_TAG_value_str); zend_string *const_VARIANT_TAG_name = zend_string_init_interned("VARIANT_TAG", sizeof("VARIANT_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_VARIANT_TAG_name, &const_VARIANT_TAG_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_VARIANT_TAG_name); zval const_GRANDFATHERED_LANG_TAG_value; - zend_string *const_GRANDFATHERED_LANG_TAG_value_str = zend_string_init(LOC_GRANDFATHERED_LANG_TAG, sizeof(LOC_GRANDFATHERED_LANG_TAG) - 1, 1); + zend_string *const_GRANDFATHERED_LANG_TAG_value_str = zend_string_init(LOC_GRANDFATHERED_LANG_TAG, strlen(LOC_GRANDFATHERED_LANG_TAG), 1); ZVAL_STR(&const_GRANDFATHERED_LANG_TAG_value, const_GRANDFATHERED_LANG_TAG_value_str); zend_string *const_GRANDFATHERED_LANG_TAG_name = zend_string_init_interned("GRANDFATHERED_LANG_TAG", sizeof("GRANDFATHERED_LANG_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_GRANDFATHERED_LANG_TAG_name, &const_GRANDFATHERED_LANG_TAG_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_GRANDFATHERED_LANG_TAG_name); zval const_PRIVATE_TAG_value; - zend_string *const_PRIVATE_TAG_value_str = zend_string_init(LOC_PRIVATE_TAG, sizeof(LOC_PRIVATE_TAG) - 1, 1); + zend_string *const_PRIVATE_TAG_value_str = zend_string_init(LOC_PRIVATE_TAG, strlen(LOC_PRIVATE_TAG), 1); ZVAL_STR(&const_PRIVATE_TAG_value, const_PRIVATE_TAG_value_str); zend_string *const_PRIVATE_TAG_name = zend_string_init_interned("PRIVATE_TAG", sizeof("PRIVATE_TAG") - 1, 1); zend_declare_class_constant_ex(class_entry, const_PRIVATE_TAG_name, &const_PRIVATE_TAG_value, ZEND_ACC_PUBLIC, NULL); diff --git a/ext/intl/uchar/uchar_arginfo.h b/ext/intl/uchar/uchar_arginfo.h index 43481573431fb..a052ae927cd0b 100644 --- a/ext/intl/uchar/uchar_arginfo.h +++ b/ext/intl/uchar/uchar_arginfo.h @@ -319,7 +319,7 @@ static zend_class_entry *register_class_IntlChar(void) class_entry = zend_register_internal_class_ex(&ce, NULL); zval const_UNICODE_VERSION_value; - zend_string *const_UNICODE_VERSION_value_str = zend_string_init(U_UNICODE_VERSION, sizeof(U_UNICODE_VERSION) - 1, 1); + zend_string *const_UNICODE_VERSION_value_str = zend_string_init(U_UNICODE_VERSION, strlen(U_UNICODE_VERSION), 1); ZVAL_STR(&const_UNICODE_VERSION_value, const_UNICODE_VERSION_value_str); zend_string *const_UNICODE_VERSION_name = zend_string_init_interned("UNICODE_VERSION", sizeof("UNICODE_VERSION") - 1, 1); zend_declare_class_constant_ex(class_entry, const_UNICODE_VERSION_name, &const_UNICODE_VERSION_value, ZEND_ACC_PUBLIC, NULL); diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h index 7252c8bee8d05..eacfc83a67103 100644 --- a/ext/mysqli/mysqli_arginfo.h +++ b/ext/mysqli/mysqli_arginfo.h @@ -1493,7 +1493,7 @@ static zend_class_entry *register_class_mysqli_sql_exception(zend_class_entry *c class_entry->ce_flags |= ZEND_ACC_FINAL; zval property_sqlstate_default_value; - zend_string *property_sqlstate_default_value_str = zend_string_init("00000", sizeof("00000") - 1, 1); + zend_string *property_sqlstate_default_value_str = zend_string_init("00000", strlen("00000"), 1); ZVAL_STR(&property_sqlstate_default_value, property_sqlstate_default_value_str); zend_string *property_sqlstate_name = zend_string_init("sqlstate", sizeof("sqlstate") - 1, 1); zend_declare_typed_property(class_entry, property_sqlstate_name, &property_sqlstate_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); diff --git a/ext/pdo/pdo_dbh_arginfo.h b/ext/pdo/pdo_dbh_arginfo.h index 54f85ad1b2763..afbbc935548e5 100644 --- a/ext/pdo/pdo_dbh_arginfo.h +++ b/ext/pdo/pdo_dbh_arginfo.h @@ -500,7 +500,7 @@ static zend_class_entry *register_class_PDO(void) zend_string_release(const_NULL_TO_STRING_name); zval const_ERR_NONE_value; - zend_string *const_ERR_NONE_value_str = zend_string_init(PDO_ERR_NONE, sizeof(PDO_ERR_NONE) - 1, 1); + zend_string *const_ERR_NONE_value_str = zend_string_init(PDO_ERR_NONE, strlen(PDO_ERR_NONE), 1); ZVAL_STR(&const_ERR_NONE_value, const_ERR_NONE_value_str); zend_string *const_ERR_NONE_name = zend_string_init_interned("ERR_NONE", sizeof("ERR_NONE") - 1, 1); zend_declare_class_constant_ex(class_entry, const_ERR_NONE_name, &const_ERR_NONE_value, ZEND_ACC_PUBLIC, NULL); diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index 84b73abbc5516..aa8612aad45ea 100644 --- a/ext/zend_test/test_arginfo.h +++ b/ext/zend_test/test_arginfo.h @@ -556,22 +556,22 @@ static zend_class_entry *register_class_ZendTestStringEnum(void) zend_class_entry *class_entry = zend_register_internal_enum("ZendTestStringEnum", IS_STRING, class_ZendTestStringEnum_methods); zval enum_case_Foo_value; - zend_string *enum_case_Foo_value_str = zend_string_init("Test1", sizeof("Test1") - 1, 1); + zend_string *enum_case_Foo_value_str = zend_string_init("Test1", strlen("Test1"), 1); ZVAL_STR(&enum_case_Foo_value, enum_case_Foo_value_str); zend_enum_add_case_cstr(class_entry, "Foo", &enum_case_Foo_value); zval enum_case_Bar_value; - zend_string *enum_case_Bar_value_str = zend_string_init("Test2", sizeof("Test2") - 1, 1); + zend_string *enum_case_Bar_value_str = zend_string_init("Test2", strlen("Test2"), 1); ZVAL_STR(&enum_case_Bar_value, enum_case_Bar_value_str); zend_enum_add_case_cstr(class_entry, "Bar", &enum_case_Bar_value); zval enum_case_Baz_value; - zend_string *enum_case_Baz_value_str = zend_string_init("Test2\\a", sizeof("Test2\\a") - 1, 1); + zend_string *enum_case_Baz_value_str = zend_string_init("Test2\\a", strlen("Test2\\a"), 1); ZVAL_STR(&enum_case_Baz_value, enum_case_Baz_value_str); zend_enum_add_case_cstr(class_entry, "Baz", &enum_case_Baz_value); zval enum_case_FortyTwo_value; - zend_string *enum_case_FortyTwo_value_str = zend_string_init("42", sizeof("42") - 1, 1); + zend_string *enum_case_FortyTwo_value_str = zend_string_init("42", strlen("42"), 1); ZVAL_STR(&enum_case_FortyTwo_value, enum_case_FortyTwo_value_str); zend_enum_add_case_cstr(class_entry, "FortyTwo", &enum_case_FortyTwo_value); diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 5e75b85c4ad6e..095fa23fe7746 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -3110,12 +3110,6 @@ static PHP_MINIT_FUNCTION(zip) php_zip_register_prop_handler(&zip_prop_handlers, "filename", NULL, php_zipobj_get_filename, IS_STRING); php_zip_register_prop_handler(&zip_prop_handlers, "comment", NULL, php_zipobj_get_zip_comment, IS_STRING); -#ifdef HAVE_LIBZIP_VERSION - zend_declare_class_constant_string(zip_class_entry, "LIBZIP_VERSION", sizeof("LIBZIP_VERSION")-1, zip_libzip_version()); -#else - zend_declare_class_constant_string(zip_class_entry, "LIBZIP_VERSION", sizeof("LIBZIP_VERSION")-1, LIBZIP_VERSION); -#endif - php_register_url_stream_wrapper("zip", &php_stream_zip_wrapper); le_zip_dir = zend_register_list_destructors_ex(php_zip_free_dir, NULL, le_zip_dir_name, module_number); diff --git a/ext/zip/php_zip.h b/ext/zip/php_zip.h index 85e2e5f24320d..bf6df15cefee9 100644 --- a/ext/zip/php_zip.h +++ b/ext/zip/php_zip.h @@ -33,6 +33,12 @@ extern zend_module_entry zip_module_entry; #define PHP_ZIP_VERSION "1.21.1" +#ifdef HAVE_LIBZIP_VERSION +#define LIBZIP_VERSION_STR zip_libzip_version() +#else +#define LIBZIP_VERSION_STR LIBZIP_VERSION +#endif + #define ZIP_OPENBASEDIR_CHECKPATH(filename) php_check_open_basedir(filename) typedef struct _ze_zip_rsrc { diff --git a/ext/zip/php_zip.stub.php b/ext/zip/php_zip.stub.php index 8501da223ea5f..c225d493cb3d4 100644 --- a/ext/zip/php_zip.stub.php +++ b/ext/zip/php_zip.stub.php @@ -633,6 +633,12 @@ class ZipArchive implements Countable */ public const EM_UNKNOWN = UNKNOWN; + /** + * @var string + * @cvalue LIBZIP_VERSION_STR + */ + public const LIBZIP_VERSION = UNKNOWN; + /** @readonly */ public int $lastId; /** @readonly */ diff --git a/ext/zip/php_zip_arginfo.h b/ext/zip/php_zip_arginfo.h index 58b2bdf534de0..287fe25322032 100644 --- a/ext/zip/php_zip_arginfo.h +++ b/ext/zip/php_zip_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 52db51284a16b7664a3f66ea5d8a4a7b23aa5127 */ + * Stub hash: d8c14dfe45c7eff2c18fd3c562488a827f658e12 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_zip_open, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) @@ -1154,6 +1154,13 @@ static zend_class_entry *register_class_ZipArchive(zend_class_entry *class_entry zend_declare_class_constant_ex(class_entry, const_EM_UNKNOWN_name, &const_EM_UNKNOWN_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_EM_UNKNOWN_name); + zval const_LIBZIP_VERSION_value; + zend_string *const_LIBZIP_VERSION_value_str = zend_string_init(LIBZIP_VERSION_STR, strlen(LIBZIP_VERSION_STR), 1); + ZVAL_STR(&const_LIBZIP_VERSION_value, const_LIBZIP_VERSION_value_str); + zend_string *const_LIBZIP_VERSION_name = zend_string_init_interned("LIBZIP_VERSION", sizeof("LIBZIP_VERSION") - 1, 1); + zend_declare_class_constant_ex(class_entry, const_LIBZIP_VERSION_name, &const_LIBZIP_VERSION_value, ZEND_ACC_PUBLIC, NULL); + zend_string_release(const_LIBZIP_VERSION_name); + zval property_lastId_default_value; ZVAL_UNDEF(&property_lastId_default_value); zend_string *property_lastId_name = zend_string_init("lastId", sizeof("lastId") - 1, 1); From ca93e48b77efee03cd81bc074e5e462c165dcb5f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 27 Sep 2022 11:30:36 +0300 Subject: [PATCH 1284/1346] Uniform placing of init_fcall guards. This fixes trcing JIT with opcache.jit=51 --- ext/opcache/jit/zend_jit_trace.c | 52 ++++++-------------------------- 1 file changed, 10 insertions(+), 42 deletions(-) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 7802a2ab01cb9..a9a597b82671e 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6047,7 +6047,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par case ZEND_INIT_METHOD_CALL: if (opline->op2_type != IS_CONST || Z_TYPE_P(RT_CONSTANT(opline, opline->op2)) != IS_STRING) { - goto generic_dynamic_call; + break; } on_this = delayed_fetch_this = 0; ce = NULL; @@ -6111,7 +6111,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto done; case ZEND_INIT_DYNAMIC_CALL: if (orig_op2_type != IS_OBJECT || op2_ce != zend_ce_closure) { - goto generic_dynamic_call; + break; } op2_info = OP2_INFO(); CHECK_OP2_TRACE_TYPE(); @@ -6120,46 +6120,6 @@ 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: -generic_dynamic_call: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { - goto jit_failure; - } - if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func - && (opline->opcode != ZEND_INIT_STATIC_METHOD_CALL - || opline->op1_type != IS_CONST - || opline->op2_type != IS_CONST - || zend_jit_may_be_modified((p+1)->func, op_array))) { - if (!zend_jit_init_fcall_guard(&dasm_state, 0, (p+1)->func, opline+1)) { - goto jit_failure; - } - } - goto done; - case ZEND_INIT_USER_CALL: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { - goto jit_failure; - } - if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func - && (opline->op2_type != IS_CONST - || zend_jit_may_be_modified((p+1)->func, op_array))) { - if (!zend_jit_init_fcall_guard(&dasm_state, 0, (p+1)->func, opline+1)) { - goto jit_failure; - } - } - goto done; - case ZEND_NEW: - if (!zend_jit_trace_handler(&dasm_state, op_array, opline, zend_may_throw(opline, ssa_op, op_array, ssa), p + 1)) { - goto jit_failure; - } - if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func - && (opline->op1_type != IS_CONST - || zend_jit_may_be_modified((p+1)->func, op_array))) { - SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_OBJECT, 1); - if (!zend_jit_init_fcall_guard(&dasm_state, 0, (p+1)->func, opline+1)) { - goto jit_failure; - } - } - goto done; case ZEND_SEND_ARRAY: case ZEND_SEND_UNPACK: if (JIT_G(current_frame) @@ -6198,6 +6158,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info), p + 1)) { goto jit_failure; } + if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func) { + if (zend_jit_may_be_polymorphic_call(opline) || + zend_jit_may_be_modified((p+1)->func, op_array)) { + if (!zend_jit_init_fcall_guard(&dasm_state, 0, (p+1)->func, opline+1)) { + goto jit_failure; + } + } + } } done: From 1a3c9b0542de5abb399af3ba9433e261506710d2 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 27 Sep 2022 17:52:01 +0200 Subject: [PATCH 1285/1346] Fix new bug81726.phpt for PHP 8.0 The error message has slightly changed, so we adapt our expectations. Closes GH-9621. --- ext/phar/tests/bug81726.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/phar/tests/bug81726.phpt b/ext/phar/tests/bug81726.phpt index 11a148c28ea93..b698f0803706a 100644 --- a/ext/phar/tests/bug81726.phpt +++ b/ext/phar/tests/bug81726.phpt @@ -10,5 +10,5 @@ if (!extension_loaded("zlib")) die("skip zlib extension not available"); var_dump(fopen("phar://" . __DIR__ . "/bug81726.gz", "r")); ?> --EXPECTF-- -Warning: fopen(phar://%s): failed to open stream: unable to decompress gzipped phar archive "%s" in %s on line %d +Warning: fopen(phar://%s): Failed to open stream: unable to decompress gzipped phar archive "%s" in %s on line %d bool(false) From e061084bbe02a41b0c93cfb1f232843426622f96 Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Tue, 27 Sep 2022 17:46:45 -0400 Subject: [PATCH 1286/1346] [ci skip] Update NEWS for PHP 8.2.0RC4 --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index a7bb2e5614889..b265e93e6c783 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.2.0RC3 +?? ??? ????, PHP 8.2.0RC4 + + +29 Sep 2022, PHP 8.2.0RC3 - Core: . Fixed observer class notify with Opcache file_cache_only=1. (ilutov) From 28a40b257a3183210700ff17e332ea57ab7ada46 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 29 Sep 2022 13:54:25 +0200 Subject: [PATCH 1287/1346] [skip ci] Pass --no-progress flag in libmysqlclient test --- .github/actions/test-libmysqlclient/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/test-libmysqlclient/action.yml b/.github/actions/test-libmysqlclient/action.yml index 017fb3bee2204..dc06401ff5e4f 100644 --- a/.github/actions/test-libmysqlclient/action.yml +++ b/.github/actions/test-libmysqlclient/action.yml @@ -19,5 +19,5 @@ runs: rm -rf junit.xml | true sapi/cli/php run-tests.php -P -q \ -g FAIL,BORK,LEAK,XLEAK \ - --offline --show-diff --show-slow 1000 --set-timeout 120 \ + --no-progress --offline --show-diff --show-slow 1000 --set-timeout 120 \ ext/pdo_mysql From 138fd5b3c8235e2ca199a767819ead88832d6e2c Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 22 Sep 2022 11:49:20 +0200 Subject: [PATCH 1288/1346] Replace reallocarray with safe_perealloc Fixes GH-9581 --- configure.ac | 4 ++-- main/php.h | 8 -------- main/reallocarray.c | 39 --------------------------------------- sapi/fpm/fpm/fpm_arrays.h | 2 +- 4 files changed, 3 insertions(+), 50 deletions(-) delete mode 100644 main/reallocarray.c diff --git a/configure.ac b/configure.ac index 44f6da3f7d1d5..61081f35c5986 100644 --- a/configure.ac +++ b/configure.ac @@ -691,7 +691,7 @@ if test "$ac_cv_func_getaddrinfo" = yes; then AC_DEFINE(HAVE_GETADDRINFO,1,[Define if you have the getaddrinfo function]) fi -AC_REPLACE_FUNCS(strlcat strlcpy explicit_bzero getopt reallocarray) +AC_REPLACE_FUNCS(strlcat strlcpy explicit_bzero getopt) AC_FUNC_ALLOCA PHP_TIME_R_TYPE PHP_CHECK_IN_ADDR_T @@ -1618,7 +1618,7 @@ PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c \ php_ini_builder.c \ php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \ strlcat.c explicit_bzero.c reentrancy.c php_variables.c php_ticks.c \ - network.c php_open_temporary_file.c php_odbc_utils.c safe_bcmp.c reallocarray.c \ + network.c php_open_temporary_file.c php_odbc_utils.c safe_bcmp.c \ output.c getopt.c php_syslog.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) PHP_ADD_SOURCES_X(main, fastcgi.c, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1, PHP_FASTCGI_OBJS, no) diff --git a/main/php.h b/main/php.h index 7e52eafd84bf4..9fe362593dfd8 100644 --- a/main/php.h +++ b/main/php.h @@ -179,14 +179,6 @@ END_EXTERN_C() #define explicit_bzero php_explicit_bzero #endif -#ifndef HAVE_REALLOCARRAY -BEGIN_EXTERN_C() -PHPAPI void* php_reallocarray(void *p, size_t nmb, size_t siz); -END_EXTERN_C() -#undef reallocarray -#define reallocarray php_reallocarray -#endif - BEGIN_EXTERN_C() PHPAPI int php_safe_bcmp(const zend_string *a, const zend_string *b); END_EXTERN_C() diff --git a/main/reallocarray.c b/main/reallocarray.c deleted file mode 100644 index 95500ebdd8591..0000000000000 --- a/main/reallocarray.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Copyright (c) The PHP Group | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.01 of the PHP license, | - | that is bundled with this package in the file LICENSE, and is | - | available through the world-wide-web at the following url: | - | https://www.php.net/license/3_01.txt | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Author: David Carlier | - +----------------------------------------------------------------------+ -*/ - -#include "php.h" - -#ifndef HAVE_REALLOCARRAY - -#include - -PHPAPI void* php_reallocarray(void *p, size_t nmb, size_t siz) -{ - size_t r; -#ifndef _WIN32 - if (__builtin_mul_overflow(nmb, siz, &r)) { -#else - if (SizeTMult(nmb, siz, &r) != S_OK) { -#endif - // EOVERFLOW may have been, arguably, more appropriate - // but this is what other implementations set - errno = ENOMEM; - return NULL; - } - - return realloc(p, r); -} -#endif diff --git a/sapi/fpm/fpm/fpm_arrays.h b/sapi/fpm/fpm/fpm_arrays.h index 454ff31204b2d..9cdd1e9523523 100644 --- a/sapi/fpm/fpm/fpm_arrays.h +++ b/sapi/fpm/fpm/fpm_arrays.h @@ -86,7 +86,7 @@ static inline void *fpm_array_push(struct fpm_array_s *a) /* {{{ */ if (a->used == a->allocated) { size_t new_allocated = a->allocated ? a->allocated * 2 : 20; - void *new_ptr = reallocarray(a->data, a->sz, new_allocated); + void *new_ptr = safe_perealloc(a->data, a->sz, new_allocated, 0, true); if (!new_ptr) { return 0; From 0d19ae4068d429ae248273352b8a5e5e97ffe36b Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 16 Sep 2022 16:53:43 +0100 Subject: [PATCH 1289/1346] Add support for binary and octal number prefixes for INI settings Closes GH-9560 --- UPGRADING | 4 + .../zend_ini_parse_quantity.phpt | 0 ...nd_ini_parse_quantity_binary_prefixes.phpt | 750 ++++++++++++++++++ .../zend_ini_parse_quantity_error.phpt | 44 + .../zend_ini_parse_quantity_hex_prefixes.phpt | 750 ++++++++++++++++++ ...zend_ini_parse_quantity_ini_set_error.phpt | 0 ..._ini_parse_quantity_ini_setting_error.phpt | 0 ...end_ini_parse_quantity_octal_prefixes.phpt | 750 ++++++++++++++++++ .../zend_ini_parse_quantity_overflow.phpt | 0 .../zend_ini_parse_quantity_zero.phpt | 71 ++ .../zend_ini_parse_uquantity_overflow.phpt | 0 Zend/zend_ini.c | 102 ++- 12 files changed, 2459 insertions(+), 12 deletions(-) rename Zend/tests/{ => zend_ini}/zend_ini_parse_quantity.phpt (100%) create mode 100644 Zend/tests/zend_ini/zend_ini_parse_quantity_binary_prefixes.phpt rename Zend/tests/{ => zend_ini}/zend_ini_parse_quantity_error.phpt (60%) create mode 100644 Zend/tests/zend_ini/zend_ini_parse_quantity_hex_prefixes.phpt rename Zend/tests/{ => zend_ini}/zend_ini_parse_quantity_ini_set_error.phpt (100%) rename Zend/tests/{ => zend_ini}/zend_ini_parse_quantity_ini_setting_error.phpt (100%) create mode 100644 Zend/tests/zend_ini/zend_ini_parse_quantity_octal_prefixes.phpt rename Zend/tests/{ => zend_ini}/zend_ini_parse_quantity_overflow.phpt (100%) create mode 100644 Zend/tests/zend_ini/zend_ini_parse_quantity_zero.phpt rename Zend/tests/{ => zend_ini}/zend_ini_parse_uquantity_overflow.phpt (100%) diff --git a/UPGRADING b/UPGRADING index 00d27ebb5f1d4..77bdec6d74d22 100644 --- a/UPGRADING +++ b/UPGRADING @@ -429,6 +429,10 @@ PHP 8.2 UPGRADE NOTES 11. Changes to INI File Handling ======================================== +- Support for binary and octal number prefixes for INI settings has been added. + Previously only hexadecimal prefixes and using a leading 0 for octal numbers + was supported. + - Parsing of some ill-formatted values will now trigger a warning when this was silently ignored before. Interpretation of these values is not changed, for backwards compatibility. This affects the following settings: diff --git a/Zend/tests/zend_ini_parse_quantity.phpt b/Zend/tests/zend_ini/zend_ini_parse_quantity.phpt similarity index 100% rename from Zend/tests/zend_ini_parse_quantity.phpt rename to Zend/tests/zend_ini/zend_ini_parse_quantity.phpt diff --git a/Zend/tests/zend_ini/zend_ini_parse_quantity_binary_prefixes.phpt b/Zend/tests/zend_ini/zend_ini_parse_quantity_binary_prefixes.phpt new file mode 100644 index 0000000000000..750a377bb142f --- /dev/null +++ b/Zend/tests/zend_ini/zend_ini_parse_quantity_binary_prefixes.phpt @@ -0,0 +1,750 @@ +--TEST-- +Test parsing of binary quantities +--EXTENSIONS-- +zend_test +--FILE-- + static HashTable *registered_zend_ini_directives; @@ -560,33 +561,110 @@ static zend_ulong zend_ini_parse_quantity_internal(zend_string *value, zend_ini_ /* Ignore leading whitespace. ZEND_STRTOL() also skips leading whitespaces, * but we need the position of the first non-whitespace later. */ - while (digits < str_end && zend_is_whitespace(*digits)) ++digits; + while (digits < str_end && zend_is_whitespace(*digits)) {++digits;} /* Ignore trailing whitespace */ - while (digits < str_end && zend_is_whitespace(*(str_end-1))) --str_end; + while (digits < str_end && zend_is_whitespace(*(str_end-1))) {--str_end;} if (digits == str_end) { *errstr = NULL; return 0; } - zend_ulong retval; - errno = 0; + bool is_negative = false; + if (digits[0] == '+') { + ++digits; + } else if (digits[0] == '-') { + is_negative = true; + ++digits; + } - if (signed_result == ZEND_INI_PARSE_QUANTITY_SIGNED) { - retval = (zend_ulong) ZEND_STRTOL(digits, &digits_end, 0); - } else { - retval = ZEND_STRTOUL(digits, &digits_end, 0); + /* if there is no digit after +/- */ + if (!isdigit(digits[0])) { + /* Escape the string to avoid null bytes and to make non-printable chars + * visible */ + smart_str_append_escaped(&invalid, ZSTR_VAL(value), ZSTR_LEN(value)); + smart_str_0(&invalid); + + *errstr = zend_strpprintf(0, "Invalid quantity \"%s\": no valid leading digits, interpreting as \"0\" for backwards compatibility", + ZSTR_VAL(invalid.s)); + + smart_str_free(&invalid); + return 0; + } + + int base = 0; + if (digits[0] == '0' && !isdigit(digits[1])) { + /* Value is just 0 */ + if ((digits+1) == str_end) { + *errstr = NULL; + return 0; + } + + switch (digits[1]) { + /* Multiplier suffixes */ + case 'g': + case 'G': + case 'm': + case 'M': + case 'k': + case 'K': + goto evaluation; + case 'x': + case 'X': + base = 16; + break; + case 'o': + case 'O': + base = 8; + break; + case 'b': + case 'B': + base = 2; + break; + default: + *errstr = zend_strpprintf(0, "Invalid prefix \"0%c\", interpreting as \"0\" for backwards compatibility", + digits[1]); + return 0; + } + digits += 2; + if (UNEXPECTED(digits == str_end)) { + /* Escape the string to avoid null bytes and to make non-printable chars + * visible */ + smart_str_append_escaped(&invalid, ZSTR_VAL(value), ZSTR_LEN(value)); + smart_str_0(&invalid); + + *errstr = zend_strpprintf(0, "Invalid quantity \"%s\": no digits after base prefix, interpreting as \"0\" for backwards compatibility", + ZSTR_VAL(invalid.s)); + + smart_str_free(&invalid); + return 0; + } } + evaluation: + + errno = 0; + zend_ulong retval = ZEND_STRTOUL(digits, &digits_end, base); if (errno == ERANGE) { overflow = true; } else if (signed_result == ZEND_INI_PARSE_QUANTITY_UNSIGNED) { - /* ZEND_STRTOUL() does not report a range error when the subject starts - * with a minus sign, so we check this here. Ignore "-1" as it is - * commonly used as max value, for instance in memory_limit=-1. */ - if (digits[0] == '-' && !(digits_end - digits == 2 && digits_end == str_end && digits[1] == '1')) { + if (is_negative) { + /* Ignore "-1" as it is commonly used as max value, for instance in memory_limit=-1. */ + if (retval == 1 && digits_end == str_end) { + retval = -1; + } else { + overflow = true; + } + } + } else if (signed_result == ZEND_INI_PARSE_QUANTITY_SIGNED) { + /* Handle PHP_INT_MIN case */ + if (is_negative && retval == ((zend_ulong)ZEND_LONG_MAX +1)) { + retval = 0u - retval; + } else if ((zend_long) retval < 0) { overflow = true; + } else if (is_negative) { + retval = 0u - retval; } } From a8d6ca4ef1070bcd8e2aee20e61e0c8b24a321bc Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 19 Sep 2022 15:50:42 +0100 Subject: [PATCH 1290/1346] Fix UPGRADING by adding DBA constants --- UPGRADING | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UPGRADING b/UPGRADING index 77bdec6d74d22..ce6deba0a1d62 100644 --- a/UPGRADING +++ b/UPGRADING @@ -404,6 +404,10 @@ PHP 8.2 UPGRADE NOTES . CURL_VERSION_UNICODE (libcurl >= 7.72.0) . CURL_VERSION_ZSTD (libcurl >= 7.72.0) +- DBA + . DBA_LMDB_USE_SUB_DIR + . DBA_LMDB_NO_SUB_DIR + - Filter . FILTER_FLAG_GLOBAL_RANGE From 74ae498a4b39a34110fee987bb22357f2a9c7479 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 19 Sep 2022 14:08:55 +0100 Subject: [PATCH 1291/1346] Move object/class redundancy check into union type handling As such a redundancy can only happen for union types --- Zend/zend_compile.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3b686176894b6..f1dce379ae86a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6455,6 +6455,14 @@ static zend_type zend_compile_typename( } free_alloca(type_list, use_heap); + + uint32_t type_mask = ZEND_TYPE_FULL_MASK(type); + if ((type_mask & MAY_BE_OBJECT) && (ZEND_TYPE_IS_COMPLEX(type) || (type_mask & MAY_BE_STATIC))) { + zend_string *type_str = zend_type_to_string(type); + zend_error_noreturn(E_COMPILE_ERROR, + "Type %s contains both object and a class type, which is redundant", + ZSTR_VAL(type_str)); + } } else if (ast->kind == ZEND_AST_TYPE_INTERSECTION) { zend_ast_list *list = zend_ast_get_list(ast); zend_type_list *type_list; @@ -6515,13 +6523,6 @@ static zend_type zend_compile_typename( zend_error_noreturn(E_COMPILE_ERROR, "Type mixed cannot be marked as nullable since mixed already includes null"); } - if ((type_mask & MAY_BE_OBJECT) && (ZEND_TYPE_IS_COMPLEX(type) || (type_mask & MAY_BE_STATIC))) { - zend_string *type_str = zend_type_to_string(type); - zend_error_noreturn(E_COMPILE_ERROR, - "Type %s contains both object and a class type, which is redundant", - ZSTR_VAL(type_str)); - } - if ((type_mask & MAY_BE_NULL) && is_marked_nullable) { zend_error_noreturn(E_COMPILE_ERROR, "null cannot be marked as nullable"); } @@ -8083,7 +8084,7 @@ static void zend_compile_use(zend_ast *ast) /* {{{ */ /* Check that we are not attempting to alias a built-in type */ if (type == ZEND_SYMBOL_CLASS && zend_is_reserved_class_name(old_name)) { - zend_error_noreturn(E_COMPILE_ERROR, + zend_error_noreturn(E_COMPILE_ERROR, "Cannot alias '%s' as it is a built-in type", ZSTR_VAL(old_name)); } From c801076d8bd7e5d31b0dfbdc8e4e3d26fd242738 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Fri, 16 Sep 2022 15:21:04 +0100 Subject: [PATCH 1292/1346] Fix GH-9556 "iterable" alias "array|Traversable" breaks PHP 8.1 code Closes GH-9558 --- .../redundant_types/object_and_dnf_type.phpt | 14 ++++++++++++++ .../redundant_types/object_and_dnf_type2.phpt | 14 ++++++++++++++ .../iterable_alias_redundancy_array_1.phpt | 12 ++++++++++++ .../iterable_alias_redundancy_array_2.phpt | 12 ++++++++++++ .../iterable_alias_redundancy_iterable.phpt | 12 ++++++++++++ .../iterable_alias_redundancy_object_1.phpt | 13 +++++++++++++ .../iterable_alias_redundancy_object_2.phpt | 13 +++++++++++++ .../iterable_alias_redundancy_object_3.phpt | 12 ++++++++++++ .../iterable_alias_redundancy_object_4.phpt | 12 ++++++++++++ .../iterable_alias_redundancy_object_5.phpt | 12 ++++++++++++ .../iterable_alias_redundancy_object_6.phpt | 12 ++++++++++++ ...rable_alias_redundancy_object_variance.phpt | 18 ++++++++++++++++++ .../object_and_class_type2.phpt | 11 +++++++++++ .../redundant_types/object_and_static2.phpt | 12 ++++++++++++ Zend/zend_compile.c | 17 +++++++++++++---- 15 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type.phpt create mode 100644 Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type2.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_1.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_2.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_iterable.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_1.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_2.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_3.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_4.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_5.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_6.phpt create mode 100644 Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_variance.phpt create mode 100644 Zend/tests/type_declarations/union_types/redundant_types/object_and_class_type2.phpt create mode 100644 Zend/tests/type_declarations/union_types/redundant_types/object_and_static2.phpt diff --git a/Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type.phpt b/Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type.phpt new file mode 100644 index 0000000000000..3a99d3a5d5202 --- /dev/null +++ b/Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type.phpt @@ -0,0 +1,14 @@ +--TEST-- +A DNF type which contains object is redundant +--FILE-- + +===DONE=== +--EXPECTF-- +Fatal error: Type (A&B)|object contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type2.phpt b/Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type2.phpt new file mode 100644 index 0000000000000..c37f08d6dc41e --- /dev/null +++ b/Zend/tests/type_declarations/dnf_types/redundant_types/object_and_dnf_type2.phpt @@ -0,0 +1,14 @@ +--TEST-- +A DNF type which contains object is redundant 2 +--FILE-- + +===DONE=== +--EXPECTF-- +Fatal error: Type (A&B)|object contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_1.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_1.phpt new file mode 100644 index 0000000000000..b11671bc09242 --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_1.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with array should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Duplicate type array is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_2.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_2.phpt new file mode 100644 index 0000000000000..6973901cb5a2b --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_array_2.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with array should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Duplicate type array is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_iterable.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_iterable.phpt new file mode 100644 index 0000000000000..e8fa3c040261a --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_iterable.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with second iterable should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Duplicate type array is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_1.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_1.phpt new file mode 100644 index 0000000000000..b7a70191145ff --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_1.phpt @@ -0,0 +1,13 @@ +--TEST-- +iterable type with object should NOT be redundant 1 +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_2.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_2.phpt new file mode 100644 index 0000000000000..07a6668232957 --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_2.phpt @@ -0,0 +1,13 @@ +--TEST-- +iterable type with object should NOT be redundant 2 +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_3.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_3.phpt new file mode 100644 index 0000000000000..eedf16fd76491 --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_3.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with object and class T should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Type Traversable|T|object|array|null contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_4.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_4.phpt new file mode 100644 index 0000000000000..acad787130a6c --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_4.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with object and class T should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Type Traversable|T|object|array|null contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_5.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_5.phpt new file mode 100644 index 0000000000000..84ba505aa7dac --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_5.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with object and class T should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Type T|Traversable|object|array|null contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_6.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_6.phpt new file mode 100644 index 0000000000000..541317d1d6961 --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_6.phpt @@ -0,0 +1,12 @@ +--TEST-- +iterable type with object and class T should be redundant +--FILE-- + +--EXPECTF-- +Fatal error: Type T|Traversable|object|array|null contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_variance.phpt b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_variance.phpt new file mode 100644 index 0000000000000..158b6c2214f41 --- /dev/null +++ b/Zend/tests/type_declarations/iterable/iterable_alias_redundancy_object_variance.phpt @@ -0,0 +1,18 @@ +--TEST-- +iterable type with object should be allowed in variance checks +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/tests/type_declarations/union_types/redundant_types/object_and_class_type2.phpt b/Zend/tests/type_declarations/union_types/redundant_types/object_and_class_type2.phpt new file mode 100644 index 0000000000000..bc9852da83d11 --- /dev/null +++ b/Zend/tests/type_declarations/union_types/redundant_types/object_and_class_type2.phpt @@ -0,0 +1,11 @@ +--TEST-- +Using both object and a class type 2 +--FILE-- + +--EXPECTF-- +Fatal error: Type Test|object contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/tests/type_declarations/union_types/redundant_types/object_and_static2.phpt b/Zend/tests/type_declarations/union_types/redundant_types/object_and_static2.phpt new file mode 100644 index 0000000000000..3fbb9a29fe5a5 --- /dev/null +++ b/Zend/tests/type_declarations/union_types/redundant_types/object_and_static2.phpt @@ -0,0 +1,12 @@ +--TEST-- +object and static are redundant 2 +--FILE-- + +--EXPECTF-- +Fatal error: Type static|object contains both object and a class type, which is redundant in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index f1dce379ae86a..154c5a810ba6a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6363,6 +6363,7 @@ static zend_type zend_compile_typename( zend_ast_list *list = zend_ast_get_list(ast); zend_type_list *type_list; bool is_composite = false; + bool has_only_iterable_class = true; ALLOCA_FLAG(use_heap) type_list = do_alloca(ZEND_TYPE_LIST_SIZE(list->children), use_heap); @@ -6371,8 +6372,10 @@ static zend_type zend_compile_typename( for (uint32_t i = 0; i < list->children; i++) { zend_ast *type_ast = list->child[i]; zend_type single_type; + uint32_t type_mask = ZEND_TYPE_FULL_MASK(type); if (type_ast->kind == ZEND_AST_TYPE_INTERSECTION) { + has_only_iterable_class = false; is_composite = true; /* The first class type can be stored directly as the type ptr payload. */ if (ZEND_TYPE_IS_COMPLEX(type) && !ZEND_TYPE_HAS_LIST(type)) { @@ -6380,8 +6383,9 @@ static zend_type zend_compile_typename( type_list->num_types = 1; type_list->types[0] = type; ZEND_TYPE_FULL_MASK(type_list->types[0]) &= ~_ZEND_TYPE_MAY_BE_MASK; - ZEND_TYPE_SET_LIST(type, type_list); } + /* Mark type as list type */ + ZEND_TYPE_SET_LIST(type, type_list); single_type = zend_compile_typename(type_ast, false); ZEND_ASSERT(ZEND_TYPE_IS_INTERSECTION(single_type)); @@ -6406,6 +6410,9 @@ static zend_type zend_compile_typename( if (single_type_mask == MAY_BE_ANY) { zend_error_noreturn(E_COMPILE_ERROR, "Type mixed can only be used as a standalone type"); } + if (ZEND_TYPE_IS_COMPLEX(single_type) && !ZEND_TYPE_IS_ITERABLE_FALLBACK(single_type)) { + has_only_iterable_class = false; + } uint32_t type_mask_overlap = ZEND_TYPE_PURE_MASK(type) & single_type_mask; if (type_mask_overlap) { @@ -6414,8 +6421,9 @@ static zend_type zend_compile_typename( zend_error_noreturn(E_COMPILE_ERROR, "Duplicate type %s is redundant", ZSTR_VAL(overlap_type_str)); } - if ( ((ZEND_TYPE_PURE_MASK(type) & MAY_BE_TRUE) && (single_type_mask == MAY_BE_FALSE)) - || ((ZEND_TYPE_PURE_MASK(type) & MAY_BE_FALSE) && (single_type_mask == MAY_BE_TRUE)) ) { + + if ( ((type_mask & MAY_BE_TRUE) && (single_type_mask == MAY_BE_FALSE)) + || ((type_mask & MAY_BE_FALSE) && (single_type_mask == MAY_BE_TRUE)) ) { zend_error_noreturn(E_COMPILE_ERROR, "Type contains both true and false, bool should be used instead"); } @@ -6457,7 +6465,8 @@ static zend_type zend_compile_typename( free_alloca(type_list, use_heap); uint32_t type_mask = ZEND_TYPE_FULL_MASK(type); - if ((type_mask & MAY_BE_OBJECT) && (ZEND_TYPE_IS_COMPLEX(type) || (type_mask & MAY_BE_STATIC))) { + if ((type_mask & MAY_BE_OBJECT) && + ((!has_only_iterable_class && ZEND_TYPE_IS_COMPLEX(type)) || (type_mask & MAY_BE_STATIC))) { zend_string *type_str = zend_type_to_string(type); zend_error_noreturn(E_COMPILE_ERROR, "Type %s contains both object and a class type, which is redundant", From 666dff4f3fede060f23019f0ca24761b1cc5c4e4 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 1 Oct 2022 11:25:37 +0200 Subject: [PATCH 1293/1346] [ci skip] NEWS --- NEWS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/NEWS b/NEWS index b265e93e6c783..af23d957b7616 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC4 +- Streams: + . Fixed bug GH-9590 (stream_select does not abort upon exception or empty + valid fd set). (Arnaud) 29 Sep 2022, PHP 8.2.0RC3 From 279ffdb598a1b29c32c3719bdfab1cd08acc3d1f Mon Sep 17 00:00:00 2001 From: HypeMC Date: Mon, 3 Oct 2022 01:05:56 +0200 Subject: [PATCH 1294/1346] Fix GH-9655: Allow pure intersection types to be implicitly nullable Closes GH-9659 --- NEWS | 4 ++++ .../implicit_nullable_intersection_type.phpt | 10 +++++++--- Zend/zend_compile.c | 9 --------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/NEWS b/NEWS index af23d957b7616..f80b375179aba 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC4 +- Core: + . Fixed bug GH-9655 (Pure intersection types cannot be implicitly nullable) + (Girgias) + - Streams: . Fixed bug GH-9590 (stream_select does not abort upon exception or empty valid fd set). (Arnaud) diff --git a/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt b/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt index fdac7576a78f8..e4afb9f28ba78 100644 --- a/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt +++ b/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt @@ -1,10 +1,14 @@ --TEST-- -Intersection types cannot be implicitly nullable +Intersection types can be implicitly nullable --FILE-- --EXPECTF-- -Fatal error: Cannot use null as default value for parameter $foo of type X&Y in %s on line %d +NULL diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 154c5a810ba6a..6f6d49e80d613 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6819,15 +6819,6 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32 zend_error_noreturn(E_COMPILE_ERROR, "never cannot be used as a parameter type"); } - if (force_nullable && ZEND_TYPE_IS_INTERSECTION(arg_info->type)) { - /* We drop the nullable type flag to generate the correct type string */ - ZEND_TYPE_FULL_MASK(arg_info->type) = ZEND_TYPE_FULL_MASK(arg_info->type) & ~MAY_BE_NULL; - zend_string *type_str = zend_type_to_string(arg_info->type); - zend_error_noreturn(E_COMPILE_ERROR, - "Cannot use null as default value for parameter $%s of type %s", - ZSTR_VAL(name), ZSTR_VAL(type_str)); - } - if (default_type != IS_UNDEF && default_type != IS_CONSTANT_AST && !force_nullable && !zend_is_valid_default_value(arg_info->type, &default_node.u.constant)) { zend_string *type_str = zend_type_to_string(arg_info->type); From ec5882e1c33eb706782e7b85628b48dc320280c6 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 3 Oct 2022 14:58:37 +0300 Subject: [PATCH 1295/1346] Fix GH-9626: JIT type assertion failure in Symfony community build --- ext/opcache/jit/zend_jit_trace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index 6f747bd8d0972..55aca3bce0f26 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -6159,6 +6159,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par goto jit_failure; } if ((p+1)->op == ZEND_JIT_TRACE_INIT_CALL && (p+1)->func) { + if (opline->opcode == ZEND_NEW && ssa_op->result_def >= 0) { + SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_OBJECT, 1); + } if (zend_jit_may_be_polymorphic_call(opline) || zend_jit_may_be_modified((p+1)->func, op_array)) { if (!zend_jit_init_fcall_guard(&dasm_state, 0, (p+1)->func, opline+1)) { From 1e9280e035c07b6da226dc9d5036c28edf51a9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Mon, 3 Oct 2022 20:32:37 +0200 Subject: [PATCH 1296/1346] [ci skip] Trim trailing whitespace in php_random.h --- ext/random/php_random.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/random/php_random.h b/ext/random/php_random.h index a2c518af28c0e..6a8b0eb84a704 100644 --- a/ext/random/php_random.h +++ b/ext/random/php_random.h @@ -107,7 +107,7 @@ static inline uint64_t php_random_uint128_lo(php_random_uint128_t num) static inline php_random_uint128_t php_random_uint128_constant(uint64_t hi, uint64_t lo) { php_random_uint128_t r; - + r.hi = hi; r.lo = lo; @@ -117,7 +117,7 @@ static inline php_random_uint128_t php_random_uint128_constant(uint64_t hi, uint static inline php_random_uint128_t php_random_uint128_add(php_random_uint128_t num1, php_random_uint128_t num2) { php_random_uint128_t r; - + r.lo = (num1.lo + num2.lo); r.hi = (num1.hi + num2.hi + (r.lo < num1.lo)); @@ -133,7 +133,7 @@ static inline php_random_uint128_t php_random_uint128_multiply(php_random_uint12 y0 = num2.lo & 0xffffffffULL, y1 = num2.lo >> 32, z0 = (((x1 * y0) + (x0 * y0 >> 32)) & 0xffffffffULL) + x0 * y1; - + r.hi = num1.hi * num2.lo + num1.lo * num2.hi; r.lo = num1.lo * num2.lo; r.hi += x1 * y1 + ((x1 * y0 + (x0 * y0 >> 32)) >> 32) + (z0 >> 32); From 01eb06a0def9fb5facf0abf0f4168fcacbbb5789 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Tue, 4 Oct 2022 14:24:51 +0100 Subject: [PATCH 1297/1346] Follow-up fix for GH-9655 Type needs to be rendered as a DNF type and not X&Y|null --- .../implicit_nullable_intersection_type.phpt | 2 +- ...licit_nullable_intersection_type_error.phpt | 18 ++++++++++++++++++ Zend/zend_compile.c | 7 ++++++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type_error.phpt diff --git a/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt b/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt index e4afb9f28ba78..d3dab0d75e0df 100644 --- a/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt +++ b/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type.phpt @@ -10,5 +10,5 @@ function foo(X&Y $foo = null) { foo(null); ?> ---EXPECTF-- +--EXPECT-- NULL diff --git a/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type_error.phpt b/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type_error.phpt new file mode 100644 index 0000000000000..65fc16e6d2c47 --- /dev/null +++ b/Zend/tests/type_declarations/intersection_types/implicit_nullable_intersection_type_error.phpt @@ -0,0 +1,18 @@ +--TEST-- +Verify type rendering in type error for implicitly nullable intersection types +--FILE-- +getMessage(), \PHP_EOL; +} + +?> +--EXPECTF-- +foo(): Argument #1 ($foo) must be of type (X&Y)|null, int given, called in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 6f6d49e80d613..94991adce8c74 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1230,7 +1230,12 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop /* Pure intersection type */ if (ZEND_TYPE_IS_INTERSECTION(type)) { ZEND_ASSERT(!ZEND_TYPE_IS_UNION(type)); - str = add_intersection_type(str, ZEND_TYPE_LIST(type), scope, /* is_bracketed */ false); + bool is_bracketed = false; + /* Shim for implicitly nullable pure intersection types */ + if (UNEXPECTED(ZEND_TYPE_PURE_MASK(type) & MAY_BE_NULL)) { + is_bracketed = true; + } + str = add_intersection_type(str, ZEND_TYPE_LIST(type), scope, is_bracketed); } else if (ZEND_TYPE_HAS_LIST(type)) { /* A union type might not be a list */ zend_type *list_type; From 62d393b1edb6d802255006a6c572480d217cbb35 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 4 Oct 2022 16:12:36 +0200 Subject: [PATCH 1298/1346] Remove support for libmysql-client from mysqli test suite Since mysqli can no longer be built against libmysql-client, there is no longer the need to distinguish. While we're at it, we also drop the superfluous is_object() checks. Closes GH-9652. --- ext/mysqli/tests/071.phpt | 36 +--- ext/mysqli/tests/bug38710.phpt | 2 +- ext/mysqli/tests/bug44897.phpt | 4 - ext/mysqli/tests/bug45019.phpt | 10 +- ext/mysqli/tests/bug45289.phpt | 5 +- ext/mysqli/tests/bug49442.phpt | 64 +++--- ext/mysqli/tests/bug51647.phpt | 2 +- ext/mysqli/tests/bug52891.phpt | 3 - ext/mysqli/tests/bug55283.phpt | 2 +- ext/mysqli/tests/bug62885.phpt | 3 - ext/mysqli/tests/bug63398.phpt | 3 - ext/mysqli/tests/bug64726.phpt | 3 - ext/mysqli/tests/bug67983.phpt | 3 - ext/mysqli/tests/bug68077.phpt | 3 - ext/mysqli/tests/bug69899.phpt | 3 - ext/mysqli/tests/bug70949.phpt | 3 - ext/mysqli/tests/bug71863.phpt | 3 - ext/mysqli/tests/bug77935.phpt | 3 - ext/mysqli/tests/connect.inc | 2 - ext/mysqli/tests/gh7837.phpt | 3 - ext/mysqli/tests/gh9590.phpt | 3 - .../tests/mysqli_change_user_insert_id.phpt | 4 - ext/mysqli/tests/mysqli_change_user_oo.phpt | 3 - .../tests/mysqli_class_mysqli_interface.phpt | 11 +- .../mysqli_class_mysqli_result_interface.phpt | 17 +- .../mysqli_class_mysqli_stmt_interface.phpt | 8 +- ext/mysqli/tests/mysqli_connect.phpt | 38 ++-- ext/mysqli/tests/mysqli_connect_attr.phpt | 3 - ext/mysqli/tests/mysqli_connect_oo.phpt | 41 ++-- ext/mysqli/tests/mysqli_constants.phpt | 61 ++---- ext/mysqli/tests/mysqli_debug.phpt | 60 +++--- ext/mysqli/tests/mysqli_debug_append.phpt | 6 +- .../tests/mysqli_debug_control_string.phpt | 6 +- ext/mysqli/tests/mysqli_debug_ini.phpt | 3 - .../mysqli_debug_mysqlnd_control_string.phpt | 22 +-- .../tests/mysqli_debug_mysqlnd_only.phpt | 3 - ext/mysqli/tests/mysqli_driver.phpt | 4 +- ext/mysqli/tests/mysqli_expire_password.phpt | 4 - ext/mysqli/tests/mysqli_explain_metadata.phpt | 2 - ext/mysqli/tests/mysqli_fetch_array.phpt | 10 +- ext/mysqli/tests/mysqli_fetch_array_oo.phpt | 10 +- ext/mysqli/tests/mysqli_fetch_column.phpt | 3 - ext/mysqli/tests/mysqli_get_host_info.phpt | 2 +- ext/mysqli/tests/mysqli_get_warnings.phpt | 3 +- ext/mysqli/tests/mysqli_kill.phpt | 10 +- .../tests/mysqli_mysqlnd_read_timeout.phpt | 3 - .../mysqli_mysqlnd_read_timeout_long.phpt | 4 - .../mysqli_mysqlnd_read_timeout_zero.phpt | 4 - ext/mysqli/tests/mysqli_no_reconnect.phpt | 19 +- ext/mysqli/tests/mysqli_options.phpt | 3 - .../mysqli_options_int_and_float_native.phpt | 3 - .../tests/mysqli_options_openbasedir.phpt | 10 +- ext/mysqli/tests/mysqli_phpinfo.phpt | 18 +- ext/mysqli/tests/mysqli_poll.phpt | 3 - ext/mysqli/tests/mysqli_poll_kill.phpt | 3 - .../mysqli_poll_mixing_insert_select.phpt | 3 - ext/mysqli/tests/mysqli_poll_reference.phpt | 3 - ext/mysqli/tests/mysqli_ps_select_union.phpt | 182 +++++++++--------- ext/mysqli/tests/mysqli_real_connect.phpt | 44 ++--- .../tests/mysqli_real_connect_pconn.phpt | 42 ++-- ext/mysqli/tests/mysqli_reap_async_query.phpt | 3 - .../mysqli_result_references_mysqlnd.phpt | 2 - ext/mysqli/tests/mysqli_stmt_bind_result.phpt | 8 +- .../tests/mysqli_stmt_execute_bind.phpt | 3 - .../mysqli_stmt_execute_stored_proc_out.phpt | 5 - ext/mysqli/tests/mysqli_stmt_multires.phpt | 3 - ext/mysqli/tests/mysqli_stmt_num_rows.phpt | 2 +- ...mt_send_long_data_packet_size_mysqlnd.phpt | 3 - .../tests/mysqli_store_result_copy.phpt | 3 - 69 files changed, 304 insertions(+), 569 deletions(-) diff --git a/ext/mysqli/tests/071.phpt b/ext/mysqli/tests/071.phpt index 8a5334d4609ad..39d8ba775942f 100644 --- a/ext/mysqli/tests/071.phpt +++ b/ext/mysqli/tests/071.phpt @@ -16,22 +16,8 @@ require_once('skipifconnectfailure.inc'); var_dump($mysql->ping()); $ret = $mysql->kill($mysql->thread_id); - if ($IS_MYSQLND) { - if ($ret !== true){ - printf("[001] Expecting boolean/true got %s/%s\n", gettype($ret), var_export($ret, true)); - } - } else { - /* libmysql return value seems to depend on server version */ - if ((($version >= 50123) || ($version <= 40200)) && $version != 50200) { - /* TODO: find exact version */ - if ($ret !== true){ - printf("[001] Expecting boolean/true got %s/%s @\n", gettype($ret), var_export($ret, true), $version); - } - } else { - if ($ret !== false){ - printf("[001] Expecting boolean/false got %s/%s @\n", gettype($ret), var_export($ret, true), $version); - } - } + if ($ret !== true){ + printf("[001] Expecting boolean/true got %s/%s\n", gettype($ret), var_export($ret, true)); } var_dump($mysql->ping()); @@ -43,22 +29,8 @@ require_once('skipifconnectfailure.inc'); var_dump(mysqli_ping($mysql)); $ret = $mysql->kill($mysql->thread_id); - if ($IS_MYSQLND) { - if ($ret !== true){ - printf("[002] Expecting boolean/true got %s/%s\n", gettype($ret), var_export($ret, true)); - } - } else { - /* libmysql return value seems to depend on server version */ - if ((($version >= 50123) || ($version <= 40200)) && $version != 50200) { - /* TODO: find exact version */ - if ($ret !== true){ - printf("[002] Expecting boolean/true got %s/%s @\n", gettype($ret), var_export($ret, true), $version); - } - } else { - if ($ret !== false){ - printf("[002] Expecting boolean/false got %s/%s @\n", gettype($ret), var_export($ret, true), $version); - } - } + if ($ret !== true){ + printf("[002] Expecting boolean/true got %s/%s\n", gettype($ret), var_export($ret, true)); } var_dump(mysqli_ping($mysql)); diff --git a/ext/mysqli/tests/bug38710.phpt b/ext/mysqli/tests/bug38710.phpt index 9c6c7c0fc44ec..9d50b9797a5f8 100644 --- a/ext/mysqli/tests/bug38710.phpt +++ b/ext/mysqli/tests/bug38710.phpt @@ -16,7 +16,7 @@ $qry->prepare("SELECT REPEAT('a',100000)"); $qry->execute(); $qry->bind_result($text); $qry->fetch(); -if ($text !== str_repeat('a', ($IS_MYSQLND || mysqli_get_server_version($db) > 50110)? 100000:(mysqli_get_server_version($db)>=50000? 8193:8191))) { +if ($text !== str_repeat('a', 100000)) { var_dump(strlen($text)); } echo "Done"; diff --git a/ext/mysqli/tests/bug44897.phpt b/ext/mysqli/tests/bug44897.phpt index 1ec80b0000f13..50177a72e5b1c 100644 --- a/ext/mysqli/tests/bug44897.phpt +++ b/ext/mysqli/tests/bug44897.phpt @@ -6,10 +6,6 @@ mysqli fetch()) { - /* NOTE: libmysql - http://bugs.mysql.com/bug.php?id=47483 */ if ($data[$index] != $column1) { - if ($IS_MYSQLND || $index != 1) { - printf("[004] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } else { - if ($column1 != "thre") - printf("[005] Got '%s'. Please check if http://bugs.mysql.com/bug.php?id=47483 has been fixed and adapt tests bug45019.phpt/mysqli_ps_select_union.phpt", $column1); - } + printf("[004] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); } $index++; } diff --git a/ext/mysqli/tests/bug45289.phpt b/ext/mysqli/tests/bug45289.phpt index 8a72e3517e403..eb5906810f20e 100644 --- a/ext/mysqli/tests/bug45289.phpt +++ b/ext/mysqli/tests/bug45289.phpt @@ -25,10 +25,7 @@ require_once('skipifconnectfailure.inc'); printf("[003] [%d] %s\n", $stmt->errno, $stmt->error); if ($res = $link->store_result()) { - if ($IS_MYSQLND) - printf("[004] Can store result!\n"); - else - printf("[004] [007] http://bugs.mysql.com/bug.php?id=47485\n"); + printf("[004] Can store result!\n"); } else { printf("[004] [%d] %s\n", $link->errno, $link->error); } diff --git a/ext/mysqli/tests/bug49442.phpt b/ext/mysqli/tests/bug49442.phpt index 748ab09f884ea..e5741ead4d595 100644 --- a/ext/mysqli/tests/bug49442.phpt +++ b/ext/mysqli/tests/bug49442.phpt @@ -63,45 +63,43 @@ mysqli.max_persistent=1 mysqli_query($link, "DELETE FROM test"); mysqli_close($link); - if ($IS_MYSQLND) { - /* - mysqlnd makes a connection created through mysql_init()/mysqli_real_connect() always a 'persistent' one. - At this point 'persistent' is not to be confused with what a user calls a 'persistent' - in this case - 'persistent' means that mysqlnd uses malloc() instead of emalloc(). nothing else. ext/mysqli will - not consider it as a 'persistent' connection in a user sense, ext/mysqli will not apply max_persistent etc. - It's only about malloc() vs. emalloc(). - - However, the bug is about malloc() and efree(). You can make mysqlnd use malloc() by either using - pconnect or mysql_init() - so we should test pconnect as well. - */ - $host = 'p:' . $host; - if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { - printf("[007] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); - } + /* + mysqlnd makes a connection created through mysql_init()/mysqli_real_connect() always a 'persistent' one. + At this point 'persistent' is not to be confused with what a user calls a 'persistent' - in this case + 'persistent' means that mysqlnd uses malloc() instead of emalloc(). nothing else. ext/mysqli will + not consider it as a 'persistent' connection in a user sense, ext/mysqli will not apply max_persistent etc. + It's only about malloc() vs. emalloc(). + + However, the bug is about malloc() and efree(). You can make mysqlnd use malloc() by either using + pconnect or mysql_init() - so we should test pconnect as well. + */ + $host = 'p:' . $host; + if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + printf("[007] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } - /* bug happened during query processing */ - if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s' - INTO TABLE test - FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\'' - LINES TERMINATED BY '\n'", - mysqli_real_escape_string($link, $file)))) { - printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - } + /* bug happened during query processing */ + if (!@mysqli_query($link, sprintf("LOAD DATA LOCAL INFILE '%s' + INTO TABLE test + FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\'' + LINES TERMINATED BY '\n'", + mysqli_real_escape_string($link, $file)))) { + printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + } - /* we survived? that's good enough... */ + /* we survived? that's good enough... */ - if (!$res = mysqli_query($link, "SELECT * FROM test ORDER BY id")) - printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + if (!$res = mysqli_query($link, "SELECT * FROM test ORDER BY id")) + printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - $i = 0; - while ($row = mysqli_fetch_assoc($res)) { - if (($row['id'] != $rows[$i]['id']) || ($row['label'] != $rows[$i]['label'])) { - printf("[010] Wrong values, check manually!\n"); - } - $i++; + $i = 0; + while ($row = mysqli_fetch_assoc($res)) { + if (($row['id'] != $rows[$i]['id']) || ($row['label'] != $rows[$i]['label'])) { + printf("[010] Wrong values, check manually!\n"); } - mysqli_close($link); + $i++; } + mysqli_close($link); print "done!"; ?> diff --git a/ext/mysqli/tests/bug51647.phpt b/ext/mysqli/tests/bug51647.phpt index 38515245e7b0e..fb7312aebbec5 100644 --- a/ext/mysqli/tests/bug51647.phpt +++ b/ext/mysqli/tests/bug51647.phpt @@ -9,7 +9,7 @@ require_once "connect.inc"; if (!defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) die("skip Requires MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT"); -if ($IS_MYSQLND && !extension_loaded("openssl")) +if (!extension_loaded("openssl")) die("skip PHP streams lack support for SSL. mysqli is compiled to use mysqlnd which uses PHP streams in turn."); if (!($link = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))) diff --git a/ext/mysqli/tests/bug52891.phpt b/ext/mysqli/tests/bug52891.phpt index 1c287d79bfad1..fc76f89b703a7 100644 --- a/ext/mysqli/tests/bug52891.phpt +++ b/ext/mysqli/tests/bug52891.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- --FILE-- 50100)) { - die("skip Your MySQL Server version has a known bug that will cause a crash"); -} if (mysqli_get_server_version($link) >= 50600) die("SKIP For MySQL < 5.6.0"); diff --git a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt index 3e5d439a538fe..393321bd1d590 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_interface.phpt @@ -61,13 +61,10 @@ require_once('skipifconnectfailure.inc'); 'use_result' => true, ); - if ($IS_MYSQLND) { - // mysqlnd only - /* $expected_methods['get_client_stats'] = true; */ - $expected_methods['get_connection_stats'] = true; - $expected_methods['reap_async_query'] = true; - $expected_methods['poll'] = true; - } + /* $expected_methods['get_client_stats'] = true; */ + $expected_methods['get_connection_stats'] = true; + $expected_methods['reap_async_query'] = true; + $expected_methods['poll'] = true; /* we should add ruled when to expect them */ if (function_exists('mysqli_debug')) diff --git a/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt index abbb47ebb1d8d..946657d3ef8aa 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_result_interface.phpt @@ -111,8 +111,7 @@ require_once('skipifconnectfailure.inc'); printf("mysqli_result->unknown = '%s'\n", @$mysqli_result->unknown); printf("\nConstructor:\n"); - if (!is_object($res = new mysqli_result($link))) - printf("[001] Expecting object/mysqli_result got %s/%s\n", gettye($res), $res); + $res = new mysqli_result($link); try { $res->num_rows; @@ -123,14 +122,9 @@ require_once('skipifconnectfailure.inc'); if (!mysqli_query($link, "SELECT id FROM test ORDER BY id")) printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - if (!is_object($res = new mysqli_result($link))) - printf("[004] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - if (!is_object($res = new mysqli_result($link, MYSQLI_STORE_RESULT))) - printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - - if (!is_object($res = new mysqli_result($link, MYSQLI_USE_RESULT))) - printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + $res = new mysqli_result($link); + $res = new mysqli_result($link, MYSQLI_STORE_RESULT); + $res = new mysqli_result($link, MYSQLI_USE_RESULT); $valid = array(MYSQLI_STORE_RESULT, MYSQLI_USE_RESULT); do { @@ -139,8 +133,7 @@ require_once('skipifconnectfailure.inc'); if ($TEST_EXPERIMENTAL) { ob_start(); - if (!is_object($res = new mysqli_result($link, $mode))) - printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + $res = new mysqli_result($link, $mode); $content = ob_get_contents(); ob_end_clean(); if (!stristr($content, 'Invalid value for resultmode')) diff --git a/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt b/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt index 626843c427d20..c0101a8d9e412 100644 --- a/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt +++ b/ext/mysqli/tests/mysqli_class_mysqli_stmt_interface.phpt @@ -40,11 +40,9 @@ mysqli 'store_result' => true, ); - if ($IS_MYSQLND) { - $expected_methods['get_result'] = true; - $expected_methods['more_results'] = true; - $expected_methods['next_result'] = true; - } + $expected_methods['get_result'] = true; + $expected_methods['more_results'] = true; + $expected_methods['next_result'] = true; foreach ($methods as $k => $method) { if (isset($expected_methods[$method])) { diff --git a/ext/mysqli/tests/mysqli_connect.phpt b/ext/mysqli/tests/mysqli_connect.phpt index 8f648934308e0..0e1142ee92a61 100644 --- a/ext/mysqli/tests/mysqli_connect.phpt +++ b/ext/mysqli/tests/mysqli_connect.phpt @@ -118,28 +118,26 @@ require_once('skipifconnectfailure.inc'); mysqli_close($link); } - if ($IS_MYSQLND) { - ini_set('mysqli.default_host', 'p:' . $host); - if (!is_object($link = mysqli_connect())) { - printf("[021] Usage of mysqli.default_host (persistent) failed\n") ; - } else { - if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'")) - printf("[022] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - $tmp = mysqli_fetch_assoc($res); - if ($tmp['testing'] !== 'mysqli.default_host (persistent)') { - printf("[023] Result looks strange - check manually, [%d] %s\n", - mysqli_errno($link), mysqli_error($link)); - var_dump($tmp); - } - mysqli_free_result($res); - mysqli_close($link); + ini_set('mysqli.default_host', 'p:' . $host); + if (!is_object($link = mysqli_connect())) { + printf("[021] Usage of mysqli.default_host (persistent) failed\n") ; + } else { + if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'")) + printf("[022] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + $tmp = mysqli_fetch_assoc($res); + if ($tmp['testing'] !== 'mysqli.default_host (persistent)') { + printf("[023] Result looks strange - check manually, [%d] %s\n", + mysqli_errno($link), mysqli_error($link)); + var_dump($tmp); } + mysqli_free_result($res); + mysqli_close($link); + } - ini_set('mysqli.default_host', 'p:'); - if (is_object($link = @mysqli_connect())) { - printf("[024] Usage of mysqli.default_host=p: did not fail\n") ; - mysqli_close($link); - } + ini_set('mysqli.default_host', 'p:'); + if (is_object($link = @mysqli_connect())) { + printf("[024] Usage of mysqli.default_host=p: did not fail\n") ; + mysqli_close($link); } print "done!"; diff --git a/ext/mysqli/tests/mysqli_connect_attr.phpt b/ext/mysqli/tests/mysqli_connect_attr.phpt index 75de208c4c5a2..323a87b74682b 100644 --- a/ext/mysqli/tests/mysqli_connect_attr.phpt +++ b/ext/mysqli/tests/mysqli_connect_attr.phpt @@ -6,9 +6,6 @@ mysqli close(); } ini_set('mysqli.default_port', $port); - if (!is_object($mysqli = new mysqli($host, $user, $passwd, $db)) || (0 !== mysqli_connect_errno())) { + $mysqli = new mysqli($host, $user, $passwd, $db); + if (0 !== mysqli_connect_errno()) { printf("[006] Usage of mysqli.default_port failed\n") ; } else { $mysqli->close(); } ini_set('mysqli.default_pw', $passwd); - if (!is_object($mysqli = new mysqli($host, $user)) || (0 !== mysqli_connect_errno())) { + $mysqli = new mysqli($host, $user); + if (0 !== mysqli_connect_errno()) { printf("[007] Usage of mysqli.default_pw failed\n") ; } else { $mysqli->close(); } ini_set('mysqli.default_user', $user); - if (!is_object($mysqli = new mysqli($host)) || (0 !== mysqli_connect_errno())) { + $mysqli = new mysqli($host); + if (0 !== mysqli_connect_errno()) { printf("[008] Usage of mysqli.default_user failed\n") ; } else { $mysqli->close(); } ini_set('mysqli.default_host', $host); - if (!is_object($mysqli = new mysqli()) || (0 !== mysqli_connect_errno())) { + $mysqli = new mysqli(); + if (0 !== mysqli_connect_errno()) { printf("[012] Failed to create mysqli object\n"); } else { // There shall be NO connection! Using new mysqli(void) shall not use defaults for a connection! @@ -66,22 +71,16 @@ require_once('skipifconnectfailure.inc'); } } - if ($IS_MYSQLND) { - ini_set('mysqli.default_host', 'p:' . $host); - if (!is_object($mysqli = new mysqli())) { - // Due to an API flaw this shall not connect - printf("[010] Failed to create mysqli object\n"); - } else { - // There shall be NO connection! Using new mysqli(void) shall not use defaults for a connection! - // We had long discussions on this and found that the ext/mysqli API as - // such is broken. As we can't fix it, we document how it has behaved from - // the first day on. And that's: no connection. - try { - $mysqli->query('SELECT 1'); - } catch (Error $exception) { - echo $exception->getMessage() . "\n"; - } - } + ini_set('mysqli.default_host', 'p:' . $host); + $mysqli = new mysqli(); + // There shall be NO connection! Using new mysqli(void) shall not use defaults for a connection! + // We had long discussions on this and found that the ext/mysqli API as + // such is broken. As we can't fix it, we document how it has behaved from + // the first day on. And that's: no connection. + try { + $mysqli->query('SELECT 1'); + } catch (Error $exception) { + echo $exception->getMessage() . "\n"; } print "... and now Exceptions\n"; diff --git a/ext/mysqli/tests/mysqli_constants.phpt b/ext/mysqli/tests/mysqli_constants.phpt index 444493fae5895..c228e1aafb69c 100644 --- a/ext/mysqli/tests/mysqli_constants.phpt +++ b/ext/mysqli/tests/mysqli_constants.phpt @@ -7,7 +7,6 @@ mysqli.allow_local_infile=1 --FILE-- true, ); -/* depends on the build - experimental */ -if ($IS_MYSQLND) { - $expected_constants['MYSQLI_OPT_INT_AND_FLOAT_NATIVE'] = true; -} +$expected_constants['MYSQLI_OPT_INT_AND_FLOAT_NATIVE'] = true; -if ($IS_MYSQLND) { - $expected_constants['MYSQLI_STORE_RESULT_COPY_DATA'] = true; -} +$expected_constants['MYSQLI_STORE_RESULT_COPY_DATA'] = true; -if ($IS_MYSQLND) { - $expected_constants['MYSQLI_REFRESH_BACKUP_LOG'] = true; -} +$expected_constants['MYSQLI_REFRESH_BACKUP_LOG'] = true; -if ($IS_MYSQLND) { - $version = 50007 + 1; - $expected_constants['MYSQLI_OPT_NET_CMD_BUFFER_SIZE'] = true; - $expected_constants['MYSQLI_OPT_NET_READ_BUFFER_SIZE'] = true; - $expected_constants['MYSQLI_ASYNC'] = true; +$version = 50007 + 1; +$expected_constants['MYSQLI_OPT_NET_CMD_BUFFER_SIZE'] = true; +$expected_constants['MYSQLI_OPT_NET_READ_BUFFER_SIZE'] = true; +$expected_constants['MYSQLI_ASYNC'] = true; - $expected_constants['MYSQLI_SERVER_PS_OUT_PARAMS'] = true; -} else { - $version = mysqli_get_client_version(); -} +$expected_constants['MYSQLI_SERVER_PS_OUT_PARAMS'] = true; -if (($version > 51122 && $version < 60000) || ($version > 60003) || $IS_MYSQLND) { - $expected_constants['MYSQLI_ON_UPDATE_NOW_FLAG'] = true; -} +$expected_constants['MYSQLI_ON_UPDATE_NOW_FLAG'] = true; -/* First introduced in MySQL 6.0, backported to MySQL 5.5 */ -if ($version >= 50500 || $IS_MYSQLND) { - $expected_constants['MYSQLI_SERVER_QUERY_WAS_SLOW'] = true; -} +$expected_constants['MYSQLI_SERVER_QUERY_WAS_SLOW'] = true; $expected_constants['MYSQLI_CLIENT_SSL_VERIFY_SERVER_CERT'] = true; -if ($IS_MYSQLND) { - $expected_constants['MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'] = true; -} +$expected_constants['MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT'] = true; -/* First introduced in MySQL 6.0, backported to MySQL 5.5 */ -if ($version >= 50606 || $IS_MYSQLND) { - $expected_constants['MYSQLI_SERVER_PUBLIC_KEY'] = true; -} +$expected_constants['MYSQLI_SERVER_PUBLIC_KEY'] = true; $expected_constants = array_merge($expected_constants, array( "MYSQLI_TYPE_NEWDECIMAL" => true, @@ -165,22 +143,15 @@ $expected_constants = array_merge($expected_constants, array( "MYSQLI_STMT_ATTR_PREFETCH_ROWS" => true, )); -if ($version < 80000 || $version >= 100000 || $IS_MYSQLND) { - $expected_constants['MYSQLI_OPT_SSL_VERIFY_SERVER_CERT'] = true; -} +$expected_constants['MYSQLI_OPT_SSL_VERIFY_SERVER_CERT'] = true; /* pretty dump test, but that is the best way to mimic mysql.c */ $expected_constants["MYSQLI_DATA_TRUNCATED"] = true; -if ($IS_MYSQLND || (!$IS_MYSQLND && ($version > 50610))) { - /* could be that MySQL/libmysql 5.6.9 had the flag already but it was no stable release */ - $expected_constants["MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS"] = true; - $expected_constants["MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS"] = true; -} +$expected_constants["MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS"] = true; +$expected_constants["MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS"] = true; -if ($IS_MYSQLND) { - $expected_constants["MYSQLI_TYPE_JSON"] = true; -} +$expected_constants["MYSQLI_TYPE_JSON"] = true; $unexpected_constants = array(); diff --git a/ext/mysqli/tests/mysqli_debug.phpt b/ext/mysqli/tests/mysqli_debug.phpt index ec0eacced8cd8..25cd8f2c8d6b5 100644 --- a/ext/mysqli/tests/mysqli_debug.phpt +++ b/ext/mysqli/tests/mysqli_debug.phpt @@ -23,38 +23,34 @@ if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) if (true !== ($tmp = mysqli_debug(sprintf('d:t:O,%s/mysqli_debug_phpt.trace', sys_get_temp_dir())))) printf("[002] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp); - if ($IS_MYSQLND) { - // let's make this mysqlnd only - for libmysql we need debug installation - - // table.inc will create a database connection and run some SQL queries, therefore - // the debug file should have entries - require_once('table.inc'); - - clearstatcache(); - $trace_file = sprintf('%s/mysqli_debug_phpt.trace', sys_get_temp_dir()); - if (!file_exists($trace_file)) - printf("[003] Trace file '%s' has not been created\n", $trace_file); - if (filesize($trace_file) < 50) - printf("[004] Trace file '%s' is very small. filesize() reports only %d bytes. Please check.\n", - $trace_file, - filesize($trace_file)); - - // will mysqli_debug() mind if the trace file gets removed? - unlink($trace_file); - clearstatcache(); - - if (!$res = mysqli_query($link, 'SELECT * FROM test')) - printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - else - mysqli_free_result($res); - - mysqli_close($link); - - clearstatcache(); - if (!file_exists($trace_file)) - printf("[006] Trace file '%s' does not exist\n", $trace_file); - unlink($trace_file); - } + // table.inc will create a database connection and run some SQL queries, therefore + // the debug file should have entries + require_once('table.inc'); + + clearstatcache(); + $trace_file = sprintf('%s/mysqli_debug_phpt.trace', sys_get_temp_dir()); + if (!file_exists($trace_file)) + printf("[003] Trace file '%s' has not been created\n", $trace_file); + if (filesize($trace_file) < 50) + printf("[004] Trace file '%s' is very small. filesize() reports only %d bytes. Please check.\n", + $trace_file, + filesize($trace_file)); + + // will mysqli_debug() mind if the trace file gets removed? + unlink($trace_file); + clearstatcache(); + + if (!$res = mysqli_query($link, 'SELECT * FROM test')) + printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + else + mysqli_free_result($res); + + mysqli_close($link); + + clearstatcache(); + if (!file_exists($trace_file)) + printf("[006] Trace file '%s' does not exist\n", $trace_file); + unlink($trace_file); print "done!"; ?> diff --git a/ext/mysqli/tests/mysqli_debug_append.phpt b/ext/mysqli/tests/mysqli_debug_append.phpt index b48e8470a47b1..1c26d469f51db 100644 --- a/ext/mysqli/tests/mysqli_debug_append.phpt +++ b/ext/mysqli/tests/mysqli_debug_append.phpt @@ -15,9 +15,6 @@ if (!defined('MYSQLI_DEBUG_TRACE_ENABLED')) if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) die("skip: debug functionality not enabled"); -if (!$IS_MYSQLND) - die("SKIP Libmysql feature not sufficiently spec'd in MySQL C API documentation"); - if (substr(PHP_OS, 0, 3) == 'WIN') die("skip this test is not for Windows platforms"); ?> --FILE-- @@ -84,8 +81,7 @@ if (substr(PHP_OS, 0, 3) == 'WIN') die("skip this test is not for Windows platfo mysqli_close($link); print "done"; - if ($IS_MYSQLND) - print "libmysql/DBUG package prints some debug info here." + print "libmysql/DBUG package prints some debug info here." ?> --CLEAN-- --FILE-- --EXPECTF-- Warning: mysqli_debug(): Unrecognized format ',' in %s on line %d diff --git a/ext/mysqli/tests/mysqli_debug_ini.phpt b/ext/mysqli/tests/mysqli_debug_ini.phpt index 42f78e7361a95..c53b103f2768b 100644 --- a/ext/mysqli/tests/mysqli_debug_ini.phpt +++ b/ext/mysqli/tests/mysqli_debug_ini.phpt @@ -15,9 +15,6 @@ if (!defined('MYSQLI_DEBUG_TRACE_ENABLED')) if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) die("skip: debug functionality not enabled"); -if (!$IS_MYSQLND) - die("skip needs mysqlnd"); - if (!$fp = @fopen('/tmp/mysqli_debug_phpt.trace', 'w')) die("skip PHP cannot create a file in /tmp/mysqli_debug_phpt"); else diff --git a/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt b/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt index 25feade40af9e..5c2f58e9f3d4b 100644 --- a/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt +++ b/ext/mysqli/tests/mysqli_debug_mysqlnd_control_string.phpt @@ -14,9 +14,6 @@ if (!defined('MYSQLI_DEBUG_TRACE_ENABLED')) if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) die("skip: debug functionality not enabled"); - -if (!$IS_MYSQLND) - die("SKIP Libmysql feature not sufficiently spec'd in MySQL C API documentation"); ?> --FILE-- \_mysqlnd_p?efree@ismU", $trace, $matches) && - !preg_match("@^[|\s]*>\_mysqlnd_p?emalloc@ismU", $trace, $matches)) { - printf("[125] Memory dump does neither contain _mysqlnd_pefree nor _mysqlnd_pemalloc calls - check manually.\n"); - var_dump($trace); - } - + // m - trace memory allocations + $trace = try_control_string($link, 't:O,' . $trace_file . ':m', $trace_file, 120); + if (!preg_match("@^[|\s]*>\_mysqlnd_p?efree@ismU", $trace, $matches) && + !preg_match("@^[|\s]*>\_mysqlnd_p?emalloc@ismU", $trace, $matches)) { + printf("[125] Memory dump does neither contain _mysqlnd_pefree nor _mysqlnd_pemalloc calls - check manually.\n"); + var_dump($trace); } mysqli_close($link); print "done"; - if ($IS_MYSQLND) - print "libmysql/DBUG package prints some debug info here."; + print "libmysql/DBUG package prints some debug info here."; @unlink($trace_file); ?> --CLEAN-- diff --git a/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt b/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt index 00a460a410e1f..8d9058439752f 100644 --- a/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt +++ b/ext/mysqli/tests/mysqli_debug_mysqlnd_only.phpt @@ -14,9 +14,6 @@ if (!defined('MYSQLI_DEBUG_TRACE_ENABLED')) if (defined('MYSQLI_DEBUG_TRACE_ENABLED') && !MYSQLI_DEBUG_TRACE_ENABLED) die("skip: debug functionality not enabled"); - -if (!$IS_MYSQLND) - die("skip mysqlnd only test"); ?> --FILE-- client_info) !== $client_info) { diff --git a/ext/mysqli/tests/mysqli_expire_password.phpt b/ext/mysqli/tests/mysqli_expire_password.phpt index 50332d6cd69b1..fa1b9a94b0f5c 100644 --- a/ext/mysqli/tests/mysqli_expire_password.phpt +++ b/ext/mysqli/tests/mysqli_expire_password.phpt @@ -26,10 +26,6 @@ if ($link->server_version >= 100000) { } -if (!$IS_MYSQLND && (mysqli_get_client_version() < 50610)) { - die(sprintf("SKIP Needs libmysql 5.6.10 or newer, found %s\n", mysqli_get_client_version())); -} - mysqli_query($link, 'DROP USER expiretest'); mysqli_query($link, 'DROP USER expiretest@localhost'); diff --git a/ext/mysqli/tests/mysqli_explain_metadata.phpt b/ext/mysqli/tests/mysqli_explain_metadata.phpt index e920a7fffb081..af8d153bc759e 100644 --- a/ext/mysqli/tests/mysqli_explain_metadata.phpt +++ b/ext/mysqli/tests/mysqli_explain_metadata.phpt @@ -5,8 +5,6 @@ mysqli --SKIPIF-- --FILE-- = 51000) { - func_mysqli_fetch_array($link, $engine, "BIGINT", "-9223372036854775808", "-9223372036854775808", 250); - func_mysqli_fetch_array($link, $engine, "BIGINT", NULL, NULL, 260); - func_mysqli_fetch_array($link, $engine, "BIGINT UNSIGNED", "18446744073709551615", "18446744073709551615", 260); - func_mysqli_fetch_array($link, $engine, "BIGINT UNSIGNED", NULL, NULL, 280); - } + func_mysqli_fetch_array($link, $engine, "BIGINT", "-9223372036854775808", "-9223372036854775808", 250); + func_mysqli_fetch_array($link, $engine, "BIGINT", NULL, NULL, 260); + func_mysqli_fetch_array($link, $engine, "BIGINT UNSIGNED", "18446744073709551615", "18446744073709551615", 260); + func_mysqli_fetch_array($link, $engine, "BIGINT UNSIGNED", NULL, NULL, 280); func_mysqli_fetch_array($link, $engine, "FLOAT", (string)(-9223372036854775808 - 1.1), "-9.22337e+18", 290, "/-9\.22337e\+?[0]?18/iu"); func_mysqli_fetch_array($link, $engine, "FLOAT", NULL, NULL, 300); diff --git a/ext/mysqli/tests/mysqli_fetch_array_oo.phpt b/ext/mysqli/tests/mysqli_fetch_array_oo.phpt index 87dd7ee7adba1..8695166338c13 100644 --- a/ext/mysqli/tests/mysqli_fetch_array_oo.phpt +++ b/ext/mysqli/tests/mysqli_fetch_array_oo.phpt @@ -171,12 +171,10 @@ require_once('skipifconnectfailure.inc'); func_mysqli_fetch_array($mysqli, $engine, "INTEGER UNSIGNED", "4294967295", "4294967295", 230); func_mysqli_fetch_array($mysqli, $engine, "INTEGER UNSIGNED", NULL, NULL, 240); - if ($IS_MYSQLND || mysqli_get_server_version($link) >= 51000) { - func_mysqli_fetch_array($mysqli, $engine, "BIGINT", "-9223372036854775808", "-9223372036854775808", 250); - func_mysqli_fetch_array($mysqli, $engine, "BIGINT", NULL, NULL, 260); - func_mysqli_fetch_array($mysqli, $engine, "BIGINT UNSIGNED", "18446744073709551615", "18446744073709551615", 270); - func_mysqli_fetch_array($mysqli, $engine, "BIGINT UNSIGNED", NULL, NULL, 280); - } + func_mysqli_fetch_array($mysqli, $engine, "BIGINT", "-9223372036854775808", "-9223372036854775808", 250); + func_mysqli_fetch_array($mysqli, $engine, "BIGINT", NULL, NULL, 260); + func_mysqli_fetch_array($mysqli, $engine, "BIGINT UNSIGNED", "18446744073709551615", "18446744073709551615", 270); + func_mysqli_fetch_array($mysqli, $engine, "BIGINT UNSIGNED", NULL, NULL, 280); func_mysqli_fetch_array($mysqli, $engine, "FLOAT", (string)(-9223372036854775808 - 1.1), "-9.22337e+18", 290, "/-9\.22337e\+?[0]?18/iu"); func_mysqli_fetch_array($mysqli, $engine, "FLOAT", NULL, NULL, 300); diff --git a/ext/mysqli/tests/mysqli_fetch_column.phpt b/ext/mysqli/tests/mysqli_fetch_column.phpt index fb4886f693c97..fddb41687d8ab 100644 --- a/ext/mysqli/tests/mysqli_fetch_column.phpt +++ b/ext/mysqli/tests/mysqli_fetch_column.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --FILE-- query("CREATE TABLE t1 (a smallint)")) printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - if (!is_object($warning = new mysqli_warning($mysqli))) - printf("[024] Expecting object/mysqli_warning, got %s/%s", gettype($warning), $warning); + $warning = new mysqli_warning($mysqli); if (!is_string($warning->message) || ('' == $warning->message)) printf("[025] Expecting string, got %s/%s", gettype($warning->message), $warning->message); diff --git a/ext/mysqli/tests/mysqli_kill.phpt b/ext/mysqli/tests/mysqli_kill.phpt index 9d7d7a0f471a9..8b143dfe15505 100644 --- a/ext/mysqli/tests/mysqli_kill.phpt +++ b/ext/mysqli/tests/mysqli_kill.phpt @@ -33,14 +33,8 @@ require_once('skipifconnectfailure.inc'); printf("[007] Expecting string/any non empty, got %s/%s\n", gettype($error), $error); var_dump($res); var_dump($link); - if ($IS_MYSQLND) { - if ($link->info != 'Records: 6 Duplicates: 0 Warnings: 0') { - printf("[008] mysqlnd used to be more verbose and used to support SELECT\n"); - } - } else { - if ($link->info != NULL) { - printf("[008] Time for wonders - libmysql has started to support SELECT, change test\n"); - } + if ($link->info != 'Records: 6 Duplicates: 0 Warnings: 0') { + printf("[008] mysqlnd used to be more verbose and used to support SELECT\n"); } mysqli_close($link); diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt index 472f88f97e860..95e11db9a6dd1 100644 --- a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --INI-- default_socket_timeout=60 diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt index a877a5cc08cf4..6953fb7809ba0 100644 --- a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt @@ -6,10 +6,6 @@ mysqli getMessage() . "\n"; } diff --git a/ext/mysqli/tests/mysqli_options_int_and_float_native.phpt b/ext/mysqli/tests/mysqli_options_int_and_float_native.phpt index dc213aa11a728..ecf8bc5cfbeb2 100644 --- a/ext/mysqli/tests/mysqli_options_int_and_float_native.phpt +++ b/ext/mysqli/tests/mysqli_options_int_and_float_native.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --FILE-- diff --git a/ext/mysqli/tests/mysqli_phpinfo.phpt b/ext/mysqli/tests/mysqli_phpinfo.phpt index 526afe74eba82..b7cd133dc2d6a 100644 --- a/ext/mysqli/tests/mysqli_phpinfo.phpt +++ b/ext/mysqli/tests/mysqli_phpinfo.phpt @@ -41,16 +41,14 @@ require_once('skipifconnectfailure.inc'); if (!stristr($phpinfo, "mysqli.max_links")) printf("[008] php.ini setting mysqli.max_links not shown.\n"); - if ($IS_MYSQLND) { - $expected = array( - 'size', - 'mysqli.allow_local_infile', 'mysqli.local_infile_directory', - 'mysqli.allow_persistent', 'mysqli.max_persistent' - ); - foreach ($expected as $k => $entry) - if (!stristr($phpinfo, $entry)) - printf("[010] Could not find entry for '%s'\n", $entry); - } + $expected = array( + 'size', + 'mysqli.allow_local_infile', 'mysqli.local_infile_directory', + 'mysqli.allow_persistent', 'mysqli.max_persistent' + ); + foreach ($expected as $k => $entry) + if (!stristr($phpinfo, $entry)) + printf("[010] Could not find entry for '%s'\n", $entry); print "done!"; ?> diff --git a/ext/mysqli/tests/mysqli_poll.phpt b/ext/mysqli/tests/mysqli_poll.phpt index ac78ccbbf83d7..e666a65aed8b5 100644 --- a/ext/mysqli/tests/mysqli_poll.phpt +++ b/ext/mysqli/tests/mysqli_poll.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --FILE-- --FILE-- --FILE-- close(); - if ($IS_MYSQLND) { - /* - Advantage mysqlnd - - The metadata mysqlnd has available after prepare is better than - the one made available by the MySQL Client Library (libmysql). - "libmysql" will give wrong results and that is OK - - http://bugs.mysql.com/bug.php?id=47483 - */ - if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST('two' AS CHAR)"))) - printf("[005] [%d] %s\n", $link->errno, $link->error); - - $column1 = null; - /* Note: bind_result before execute */ - if (!$stmt->bind_result($column1) || !$stmt->execute()) - printf("[006] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[007] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - $index++; + /* + Advantage mysqlnd - + The metadata mysqlnd has available after prepare is better than + the one made available by the MySQL Client Library (libmysql). + "libmysql" will give wrong results and that is OK - + http://bugs.mysql.com/bug.php?id=47483 + */ + if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST('two' AS CHAR)"))) + printf("[005] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + /* Note: bind_result before execute */ + if (!$stmt->bind_result($column1) || !$stmt->execute()) + printf("[006] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[007] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); } - $stmt->close(); + $index++; } + $stmt->close(); // Regular (non-prepared) queries print "Mixing CAST('somestring'AS CHAR), integer and CAST(integer AS CHAR)...\n"; @@ -98,25 +96,23 @@ require_once('skipifconnectfailure.inc'); } $stmt->close(); - if ($IS_MYSQLND) { - /* Advantage mysqlnd - see above... */ - if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) - printf("[012] [%d] %s\n", $link->errno, $link->error); - - $column1 = null; - if (!$stmt->bind_result($column1) || !$stmt->execute()) - printf("[013] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[014] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - $index++; + /* Advantage mysqlnd - see above... */ + if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT CAST('three' AS CHAR) UNION SELECT CAST(2 AS CHAR)"))) + printf("[012] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->bind_result($column1) || !$stmt->execute()) + printf("[013] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[014] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); } - $stmt->close(); + $index++; } + $stmt->close(); print "Using integer only...\n"; if (!($res = $link->query("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) @@ -147,25 +143,23 @@ require_once('skipifconnectfailure.inc'); } $stmt->close(); - if ($IS_MYSQLND) { - /* Advantage mysqlnd - see above */ - if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) - printf("[019] [%d] %s\n", $link->errno, $link->error); - - $column1 = null; - if (!$stmt->bind_result($column1) || !$stmt->execute()) - printf("[020] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[021] Row %d, expecting %s/%s got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - $index++; + /* Advantage mysqlnd - see above */ + if (!($stmt = $link->prepare("SELECT 1 AS column1 UNION SELECT 303 UNION SELECT 2"))) + printf("[019] [%d] %s\n", $link->errno, $link->error); + + $column1 = null; + if (!$stmt->bind_result($column1) || !$stmt->execute()) + printf("[020] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[021] Row %d, expecting %s/%s got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); } - $stmt->close(); + $index++; } + $stmt->close(); print "Testing bind_param(), strings only...\n"; $two = 'two'; @@ -185,27 +179,25 @@ require_once('skipifconnectfailure.inc'); } $stmt->close(); - if ($IS_MYSQLND) { - /* Advantage mysqlnd - see above */ - $two = 'two'; - $three = 'three'; - if (!($stmt = $link->prepare("SELECT 'one' AS column1 UNION SELECT ? UNION SELECT ?"))) - printf("[024] [%d] %s\n", $stmt->errno, $stmt->error); - - $column1 = null; - if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) - printf("[025] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[26] Row %d, expecting %s/%s, got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - $index++; + /* Advantage mysqlnd - see above */ + $two = 'two'; + $three = 'three'; + if (!($stmt = $link->prepare("SELECT 'one' AS column1 UNION SELECT ? UNION SELECT ?"))) + printf("[024] [%d] %s\n", $stmt->errno, $stmt->error); + + $column1 = null; + if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) + printf("[025] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[26] Row %d, expecting %s/%s, got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); } - $stmt->close(); + $index++; } + $stmt->close(); print "Testing bind_param(), strings only, with CAST AS CHAR...\n"; $two = 'two'; @@ -225,27 +217,25 @@ require_once('skipifconnectfailure.inc'); } $stmt->close(); - if ($IS_MYSQLND) { - /* Advantage mysqlnd - see above */ - $two = 'two'; - $three = 'three beers are more than enough'; - if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST(? AS CHAR) UNION SELECT CAST(? AS CHAR)"))) - printf("[029] [%d] %s\n", $stmt->errno, $stmt->error); - - $column1 = null; - if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) - printf("[030] [%d] %s\n", $stmt->errno, $stmt->error); - - $index = 0; - while ($stmt->fetch()) { - if ($data[$index] != $column1) { - printf("[31] Row %d, expecting %s/%s, got %s/%s\n", - $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); - } - $index++; + /* Advantage mysqlnd - see above */ + $two = 'two'; + $three = 'three beers are more than enough'; + if (!($stmt = $link->prepare("SELECT CAST('one' AS CHAR) AS column1 UNION SELECT CAST(? AS CHAR) UNION SELECT CAST(? AS CHAR)"))) + printf("[029] [%d] %s\n", $stmt->errno, $stmt->error); + + $column1 = null; + if (!$stmt->bind_param('ss', $three, $two) || !$stmt->bind_result($column1) || !$stmt->execute()) + printf("[030] [%d] %s\n", $stmt->errno, $stmt->error); + + $index = 0; + while ($stmt->fetch()) { + if ($data[$index] != $column1) { + printf("[31] Row %d, expecting %s/%s, got %s/%s\n", + $index + 1, gettype($data[$index]), $data[$index], gettype($column1), $column1); } - $stmt->close(); + $index++; } + $stmt->close(); $link->close(); diff --git a/ext/mysqli/tests/mysqli_real_connect.phpt b/ext/mysqli/tests/mysqli_real_connect.phpt index 2df7356215dad..b2b23ea45018c 100644 --- a/ext/mysqli/tests/mysqli_real_connect.phpt +++ b/ext/mysqli/tests/mysqli_real_connect.phpt @@ -113,32 +113,30 @@ mysqli.allow_local_infile=1 mysqli_close($link); var_dump($link); - if ($IS_MYSQLND) { - ini_set('mysqli.default_host', 'p:' . $host); - $link = mysqli_init(); - if (!@mysqli_real_connect($link)) { - printf("[022] Usage of mysqli.default_host=p:%s (persistent) failed\n", $host) ; - } else { - if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'")) - printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - $tmp = mysqli_fetch_assoc($res); - if ($tmp['testing'] !== 'mysqli.default_host (persistent)') { - printf("[024] Result looks strange - check manually, [%d] %s\n", - mysqli_errno($link), mysqli_error($link)); - var_dump($tmp); - } - mysqli_free_result($res); - mysqli_close($link); + ini_set('mysqli.default_host', 'p:' . $host); + $link = mysqli_init(); + if (!@mysqli_real_connect($link)) { + printf("[022] Usage of mysqli.default_host=p:%s (persistent) failed\n", $host) ; + } else { + if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'")) + printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + $tmp = mysqli_fetch_assoc($res); + if ($tmp['testing'] !== 'mysqli.default_host (persistent)') { + printf("[024] Result looks strange - check manually, [%d] %s\n", + mysqli_errno($link), mysqli_error($link)); + var_dump($tmp); } + mysqli_free_result($res); + mysqli_close($link); + } - ini_set('mysqli.default_host', 'p:'); - $link = mysqli_init(); - if (@mysqli_real_connect($link)) { - printf("[025] Usage of mysqli.default_host=p: did not fail\n") ; - mysqli_close($link); - } - @mysqli_close($link); + ini_set('mysqli.default_host', 'p:'); + $link = mysqli_init(); + if (@mysqli_real_connect($link)) { + printf("[025] Usage of mysqli.default_host=p: did not fail\n") ; + mysqli_close($link); } + @mysqli_close($link); try { mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket); diff --git a/ext/mysqli/tests/mysqli_real_connect_pconn.phpt b/ext/mysqli/tests/mysqli_real_connect_pconn.phpt index b9f7a4b39fa5f..087bc64a43dc9 100644 --- a/ext/mysqli/tests/mysqli_real_connect_pconn.phpt +++ b/ext/mysqli/tests/mysqli_real_connect_pconn.phpt @@ -5,8 +5,6 @@ mysqli --SKIPIF-- --INI-- mysqli.allow_local_infile=1 @@ -116,29 +114,27 @@ mysqli.max_persistent=10 mysqli_close($link); - if ($IS_MYSQLND) { - $link = mysqli_init(); - if (!@mysqli_real_connect($link)) { - printf("[022] Usage of mysqli.default_host=p:%s (persistent) failed\n", $host) ; - } else { - if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'")) - printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); - $tmp = mysqli_fetch_assoc($res); - if ($tmp['testing'] !== 'mysqli.default_host (persistent)') { - printf("[024] Result looks strange - check manually, [%d] %s\n", - mysqli_errno($link), mysqli_error($link)); - var_dump($tmp); - } - mysqli_free_result($res); - mysqli_close($link); + $link = mysqli_init(); + if (!@mysqli_real_connect($link)) { + printf("[022] Usage of mysqli.default_host=p:%s (persistent) failed\n", $host) ; + } else { + if (!$res = mysqli_query($link, "SELECT 'mysqli.default_host (persistent)' AS 'testing'")) + printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + $tmp = mysqli_fetch_assoc($res); + if ($tmp['testing'] !== 'mysqli.default_host (persistent)') { + printf("[024] Result looks strange - check manually, [%d] %s\n", + mysqli_errno($link), mysqli_error($link)); + var_dump($tmp); } + mysqli_free_result($res); + mysqli_close($link); + } - ini_set('mysqli.default_host', 'p:'); - $link = mysqli_init(); - if (@mysqli_real_connect($link)) { - printf("[025] Usage of mysqli.default_host=p: did not fail\n") ; - mysqli_close($link); - } + ini_set('mysqli.default_host', 'p:'); + $link = mysqli_init(); + if (@mysqli_real_connect($link)) { + printf("[025] Usage of mysqli.default_host=p: did not fail\n") ; + mysqli_close($link); } if (NULL === ($tmp = mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket))) diff --git a/ext/mysqli/tests/mysqli_reap_async_query.phpt b/ext/mysqli/tests/mysqli_reap_async_query.phpt index 7d538297623bc..49398a45df07d 100644 --- a/ext/mysqli/tests/mysqli_reap_async_query.phpt +++ b/ext/mysqli/tests/mysqli_reap_async_query.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --FILE-- --FILE-- 4294967296))) { - /* NOTE: the MySQL Client Library - not mysqlnd - will allocate - a hugge max_length(type) = 4GB bind buffer */ - func_mysqli_stmt_bind_result($link, $engine, "b", "LONGBLOB", "", 1660); - func_mysqli_stmt_bind_result($link, $engine, "b", "LONGTEXT", "", 1680, 'string'); - } + func_mysqli_stmt_bind_result($link, $engine, "b", "LONGBLOB", "", 1660); + func_mysqli_stmt_bind_result($link, $engine, "b", "LONGTEXT", "", 1680, 'string'); func_mysqli_stmt_bind_result($link, $engine, "s", "ENUM('a', 'b')", "a", 1700, 'string'); func_mysqli_stmt_bind_result($link, $engine, "s", "ENUM('a', 'b')", NULL, 1720, 'string'); diff --git a/ext/mysqli/tests/mysqli_stmt_execute_bind.phpt b/ext/mysqli/tests/mysqli_stmt_execute_bind.phpt index deb95c9f8bdea..7921e51f75be4 100644 --- a/ext/mysqli/tests/mysqli_stmt_execute_bind.phpt +++ b/ext/mysqli/tests/mysqli_stmt_execute_bind.phpt @@ -5,9 +5,6 @@ mysqli --SKIPIF-- --FILE-- --FILE-- --FILE-- --FILE-- --INI-- mysqlnd.debug="d:t:O,{TMP}/mysqlnd.trace" From 58fc34ffb75862619c0f6f8b1d4e0131a5848484 Mon Sep 17 00:00:00 2001 From: Benoit Viguier Date: Thu, 6 Oct 2022 10:07:42 +0200 Subject: [PATCH 1299/1346] Fix memory-leak in CLI web server Closes GH-9680 Signed-off-by: George Peter Banyard --- sapi/cli/php_cli_server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c index 66e31323947c4..9c1a78024c4e5 100644 --- a/sapi/cli/php_cli_server.c +++ b/sapi/cli/php_cli_server.c @@ -1673,6 +1673,7 @@ static void php_cli_server_client_save_header(php_cli_server_client *client) zend_hash_add(&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); client->current_header_name = NULL; client->current_header_value = NULL; From 59a19d710b8e95045d233fec827145da9df4f3c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Thu, 6 Oct 2022 12:55:51 +0200 Subject: [PATCH 1300/1346] Reduce scope of `r` in rand_rangeXX (#9678) This variable is only accessed within a single iteration of the expansion loop. --- ext/random/random.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/random/random.c b/ext/random/random.c index 7cd1bfc8c939d..13f1c94c3acf4 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -90,14 +90,14 @@ static zend_object_handlers random_randomizer_object_handlers; static inline uint32_t rand_range32(const php_random_algo *algo, php_random_status *status, uint32_t umax) { - uint32_t result, limit, r; + uint32_t result, limit; size_t total_size = 0; uint32_t count = 0; result = 0; total_size = 0; do { - r = algo->generate(status); + uint32_t r = algo->generate(status); result = result | (r << (total_size * 8)); total_size += status->last_generated_size; if (EG(exception)) { @@ -132,7 +132,7 @@ static inline uint32_t rand_range32(const php_random_algo *algo, php_random_stat result = 0; total_size = 0; do { - r = algo->generate(status); + uint32_t r = algo->generate(status); result = result | (r << (total_size * 8)); total_size += status->last_generated_size; if (EG(exception)) { @@ -146,14 +146,14 @@ static inline uint32_t rand_range32(const php_random_algo *algo, php_random_stat static inline uint64_t rand_range64(const php_random_algo *algo, php_random_status *status, uint64_t umax) { - uint64_t result, limit, r; + uint64_t result, limit; size_t total_size = 0; uint32_t count = 0; result = 0; total_size = 0; do { - r = algo->generate(status); + uint64_t r = algo->generate(status); result = result | (r << (total_size * 8)); total_size += status->last_generated_size; if (EG(exception)) { @@ -188,7 +188,7 @@ static inline uint64_t rand_range64(const php_random_algo *algo, php_random_stat result = 0; total_size = 0; do { - r = algo->generate(status); + uint64_t r = algo->generate(status); result = result | (r << (total_size * 8)); total_size += status->last_generated_size; if (EG(exception)) { From 22db5aa576733a9f69255dad6e64ed5749f17a77 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 7 Oct 2022 16:40:26 +0200 Subject: [PATCH 1301/1346] [ci skip] Fix contributor name in NEWS Cf. . --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index f80b375179aba..46676dcf1a1da 100644 --- a/NEWS +++ b/NEWS @@ -353,7 +353,7 @@ PHP NEWS . Discard poll calls on socket when no timeout/non blocking/MSG_DONTWAIT. (Max Kellermann) - PCRE: - . Implemented FR #77726 (Allow null character in regex patterns). (cmb) + . Implemented FR #77726 (Allow null character in regex patterns). (tobil4sk) - Standard: . Deprecated utf8_encode() and utf8_decode(). (Rowan Tommins) From 69ef3247fd42727787adb1d26c517e47d39dd818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Mon, 10 Oct 2022 11:10:43 +0200 Subject: [PATCH 1302/1346] Generate constant declarations with the CONST_CS flag for PHP 7.x --- build/gen_stub.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/gen_stub.php b/build/gen_stub.php index 344d5a75cdd59..411f60dc2b798 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1968,6 +1968,10 @@ private function getGlobalConstDeclaration(EvaluatedValue $value, iterable $allC $cConstValue = $value->getCConstValue($allConstInfos); $flags = "CONST_PERSISTENT"; + if ($this->phpVersionIdMinimumCompatibility !== null && $this->phpVersionIdMinimumCompatibility < 80000) { + $flags .= " | CONST_CS"; + } + if ($this->isDeprecated) { $flags .= " | CONST_DEPRECATED"; } From 6e0505bf27bcdbbbf8733337a39b660a07cd2590 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 7 Oct 2022 16:51:01 +0200 Subject: [PATCH 1303/1346] Fix GH-9589: dl() segfaults when module is already loaded As of PHP 8.2.0, `zend_module_entry` structures are no longer copied, so when a module is permanently loaded, and users try to dynamically load that module again, the structure is corrupted[1], causing a segfault on shutdown. We catch that by checking whether any dynamically loaded module is already loaded, and bailing out in that case without modifying the `zend_module_entry` structure. [1] Closes GH-9689. --- NEWS | 2 ++ ext/standard/dl.c | 5 +++++ ext/standard/tests/general_functions/gh9589.phpt | 10 ++++++++++ 3 files changed, 17 insertions(+) create mode 100644 ext/standard/tests/general_functions/gh9589.phpt diff --git a/NEWS b/NEWS index b14555b348bff..62b82f32fddc2 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed bug GH-9655 (Pure intersection types cannot be implicitly nullable) (Girgias) + . Fixed bug GH-9589 (dl() segfaults when module is already loaded). (cmb, + Arnaud) - Streams: . Fixed bug GH-9590 (stream_select does not abort upon exception or empty diff --git a/ext/standard/dl.c b/ext/standard/dl.c index aae0996384562..7b47c4726d1a7 100644 --- a/ext/standard/dl.c +++ b/ext/standard/dl.c @@ -205,6 +205,11 @@ PHPAPI int php_load_extension(const char *filename, int type, int start_now) return FAILURE; } module_entry = get_module(); + if (zend_hash_str_exists(&module_registry, module_entry->name, strlen(module_entry->name))) { + DL_UNLOAD(handle); + zend_error(E_CORE_WARNING, "Module \"%s\" is already loaded", module_entry->name); + return FAILURE; + } if (module_entry->zend_api != ZEND_MODULE_API_NO) { php_error_docref(NULL, error_type, "%s: Unable to initialize module\n" diff --git a/ext/standard/tests/general_functions/gh9589.phpt b/ext/standard/tests/general_functions/gh9589.phpt new file mode 100644 index 0000000000000..a26f052debeb8 --- /dev/null +++ b/ext/standard/tests/general_functions/gh9589.phpt @@ -0,0 +1,10 @@ +--TEST-- +dl() segfaults when module is already loaded +--EXTENSIONS-- +dl_test +--FILE-- + +--EXPECT-- +Warning: Module "dl_test" is already loaded in Unknown on line 0 From 9be00e3935b69930b5c2603e78f5e51026102377 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 11 Oct 2022 00:50:17 +0200 Subject: [PATCH 1304/1346] Ensure driver specific PDO methods have a proper run_time_cache --- ext/pdo/pdo_dbh.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 26d4e9bf85870..2c56459a62772 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -34,6 +34,7 @@ #include "zend_hash.h" #include "pdo_dbh_arginfo.h" #include "zend_observer.h" +#include "zend_extensions.h" static bool pdo_dbh_attribute_set(pdo_dbh_t *dbh, zend_long attr, zval *value); @@ -1204,6 +1205,9 @@ static void cls_method_dtor(zval *el) /* {{{ */ { if (func->common.function_name) { zend_string_release_ex(func->common.function_name, 0); } + if (ZEND_MAP_PTR(func->common.run_time_cache)) { + efree(ZEND_MAP_PTR(func->common.run_time_cache)); + } efree(func); } /* }}} */ @@ -1213,6 +1217,9 @@ static void cls_method_pdtor(zval *el) /* {{{ */ { if (func->common.function_name) { zend_string_release_ex(func->common.function_name, 1); } + if (ZEND_MAP_PTR(func->common.run_time_cache)) { + pefree(ZEND_MAP_PTR(func->common.run_time_cache), 1); + } pefree(func, 1); } /* }}} */ @@ -1240,13 +1247,14 @@ bool pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind) memset(&func, 0, sizeof(func)); + size_t rt_cache_size = zend_internal_run_time_cache_reserved_size(); while (funcs->fname) { func.type = ZEND_INTERNAL_FUNCTION; func.handler = funcs->handler; func.function_name = zend_string_init(funcs->fname, strlen(funcs->fname), dbh->is_persistent); func.scope = dbh_obj->std.ce; func.prototype = NULL; - ZEND_MAP_PTR(func.run_time_cache) = NULL; + ZEND_MAP_PTR(func.run_time_cache) = rt_cache_size ? pemalloc(rt_cache_size, dbh->is_persistent) : NULL; func.T = ZEND_OBSERVER_ENABLED; if (funcs->flags) { func.fn_flags = funcs->flags | ZEND_ACC_NEVER_CACHE; From 60cb8fe656699880d5a00be4e948f3f457a395ce Mon Sep 17 00:00:00 2001 From: Sergey Panteleev Date: Tue, 11 Oct 2022 10:49:29 +0300 Subject: [PATCH 1305/1346] [ci skip] Update NEWS for PHP 8.2.0RC5 --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 62b82f32fddc2..b0a258b71b67c 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.2.0RC4 +?? ??? ????, PHP 8.2.0RC5 + + +13 Oct 2022, PHP 8.2.0RC4 - Core: . Fixed bug GH-9655 (Pure intersection types cannot be implicitly nullable) From c15fe51918728816f65a78bbaf4090789aea71c4 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 2 Oct 2022 12:55:00 +0100 Subject: [PATCH 1306/1346] Fix GH-9653: does not inconditionally support copy_file_range on older kernels. As mentioned in its manpage, it had been reworked in the 5.3 line to support cross filesystem interactions. Closes #GH-9656 --- NEWS | 1 + configure.ac | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index b0a258b71b67c..74f520b149037 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ PHP NEWS - Streams: . Fixed bug GH-9590 (stream_select does not abort upon exception or empty valid fd set). (Arnaud) + . Fixed bug GH-9653 (file copy between different filesystems). (David Carlier) 29 Sep 2022, PHP 8.2.0RC3 diff --git a/configure.ac b/configure.ac index a9c609df2ed12..331015490cfde 100644 --- a/configure.ac +++ b/configure.ac @@ -364,7 +364,6 @@ PHP_CHECK_FUNC(socketpair, socket, network) PHP_CHECK_FUNC(htonl, socket, network) PHP_CHECK_FUNC(gethostname, nsl, network) PHP_CHECK_FUNC(gethostbyaddr, nsl, network) -PHP_CHECK_FUNC(copy_file_range) PHP_CHECK_FUNC(dlopen, dl, root) PHP_CHECK_FUNC(dlsym, dl, root) if test "$ac_cv_func_dlopen" = "yes"; then @@ -691,6 +690,33 @@ if test "$ac_cv_func_getaddrinfo" = yes; then AC_DEFINE(HAVE_GETADDRINFO,1,[Define if you have the getaddrinfo function]) fi +AC_CACHE_CHECK([for copy_file_range], ac_cv_copy_file_range, +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#ifdef __linux__ +#ifndef _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; +#endif +} +#else +#error "unsupported platform" +#endif +]])], [ac_cv_copy_file_range=yes], [ac_cv_copy_file_range=no]) +]) + +if test "$ac_cv_copy_file_range" = yes; then + AC_DEFINE(HAVE_COPY_FILE_RANGE,1,[Define if copy_file_range support]) +fi + AC_REPLACE_FUNCS(strlcat strlcpy explicit_bzero getopt) AC_FUNC_ALLOCA PHP_TIME_R_TYPE From 2c25dfb440296a18f05789ac1a73369a8505b0dd Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 16 Oct 2022 12:46:25 +0200 Subject: [PATCH 1307/1346] [ci skip] NEWS --- NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/NEWS b/NEWS index a61d27969ecc7..45cfeda121903 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC5 +- Core: + . Fixed bug GH-9752 (Generator crashes when interrupted during argument + evaluation with extra named params). (Arnaud) + - MySQLnd: . Fixed potential heap corruption due to alignment mismatch. (cmb) From eecbb60db62bf3c7062eaf1bcb4e0a1b041d0edc Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 17 Oct 2022 15:08:21 +0300 Subject: [PATCH 1308/1346] Fix memory leak Fixes oss-fuzz #52479 --- Zend/Optimizer/zend_cfg.c | 6 ++++-- Zend/zend_compile.c | 4 ++++ ext/opcache/tests/opt/match_001.phpt | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 ext/opcache/tests/opt/match_001.phpt diff --git a/Zend/Optimizer/zend_cfg.c b/Zend/Optimizer/zend_cfg.c index cc946c1b9ef3a..6d538f71316cc 100644 --- a/Zend/Optimizer/zend_cfg.c +++ b/Zend/Optimizer/zend_cfg.c @@ -297,12 +297,12 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, case ZEND_RETURN: case ZEND_RETURN_BY_REF: case ZEND_GENERATOR_RETURN: - case ZEND_MATCH_ERROR: case ZEND_VERIFY_NEVER_TYPE: if (i + 1 < op_array->last) { BB_START(i + 1); } break; + case ZEND_MATCH_ERROR: case ZEND_EXIT: case ZEND_THROW: /* Don't treat THROW as terminator if it's used in expression context, @@ -428,7 +428,9 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, break; case ZEND_FREE: case ZEND_FE_FREE: - if (zend_optimizer_is_loop_var_free(opline)) { + if (zend_optimizer_is_loop_var_free(opline) + && ((opline-1)->opcode != ZEND_MATCH_ERROR + || (opline-1)->extended_value != ZEND_THROW_IS_EXPR)) { BB_START(i); flags |= ZEND_FUNC_FREE_LOOP_VAR; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 94991adce8c74..395a8a5e984e4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5776,6 +5776,10 @@ static void zend_compile_match(znode *result, zend_ast *ast) if (opline->op1_type == IS_CONST) { Z_TRY_ADDREF_P(CT_CONSTANT(opline->op1)); } + if (arms->children == 0) { + /* Mark this as an "expression throw" for opcache. */ + opline->extended_value = ZEND_THROW_IS_EXPR; + } } for (uint32_t i = 0; i < arms->children; ++i) { diff --git a/ext/opcache/tests/opt/match_001.phpt b/ext/opcache/tests/opt/match_001.phpt new file mode 100644 index 0000000000000..f244f2624546a --- /dev/null +++ b/ext/opcache/tests/opt/match_001.phpt @@ -0,0 +1,19 @@ +--TEST-- +Match 001: memory leak because of live range lose +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.optimization_level=-1 +--FILE-- + +--EXPECTF-- +Warning: Undefined variable $y in %smatch_001.php on line 2 + +Warning: Undefined variable $y in %smatch_001.php on line 2 + +Fatal error: Uncaught Error: Undefined constant "y" in %smatch_001.php:2 +Stack trace: +#0 {main} + thrown in %smatch_001.php on line 2 From f5aaa8f187449daf2faceae2f869e75593891a1a Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 18 Oct 2022 16:07:56 +0200 Subject: [PATCH 1309/1346] Fix GH-9372: HY010 when binding overlong parameter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If `SQLPutData()` *fails*, we should not call `SQLParamData()` again, because that yields the confusing `HY010` (Function sequence error). Instead we properly handle `SQLPutData()` errors. For the given case (paramter length > column length), some drivers let `SQLPutData()` fail, while others do not. Either behavior seems to conform to the ODBC specification. Anyhow, we do not want to silently truncate the given parameter, since that would break the behavior for drivers which do not fail, but still don't simply truncate the given parameter. So it is finally up to userland to avoid passing overlong parameters – with this patch they at least get useful information about the actual issue. Closes GH-9541. --- NEWS | 5 +++- ext/pdo_odbc/odbc_stmt.c | 17 ++++++++--- ext/pdo_odbc/tests/gh9372.phpt | 52 ++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 ext/pdo_odbc/tests/gh9372.phpt diff --git a/NEWS b/NEWS index 45cfeda121903..d4366b41220ed 100644 --- a/NEWS +++ b/NEWS @@ -9,8 +9,11 @@ PHP NEWS - MySQLnd: . Fixed potential heap corruption due to alignment mismatch. (cmb) +- PDO_ODBC: + . Fixed bug GH-9372 (HY010 when binding overlong parameter). (cmb) + - SOAP: - . Fixed GH-9720 (Null pointer dereference while serializing the response). + . Fixed bug GH-9720 (Null pointer dereference while serializing the response). (cmb) 13 Oct 2022, PHP 8.2.0RC4 diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c index 040962d54147b..ea0dd0e53aac6 100644 --- a/ext/pdo_odbc/odbc_stmt.c +++ b/ext/pdo_odbc/odbc_stmt.c @@ -155,7 +155,7 @@ static int odbc_stmt_dtor(pdo_stmt_t *stmt) static int odbc_stmt_execute(pdo_stmt_t *stmt) { - RETCODE rc; + RETCODE rc, rc1; pdo_odbc_stmt *S = (pdo_odbc_stmt*)stmt->driver_data; char *buf = NULL; SQLLEN row_count = -1; @@ -192,11 +192,17 @@ static int odbc_stmt_execute(pdo_stmt_t *stmt) Z_STRLEN_P(parameter), &ulen)) { case PDO_ODBC_CONV_NOT_REQUIRED: - SQLPutData(S->stmt, Z_STRVAL_P(parameter), + rc1 = SQLPutData(S->stmt, Z_STRVAL_P(parameter), Z_STRLEN_P(parameter)); + if (rc1 != SQL_SUCCESS && rc1 != SQL_SUCCESS_WITH_INFO) { + rc = rc1; + } break; case PDO_ODBC_CONV_OK: - SQLPutData(S->stmt, S->convbuf, ulen); + rc1 = SQLPutData(S->stmt, S->convbuf, ulen); + if (rc1 != SQL_SUCCESS && rc1 != SQL_SUCCESS_WITH_INFO) { + rc = rc1; + } break; case PDO_ODBC_CONV_FAIL: pdo_odbc_stmt_error("error converting input string"); @@ -233,7 +239,10 @@ static int odbc_stmt_execute(pdo_stmt_t *stmt) if (len == 0) { break; } - SQLPutData(S->stmt, buf, len); + rc1 = SQLPutData(S->stmt, buf, len); + if (rc1 != SQL_SUCCESS && rc1 != SQL_SUCCESS_WITH_INFO) { + rc = rc1; + } } while (1); } } diff --git a/ext/pdo_odbc/tests/gh9372.phpt b/ext/pdo_odbc/tests/gh9372.phpt new file mode 100644 index 0000000000000..9f9b884932a57 --- /dev/null +++ b/ext/pdo_odbc/tests/gh9372.phpt @@ -0,0 +1,52 @@ +--TEST-- +Bug GH-9372 (HY010 when binding overlong parameter) +--EXTENSIONS-- +pdo_odbc +--SKIPIF-- + +--FILE-- +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + +$db->exec("CREATE TABLE gh9372 (col VARCHAR(10))"); +$db->exec("INSERT INTO gh9372 VALUES ('something')"); + +$stmt = $db->prepare("SELECT * FROM gh9372 WHERE col = ?"); +$stmt->bindValue(1, 'something else'); +try { + $stmt->execute(); +} catch (PDOException $ex) { + if ($ex->getCode() !== "22001") { + var_dump($ex->getMessage()); + } +} + +$stmt = $db->prepare("SELECT * FROM gh9372 WHERE col = ?"); +$stream = fopen("php://memory", "w+"); +fwrite($stream, 'something else'); +rewind($stream); +$stmt->bindvalue(1, $stream, PDO::PARAM_LOB); +try { + $stmt->execute(); +} catch (PDOException $ex) { + if ($ex->getCode() !== "22001") { + var_dump($ex->getMessage()); + } +} +?> +--CLEAN-- +exec("DROP TABLE gh9372"); +?> +--EXPECT-- From 75c06e869cebc6f7cc1e56d8ab8489b9978fd3a0 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 20 Oct 2022 10:57:13 +0200 Subject: [PATCH 1310/1346] [skip ci] Mark frequently failing OCI test as XFAIL --- ext/pdo_oci/tests/oci_success_with_info.phpt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/pdo_oci/tests/oci_success_with_info.phpt b/ext/pdo_oci/tests/oci_success_with_info.phpt index 8c43c46e19681..1c56a66a4a742 100644 --- a/ext/pdo_oci/tests/oci_success_with_info.phpt +++ b/ext/pdo_oci/tests/oci_success_with_info.phpt @@ -3,6 +3,8 @@ Handling OCI_SUCCESS_WITH_INFO --EXTENSIONS-- pdo pdo_oci +--XFAIL-- +This test frequently fails in CI --SKIPIF-- Date: Tue, 18 Oct 2022 03:28:36 -0400 Subject: [PATCH 1311/1346] [skip ci] Document zend_enum_get_case_by_value() function This function was introduced in d62d50b88ecf8ed838b20d48006a32277eb569fe. --- UPGRADING.INTERNALS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS index e122bb0e67ec7..6b52cdf1848e3 100644 --- a/UPGRADING.INTERNALS +++ b/UPGRADING.INTERNALS @@ -57,6 +57,8 @@ PHP 8.2 INTERNALS UPGRADE NOTES * The CHECK_NULL_PATH and CHECK_ZVAL_NULL_PATH macros are now wrappers using the new inline functions: bool zend_str_has_nul_byte(const zend_string *str) and zend_char_has_nul_byte(const char *s, size_t known_length) +* Added zend_enum_get_case_by_value() function, which provides an internal API + similiar to BackedEnum::from() and BackedEnum::tryFrom(). ======================== 2. Build system changes From 7acb7703e2291d72d7bf177441a1f6be12717702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Tue, 10 May 2022 15:54:55 +0200 Subject: [PATCH 1312/1346] opcache: add FrankenPHP to the allow list --- ext/opcache/ZendAccelerator.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 0c956fe846935..f78ae8755f336 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -2824,6 +2824,7 @@ static inline int accel_find_sapi(void) "litespeed", "uwsgi", "fuzzer", + "frankenphp", NULL }; const char **sapi_name; @@ -3156,7 +3157,7 @@ static int accel_startup(zend_extension *extension) strcmp(sapi_module.name, "cli") == 0) { zps_startup_failure("Opcode Caching is disabled for CLI", NULL, accelerator_remove_cb); } else { - zps_startup_failure("Opcode Caching is only supported in Apache, FPM, FastCGI and LiteSpeed SAPIs", NULL, accelerator_remove_cb); + zps_startup_failure("Opcode Caching is only supported in Apache, FPM, FastCGI, FrankenPHP, LiteSpeed and uWSGI SAPIs", NULL, accelerator_remove_cb); } return SUCCESS; } From 6b35850139fcaeeb70ef92aedd864e2b85b862a1 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sat, 22 Oct 2022 10:45:09 +0200 Subject: [PATCH 1313/1346] [ci skip] NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index d4366b41220ed..1fb5ee3d1c98e 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,8 @@ PHP NEWS - Core: . Fixed bug GH-9752 (Generator crashes when interrupted during argument evaluation with extra named params). (Arnaud) + . Fixed bug GH-9801 (Generator crashes when memory limit is exceeded during + initialization). (Arnaud) - MySQLnd: . Fixed potential heap corruption due to alignment mismatch. (cmb) From 1ef65c1cf030ac5173fb388795f82e3d14a70c6b Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Mon, 17 Oct 2022 20:38:40 +0100 Subject: [PATCH 1314/1346] Clean up OpenSSL engine list when OpenSSL 1.0.2 used Attempt to fix GH-8620. --- NEWS | 4 ++++ ext/openssl/openssl.c | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/NEWS b/NEWS index 1fb5ee3d1c98e..66bcf6ee99e7d 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,10 @@ PHP NEWS - MySQLnd: . Fixed potential heap corruption due to alignment mismatch. (cmb) +- OpenSSL: + . Fixed missing clean up of OpenSSL engine list - attempt to fix GH-8620. + (Jakub Zelenka) + - PDO_ODBC: . Fixed bug GH-9372 (HY010 when binding overlong parameter). (cmb) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 81cef7edbfca5..0f937f8c6de0f 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -61,6 +61,10 @@ #include #endif +#if OPENSSL_VERSION_NUMBER < 0x10100000L && !defined(OPENSSL_NO_ENGINE) +#include +#endif + /* Common */ #include @@ -1312,6 +1316,11 @@ PHP_MSHUTDOWN_FUNCTION(openssl) #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined (LIBRESSL_VERSION_NUMBER) EVP_cleanup(); +#ifndef OPENSSL_NO_ENGINE + /* Free engine list initialized by OPENSSL_config */ + ENGINE_cleanup(); +#endif + /* prevent accessing locking callback from unloaded extension */ CRYPTO_set_locking_callback(NULL); /* free allocated error strings */ From 5e9654be0337d4778f3ab93bdfce228c12d135f6 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 22 Oct 2022 21:31:51 +0000 Subject: [PATCH 1315/1346] Fixed missing run_time_cache for preloaded arena allocated internal functions This effectively affected all preloaded enums, leading them to possibly share a run_time_cache__ptr slot with unrelated functions. (Given that these were not set again.) This bugfix is not accompanied by a test, due to how hard to trigger it was and getting a crash also depends a lot on the precise alignment of whether a cache entry accidentally overlapping has been used etc. --- NEWS | 1 + ext/opcache/zend_persist.c | 1 + 2 files changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 0e733b94bf284..eb1c84972e1d8 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ PHP NEWS evaluation with extra named params). (Arnaud) . Fixed bug GH-9801 (Generator crashes when memory limit is exceeded during initialization). (Arnaud) + . Fixed a bug with preloaded enums possibly segfaulting. (Bob) - MySQLnd: . Fixed potential heap corruption due to alignment mismatch. (cmb) diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 0e2eb0377a8a9..91765676b3860 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -723,6 +723,7 @@ static void zend_persist_class_method(zval *zv, zend_class_entry *ce) } } } + ZEND_MAP_PTR_NEW(op_array->run_time_cache); } } return; From 3e2184f795e2f24343f0f83a1bd10680d03d16e3 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sun, 23 Oct 2022 00:39:42 +0100 Subject: [PATCH 1316/1346] Fix OpenSSL conflicting merge for compilation issue with old digests --- ext/openssl/openssl.c | 106 ---------------------------------- ext/openssl/openssl.stub.php | 6 +- ext/openssl/openssl_arginfo.h | 8 ++- 3 files changed, 11 insertions(+), 109 deletions(-) diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 6e273bf9c9435..cb5e6260b4abb 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1245,113 +1245,7 @@ PHP_MINIT_FUNCTION(openssl) * OpenSSL callbacks */ ssl_stream_data_index = SSL_get_ex_new_index(0, "PHP stream index", NULL, NULL, NULL); -<<<<<<< HEAD register_openssl_symbols(module_number); -======= - REGISTER_STRING_CONSTANT("OPENSSL_VERSION_TEXT", OPENSSL_VERSION_TEXT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_VERSION_NUMBER", OPENSSL_VERSION_NUMBER, CONST_CS|CONST_PERSISTENT); - - /* purposes for cert purpose checking */ - REGISTER_LONG_CONSTANT("X509_PURPOSE_SSL_CLIENT", X509_PURPOSE_SSL_CLIENT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("X509_PURPOSE_SSL_SERVER", X509_PURPOSE_SSL_SERVER, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("X509_PURPOSE_NS_SSL_SERVER", X509_PURPOSE_NS_SSL_SERVER, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("X509_PURPOSE_SMIME_SIGN", X509_PURPOSE_SMIME_SIGN, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("X509_PURPOSE_SMIME_ENCRYPT", X509_PURPOSE_SMIME_ENCRYPT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("X509_PURPOSE_CRL_SIGN", X509_PURPOSE_CRL_SIGN, CONST_CS|CONST_PERSISTENT); -#ifdef X509_PURPOSE_ANY - REGISTER_LONG_CONSTANT("X509_PURPOSE_ANY", X509_PURPOSE_ANY, CONST_CS|CONST_PERSISTENT); -#endif - - /* digest algorithm constants */ - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA1", OPENSSL_ALGO_SHA1, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD5", OPENSSL_ALGO_MD5, CONST_CS|CONST_PERSISTENT); -#ifndef OPENSSL_NO_MD4 - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD4", OPENSSL_ALGO_MD4, CONST_CS|CONST_PERSISTENT); -#endif -#ifndef OPENSSL_NO_MD2 - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD2", OPENSSL_ALGO_MD2, CONST_CS|CONST_PERSISTENT); -#endif -#if PHP_OPENSSL_API_VERSION < 0x10100 - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_DSS1", OPENSSL_ALGO_DSS1, CONST_CS|CONST_PERSISTENT); -#endif - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA224", OPENSSL_ALGO_SHA224, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA256", OPENSSL_ALGO_SHA256, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA384", OPENSSL_ALGO_SHA384, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA512", OPENSSL_ALGO_SHA512, CONST_CS|CONST_PERSISTENT); -#ifndef OPENSSL_NO_RMD160 - REGISTER_LONG_CONSTANT("OPENSSL_ALGO_RMD160", OPENSSL_ALGO_RMD160, CONST_CS|CONST_PERSISTENT); -#endif - - /* flags for S/MIME */ - REGISTER_LONG_CONSTANT("PKCS7_DETACHED", PKCS7_DETACHED, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_TEXT", PKCS7_TEXT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_NOINTERN", PKCS7_NOINTERN, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_NOVERIFY", PKCS7_NOVERIFY, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_NOCHAIN", PKCS7_NOCHAIN, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_NOCERTS", PKCS7_NOCERTS, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_NOATTR", PKCS7_NOATTR, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_BINARY", PKCS7_BINARY, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("PKCS7_NOSIGS", PKCS7_NOSIGS, CONST_CS|CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("OPENSSL_CMS_DETACHED", CMS_DETACHED, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_TEXT", CMS_TEXT, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_NOINTERN", CMS_NOINTERN, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_NOVERIFY", CMS_NOVERIFY, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_NOCERTS", CMS_NOCERTS, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_NOATTR", CMS_NOATTR, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_BINARY", CMS_BINARY, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CMS_NOSIGS", CMS_NOSIGS, CONST_CS|CONST_PERSISTENT); - - REGISTER_LONG_CONSTANT("OPENSSL_PKCS1_PADDING", RSA_PKCS1_PADDING, CONST_CS|CONST_PERSISTENT); -#ifdef RSA_SSLV23_PADDING - REGISTER_LONG_CONSTANT("OPENSSL_SSLV23_PADDING", RSA_SSLV23_PADDING, CONST_CS|CONST_PERSISTENT); -#endif - REGISTER_LONG_CONSTANT("OPENSSL_NO_PADDING", RSA_NO_PADDING, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_PKCS1_OAEP_PADDING", RSA_PKCS1_OAEP_PADDING, CONST_CS|CONST_PERSISTENT); - - /* Informational stream wrapper constants */ - REGISTER_STRING_CONSTANT("OPENSSL_DEFAULT_STREAM_CIPHERS", OPENSSL_DEFAULT_STREAM_CIPHERS, CONST_CS|CONST_PERSISTENT); - - /* Ciphers */ -#ifndef OPENSSL_NO_RC2 - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_RC2_40", PHP_OPENSSL_CIPHER_RC2_40, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_RC2_128", PHP_OPENSSL_CIPHER_RC2_128, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_RC2_64", PHP_OPENSSL_CIPHER_RC2_64, CONST_CS|CONST_PERSISTENT); -#endif -#ifndef OPENSSL_NO_DES - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_DES", PHP_OPENSSL_CIPHER_DES, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_3DES", PHP_OPENSSL_CIPHER_3DES, CONST_CS|CONST_PERSISTENT); -#endif -#ifndef OPENSSL_NO_AES - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_AES_128_CBC", PHP_OPENSSL_CIPHER_AES_128_CBC, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_AES_192_CBC", PHP_OPENSSL_CIPHER_AES_192_CBC, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_CIPHER_AES_256_CBC", PHP_OPENSSL_CIPHER_AES_256_CBC, CONST_CS|CONST_PERSISTENT); -#endif - - /* Values for key types */ - REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_RSA", OPENSSL_KEYTYPE_RSA, CONST_CS|CONST_PERSISTENT); -#ifndef NO_DSA - REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_DSA", OPENSSL_KEYTYPE_DSA, CONST_CS|CONST_PERSISTENT); -#endif - REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_DH", OPENSSL_KEYTYPE_DH, CONST_CS|CONST_PERSISTENT); -#ifdef HAVE_EVP_PKEY_EC - REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_EC", OPENSSL_KEYTYPE_EC, CONST_CS|CONST_PERSISTENT); -#endif - - REGISTER_LONG_CONSTANT("OPENSSL_RAW_DATA", OPENSSL_RAW_DATA, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ZERO_PADDING", OPENSSL_ZERO_PADDING, CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_DONT_ZERO_PAD_KEY", OPENSSL_DONT_ZERO_PAD_KEY, CONST_CS|CONST_PERSISTENT); - -#ifndef OPENSSL_NO_TLSEXT - /* SNI support included */ - REGISTER_LONG_CONSTANT("OPENSSL_TLSEXT_SERVER_NAME", 1, CONST_CS|CONST_PERSISTENT); -#endif - - /* Register encodings */ - REGISTER_LONG_CONSTANT("OPENSSL_ENCODING_DER",ENCODING_DER,CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ENCODING_SMIME",ENCODING_SMIME,CONST_CS|CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("OPENSSL_ENCODING_PEM",ENCODING_PEM,CONST_CS|CONST_PERSISTENT); ->>>>>>> PHP-8.1 /* Determine default SSL configuration file */ config_filename = getenv("OPENSSL_CONF"); diff --git a/ext/openssl/openssl.stub.php b/ext/openssl/openssl.stub.php index 8a0f678f3d968..16923ad42fca2 100644 --- a/ext/openssl/openssl.stub.php +++ b/ext/openssl/openssl.stub.php @@ -64,12 +64,14 @@ * @cvalue OPENSSL_ALGO_MD5 */ const OPENSSL_ALGO_MD5 = UNKNOWN; +#ifndef OPENSSL_NO_MD4 /** * @var int * @cvalue OPENSSL_ALGO_MD4 */ const OPENSSL_ALGO_MD4 = UNKNOWN; -#ifdef HAVE_OPENSSL_MD2_H +#endif +#ifndef OPENSSL_NO_MD2 /** * @var int * @cvalue OPENSSL_ALGO_MD2 @@ -104,11 +106,13 @@ * @cvalue OPENSSL_ALGO_SHA512 */ const OPENSSL_ALGO_SHA512 = UNKNOWN; +#ifndef OPENSSL_NO_RMD160 /** * @var int * @cvalue OPENSSL_ALGO_RMD160 */ const OPENSSL_ALGO_RMD160 = UNKNOWN; +#endif /* flags for S/MIME */ diff --git a/ext/openssl/openssl_arginfo.h b/ext/openssl/openssl_arginfo.h index 2159267bbcc56..2c0eb850dfb4a 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: 02ee3cc08e7bda875321cb63e879deed48d7a389 */ + * Stub hash: ec0f6d5850d52d9bf8f6e9262ef49c68a818a946 */ 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) @@ -553,8 +553,10 @@ static void register_openssl_symbols(int module_number) #endif REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA1", OPENSSL_ALGO_SHA1, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD5", OPENSSL_ALGO_MD5, CONST_PERSISTENT); +#if !defined(OPENSSL_NO_MD4) REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD4", OPENSSL_ALGO_MD4, CONST_PERSISTENT); -#if defined(HAVE_OPENSSL_MD2_H) +#endif +#if !defined(OPENSSL_NO_MD2) REGISTER_LONG_CONSTANT("OPENSSL_ALGO_MD2", OPENSSL_ALGO_MD2, CONST_PERSISTENT); #endif #if PHP_OPENSSL_API_VERSION < 0x10100 @@ -564,7 +566,9 @@ static void register_openssl_symbols(int module_number) REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA256", OPENSSL_ALGO_SHA256, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA384", OPENSSL_ALGO_SHA384, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("OPENSSL_ALGO_SHA512", OPENSSL_ALGO_SHA512, CONST_PERSISTENT); +#if !defined(OPENSSL_NO_RMD160) REGISTER_LONG_CONSTANT("OPENSSL_ALGO_RMD160", OPENSSL_ALGO_RMD160, CONST_PERSISTENT); +#endif REGISTER_LONG_CONSTANT("PKCS7_DETACHED", PKCS7_DETACHED, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PKCS7_TEXT", PKCS7_TEXT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PKCS7_NOINTERN", PKCS7_NOINTERN, CONST_PERSISTENT); From b732d803296e4a776ea58ea3e06f82295e24e7a1 Mon Sep 17 00:00:00 2001 From: Jakub Zelenka Date: Sat, 22 Oct 2022 12:30:32 +0100 Subject: [PATCH 1317/1346] Fix bug GH-9779: stream_copy_to_stream fail when dest in append mode --- NEWS | 4 + configure.ac | 2 + ext/standard/tests/file/gh9779.phpt | 27 ++++++ main/streams/streams.c | 134 +++++++++++++--------------- 4 files changed, 93 insertions(+), 74 deletions(-) create mode 100644 ext/standard/tests/file/gh9779.phpt diff --git a/NEWS b/NEWS index 43220bd5ee411..156c5291c8f5e 100644 --- a/NEWS +++ b/NEWS @@ -28,6 +28,10 @@ PHP NEWS . Fixed bug GH-9720 (Null pointer dereference while serializing the response). (cmb) +- Streams: + . Fixed bug GH-9779 (stream_copy_to_stream fails if dest in append mode). + (Jakub Zelenka) + 13 Oct 2022, PHP 8.2.0RC4 - Core: diff --git a/configure.ac b/configure.ac index 331015490cfde..e0a17416ac875 100644 --- a/configure.ac +++ b/configure.ac @@ -690,6 +690,8 @@ if test "$ac_cv_func_getaddrinfo" = yes; then AC_DEFINE(HAVE_GETADDRINFO,1,[Define if you have the getaddrinfo function]) fi +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], ac_cv_copy_file_range, [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef __linux__ diff --git a/ext/standard/tests/file/gh9779.phpt b/ext/standard/tests/file/gh9779.phpt new file mode 100644 index 0000000000000..403196de249a9 --- /dev/null +++ b/ext/standard/tests/file/gh9779.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug GH-9779 (stream_copy_to_stream doesn't work anymore with resource opened in a append mode) +--FILE-- + +--CLEAN-- + +--EXPECTF-- +string(6) "foobar" diff --git a/main/streams/streams.c b/main/streams/streams.c index fd65896586e7d..20029fc73eebd 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1557,87 +1557,73 @@ PHPAPI zend_result _php_stream_copy_to_stream_ex(php_stream *src, php_stream *de } #ifdef HAVE_COPY_FILE_RANGE - - /* TODO: on FreeBSD, copy_file_range() works only with the - undocumented flag 0x01000000; until the problem is fixed - properly, copy_file_range() is not used on FreeBSD */ -#ifndef __FreeBSD__ if (php_stream_is(src, PHP_STREAM_IS_STDIO) && - php_stream_is(dest, PHP_STREAM_IS_STDIO) && - src->writepos == src->readpos && - php_stream_can_cast(src, PHP_STREAM_AS_FD) == SUCCESS && - php_stream_can_cast(dest, PHP_STREAM_AS_FD) == SUCCESS) { - /* both php_stream instances are backed by a file - descriptor, are not filtered and the read buffer is - empty: we can use copy_file_range() */ - - int src_fd, dest_fd; - - php_stream_cast(src, PHP_STREAM_AS_FD, (void*)&src_fd, 0); - php_stream_cast(dest, PHP_STREAM_AS_FD, (void*)&dest_fd, 0); - - /* clamp to INT_MAX to avoid EOVERFLOW */ - const size_t cfr_max = MIN(maxlen, (size_t)SSIZE_MAX); - - /* copy_file_range() is a Linux-specific system call - which allows efficient copying between two file - descriptors, eliminating the need to transfer data - from the kernel to userspace and back. For - networking file systems like NFS and Ceph, it even - eliminates copying data to the client, and local - filesystems like Btrfs and XFS can create shared - extents. */ - - ssize_t result = copy_file_range(src_fd, NULL, - dest_fd, NULL, - cfr_max, 0); - if (result > 0) { - size_t nbytes = (size_t)result; - haveread += nbytes; - - src->position += nbytes; - dest->position += nbytes; - - if ((maxlen != PHP_STREAM_COPY_ALL && nbytes == maxlen) || - php_stream_eof(src)) { - /* the whole request was satisfied or - end-of-file reached - done */ + php_stream_is(dest, PHP_STREAM_IS_STDIO) && + src->writepos == src->readpos) { + /* both php_stream instances are backed by a file descriptor, are not filtered and the + * read buffer is empty: we can use copy_file_range() */ + int src_fd, dest_fd, dest_open_flags = 0; + + /* get dest open flags to check if the stream is open in append mode */ + php_stream_parse_fopen_modes(dest->mode, &dest_open_flags); + + /* copy_file_range does not work with O_APPEND */ + if (php_stream_cast(src, PHP_STREAM_AS_FD, (void*)&src_fd, 0) == SUCCESS && + php_stream_cast(dest, PHP_STREAM_AS_FD, (void*)&dest_fd, 0) == SUCCESS && + php_stream_parse_fopen_modes(dest->mode, &dest_open_flags) == SUCCESS && + !(dest_open_flags & O_APPEND)) { + + /* clamp to INT_MAX to avoid EOVERFLOW */ + const size_t cfr_max = MIN(maxlen, (size_t)SSIZE_MAX); + + /* copy_file_range() is a Linux-specific system call which allows efficient copying + * between two file descriptors, eliminating the need to transfer data from the kernel + * to userspace and back. For networking file systems like NFS and Ceph, it even + * eliminates copying data to the client, and local filesystems like Btrfs and XFS can + * create shared extents. */ + ssize_t result = copy_file_range(src_fd, NULL, dest_fd, NULL, cfr_max, 0); + if (result > 0) { + size_t nbytes = (size_t)result; + haveread += nbytes; + + src->position += nbytes; + dest->position += nbytes; + + if ((maxlen != PHP_STREAM_COPY_ALL && nbytes == maxlen) || php_stream_eof(src)) { + /* the whole request was satisfied or end-of-file reached - done */ + *len = haveread; + return SUCCESS; + } + + /* there may be more data; continue copying using the fallback code below */ + } else if (result == 0) { + /* end of file */ *len = haveread; return SUCCESS; - } - - /* there may be more data; continue copying - using the fallback code below */ - } else if (result == 0) { - /* end of file */ - *len = haveread; - return SUCCESS; - } else if (result < 0) { - switch (errno) { - case EINVAL: - /* some formal error, e.g. overlapping - file ranges */ - break; - - case EXDEV: - /* pre Linux 5.3 error */ - break; - - case ENOSYS: - /* not implemented by this Linux kernel */ - break; + } else if (result < 0) { + switch (errno) { + case EINVAL: + /* some formal error, e.g. overlapping file ranges */ + break; + + case EXDEV: + /* pre Linux 5.3 error */ + break; + + case ENOSYS: + /* not implemented by this Linux kernel */ + break; + + default: + /* unexpected I/O error - give up, no fallback */ + *len = haveread; + return FAILURE; + } - default: - /* unexpected I/O error - give up, no - fallback */ - *len = haveread; - return FAILURE; + /* fall back to classic copying */ } - - /* fall back to classic copying */ } } -#endif // __FreeBSD__ #endif // HAVE_COPY_FILE_RANGE if (maxlen == PHP_STREAM_COPY_ALL) { From e0d9a29958944ba49bf29e8928946761d460999d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 24 Oct 2022 12:10:08 +0300 Subject: [PATCH 1318/1346] Fixed test --- ext/opcache/tests/jit/fetch_dim_rw_004.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opcache/tests/jit/fetch_dim_rw_004.phpt b/ext/opcache/tests/jit/fetch_dim_rw_004.phpt index 7e9b032551ea8..ea3fff88f1e45 100644 --- a/ext/opcache/tests/jit/fetch_dim_rw_004.phpt +++ b/ext/opcache/tests/jit/fetch_dim_rw_004.phpt @@ -13,7 +13,7 @@ $k=[]; $y[$k]++; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: {closure}(): Argument #1 ($y) must be of type y, int given, called in %sfetch_dim_rw_004.php on line 5 and defined in /home/dmitry/php/php8.1/ext/opcache/tests/jit/fetch_dim_rw_004.php:2 +Fatal error: Uncaught TypeError: {closure}(): Argument #1 ($y) must be of type y, int given, called in %sfetch_dim_rw_004.php:2 Stack trace: #0 %sfetch_dim_rw_004.php(5): {closure}(2, 'Undefined varia...', '%s', 5) #1 {main} From 0b0259a418b78c05cd5cd23f756582615d9b5918 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 24 Oct 2022 11:39:54 +0100 Subject: [PATCH 1319/1346] Convert Implicitly nullable pure intersection types to DNF If we don't then Reflection would give us a ReflectionIntersectionType even if the type is currently displayed as (X&Y)|null --- Zend/zend_compile.c | 20 ++++++++-- ...intersection_type_implicitly_nullable.phpt | 37 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 ext/reflection/tests/types/pure_intersection_type_implicitly_nullable.phpt diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 395a8a5e984e4..9714aea3bba01 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6527,10 +6527,24 @@ static zend_type zend_compile_typename( ZEND_ASSERT(list->children == type_list->num_types); - ZEND_TYPE_SET_LIST(type, type_list); ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT; - /* Inform that the type list is an intersection type */ - ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_INTERSECTION_BIT; + /* An implicitly nullable intersection type needs to be converted to a DNF type */ + if (force_allow_null) { + zend_type intersection_type = ZEND_TYPE_INIT_NONE(0); + ZEND_TYPE_SET_LIST(intersection_type, type_list); + ZEND_TYPE_FULL_MASK(intersection_type) |= _ZEND_TYPE_INTERSECTION_BIT; + + zend_type_list *dnf_type_list = zend_arena_alloc(&CG(arena), ZEND_TYPE_LIST_SIZE(list->children)); + dnf_type_list->num_types = 1; + dnf_type_list->types[0] = intersection_type; + ZEND_TYPE_SET_LIST(type, dnf_type_list); + /* Inform that the type list is a DNF type */ + ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_UNION_BIT; + } else { + ZEND_TYPE_SET_LIST(type, type_list); + /* Inform that the type list is an intersection type */ + ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_INTERSECTION_BIT; + } } else { type = zend_compile_single_typename(ast); } diff --git a/ext/reflection/tests/types/pure_intersection_type_implicitly_nullable.phpt b/ext/reflection/tests/types/pure_intersection_type_implicitly_nullable.phpt new file mode 100644 index 0000000000000..de2474cfbd495 --- /dev/null +++ b/ext/reflection/tests/types/pure_intersection_type_implicitly_nullable.phpt @@ -0,0 +1,37 @@ +--TEST-- +Intersection type which is implicitly nullable should be a DNF type in reflection +--FILE-- +allowsNull()) . "\n"; + foreach ($rt->getTypes() as $type) { + if ($type instanceof ReflectionNamedType) { + echo $str_indent . " Name: " . $type->getName() . "\n"; + echo $str_indent . " String: " . (string) $type . "\n"; + } else { + dumpType($type, $indent+1); + } + } +} + +function foo(X&Y $foo = null) { + var_dump($foo); +} + +dumpType((new ReflectionFunction('foo'))->getParameters()[0]->getType()); + +?> +--EXPECT-- +Type (X&Y)|null is ReflectionUnionType: +Allows Null: true + Type X&Y is ReflectionIntersectionType: + Allows Null: false + Name: X + String: X + Name: Y + String: Y + Name: null + String: null From 8c2df899d0d92cfc63e3107e3444811489f85a53 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 24 Oct 2022 11:41:42 +0100 Subject: [PATCH 1320/1346] Revert 01eb06a0def9fb5facf0abf0f4168fcacbbb5789 We do not need this shim anymore since it is converted to a proper DNF type at compile time --- Zend/zend_compile.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9714aea3bba01..b4be1ebb8e9a8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1230,12 +1230,7 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop /* Pure intersection type */ if (ZEND_TYPE_IS_INTERSECTION(type)) { ZEND_ASSERT(!ZEND_TYPE_IS_UNION(type)); - bool is_bracketed = false; - /* Shim for implicitly nullable pure intersection types */ - if (UNEXPECTED(ZEND_TYPE_PURE_MASK(type) & MAY_BE_NULL)) { - is_bracketed = true; - } - str = add_intersection_type(str, ZEND_TYPE_LIST(type), scope, is_bracketed); + str = add_intersection_type(str, ZEND_TYPE_LIST(type), scope, /* is_bracketed */ false); } else if (ZEND_TYPE_HAS_LIST(type)) { /* A union type might not be a list */ zend_type *list_type; From cb3adf351de064eb2c3a18e69d10310bc88700cf Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 24 Oct 2022 15:17:18 +0100 Subject: [PATCH 1321/1346] Fix OpCache build after 0b0259a418b78c05cd5cd23f756582615d9b5918 The intersection type needs to be marked as being allocated on the arena otherwise zend_persist_type() tries to free it and corrupts the Zend MM Heap Also we only need to allocate the space for a list of size 1 and not the whole length of the intersection type --- Zend/zend_compile.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b4be1ebb8e9a8..5243eb608f333 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6522,23 +6522,25 @@ static zend_type zend_compile_typename( ZEND_ASSERT(list->children == type_list->num_types); - ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT; /* An implicitly nullable intersection type needs to be converted to a DNF type */ if (force_allow_null) { zend_type intersection_type = ZEND_TYPE_INIT_NONE(0); ZEND_TYPE_SET_LIST(intersection_type, type_list); ZEND_TYPE_FULL_MASK(intersection_type) |= _ZEND_TYPE_INTERSECTION_BIT; + ZEND_TYPE_FULL_MASK(intersection_type) |= _ZEND_TYPE_ARENA_BIT; - zend_type_list *dnf_type_list = zend_arena_alloc(&CG(arena), ZEND_TYPE_LIST_SIZE(list->children)); + zend_type_list *dnf_type_list = zend_arena_alloc(&CG(arena), ZEND_TYPE_LIST_SIZE(1)); dnf_type_list->num_types = 1; dnf_type_list->types[0] = intersection_type; ZEND_TYPE_SET_LIST(type, dnf_type_list); /* Inform that the type list is a DNF type */ ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_UNION_BIT; + ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT; } else { ZEND_TYPE_SET_LIST(type, type_list); /* Inform that the type list is an intersection type */ ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_INTERSECTION_BIT; + ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT; } } else { type = zend_compile_single_typename(ast); From 4ccc414961a70200d638ca281a35f893226d74e2 Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Tue, 25 Oct 2022 13:46:14 -0400 Subject: [PATCH 1322/1346] [ci skip] Update NEWS for PHP 8.2.0RC6 --- NEWS | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d1ae3e22ee093..e1a0c82c93527 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.2.0RC5 +?? ??? ????, PHP 8.2.0RC6 + + +27 Oct 2022, PHP 8.2.0RC5 - CLI: . Fixed bug GH-9709 (Null pointer dereference with -w/-s options). (Adam Saponara) From 56c121cea2fa51533ebb5fc4cb4ac71324ffd1e3 Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 24 Oct 2022 13:39:55 +0200 Subject: [PATCH 1323/1346] Initialize run time cache in PDO methods (#9818) Without the memset the memory was uninitialized and the new test segfaulted when accessing the memory in _zend_observe_fcall_begin(). --- NEWS | 6 ++- ext/pdo/pdo_dbh.c | 2 +- .../observer_sqlite_create_function.phpt | 51 +++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 ext/zend_test/tests/observer_sqlite_create_function.phpt diff --git a/NEWS b/NEWS index e1a0c82c93527..b9a31cd5c6492 100644 --- a/NEWS +++ b/NEWS @@ -2,11 +2,15 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC6 +- PDO: + . Fixed bug GH-9818 (Initialize run time cache in PDO methods). + (Florian Sowade) 27 Oct 2022, PHP 8.2.0RC5 - CLI: - . Fixed bug GH-9709 (Null pointer dereference with -w/-s options). (Adam Saponara) + . Fixed bug GH-9709 (Null pointer dereference with -w/-s options). + (Adam Saponara) - GD: . Fixed bug #81739: OOB read due to insufficient input validation in diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 2c56459a62772..0de21811f26e4 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -1254,7 +1254,7 @@ bool pdo_hash_methods(pdo_dbh_object_t *dbh_obj, int kind) func.function_name = zend_string_init(funcs->fname, strlen(funcs->fname), dbh->is_persistent); func.scope = dbh_obj->std.ce; func.prototype = NULL; - ZEND_MAP_PTR(func.run_time_cache) = rt_cache_size ? pemalloc(rt_cache_size, dbh->is_persistent) : NULL; + ZEND_MAP_PTR(func.run_time_cache) = rt_cache_size ? pecalloc(rt_cache_size, 1, dbh->is_persistent) : NULL; func.T = ZEND_OBSERVER_ENABLED; if (funcs->flags) { func.fn_flags = funcs->flags | ZEND_ACC_NEVER_CACHE; diff --git a/ext/zend_test/tests/observer_sqlite_create_function.phpt b/ext/zend_test/tests/observer_sqlite_create_function.phpt new file mode 100644 index 0000000000000..85d269c9ead1a --- /dev/null +++ b/ext/zend_test/tests/observer_sqlite_create_function.phpt @@ -0,0 +1,51 @@ +--TEST-- +Observer: PDO::sqliteCreateFunction() can be observed +--EXTENSIONS-- +zend_test +PDO +pdo_sqlite +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +--FILE-- +sqliteCreateFunction('returnOne', 'returnOne', 0); + +foreach ($db->query('SELECT returnOne()') as $row) { + var_dump($row); +} + +echo 'Done' . PHP_EOL; +?> +--EXPECTF-- + + + + + + + + + + + + + + + + +array(2) { + ["returnOne()"]=> + int(1) + [0]=> + int(1) +} + +Done + From b9474bf385a7c7caf0c16531dcec8774fbcf6e25 Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 24 Oct 2022 22:24:58 +0200 Subject: [PATCH 1324/1346] =?UTF-8?q?Don=E2=80=99t=20report=20arginfo=20vi?= =?UTF-8?q?olations=20on=20fake=20closures=20(#9823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NEWS | 4 ++++ Zend/zend_execute.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index b9a31cd5c6492..62f53e06bfa7d 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.2.0RC6 +- Core: + . Fixed bug GH-9823 (Don’t reset func in zend_closure_internal_handler). + (Florian Sowade) + - PDO: . Fixed bug GH-9818 (Initialize run time cache in PDO methods). (Florian Sowade) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 15c356a3b4ebd..e6db31038a9d6 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1210,8 +1210,8 @@ static zend_never_inline ZEND_ATTRIBUTE_UNUSED bool zend_verify_internal_arg_typ * trust that arginfo matches what is enforced by zend_parse_parameters. */ ZEND_API bool zend_internal_call_should_throw(zend_function *fbc, zend_execute_data *call) { - if (fbc->internal_function.handler == ZEND_FN(pass)) { - /* Be lenient about the special pass function. */ + if (fbc->internal_function.handler == ZEND_FN(pass) || (fbc->internal_function.fn_flags | ZEND_ACC_FAKE_CLOSURE)) { + /* Be lenient about the special pass function and about fake closures. */ return 0; } From 1d6b32f65ce795594edc3962ea9b1b3707f00110 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Fri, 21 Oct 2022 22:07:44 +0200 Subject: [PATCH 1325/1346] Remove unnecessary ast eval bailout We can just reset the filename_override to NULL in php_request_shutdown. Closes GH-9805 --- Zend/zend_ast.c | 11 +---------- Zend/zend_execute_API.c | 2 -- main/main.c | 3 +++ 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index acde144eb76f6..63146fc5dd24f 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -801,8 +801,6 @@ static zend_result ZEND_FASTCALL zend_ast_evaluate_ex(zval *result, zend_ast *as { zend_string *class_name = zend_ast_get_str(ast->child[0]); zend_string *const_name = zend_ast_get_str(ast->child[1]); - zval *zv; - bool bailout = 0; zend_string *previous_filename; zend_long previous_lineno; @@ -812,18 +810,11 @@ static zend_result ZEND_FASTCALL zend_ast_evaluate_ex(zval *result, zend_ast *as EG(filename_override) = scope->info.user.filename; EG(lineno_override) = zend_ast_get_lineno(ast); } - zend_try { - zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr); - } zend_catch { - bailout = 1; - } zend_end_try(); + zval *zv = zend_get_class_constant_ex(class_name, const_name, scope, ast->attr); if (scope) { EG(filename_override) = previous_filename; EG(lineno_override) = previous_lineno; } - if (bailout) { - zend_bailout(); - } if (UNEXPECTED(zv == NULL)) { ZVAL_UNDEF(result); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 3e19c0cfa8ee9..82c38366d89a2 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -471,8 +471,6 @@ void shutdown_executor(void) /* {{{ */ if (EG(ht_iterators) != EG(ht_iterators_slots)) { efree(EG(ht_iterators)); } - - ZEND_ASSERT(EG(filename_override) == NULL); } #if ZEND_DEBUG diff --git a/main/main.c b/main/main.c index 4f7e3f2fbcfcf..8be52d316a159 100644 --- a/main/main.c +++ b/main/main.c @@ -1588,6 +1588,9 @@ static void php_free_request_globals(void) efree(PG(php_sys_temp_dir)); PG(php_sys_temp_dir) = NULL; } + + EG(filename_override) = NULL; + EG(lineno_override) = -1; } /* }}} */ From 7f0b228f48ad29c13a84dc8c8bc050f34d3a855a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Fri, 28 Oct 2022 16:52:43 +0200 Subject: [PATCH 1326/1346] Fix pre-PHP 8.2 compatibility for php_mt_rand_range() with MT_RAND_PHP (#9839) * Fix pre-PHP 8.2 compatibility for php_mt_rand_range() with MT_RAND_PHP As some left-over comments indicated: > Legacy mode deliberately not inside php_mt_rand_range() > to prevent other functions being affected The broken scaler was only used for `php_mt_rand_common()`, not `php_mt_rand_range()`. The former is only used for `mt_rand()`, whereas the latter is used for `array_rand()` and others. With the refactoring for the introduction of ext/random `php_mt_rand_common()` and `php_mt_rand_range()` were accidentally unified, thus introducing a behavioral change that was reported in FakerPHP/Faker#528. This commit moves the checks for `MT_RAND_PHP` from the general-purpose `range()` function back into `php_mt_rand_common()` and also into `Randomizer::getInt()` for drop-in compatibility with `mt_rand()`. * [ci skip] NEWS for `MT_RAND_PHP` compatibility --- NEWS | 4 +++ ext/random/engine_mt19937.c | 18 +---------- ext/random/random.c | 16 +++++++++- ext/random/randomizer.c | 17 +++++++++- .../01_functions/array_rand_mt_rand_php.phpt | 32 +++++++++++++++++++ 5 files changed, 68 insertions(+), 19 deletions(-) create mode 100644 ext/random/tests/01_functions/array_rand_mt_rand_php.phpt diff --git a/NEWS b/NEWS index fcf4383f8fb07..afe853c2afa2f 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,10 @@ PHP NEWS . Fixed bug GH-9818 (Initialize run time cache in PDO methods). (Florian Sowade) +- Random: + . Fixed bug GH-9839 (Pre-PHP 8.2 output compatibility for non-mt_rand() + functions for MT_RAND_PHP). (timwolla) + 27 Oct 2022, PHP 8.2.0RC5 - CLI: diff --git a/ext/random/engine_mt19937.c b/ext/random/engine_mt19937.c index 227c1ac02540d..87f96be70abd8 100644 --- a/ext/random/engine_mt19937.c +++ b/ext/random/engine_mt19937.c @@ -162,23 +162,7 @@ static uint64_t generate(php_random_status *status) static zend_long range(php_random_status *status, zend_long min, zend_long max) { - php_random_status_state_mt19937 *s = status->state; - - if (s->mode == MT_RAND_MT19937) { - return php_random_range(&php_random_algo_mt19937, status, min, max); - } - - /* Legacy mode deliberately not inside php_mt_rand_range() - * to prevent other functions being affected */ - - uint64_t r = php_random_algo_mt19937.generate(status) >> 1; - - /* This is an inlined version of the RAND_RANGE_BADSCALING macro that does not invoke UB when encountering - * (max - min) > ZEND_LONG_MAX. - */ - zend_ulong offset = (double) ( (double) max - min + 1.0) * (r / (PHP_MT_RAND_MAX + 1.0)); - - return (zend_long) (offset + min); + return php_random_range(&php_random_algo_mt19937, status, min, max); } static bool serialize(php_random_status *status, HashTable *data) diff --git a/ext/random/random.c b/ext/random/random.c index 13f1c94c3acf4..161eb8e685203 100644 --- a/ext/random/random.c +++ b/ext/random/random.c @@ -449,7 +449,21 @@ PHPAPI zend_long php_mt_rand_range(zend_long min, zend_long max) * rand() allows min > max, mt_rand does not */ PHPAPI zend_long php_mt_rand_common(zend_long min, zend_long max) { - return php_mt_rand_range(min, max); + php_random_status *status = php_random_default_status(); + php_random_status_state_mt19937 *s = status->state; + + if (s->mode == MT_RAND_MT19937) { + return php_mt_rand_range(min, max); + } + + uint64_t r = php_random_algo_mt19937.generate(php_random_default_status()) >> 1; + + /* This is an inlined version of the RAND_RANGE_BADSCALING macro that does not invoke UB when encountering + * (max - min) > ZEND_LONG_MAX. + */ + zend_ulong offset = (double) ( (double) max - min + 1.0) * (r / (PHP_MT_RAND_MAX + 1.0)); + + return (zend_long) (offset + min); } /* }}} */ diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index 0e3d90120b6fc..391cc16cc74db 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -126,7 +126,22 @@ PHP_METHOD(Random_Randomizer, getInt) RETURN_THROWS(); } - result = randomizer->algo->range(randomizer->status, min, max); + if (UNEXPECTED( + randomizer->algo->range == php_random_algo_mt19937.range + && ((php_random_status_state_mt19937 *) randomizer->status->state)->mode != MT_RAND_MT19937 + )) { + uint64_t r = php_random_algo_mt19937.generate(randomizer->status) >> 1; + + /* This is an inlined version of the RAND_RANGE_BADSCALING macro that does not invoke UB when encountering + * (max - min) > ZEND_LONG_MAX. + */ + zend_ulong offset = (double) ( (double) max - min + 1.0) * (r / (PHP_MT_RAND_MAX + 1.0)); + + result = (zend_long) (offset + min); + } else { + result = randomizer->algo->range(randomizer->status, min, max); + } + if (EG(exception)) { RETURN_THROWS(); } diff --git a/ext/random/tests/01_functions/array_rand_mt_rand_php.phpt b/ext/random/tests/01_functions/array_rand_mt_rand_php.phpt new file mode 100644 index 0000000000000..01a4e3ff5dfcd --- /dev/null +++ b/ext/random/tests/01_functions/array_rand_mt_rand_php.phpt @@ -0,0 +1,32 @@ +--TEST-- +array_rand() is not affected by MT_RAND_PHP as with PHP < 8.2 +--FILE-- + +--EXPECTF-- +string(11) "found key 0" +string(11) "found key 1" +string(11) "found key 0" +string(3) "foo" +string(3) "bar" +string(3) "foo" From 721e604a691136471f8af8e9584dcf29a60544b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Kocsis?= Date: Sun, 30 Oct 2022 14:58:16 +0100 Subject: [PATCH 1327/1346] Do not display the value of UNKNOWN constants in the manual (#9843) --- build/gen_stub.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/gen_stub.php b/build/gen_stub.php index 411f60dc2b798..8cf319ceaea39 100755 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1911,6 +1911,10 @@ protected function addTypeToFieldSynopsis(DOMDocument $doc, DOMElement $fieldsyn protected function getFieldSynopsisValueString(iterable $allConstInfos): ?string { $value = EvaluatedValue::createFromExpression($this->value, null, $this->cValue, $allConstInfos); + if ($value->isUnknownConstValue) { + return null; + } + if ($value->originatingConst) { return $value->originatingConst->getFieldSynopsisValueString($allConstInfos); } From 482ae71fda1bca652d9d22cfbbcc3c4decf10960 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 31 Oct 2022 12:20:28 +0300 Subject: [PATCH 1328/1346] Fix memory leak --- .../dnf_types/dnf_intersection_and_eval.phpt | 9 +++++++++ Zend/zend_opcode.c | 10 ++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/dnf_types/dnf_intersection_and_eval.phpt diff --git a/Zend/tests/type_declarations/dnf_types/dnf_intersection_and_eval.phpt b/Zend/tests/type_declarations/dnf_types/dnf_intersection_and_eval.phpt new file mode 100644 index 0000000000000..80f1920779bad --- /dev/null +++ b/Zend/tests/type_declarations/dnf_types/dnf_intersection_and_eval.phpt @@ -0,0 +1,9 @@ +--TEST-- +Union and intersection type leaks +--FILE-- + +DONE +--EXPECTF-- +DONE diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 8d998d03786e2..6d42379b2022e 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -110,9 +110,15 @@ ZEND_API void destroy_zend_function(zend_function *function) ZEND_API void zend_type_release(zend_type type, bool persistent) { if (ZEND_TYPE_HAS_LIST(type)) { - zend_type *list_type; + zend_type *list_type, *sublist_type; ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(type), list_type) { - if (ZEND_TYPE_HAS_NAME(*list_type)) { + if (ZEND_TYPE_HAS_LIST(*list_type)) { + ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(*list_type), sublist_type) { + if (ZEND_TYPE_HAS_NAME(*sublist_type)) { + zend_string_release(ZEND_TYPE_NAME(*sublist_type)); + } + } ZEND_TYPE_LIST_FOREACH_END(); + } else if (ZEND_TYPE_HAS_NAME(*list_type)) { zend_string_release(ZEND_TYPE_NAME(*list_type)); } } ZEND_TYPE_LIST_FOREACH_END(); From 605136204eaa4ee90ca13351ee0df232246ddeb0 Mon Sep 17 00:00:00 2001 From: Derick Rethans Date: Wed, 2 Nov 2022 09:43:40 +0000 Subject: [PATCH 1329/1346] Updated to version 2022.6 (2022f) --- ext/date/lib/timezonedb.h | 22588 ++++++++++++++++++------------------ 1 file changed, 11298 insertions(+), 11290 deletions(-) diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index fbaae9d81a6b8..671a7238e4c8b 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -11,600 +11,600 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[596] = { { (char*) "Africa/Algiers" , 0x0003F9 }, { (char*) "Africa/Asmara" , 0x0005DB }, { (char*) "Africa/Asmera" , 0x000691 }, - { (char*) "Africa/Bamako" , 0x000747 }, - { (char*) "Africa/Bangui" , 0x0007F1 }, - { (char*) "Africa/Banjul" , 0x000880 }, - { (char*) "Africa/Bissau" , 0x000934 }, - { (char*) "Africa/Blantyre" , 0x0009D5 }, - { (char*) "Africa/Brazzaville" , 0x000A86 }, - { (char*) "Africa/Bujumbura" , 0x000B15 }, - { (char*) "Africa/Cairo" , 0x000BA4 }, - { (char*) "Africa/Casablanca" , 0x0010AC }, - { (char*) "Africa/Ceuta" , 0x001837 }, - { (char*) "Africa/Conakry" , 0x001A83 }, - { (char*) "Africa/Dakar" , 0x001B2D }, - { (char*) "Africa/Dar_es_Salaam" , 0x001BCE }, - { (char*) "Africa/Djibouti" , 0x001C7B }, - { (char*) "Africa/Douala" , 0x001D0A }, - { (char*) "Africa/El_Aaiun" , 0x001D99 }, - { (char*) "Africa/Freetown" , 0x0024CB }, - { (char*) "Africa/Gaborone" , 0x00261B }, - { (char*) "Africa/Harare" , 0x0026DB }, - { (char*) "Africa/Johannesburg" , 0x00276A }, - { (char*) "Africa/Juba" , 0x002834 }, - { (char*) "Africa/Kampala" , 0x002A0A }, - { (char*) "Africa/Khartoum" , 0x002ACC }, - { (char*) "Africa/Kigali" , 0x002CA2 }, - { (char*) "Africa/Kinshasa" , 0x002D31 }, - { (char*) "Africa/Lagos" , 0x002DD9 }, - { (char*) "Africa/Libreville" , 0x002E99 }, - { (char*) "Africa/Lome" , 0x002F28 }, - { (char*) "Africa/Luanda" , 0x002FB6 }, - { (char*) "Africa/Lubumbashi" , 0x003054 }, - { (char*) "Africa/Lusaka" , 0x00310F }, - { (char*) "Africa/Malabo" , 0x00319E }, - { (char*) "Africa/Maputo" , 0x003240 }, - { (char*) "Africa/Maseru" , 0x0032CF }, - { (char*) "Africa/Mbabane" , 0x003378 }, - { (char*) "Africa/Mogadishu" , 0x003409 }, - { (char*) "Africa/Monrovia" , 0x0034B6 }, - { (char*) "Africa/Nairobi" , 0x003566 }, - { (char*) "Africa/Ndjamena" , 0x003631 }, - { (char*) "Africa/Niamey" , 0x0036DD }, - { (char*) "Africa/Nouakchott" , 0x003792 }, - { (char*) "Africa/Ouagadougou" , 0x00383C }, - { (char*) "Africa/Porto-Novo" , 0x0038CA }, - { (char*) "Africa/Sao_Tome" , 0x00396C }, - { (char*) "Africa/Timbuktu" , 0x003A25 }, - { (char*) "Africa/Tripoli" , 0x003ACF }, - { (char*) "Africa/Tunis" , 0x003C8A }, - { (char*) "Africa/Windhoek" , 0x003E57 }, - { (char*) "America/Adak" , 0x0040E1 }, - { (char*) "America/Anchorage" , 0x0044C6 }, - { (char*) "America/Anguilla" , 0x0048B6 }, - { (char*) "America/Antigua" , 0x004944 }, - { (char*) "America/Araguaina" , 0x0049E5 }, - { (char*) "America/Argentina/Buenos_Aires" , 0x004C4A }, - { (char*) "America/Argentina/Catamarca" , 0x004F2F }, - { (char*) "America/Argentina/ComodRivadavia" , 0x00521A }, - { (char*) "America/Argentina/Cordoba" , 0x0054EA }, - { (char*) "America/Argentina/Jujuy" , 0x0057F0 }, - { (char*) "America/Argentina/La_Rioja" , 0x005AB8 }, - { (char*) "America/Argentina/Mendoza" , 0x005D9E }, - { (char*) "America/Argentina/Rio_Gallegos" , 0x00607A }, - { (char*) "America/Argentina/Salta" , 0x006359 }, - { (char*) "America/Argentina/San_Juan" , 0x00662D }, - { (char*) "America/Argentina/San_Luis" , 0x006913 }, - { (char*) "America/Argentina/Tucuman" , 0x006BF9 }, - { (char*) "America/Argentina/Ushuaia" , 0x006EE7 }, - { (char*) "America/Aruba" , 0x0071CC }, - { (char*) "America/Asuncion" , 0x00726F }, - { (char*) "America/Atikokan" , 0x0075EF }, - { (char*) "America/Atka" , 0x0076FC }, - { (char*) "America/Bahia" , 0x007AD1 }, - { (char*) "America/Bahia_Banderas" , 0x007D8C }, - { (char*) "America/Barbados" , 0x007FCA }, - { (char*) "America/Belem" , 0x0080EC }, - { (char*) "America/Belize" , 0x008294 }, - { (char*) "America/Blanc-Sablon" , 0x0086B5 }, - { (char*) "America/Boa_Vista" , 0x0087AA }, - { (char*) "America/Bogota" , 0x00896B }, - { (char*) "America/Boise" , 0x008A2A }, - { (char*) "America/Buenos_Aires" , 0x008E3D }, - { (char*) "America/Cambridge_Bay" , 0x00910D }, - { (char*) "America/Campo_Grande" , 0x00942D }, - { (char*) "America/Cancun" , 0x009803 }, - { (char*) "America/Caracas" , 0x009A44 }, - { (char*) "America/Catamarca" , 0x009B0E }, - { (char*) "America/Cayenne" , 0x009DDE }, - { (char*) "America/Cayman" , 0x009E81 }, - { (char*) "America/Chicago" , 0x009F22 }, - { (char*) "America/Chihuahua" , 0x00A61C }, - { (char*) "America/Coral_Harbour" , 0x00A7A2 }, - { (char*) "America/Cordoba" , 0x00A88E }, - { (char*) "America/Costa_Rica" , 0x00AB5E }, - { (char*) "America/Creston" , 0x00AC52 }, - { (char*) "America/Cuiaba" , 0x00AD0E }, - { (char*) "America/Curacao" , 0x00B0CB }, - { (char*) "America/Danmarkshavn" , 0x00B16E }, - { (char*) "America/Dawson" , 0x00B353 }, - { (char*) "America/Dawson_Creek" , 0x00B776 }, - { (char*) "America/Denver" , 0x00BA4D }, - { (char*) "America/Detroit" , 0x00BE80 }, - { (char*) "America/Dominica" , 0x00C228 }, - { (char*) "America/Edmonton" , 0x00C2B6 }, - { (char*) "America/Eirunepe" , 0x00C6A9 }, - { (char*) "America/El_Salvador" , 0x00C878 }, - { (char*) "America/Ensenada" , 0x00C934 }, - { (char*) "America/Fort_Nelson" , 0x00CD41 }, - { (char*) "America/Fort_Wayne" , 0x00D309 }, - { (char*) "America/Fortaleza" , 0x00D528 }, - { (char*) "America/Glace_Bay" , 0x00D73E }, - { (char*) "America/Godthab" , 0x00DAD5 }, - { (char*) "America/Goose_Bay" , 0x00DCB2 }, - { (char*) "America/Grand_Turk" , 0x00E30A }, - { (char*) "America/Grenada" , 0x00E66B }, - { (char*) "America/Guadeloupe" , 0x00E6F9 }, - { (char*) "America/Guatemala" , 0x00E787 }, - { (char*) "America/Guayaquil" , 0x00E867 }, - { (char*) "America/Guyana" , 0x00E938 }, - { (char*) "America/Halifax" , 0x00E9F9 }, - { (char*) "America/Havana" , 0x00F0AB }, - { (char*) "America/Hermosillo" , 0x00F514 }, - { (char*) "America/Indiana/Indianapolis" , 0x00F65D }, - { (char*) "America/Indiana/Knox" , 0x00F895 }, - { (char*) "America/Indiana/Marengo" , 0x00FCAE }, - { (char*) "America/Indiana/Petersburg" , 0x00FF08 }, - { (char*) "America/Indiana/Tell_City" , 0x0101D2 }, - { (char*) "America/Indiana/Vevay" , 0x0103FC }, - { (char*) "America/Indiana/Vincennes" , 0x010593 }, - { (char*) "America/Indiana/Winamac" , 0x0107E9 }, - { (char*) "America/Indianapolis" , 0x010A6F }, - { (char*) "America/Inuvik" , 0x010C8E }, - { (char*) "America/Iqaluit" , 0x010F6B }, - { (char*) "America/Jamaica" , 0x011279 }, - { (char*) "America/Jujuy" , 0x0113D8 }, - { (char*) "America/Juneau" , 0x011696 }, - { (char*) "America/Kentucky/Louisville" , 0x011A7C }, - { (char*) "America/Kentucky/Monticello" , 0x011F80 }, - { (char*) "America/Knox_IN" , 0x01236C }, - { (char*) "America/Kralendijk" , 0x012770 }, - { (char*) "America/La_Paz" , 0x012813 }, - { (char*) "America/Lima" , 0x0128C9 }, - { (char*) "America/Los_Angeles" , 0x0129F0 }, - { (char*) "America/Louisville" , 0x012F11 }, - { (char*) "America/Lower_Princes" , 0x0133F7 }, - { (char*) "America/Maceio" , 0x01349A }, - { (char*) "America/Managua" , 0x0136AC }, - { (char*) "America/Manaus" , 0x0137DF }, - { (char*) "America/Marigot" , 0x013996 }, - { (char*) "America/Martinique" , 0x013A24 }, - { (char*) "America/Matamoros" , 0x013AE2 }, - { (char*) "America/Mazatlan" , 0x013CE1 }, - { (char*) "America/Mendoza" , 0x013E91 }, - { (char*) "America/Menominee" , 0x014161 }, - { (char*) "America/Merida" , 0x014521 }, - { (char*) "America/Metlakatla" , 0x01467C }, - { (char*) "America/Mexico_City" , 0x0148F2 }, - { (char*) "America/Miquelon" , 0x014AB0 }, - { (char*) "America/Moncton" , 0x014CE2 }, - { (char*) "America/Monterrey" , 0x0152DB }, - { (char*) "America/Montevideo" , 0x015451 }, - { (char*) "America/Montreal" , 0x015826 }, - { (char*) "America/Montserrat" , 0x015EE7 }, - { (char*) "America/Nassau" , 0x015F75 }, - { (char*) "America/New_York" , 0x01636F }, - { (char*) "America/Nipigon" , 0x016A5F }, - { (char*) "America/Nome" , 0x016DCF }, - { (char*) "America/Noronha" , 0x0171B7 }, - { (char*) "America/North_Dakota/Beulah" , 0x0173B7 }, - { (char*) "America/North_Dakota/Center" , 0x0177EB }, - { (char*) "America/North_Dakota/New_Salem" , 0x017BEA }, - { (char*) "America/Nuuk" , 0x017FEF }, - { (char*) "America/Ojinaga" , 0x0181E2 }, - { (char*) "America/Panama" , 0x0183FA }, - { (char*) "America/Pangnirtung" , 0x01849B }, - { (char*) "America/Paramaribo" , 0x0187C2 }, - { (char*) "America/Phoenix" , 0x018889 }, - { (char*) "America/Port-au-Prince" , 0x0189A2 }, - { (char*) "America/Port_of_Spain" , 0x018BE3 }, - { (char*) "America/Porto_Acre" , 0x018C71 }, - { (char*) "America/Porto_Velho" , 0x018E1F }, - { (char*) "America/Puerto_Rico" , 0x018FBD }, - { (char*) "America/Punta_Arenas" , 0x01907A }, - { (char*) "America/Rainy_River" , 0x01955C }, - { (char*) "America/Rankin_Inlet" , 0x0198CD }, - { (char*) "America/Recife" , 0x019BA3 }, - { (char*) "America/Regina" , 0x019D9D }, - { (char*) "America/Resolute" , 0x01A03C }, - { (char*) "America/Rio_Branco" , 0x01A313 }, - { (char*) "America/Rosario" , 0x01A4C5 }, - { (char*) "America/Santa_Isabel" , 0x01A795 }, - { (char*) "America/Santarem" , 0x01ABA2 }, - { (char*) "America/Santiago" , 0x01AD52 }, - { (char*) "America/Santo_Domingo" , 0x01B2BA }, - { (char*) "America/Sao_Paulo" , 0x01B403 }, - { (char*) "America/Scoresbysund" , 0x01B7FD }, - { (char*) "America/Shiprock" , 0x01BA05 }, - { (char*) "America/Sitka" , 0x01BE23 }, - { (char*) "America/St_Barthelemy" , 0x01C1FE }, - { (char*) "America/St_Johns" , 0x01C28C }, - { (char*) "America/St_Kitts" , 0x01CA10 }, - { (char*) "America/St_Lucia" , 0x01CA9E }, - { (char*) "America/St_Thomas" , 0x01CB3F }, - { (char*) "America/St_Vincent" , 0x01CBCD }, - { (char*) "America/Swift_Current" , 0x01CC6E }, - { (char*) "America/Tegucigalpa" , 0x01CDFC }, - { (char*) "America/Thule" , 0x01CECA }, - { (char*) "America/Thunder_Bay" , 0x01D0AB }, - { (char*) "America/Tijuana" , 0x01D442 }, - { (char*) "America/Toronto" , 0x01D870 }, - { (char*) "America/Tortola" , 0x01DF4E }, - { (char*) "America/Vancouver" , 0x01DFDC }, - { (char*) "America/Virgin" , 0x01E533 }, - { (char*) "America/Whitehorse" , 0x01E5C1 }, - { (char*) "America/Winnipeg" , 0x01E9E4 }, - { (char*) "America/Yakutat" , 0x01EF1B }, - { (char*) "America/Yellowknife" , 0x01F2E9 }, - { (char*) "Antarctica/Casey" , 0x01F5E5 }, - { (char*) "Antarctica/Davis" , 0x01F6E9 }, - { (char*) "Antarctica/DumontDUrville" , 0x01F7BF }, - { (char*) "Antarctica/Macquarie" , 0x01F873 }, - { (char*) "Antarctica/Mawson" , 0x01FC5F }, - { (char*) "Antarctica/McMurdo" , 0x01FD09 }, - { (char*) "Antarctica/Palmer" , 0x02003B }, - { (char*) "Antarctica/Rothera" , 0x0203C4 }, - { (char*) "Antarctica/South_Pole" , 0x02045B }, - { (char*) "Antarctica/Syowa" , 0x020767 }, - { (char*) "Antarctica/Troll" , 0x0207FD }, - { (char*) "Antarctica/Vostok" , 0x0208BF }, - { (char*) "Arctic/Longyearbyen" , 0x020956 }, - { (char*) "Asia/Aden" , 0x020C06 }, - { (char*) "Asia/Almaty" , 0x020C97 }, - { (char*) "Asia/Amman" , 0x020F1B }, - { (char*) "Asia/Anadyr" , 0x0212C7 }, - { (char*) "Asia/Aqtau" , 0x0215CD }, - { (char*) "Asia/Aqtobe" , 0x02184C }, - { (char*) "Asia/Ashgabat" , 0x021ACC }, - { (char*) "Asia/Ashkhabad" , 0x021C4F }, - { (char*) "Asia/Atyrau" , 0x021DD2 }, - { (char*) "Asia/Baghdad" , 0x02205B }, - { (char*) "Asia/Bahrain" , 0x0222DD }, - { (char*) "Asia/Baku" , 0x022396 }, - { (char*) "Asia/Bangkok" , 0x02268A }, - { (char*) "Asia/Barnaul" , 0x02272E }, - { (char*) "Asia/Beirut" , 0x022A39 }, - { (char*) "Asia/Bishkek" , 0x022D21 }, - { (char*) "Asia/Brunei" , 0x022F97 }, - { (char*) "Asia/Calcutta" , 0x02303D }, - { (char*) "Asia/Chita" , 0x023125 }, - { (char*) "Asia/Choibalsan" , 0x023433 }, - { (char*) "Asia/Chongqing" , 0x0236BC }, - { (char*) "Asia/Chungking" , 0x023851 }, - { (char*) "Asia/Colombo" , 0x0239E6 }, - { (char*) "Asia/Dacca" , 0x023AE9 }, - { (char*) "Asia/Damascus" , 0x023BDC }, - { (char*) "Asia/Dhaka" , 0x0240BA }, - { (char*) "Asia/Dili" , 0x0241AD }, - { (char*) "Asia/Dubai" , 0x024263 }, - { (char*) "Asia/Dushanbe" , 0x0242F4 }, - { (char*) "Asia/Famagusta" , 0x02446E }, - { (char*) "Asia/Gaza" , 0x024835 }, - { (char*) "Asia/Harbin" , 0x024D35 }, - { (char*) "Asia/Hebron" , 0x024ECA }, - { (char*) "Asia/Ho_Chi_Minh" , 0x0253DB }, - { (char*) "Asia/Hong_Kong" , 0x0254D3 }, - { (char*) "Asia/Hovd" , 0x0257E6 }, - { (char*) "Asia/Irkutsk" , 0x025A6F }, - { (char*) "Asia/Istanbul" , 0x025D8D }, - { (char*) "Asia/Jakarta" , 0x026249 }, - { (char*) "Asia/Jayapura" , 0x02635A }, - { (char*) "Asia/Jerusalem" , 0x026447 }, - { (char*) "Asia/Kabul" , 0x026885 }, - { (char*) "Asia/Kamchatka" , 0x026930 }, - { (char*) "Asia/Karachi" , 0x026C25 }, - { (char*) "Asia/Kashgar" , 0x026D3B }, - { (char*) "Asia/Kathmandu" , 0x026DCC }, - { (char*) "Asia/Katmandu" , 0x026E79 }, - { (char*) "Asia/Khandyga" , 0x026F26 }, - { (char*) "Asia/Kolkata" , 0x027257 }, - { (char*) "Asia/Krasnoyarsk" , 0x02733F }, - { (char*) "Asia/Kuala_Lumpur" , 0x027649 }, - { (char*) "Asia/Kuching" , 0x027769 }, - { (char*) "Asia/Kuwait" , 0x0278C3 }, - { (char*) "Asia/Macao" , 0x027954 }, - { (char*) "Asia/Macau" , 0x027C77 }, - { (char*) "Asia/Magadan" , 0x027F9A }, - { (char*) "Asia/Makassar" , 0x0282A5 }, - { (char*) "Asia/Manila" , 0x0283B8 }, - { (char*) "Asia/Muscat" , 0x0284B2 }, - { (char*) "Asia/Nicosia" , 0x028543 }, - { (char*) "Asia/Novokuznetsk" , 0x0287B7 }, - { (char*) "Asia/Novosibirsk" , 0x028AAA }, - { (char*) "Asia/Omsk" , 0x028DBB }, - { (char*) "Asia/Oral" , 0x0290B9 }, - { (char*) "Asia/Phnom_Penh" , 0x029345 }, - { (char*) "Asia/Pontianak" , 0x029419 }, - { (char*) "Asia/Pyongyang" , 0x029532 }, - { (char*) "Asia/Qatar" , 0x0295F5 }, - { (char*) "Asia/Qostanay" , 0x029699 }, - { (char*) "Asia/Qyzylorda" , 0x029926 }, - { (char*) "Asia/Rangoon" , 0x029BBF }, - { (char*) "Asia/Riyadh" , 0x029C86 }, - { (char*) "Asia/Saigon" , 0x029D17 }, - { (char*) "Asia/Sakhalin" , 0x029E0F }, - { (char*) "Asia/Samarkand" , 0x02A126 }, - { (char*) "Asia/Seoul" , 0x02A2B1 }, - { (char*) "Asia/Shanghai" , 0x02A45C }, - { (char*) "Asia/Singapore" , 0x02A5FD }, - { (char*) "Asia/Srednekolymsk" , 0x02A709 }, - { (char*) "Asia/Taipei" , 0x02AA1D }, - { (char*) "Asia/Tashkent" , 0x02AC28 }, - { (char*) "Asia/Tbilisi" , 0x02ADB3 }, - { (char*) "Asia/Tehran" , 0x02B034 }, - { (char*) "Asia/Tel_Aviv" , 0x02B36C }, - { (char*) "Asia/Thimbu" , 0x02B7AA }, - { (char*) "Asia/Thimphu" , 0x02B850 }, - { (char*) "Asia/Tokyo" , 0x02B8F6 }, - { (char*) "Asia/Tomsk" , 0x02B9D7 }, - { (char*) "Asia/Ujung_Pandang" , 0x02BCE2 }, - { (char*) "Asia/Ulaanbaatar" , 0x02BDAC }, - { (char*) "Asia/Ulan_Bator" , 0x02C01F }, - { (char*) "Asia/Urumqi" , 0x02C27D }, - { (char*) "Asia/Ust-Nera" , 0x02C31B }, - { (char*) "Asia/Vientiane" , 0x02C63E }, - { (char*) "Asia/Vladivostok" , 0x02C724 }, - { (char*) "Asia/Yakutsk" , 0x02CA29 }, - { (char*) "Asia/Yangon" , 0x02CD2D }, - { (char*) "Asia/Yekaterinburg" , 0x02CDF4 }, - { (char*) "Asia/Yerevan" , 0x02D106 }, - { (char*) "Atlantic/Azores" , 0x02D3D6 }, - { (char*) "Atlantic/Bermuda" , 0x02D995 }, - { (char*) "Atlantic/Canary" , 0x02DDA1 }, - { (char*) "Atlantic/Cape_Verde" , 0x02DF99 }, - { (char*) "Atlantic/Faeroe" , 0x02E054 }, - { (char*) "Atlantic/Faroe" , 0x02E219 }, - { (char*) "Atlantic/Jan_Mayen" , 0x02E3DE }, - { (char*) "Atlantic/Madeira" , 0x02E68E }, - { (char*) "Atlantic/Reykjavik" , 0x02EC56 }, - { (char*) "Atlantic/South_Georgia" , 0x02EF53 }, - { (char*) "Atlantic/St_Helena" , 0x02EFE3 }, - { (char*) "Atlantic/Stanley" , 0x02F084 }, - { (char*) "Australia/ACT" , 0x02F3A5 }, - { (char*) "Australia/Adelaide" , 0x02F739 }, - { (char*) "Australia/Brisbane" , 0x02FAED }, - { (char*) "Australia/Broken_Hill" , 0x02FC31 }, - { (char*) "Australia/Canberra" , 0x030006 }, - { (char*) "Australia/Currie" , 0x03039A }, - { (char*) "Australia/Darwin" , 0x030791 }, - { (char*) "Australia/Eucla" , 0x030899 }, - { (char*) "Australia/Hobart" , 0x0309F8 }, - { (char*) "Australia/LHI" , 0x030DF7 }, - { (char*) "Australia/Lindeman" , 0x0310B7 }, - { (char*) "Australia/Lord_Howe" , 0x031227 }, - { (char*) "Australia/Melbourne" , 0x0314F7 }, - { (char*) "Australia/North" , 0x031893 }, - { (char*) "Australia/NSW" , 0x031989 }, - { (char*) "Australia/Perth" , 0x031D1D }, - { (char*) "Australia/Queensland" , 0x031E79 }, - { (char*) "Australia/South" , 0x031FA6 }, - { (char*) "Australia/Sydney" , 0x03234B }, - { (char*) "Australia/Tasmania" , 0x0326FB }, - { (char*) "Australia/Victoria" , 0x032AF2 }, - { (char*) "Australia/West" , 0x032E86 }, - { (char*) "Australia/Yancowinna" , 0x032FC4 }, - { (char*) "Brazil/Acre" , 0x03337D }, - { (char*) "Brazil/DeNoronha" , 0x03352B }, - { (char*) "Brazil/East" , 0x03371B }, - { (char*) "Brazil/West" , 0x033ADF }, - { (char*) "Canada/Atlantic" , 0x033C87 }, - { (char*) "Canada/Central" , 0x03431B }, - { (char*) "Canada/Eastern" , 0x034835 }, - { (char*) "Canada/Mountain" , 0x034EF6 }, - { (char*) "Canada/Newfoundland" , 0x0352CC }, - { (char*) "Canada/Pacific" , 0x035A2E }, - { (char*) "Canada/Saskatchewan" , 0x035F6C }, - { (char*) "Canada/Yukon" , 0x0361F6 }, - { (char*) "CET" , 0x036607 }, - { (char*) "Chile/Continental" , 0x036880 }, - { (char*) "Chile/EasterIsland" , 0x036DD6 }, - { (char*) "CST6CDT" , 0x037278 }, - { (char*) "Cuba" , 0x03763B }, - { (char*) "EET" , 0x037AA4 }, - { (char*) "Egypt" , 0x037CA1 }, - { (char*) "Eire" , 0x0381A9 }, - { (char*) "EST" , 0x03878D }, - { (char*) "EST5EDT" , 0x038808 }, - { (char*) "Etc/GMT" , 0x038BCB }, - { (char*) "Etc/GMT+0" , 0x038C46 }, - { (char*) "Etc/GMT+1" , 0x038CC1 }, - { (char*) "Etc/GMT+10" , 0x038D3E }, - { (char*) "Etc/GMT+11" , 0x038DBC }, - { (char*) "Etc/GMT+12" , 0x038E3A }, - { (char*) "Etc/GMT+2" , 0x038EB8 }, - { (char*) "Etc/GMT+3" , 0x038F35 }, - { (char*) "Etc/GMT+4" , 0x038FB2 }, - { (char*) "Etc/GMT+5" , 0x03902F }, - { (char*) "Etc/GMT+6" , 0x0390AC }, - { (char*) "Etc/GMT+7" , 0x039129 }, - { (char*) "Etc/GMT+8" , 0x0391A6 }, - { (char*) "Etc/GMT+9" , 0x039223 }, - { (char*) "Etc/GMT-0" , 0x0392A0 }, - { (char*) "Etc/GMT-1" , 0x03931B }, - { (char*) "Etc/GMT-10" , 0x039399 }, - { (char*) "Etc/GMT-11" , 0x039418 }, - { (char*) "Etc/GMT-12" , 0x039497 }, - { (char*) "Etc/GMT-13" , 0x039516 }, - { (char*) "Etc/GMT-14" , 0x039595 }, - { (char*) "Etc/GMT-2" , 0x039614 }, - { (char*) "Etc/GMT-3" , 0x039692 }, - { (char*) "Etc/GMT-4" , 0x039710 }, - { (char*) "Etc/GMT-5" , 0x03978E }, - { (char*) "Etc/GMT-6" , 0x03980C }, - { (char*) "Etc/GMT-7" , 0x03988A }, - { (char*) "Etc/GMT-8" , 0x039908 }, - { (char*) "Etc/GMT-9" , 0x039986 }, - { (char*) "Etc/GMT0" , 0x039A04 }, - { (char*) "Etc/Greenwich" , 0x039A7F }, - { (char*) "Etc/UCT" , 0x039AFA }, - { (char*) "Etc/Universal" , 0x039B75 }, - { (char*) "Etc/UTC" , 0x039BF0 }, - { (char*) "Etc/Zulu" , 0x039C6B }, - { (char*) "Europe/Amsterdam" , 0x039CE6 }, - { (char*) "Europe/Andorra" , 0x03A121 }, - { (char*) "Europe/Astrakhan" , 0x03A2B2 }, - { (char*) "Europe/Athens" , 0x03A5A6 }, - { (char*) "Europe/Belfast" , 0x03A85C }, - { (char*) "Europe/Belgrade" , 0x03AEA7 }, - { (char*) "Europe/Berlin" , 0x03B091 }, - { (char*) "Europe/Bratislava" , 0x03B372 }, - { (char*) "Europe/Brussels" , 0x03B651 }, - { (char*) "Europe/Bucharest" , 0x03BAAC }, - { (char*) "Europe/Budapest" , 0x03BD4D }, - { (char*) "Europe/Busingen" , 0x03C057 }, - { (char*) "Europe/Chisinau" , 0x03C25C }, - { (char*) "Europe/Copenhagen" , 0x03C55B }, - { (char*) "Europe/Dublin" , 0x03C7D6 }, - { (char*) "Europe/Gibraltar" , 0x03CDBA }, - { (char*) "Europe/Guernsey" , 0x03D28A }, - { (char*) "Europe/Helsinki" , 0x03D8E1 }, - { (char*) "Europe/Isle_of_Man" , 0x03DACE }, - { (char*) "Europe/Istanbul" , 0x03E119 }, - { (char*) "Europe/Jersey" , 0x03E5D5 }, - { (char*) "Europe/Kaliningrad" , 0x03EC2C }, - { (char*) "Europe/Kiev" , 0x03EFD4 }, - { (char*) "Europe/Kirov" , 0x03F20E }, - { (char*) "Europe/Kyiv" , 0x03F4F5 }, - { (char*) "Europe/Lisbon" , 0x03F743 }, - { (char*) "Europe/Ljubljana" , 0x03FD10 }, - { (char*) "Europe/London" , 0x03FEFA }, - { (char*) "Europe/Luxembourg" , 0x040545 }, - { (char*) "Europe/Madrid" , 0x040990 }, - { (char*) "Europe/Malta" , 0x040D2D }, - { (char*) "Europe/Mariehamn" , 0x0410D9 }, - { (char*) "Europe/Minsk" , 0x0412C6 }, - { (char*) "Europe/Monaco" , 0x0415FA }, - { (char*) "Europe/Moscow" , 0x041A60 }, - { (char*) "Europe/Nicosia" , 0x041E0C }, - { (char*) "Europe/Oslo" , 0x04206D }, - { (char*) "Europe/Paris" , 0x04231D }, - { (char*) "Europe/Podgorica" , 0x04277A }, - { (char*) "Europe/Prague" , 0x042964 }, - { (char*) "Europe/Riga" , 0x042C43 }, - { (char*) "Europe/Rome" , 0x042F05 }, - { (char*) "Europe/Samara" , 0x0432C4 }, - { (char*) "Europe/San_Marino" , 0x0435C5 }, - { (char*) "Europe/Sarajevo" , 0x043984 }, - { (char*) "Europe/Saratov" , 0x043B6E }, - { (char*) "Europe/Simferopol" , 0x043E60 }, - { (char*) "Europe/Skopje" , 0x0441D3 }, - { (char*) "Europe/Sofia" , 0x0443BD }, - { (char*) "Europe/Stockholm" , 0x044619 }, - { (char*) "Europe/Tallinn" , 0x044816 }, - { (char*) "Europe/Tirane" , 0x044AC5 }, - { (char*) "Europe/Tiraspol" , 0x044D2D }, - { (char*) "Europe/Ulyanovsk" , 0x04502C }, - { (char*) "Europe/Uzhgorod" , 0x045342 }, - { (char*) "Europe/Vaduz" , 0x04557C }, - { (char*) "Europe/Vatican" , 0x045766 }, - { (char*) "Europe/Vienna" , 0x045B25 }, - { (char*) "Europe/Vilnius" , 0x045DC3 }, - { (char*) "Europe/Volgograd" , 0x046073 }, - { (char*) "Europe/Warsaw" , 0x046370 }, - { (char*) "Europe/Zagreb" , 0x046717 }, - { (char*) "Europe/Zaporozhye" , 0x046901 }, - { (char*) "Europe/Zurich" , 0x046B3B }, - { (char*) "Factory" , 0x046D38 }, - { (char*) "GB" , 0x046DB5 }, - { (char*) "GB-Eire" , 0x047400 }, - { (char*) "GMT" , 0x047A4B }, - { (char*) "GMT+0" , 0x047AC6 }, - { (char*) "GMT-0" , 0x047B41 }, - { (char*) "GMT0" , 0x047BBC }, - { (char*) "Greenwich" , 0x047C37 }, - { (char*) "Hongkong" , 0x047CB2 }, - { (char*) "HST" , 0x047FC5 }, - { (char*) "Iceland" , 0x048041 }, - { (char*) "Indian/Antananarivo" , 0x04833E }, - { (char*) "Indian/Chagos" , 0x0483EA }, - { (char*) "Indian/Christmas" , 0x04848E }, - { (char*) "Indian/Cocos" , 0x04851F }, - { (char*) "Indian/Comoro" , 0x0485B7 }, - { (char*) "Indian/Kerguelen" , 0x048646 }, - { (char*) "Indian/Mahe" , 0x0486D7 }, - { (char*) "Indian/Maldives" , 0x048768 }, - { (char*) "Indian/Mauritius" , 0x04880C }, - { (char*) "Indian/Mayotte" , 0x0488CB }, - { (char*) "Indian/Reunion" , 0x04895A }, - { (char*) "Iran" , 0x0489EB }, - { (char*) "Israel" , 0x048D23 }, - { (char*) "Jamaica" , 0x049161 }, - { (char*) "Japan" , 0x0492C0 }, - { (char*) "Kwajalein" , 0x0493A1 }, - { (char*) "Libya" , 0x049488 }, - { (char*) "MET" , 0x049643 }, - { (char*) "Mexico/BajaNorte" , 0x0498BC }, - { (char*) "Mexico/BajaSur" , 0x049CC9 }, - { (char*) "Mexico/General" , 0x049E44 }, - { (char*) "MST" , 0x049FF6 }, - { (char*) "MST7MDT" , 0x04A071 }, - { (char*) "Navajo" , 0x04A434 }, - { (char*) "NZ" , 0x04A852 }, - { (char*) "NZ-CHAT" , 0x04AC71 }, - { (char*) "Pacific/Apia" , 0x04AFA5 }, - { (char*) "Pacific/Auckland" , 0x04B148 }, - { (char*) "Pacific/Bougainville" , 0x04B57F }, - { (char*) "Pacific/Chatham" , 0x04B660 }, - { (char*) "Pacific/Chuuk" , 0x04B9A3 }, - { (char*) "Pacific/Easter" , 0x04BA81 }, - { (char*) "Pacific/Efate" , 0x04BF30 }, - { (char*) "Pacific/Enderbury" , 0x04C092 }, - { (char*) "Pacific/Fakaofo" , 0x04C14A }, - { (char*) "Pacific/Fiji" , 0x04C1EF }, - { (char*) "Pacific/Funafuti" , 0x04C3A7 }, - { (char*) "Pacific/Galapagos" , 0x04C439 }, - { (char*) "Pacific/Gambier" , 0x04C505 }, - { (char*) "Pacific/Guadalcanal" , 0x04C5A4 }, - { (char*) "Pacific/Guam" , 0x04C636 }, - { (char*) "Pacific/Honolulu" , 0x04C7A0 }, - { (char*) "Pacific/Johnston" , 0x04C88F }, - { (char*) "Pacific/Kanton" , 0x04C978 }, - { (char*) "Pacific/Kiritimati" , 0x04CA3F }, - { (char*) "Pacific/Kosrae" , 0x04CB05 }, - { (char*) "Pacific/Kwajalein" , 0x04CC09 }, - { (char*) "Pacific/Majuro" , 0x04CCF9 }, - { (char*) "Pacific/Marquesas" , 0x04CDFC }, - { (char*) "Pacific/Midway" , 0x04CEA4 }, - { (char*) "Pacific/Nauru" , 0x04CF67 }, - { (char*) "Pacific/Niue" , 0x04D02A }, - { (char*) "Pacific/Norfolk" , 0x04D0D0 }, - { (char*) "Pacific/Noumea" , 0x04D1D3 }, - { (char*) "Pacific/Pago_Pago" , 0x04D2A5 }, - { (char*) "Pacific/Palau" , 0x04D343 }, - { (char*) "Pacific/Pitcairn" , 0x04D3E3 }, - { (char*) "Pacific/Pohnpei" , 0x04D488 }, - { (char*) "Pacific/Ponape" , 0x04D578 }, - { (char*) "Pacific/Port_Moresby" , 0x04D65A }, - { (char*) "Pacific/Rarotonga" , 0x04D71D }, - { (char*) "Pacific/Saipan" , 0x04D8BF }, - { (char*) "Pacific/Samoa" , 0x04DA20 }, - { (char*) "Pacific/Tahiti" , 0x04DABE }, - { (char*) "Pacific/Tarawa" , 0x04DB5E }, - { (char*) "Pacific/Tongatapu" , 0x04DBFF }, - { (char*) "Pacific/Truk" , 0x04DCF8 }, - { (char*) "Pacific/Wake" , 0x04DDC7 }, - { (char*) "Pacific/Wallis" , 0x04DE64 }, - { (char*) "Pacific/Yap" , 0x04DEF6 }, - { (char*) "Poland" , 0x04DFC5 }, - { (char*) "Portugal" , 0x04E36C }, - { (char*) "PRC" , 0x04E926 }, - { (char*) "PST8PDT" , 0x04EABB }, - { (char*) "ROC" , 0x04EE7E }, - { (char*) "ROK" , 0x04F089 }, - { (char*) "Singapore" , 0x04F234 }, - { (char*) "Turkey" , 0x04F340 }, - { (char*) "UCT" , 0x04F7FC }, - { (char*) "Universal" , 0x04F877 }, - { (char*) "US/Alaska" , 0x04F8F2 }, - { (char*) "US/Aleutian" , 0x04FCCF }, - { (char*) "US/Arizona" , 0x0500A4 }, - { (char*) "US/Central" , 0x0501A0 }, - { (char*) "US/East-Indiana" , 0x050886 }, - { (char*) "US/Eastern" , 0x050AA5 }, - { (char*) "US/Hawaii" , 0x051181 }, - { (char*) "US/Indiana-Starke" , 0x05126A }, - { (char*) "US/Michigan" , 0x05166E }, - { (char*) "US/Mountain" , 0x0519FD }, - { (char*) "US/Pacific" , 0x051E1B }, - { (char*) "US/Samoa" , 0x052335 }, - { (char*) "UTC" , 0x0523D3 }, - { (char*) "W-SU" , 0x05244E }, - { (char*) "WET" , 0x0527E6 }, - { (char*) "Zulu" , 0x0529E0 }, + { (char*) "Africa/Bamako" , 0x00075C }, + { (char*) "Africa/Bangui" , 0x000806 }, + { (char*) "Africa/Banjul" , 0x000895 }, + { (char*) "Africa/Bissau" , 0x000949 }, + { (char*) "Africa/Blantyre" , 0x0009EA }, + { (char*) "Africa/Brazzaville" , 0x000A9B }, + { (char*) "Africa/Bujumbura" , 0x000B2A }, + { (char*) "Africa/Cairo" , 0x000BB9 }, + { (char*) "Africa/Casablanca" , 0x0010C1 }, + { (char*) "Africa/Ceuta" , 0x00184C }, + { (char*) "Africa/Conakry" , 0x001A98 }, + { (char*) "Africa/Dakar" , 0x001B42 }, + { (char*) "Africa/Dar_es_Salaam" , 0x001BE3 }, + { (char*) "Africa/Djibouti" , 0x001C90 }, + { (char*) "Africa/Douala" , 0x001D1F }, + { (char*) "Africa/El_Aaiun" , 0x001DAE }, + { (char*) "Africa/Freetown" , 0x0024E0 }, + { (char*) "Africa/Gaborone" , 0x002630 }, + { (char*) "Africa/Harare" , 0x0026F0 }, + { (char*) "Africa/Johannesburg" , 0x00277F }, + { (char*) "Africa/Juba" , 0x002849 }, + { (char*) "Africa/Kampala" , 0x002A1F }, + { (char*) "Africa/Khartoum" , 0x002AE1 }, + { (char*) "Africa/Kigali" , 0x002CB7 }, + { (char*) "Africa/Kinshasa" , 0x002D46 }, + { (char*) "Africa/Lagos" , 0x002DEE }, + { (char*) "Africa/Libreville" , 0x002EAE }, + { (char*) "Africa/Lome" , 0x002F3D }, + { (char*) "Africa/Luanda" , 0x002FCB }, + { (char*) "Africa/Lubumbashi" , 0x003069 }, + { (char*) "Africa/Lusaka" , 0x003124 }, + { (char*) "Africa/Malabo" , 0x0031B3 }, + { (char*) "Africa/Maputo" , 0x003255 }, + { (char*) "Africa/Maseru" , 0x0032E4 }, + { (char*) "Africa/Mbabane" , 0x00338D }, + { (char*) "Africa/Mogadishu" , 0x00341E }, + { (char*) "Africa/Monrovia" , 0x0034CB }, + { (char*) "Africa/Nairobi" , 0x00357B }, + { (char*) "Africa/Ndjamena" , 0x003646 }, + { (char*) "Africa/Niamey" , 0x0036F2 }, + { (char*) "Africa/Nouakchott" , 0x0037A7 }, + { (char*) "Africa/Ouagadougou" , 0x003851 }, + { (char*) "Africa/Porto-Novo" , 0x0038DF }, + { (char*) "Africa/Sao_Tome" , 0x003981 }, + { (char*) "Africa/Timbuktu" , 0x003A3A }, + { (char*) "Africa/Tripoli" , 0x003AC8 }, + { (char*) "Africa/Tunis" , 0x003C83 }, + { (char*) "Africa/Windhoek" , 0x003E50 }, + { (char*) "America/Adak" , 0x0040DA }, + { (char*) "America/Anchorage" , 0x0044BF }, + { (char*) "America/Anguilla" , 0x0048AF }, + { (char*) "America/Antigua" , 0x00493D }, + { (char*) "America/Araguaina" , 0x0049DE }, + { (char*) "America/Argentina/Buenos_Aires" , 0x004C43 }, + { (char*) "America/Argentina/Catamarca" , 0x004F28 }, + { (char*) "America/Argentina/ComodRivadavia" , 0x005213 }, + { (char*) "America/Argentina/Cordoba" , 0x0054E3 }, + { (char*) "America/Argentina/Jujuy" , 0x0057E9 }, + { (char*) "America/Argentina/La_Rioja" , 0x005AB1 }, + { (char*) "America/Argentina/Mendoza" , 0x005D97 }, + { (char*) "America/Argentina/Rio_Gallegos" , 0x006073 }, + { (char*) "America/Argentina/Salta" , 0x006352 }, + { (char*) "America/Argentina/San_Juan" , 0x006626 }, + { (char*) "America/Argentina/San_Luis" , 0x00690C }, + { (char*) "America/Argentina/Tucuman" , 0x006BF2 }, + { (char*) "America/Argentina/Ushuaia" , 0x006EE0 }, + { (char*) "America/Aruba" , 0x0071C5 }, + { (char*) "America/Asuncion" , 0x007268 }, + { (char*) "America/Atikokan" , 0x0075E8 }, + { (char*) "America/Atka" , 0x0076F5 }, + { (char*) "America/Bahia" , 0x007ACA }, + { (char*) "America/Bahia_Banderas" , 0x007D85 }, + { (char*) "America/Barbados" , 0x008089 }, + { (char*) "America/Belem" , 0x0081AB }, + { (char*) "America/Belize" , 0x008353 }, + { (char*) "America/Blanc-Sablon" , 0x008774 }, + { (char*) "America/Boa_Vista" , 0x008869 }, + { (char*) "America/Bogota" , 0x008A2A }, + { (char*) "America/Boise" , 0x008AE9 }, + { (char*) "America/Buenos_Aires" , 0x008EFC }, + { (char*) "America/Cambridge_Bay" , 0x0091CC }, + { (char*) "America/Campo_Grande" , 0x0094EC }, + { (char*) "America/Cancun" , 0x0098C2 }, + { (char*) "America/Caracas" , 0x009B03 }, + { (char*) "America/Catamarca" , 0x009BCD }, + { (char*) "America/Cayenne" , 0x009E9D }, + { (char*) "America/Cayman" , 0x009F40 }, + { (char*) "America/Chicago" , 0x009FE1 }, + { (char*) "America/Chihuahua" , 0x00A6DB }, + { (char*) "America/Coral_Harbour" , 0x00A9C0 }, + { (char*) "America/Cordoba" , 0x00AA61 }, + { (char*) "America/Costa_Rica" , 0x00AD31 }, + { (char*) "America/Creston" , 0x00AE25 }, + { (char*) "America/Cuiaba" , 0x00AEE1 }, + { (char*) "America/Curacao" , 0x00B29E }, + { (char*) "America/Danmarkshavn" , 0x00B341 }, + { (char*) "America/Dawson" , 0x00B526 }, + { (char*) "America/Dawson_Creek" , 0x00B949 }, + { (char*) "America/Denver" , 0x00BC20 }, + { (char*) "America/Detroit" , 0x00C053 }, + { (char*) "America/Dominica" , 0x00C3FB }, + { (char*) "America/Edmonton" , 0x00C489 }, + { (char*) "America/Eirunepe" , 0x00C87C }, + { (char*) "America/El_Salvador" , 0x00CA4B }, + { (char*) "America/Ensenada" , 0x00CB07 }, + { (char*) "America/Fort_Nelson" , 0x00CF14 }, + { (char*) "America/Fort_Wayne" , 0x00D4DC }, + { (char*) "America/Fortaleza" , 0x00D6FB }, + { (char*) "America/Glace_Bay" , 0x00D911 }, + { (char*) "America/Godthab" , 0x00DCA8 }, + { (char*) "America/Goose_Bay" , 0x00DE85 }, + { (char*) "America/Grand_Turk" , 0x00E4DD }, + { (char*) "America/Grenada" , 0x00E83E }, + { (char*) "America/Guadeloupe" , 0x00E8CC }, + { (char*) "America/Guatemala" , 0x00E95A }, + { (char*) "America/Guayaquil" , 0x00EA3A }, + { (char*) "America/Guyana" , 0x00EB0B }, + { (char*) "America/Halifax" , 0x00EBCC }, + { (char*) "America/Havana" , 0x00F27E }, + { (char*) "America/Hermosillo" , 0x00F6E7 }, + { (char*) "America/Indiana/Indianapolis" , 0x00F830 }, + { (char*) "America/Indiana/Knox" , 0x00FA68 }, + { (char*) "America/Indiana/Marengo" , 0x00FE81 }, + { (char*) "America/Indiana/Petersburg" , 0x0100DB }, + { (char*) "America/Indiana/Tell_City" , 0x0103A5 }, + { (char*) "America/Indiana/Vevay" , 0x0105CF }, + { (char*) "America/Indiana/Vincennes" , 0x010766 }, + { (char*) "America/Indiana/Winamac" , 0x0109BC }, + { (char*) "America/Indianapolis" , 0x010C42 }, + { (char*) "America/Inuvik" , 0x010E61 }, + { (char*) "America/Iqaluit" , 0x01113E }, + { (char*) "America/Jamaica" , 0x01144C }, + { (char*) "America/Jujuy" , 0x0115AB }, + { (char*) "America/Juneau" , 0x011869 }, + { (char*) "America/Kentucky/Louisville" , 0x011C4F }, + { (char*) "America/Kentucky/Monticello" , 0x012153 }, + { (char*) "America/Knox_IN" , 0x01253F }, + { (char*) "America/Kralendijk" , 0x012943 }, + { (char*) "America/La_Paz" , 0x012A00 }, + { (char*) "America/Lima" , 0x012AB6 }, + { (char*) "America/Los_Angeles" , 0x012BDD }, + { (char*) "America/Louisville" , 0x0130FE }, + { (char*) "America/Lower_Princes" , 0x0135E4 }, + { (char*) "America/Maceio" , 0x0136A1 }, + { (char*) "America/Managua" , 0x0138B3 }, + { (char*) "America/Manaus" , 0x0139E6 }, + { (char*) "America/Marigot" , 0x013B9D }, + { (char*) "America/Martinique" , 0x013C5A }, + { (char*) "America/Matamoros" , 0x013D18 }, + { (char*) "America/Mazatlan" , 0x013F17 }, + { (char*) "America/Mendoza" , 0x014226 }, + { (char*) "America/Menominee" , 0x0144F6 }, + { (char*) "America/Merida" , 0x0148B6 }, + { (char*) "America/Metlakatla" , 0x014B70 }, + { (char*) "America/Mexico_City" , 0x014DE6 }, + { (char*) "America/Miquelon" , 0x015103 }, + { (char*) "America/Moncton" , 0x015335 }, + { (char*) "America/Monterrey" , 0x01592E }, + { (char*) "America/Montevideo" , 0x015C03 }, + { (char*) "America/Montreal" , 0x015FD8 }, + { (char*) "America/Montserrat" , 0x016699 }, + { (char*) "America/Nassau" , 0x016727 }, + { (char*) "America/New_York" , 0x016B21 }, + { (char*) "America/Nipigon" , 0x017211 }, + { (char*) "America/Nome" , 0x0178D2 }, + { (char*) "America/Noronha" , 0x017CBA }, + { (char*) "America/North_Dakota/Beulah" , 0x017EBA }, + { (char*) "America/North_Dakota/Center" , 0x0182EE }, + { (char*) "America/North_Dakota/New_Salem" , 0x0186ED }, + { (char*) "America/Nuuk" , 0x018AF2 }, + { (char*) "America/Ojinaga" , 0x018CE5 }, + { (char*) "America/Panama" , 0x018FCC }, + { (char*) "America/Pangnirtung" , 0x01906D }, + { (char*) "America/Paramaribo" , 0x019394 }, + { (char*) "America/Phoenix" , 0x01945B }, + { (char*) "America/Port-au-Prince" , 0x019574 }, + { (char*) "America/Port_of_Spain" , 0x0197B5 }, + { (char*) "America/Porto_Acre" , 0x019843 }, + { (char*) "America/Porto_Velho" , 0x0199F1 }, + { (char*) "America/Puerto_Rico" , 0x019B8F }, + { (char*) "America/Punta_Arenas" , 0x019C4C }, + { (char*) "America/Rainy_River" , 0x01A12E }, + { (char*) "America/Rankin_Inlet" , 0x01A648 }, + { (char*) "America/Recife" , 0x01A91E }, + { (char*) "America/Regina" , 0x01AB18 }, + { (char*) "America/Resolute" , 0x01ADB7 }, + { (char*) "America/Rio_Branco" , 0x01B08E }, + { (char*) "America/Rosario" , 0x01B240 }, + { (char*) "America/Santa_Isabel" , 0x01B510 }, + { (char*) "America/Santarem" , 0x01B91D }, + { (char*) "America/Santiago" , 0x01BACD }, + { (char*) "America/Santo_Domingo" , 0x01C035 }, + { (char*) "America/Sao_Paulo" , 0x01C17E }, + { (char*) "America/Scoresbysund" , 0x01C578 }, + { (char*) "America/Shiprock" , 0x01C780 }, + { (char*) "America/Sitka" , 0x01CB9E }, + { (char*) "America/St_Barthelemy" , 0x01CF79 }, + { (char*) "America/St_Johns" , 0x01D036 }, + { (char*) "America/St_Kitts" , 0x01D7BA }, + { (char*) "America/St_Lucia" , 0x01D848 }, + { (char*) "America/St_Thomas" , 0x01D8E9 }, + { (char*) "America/St_Vincent" , 0x01D977 }, + { (char*) "America/Swift_Current" , 0x01DA18 }, + { (char*) "America/Tegucigalpa" , 0x01DBA6 }, + { (char*) "America/Thule" , 0x01DC74 }, + { (char*) "America/Thunder_Bay" , 0x01DE55 }, + { (char*) "America/Tijuana" , 0x01E516 }, + { (char*) "America/Toronto" , 0x01E944 }, + { (char*) "America/Tortola" , 0x01F022 }, + { (char*) "America/Vancouver" , 0x01F0B0 }, + { (char*) "America/Virgin" , 0x01F607 }, + { (char*) "America/Whitehorse" , 0x01F6C4 }, + { (char*) "America/Winnipeg" , 0x01FAE7 }, + { (char*) "America/Yakutat" , 0x02001E }, + { (char*) "America/Yellowknife" , 0x0203EC }, + { (char*) "Antarctica/Casey" , 0x0206E8 }, + { (char*) "Antarctica/Davis" , 0x0207EC }, + { (char*) "Antarctica/DumontDUrville" , 0x0208C2 }, + { (char*) "Antarctica/Macquarie" , 0x020976 }, + { (char*) "Antarctica/Mawson" , 0x020D62 }, + { (char*) "Antarctica/McMurdo" , 0x020E0C }, + { (char*) "Antarctica/Palmer" , 0x02113E }, + { (char*) "Antarctica/Rothera" , 0x0214C7 }, + { (char*) "Antarctica/South_Pole" , 0x02155E }, + { (char*) "Antarctica/Syowa" , 0x02197D }, + { (char*) "Antarctica/Troll" , 0x021A13 }, + { (char*) "Antarctica/Vostok" , 0x021AD5 }, + { (char*) "Arctic/Longyearbyen" , 0x021B6C }, + { (char*) "Asia/Aden" , 0x021E39 }, + { (char*) "Asia/Almaty" , 0x021ECA }, + { (char*) "Asia/Amman" , 0x02214E }, + { (char*) "Asia/Anadyr" , 0x0224FA }, + { (char*) "Asia/Aqtau" , 0x022800 }, + { (char*) "Asia/Aqtobe" , 0x022A7F }, + { (char*) "Asia/Ashgabat" , 0x022CFF }, + { (char*) "Asia/Ashkhabad" , 0x022E82 }, + { (char*) "Asia/Atyrau" , 0x023005 }, + { (char*) "Asia/Baghdad" , 0x02328E }, + { (char*) "Asia/Bahrain" , 0x023510 }, + { (char*) "Asia/Baku" , 0x0235C9 }, + { (char*) "Asia/Bangkok" , 0x0238BD }, + { (char*) "Asia/Barnaul" , 0x023961 }, + { (char*) "Asia/Beirut" , 0x023C6C }, + { (char*) "Asia/Bishkek" , 0x023F54 }, + { (char*) "Asia/Brunei" , 0x0241CA }, + { (char*) "Asia/Calcutta" , 0x024270 }, + { (char*) "Asia/Chita" , 0x024358 }, + { (char*) "Asia/Choibalsan" , 0x024666 }, + { (char*) "Asia/Chongqing" , 0x0248EF }, + { (char*) "Asia/Chungking" , 0x024A84 }, + { (char*) "Asia/Colombo" , 0x024C19 }, + { (char*) "Asia/Dacca" , 0x024D1C }, + { (char*) "Asia/Damascus" , 0x024E0F }, + { (char*) "Asia/Dhaka" , 0x0252ED }, + { (char*) "Asia/Dili" , 0x0253E0 }, + { (char*) "Asia/Dubai" , 0x025496 }, + { (char*) "Asia/Dushanbe" , 0x025527 }, + { (char*) "Asia/Famagusta" , 0x0256A1 }, + { (char*) "Asia/Gaza" , 0x025A68 }, + { (char*) "Asia/Harbin" , 0x025F68 }, + { (char*) "Asia/Hebron" , 0x0260FD }, + { (char*) "Asia/Ho_Chi_Minh" , 0x02660E }, + { (char*) "Asia/Hong_Kong" , 0x026706 }, + { (char*) "Asia/Hovd" , 0x026A19 }, + { (char*) "Asia/Irkutsk" , 0x026CA2 }, + { (char*) "Asia/Istanbul" , 0x026FC0 }, + { (char*) "Asia/Jakarta" , 0x02747C }, + { (char*) "Asia/Jayapura" , 0x02758D }, + { (char*) "Asia/Jerusalem" , 0x02767A }, + { (char*) "Asia/Kabul" , 0x027AB8 }, + { (char*) "Asia/Kamchatka" , 0x027B63 }, + { (char*) "Asia/Karachi" , 0x027E58 }, + { (char*) "Asia/Kashgar" , 0x027F6E }, + { (char*) "Asia/Kathmandu" , 0x027FFF }, + { (char*) "Asia/Katmandu" , 0x0280AC }, + { (char*) "Asia/Khandyga" , 0x028159 }, + { (char*) "Asia/Kolkata" , 0x02848A }, + { (char*) "Asia/Krasnoyarsk" , 0x028572 }, + { (char*) "Asia/Kuala_Lumpur" , 0x02887C }, + { (char*) "Asia/Kuching" , 0x02899C }, + { (char*) "Asia/Kuwait" , 0x028AF6 }, + { (char*) "Asia/Macao" , 0x028B87 }, + { (char*) "Asia/Macau" , 0x028EAA }, + { (char*) "Asia/Magadan" , 0x0291CD }, + { (char*) "Asia/Makassar" , 0x0294D8 }, + { (char*) "Asia/Manila" , 0x0295EB }, + { (char*) "Asia/Muscat" , 0x0296E5 }, + { (char*) "Asia/Nicosia" , 0x029776 }, + { (char*) "Asia/Novokuznetsk" , 0x0299EA }, + { (char*) "Asia/Novosibirsk" , 0x029CDD }, + { (char*) "Asia/Omsk" , 0x029FEE }, + { (char*) "Asia/Oral" , 0x02A2EC }, + { (char*) "Asia/Phnom_Penh" , 0x02A578 }, + { (char*) "Asia/Pontianak" , 0x02A64C }, + { (char*) "Asia/Pyongyang" , 0x02A765 }, + { (char*) "Asia/Qatar" , 0x02A828 }, + { (char*) "Asia/Qostanay" , 0x02A8CC }, + { (char*) "Asia/Qyzylorda" , 0x02AB59 }, + { (char*) "Asia/Rangoon" , 0x02ADF2 }, + { (char*) "Asia/Riyadh" , 0x02AEB9 }, + { (char*) "Asia/Saigon" , 0x02AF4A }, + { (char*) "Asia/Sakhalin" , 0x02B042 }, + { (char*) "Asia/Samarkand" , 0x02B359 }, + { (char*) "Asia/Seoul" , 0x02B4E4 }, + { (char*) "Asia/Shanghai" , 0x02B68F }, + { (char*) "Asia/Singapore" , 0x02B830 }, + { (char*) "Asia/Srednekolymsk" , 0x02B93C }, + { (char*) "Asia/Taipei" , 0x02BC50 }, + { (char*) "Asia/Tashkent" , 0x02BE5B }, + { (char*) "Asia/Tbilisi" , 0x02BFE6 }, + { (char*) "Asia/Tehran" , 0x02C267 }, + { (char*) "Asia/Tel_Aviv" , 0x02C59F }, + { (char*) "Asia/Thimbu" , 0x02C9DD }, + { (char*) "Asia/Thimphu" , 0x02CA83 }, + { (char*) "Asia/Tokyo" , 0x02CB29 }, + { (char*) "Asia/Tomsk" , 0x02CC0A }, + { (char*) "Asia/Ujung_Pandang" , 0x02CF15 }, + { (char*) "Asia/Ulaanbaatar" , 0x02CFDF }, + { (char*) "Asia/Ulan_Bator" , 0x02D252 }, + { (char*) "Asia/Urumqi" , 0x02D4B0 }, + { (char*) "Asia/Ust-Nera" , 0x02D54E }, + { (char*) "Asia/Vientiane" , 0x02D871 }, + { (char*) "Asia/Vladivostok" , 0x02D957 }, + { (char*) "Asia/Yakutsk" , 0x02DC5C }, + { (char*) "Asia/Yangon" , 0x02DF60 }, + { (char*) "Asia/Yekaterinburg" , 0x02E027 }, + { (char*) "Asia/Yerevan" , 0x02E339 }, + { (char*) "Atlantic/Azores" , 0x02E609 }, + { (char*) "Atlantic/Bermuda" , 0x02EBC8 }, + { (char*) "Atlantic/Canary" , 0x02EFD4 }, + { (char*) "Atlantic/Cape_Verde" , 0x02F1CC }, + { (char*) "Atlantic/Faeroe" , 0x02F287 }, + { (char*) "Atlantic/Faroe" , 0x02F44C }, + { (char*) "Atlantic/Jan_Mayen" , 0x02F611 }, + { (char*) "Atlantic/Madeira" , 0x02F8DE }, + { (char*) "Atlantic/Reykjavik" , 0x02FEA6 }, + { (char*) "Atlantic/South_Georgia" , 0x0301A3 }, + { (char*) "Atlantic/St_Helena" , 0x030233 }, + { (char*) "Atlantic/Stanley" , 0x0302D4 }, + { (char*) "Australia/ACT" , 0x0305F5 }, + { (char*) "Australia/Adelaide" , 0x030989 }, + { (char*) "Australia/Brisbane" , 0x030D3D }, + { (char*) "Australia/Broken_Hill" , 0x030E81 }, + { (char*) "Australia/Canberra" , 0x031256 }, + { (char*) "Australia/Currie" , 0x0315EA }, + { (char*) "Australia/Darwin" , 0x0319E1 }, + { (char*) "Australia/Eucla" , 0x031AE9 }, + { (char*) "Australia/Hobart" , 0x031C48 }, + { (char*) "Australia/LHI" , 0x032047 }, + { (char*) "Australia/Lindeman" , 0x032307 }, + { (char*) "Australia/Lord_Howe" , 0x032477 }, + { (char*) "Australia/Melbourne" , 0x032747 }, + { (char*) "Australia/North" , 0x032AE3 }, + { (char*) "Australia/NSW" , 0x032BD9 }, + { (char*) "Australia/Perth" , 0x032F6D }, + { (char*) "Australia/Queensland" , 0x0330C9 }, + { (char*) "Australia/South" , 0x0331F6 }, + { (char*) "Australia/Sydney" , 0x03359B }, + { (char*) "Australia/Tasmania" , 0x03394B }, + { (char*) "Australia/Victoria" , 0x033D42 }, + { (char*) "Australia/West" , 0x0340D6 }, + { (char*) "Australia/Yancowinna" , 0x034214 }, + { (char*) "Brazil/Acre" , 0x0345CD }, + { (char*) "Brazil/DeNoronha" , 0x03477B }, + { (char*) "Brazil/East" , 0x03496B }, + { (char*) "Brazil/West" , 0x034D2F }, + { (char*) "Canada/Atlantic" , 0x034ED7 }, + { (char*) "Canada/Central" , 0x03556B }, + { (char*) "Canada/Eastern" , 0x035A85 }, + { (char*) "Canada/Mountain" , 0x036146 }, + { (char*) "Canada/Newfoundland" , 0x03651C }, + { (char*) "Canada/Pacific" , 0x036C7E }, + { (char*) "Canada/Saskatchewan" , 0x0371BC }, + { (char*) "Canada/Yukon" , 0x037446 }, + { (char*) "CET" , 0x037857 }, + { (char*) "Chile/Continental" , 0x037AD0 }, + { (char*) "Chile/EasterIsland" , 0x038026 }, + { (char*) "CST6CDT" , 0x0384C8 }, + { (char*) "Cuba" , 0x03888B }, + { (char*) "EET" , 0x038CF4 }, + { (char*) "Egypt" , 0x038EF1 }, + { (char*) "Eire" , 0x0393F9 }, + { (char*) "EST" , 0x0399DD }, + { (char*) "EST5EDT" , 0x039A58 }, + { (char*) "Etc/GMT" , 0x039E1B }, + { (char*) "Etc/GMT+0" , 0x039E96 }, + { (char*) "Etc/GMT+1" , 0x039F11 }, + { (char*) "Etc/GMT+10" , 0x039F8E }, + { (char*) "Etc/GMT+11" , 0x03A00C }, + { (char*) "Etc/GMT+12" , 0x03A08A }, + { (char*) "Etc/GMT+2" , 0x03A108 }, + { (char*) "Etc/GMT+3" , 0x03A185 }, + { (char*) "Etc/GMT+4" , 0x03A202 }, + { (char*) "Etc/GMT+5" , 0x03A27F }, + { (char*) "Etc/GMT+6" , 0x03A2FC }, + { (char*) "Etc/GMT+7" , 0x03A379 }, + { (char*) "Etc/GMT+8" , 0x03A3F6 }, + { (char*) "Etc/GMT+9" , 0x03A473 }, + { (char*) "Etc/GMT-0" , 0x03A4F0 }, + { (char*) "Etc/GMT-1" , 0x03A56B }, + { (char*) "Etc/GMT-10" , 0x03A5E9 }, + { (char*) "Etc/GMT-11" , 0x03A668 }, + { (char*) "Etc/GMT-12" , 0x03A6E7 }, + { (char*) "Etc/GMT-13" , 0x03A766 }, + { (char*) "Etc/GMT-14" , 0x03A7E5 }, + { (char*) "Etc/GMT-2" , 0x03A864 }, + { (char*) "Etc/GMT-3" , 0x03A8E2 }, + { (char*) "Etc/GMT-4" , 0x03A960 }, + { (char*) "Etc/GMT-5" , 0x03A9DE }, + { (char*) "Etc/GMT-6" , 0x03AA5C }, + { (char*) "Etc/GMT-7" , 0x03AADA }, + { (char*) "Etc/GMT-8" , 0x03AB58 }, + { (char*) "Etc/GMT-9" , 0x03ABD6 }, + { (char*) "Etc/GMT0" , 0x03AC54 }, + { (char*) "Etc/Greenwich" , 0x03ACCF }, + { (char*) "Etc/UCT" , 0x03AD4A }, + { (char*) "Etc/Universal" , 0x03ADC5 }, + { (char*) "Etc/UTC" , 0x03AE40 }, + { (char*) "Etc/Zulu" , 0x03AEBB }, + { (char*) "Europe/Amsterdam" , 0x03AF36 }, + { (char*) "Europe/Andorra" , 0x03B371 }, + { (char*) "Europe/Astrakhan" , 0x03B502 }, + { (char*) "Europe/Athens" , 0x03B7F6 }, + { (char*) "Europe/Belfast" , 0x03BAAC }, + { (char*) "Europe/Belgrade" , 0x03C0F7 }, + { (char*) "Europe/Berlin" , 0x03C2E1 }, + { (char*) "Europe/Bratislava" , 0x03C5C2 }, + { (char*) "Europe/Brussels" , 0x03C8A1 }, + { (char*) "Europe/Bucharest" , 0x03CCFC }, + { (char*) "Europe/Budapest" , 0x03CF9D }, + { (char*) "Europe/Busingen" , 0x03D2A7 }, + { (char*) "Europe/Chisinau" , 0x03D4AC }, + { (char*) "Europe/Copenhagen" , 0x03D7AB }, + { (char*) "Europe/Dublin" , 0x03DA26 }, + { (char*) "Europe/Gibraltar" , 0x03E00A }, + { (char*) "Europe/Guernsey" , 0x03E4DA }, + { (char*) "Europe/Helsinki" , 0x03EB31 }, + { (char*) "Europe/Isle_of_Man" , 0x03ED1E }, + { (char*) "Europe/Istanbul" , 0x03F369 }, + { (char*) "Europe/Jersey" , 0x03F825 }, + { (char*) "Europe/Kaliningrad" , 0x03FE7C }, + { (char*) "Europe/Kiev" , 0x040224 }, + { (char*) "Europe/Kirov" , 0x04045E }, + { (char*) "Europe/Kyiv" , 0x040745 }, + { (char*) "Europe/Lisbon" , 0x040993 }, + { (char*) "Europe/Ljubljana" , 0x040F60 }, + { (char*) "Europe/London" , 0x04114A }, + { (char*) "Europe/Luxembourg" , 0x041795 }, + { (char*) "Europe/Madrid" , 0x041BE0 }, + { (char*) "Europe/Malta" , 0x041F7D }, + { (char*) "Europe/Mariehamn" , 0x042329 }, + { (char*) "Europe/Minsk" , 0x042516 }, + { (char*) "Europe/Monaco" , 0x04284A }, + { (char*) "Europe/Moscow" , 0x042CB0 }, + { (char*) "Europe/Nicosia" , 0x04305C }, + { (char*) "Europe/Oslo" , 0x0432BD }, + { (char*) "Europe/Paris" , 0x04356D }, + { (char*) "Europe/Podgorica" , 0x0439CA }, + { (char*) "Europe/Prague" , 0x043BB4 }, + { (char*) "Europe/Riga" , 0x043E93 }, + { (char*) "Europe/Rome" , 0x044155 }, + { (char*) "Europe/Samara" , 0x044514 }, + { (char*) "Europe/San_Marino" , 0x044815 }, + { (char*) "Europe/Sarajevo" , 0x044BD4 }, + { (char*) "Europe/Saratov" , 0x044DBE }, + { (char*) "Europe/Simferopol" , 0x0450B0 }, + { (char*) "Europe/Skopje" , 0x045423 }, + { (char*) "Europe/Sofia" , 0x04560D }, + { (char*) "Europe/Stockholm" , 0x045869 }, + { (char*) "Europe/Tallinn" , 0x045A66 }, + { (char*) "Europe/Tirane" , 0x045D15 }, + { (char*) "Europe/Tiraspol" , 0x045F7D }, + { (char*) "Europe/Ulyanovsk" , 0x04627C }, + { (char*) "Europe/Uzhgorod" , 0x046592 }, + { (char*) "Europe/Vaduz" , 0x0467CC }, + { (char*) "Europe/Vatican" , 0x0469B6 }, + { (char*) "Europe/Vienna" , 0x046D75 }, + { (char*) "Europe/Vilnius" , 0x047013 }, + { (char*) "Europe/Volgograd" , 0x0472C3 }, + { (char*) "Europe/Warsaw" , 0x0475C0 }, + { (char*) "Europe/Zagreb" , 0x047967 }, + { (char*) "Europe/Zaporozhye" , 0x047B51 }, + { (char*) "Europe/Zurich" , 0x047D8B }, + { (char*) "Factory" , 0x047F88 }, + { (char*) "GB" , 0x048005 }, + { (char*) "GB-Eire" , 0x048650 }, + { (char*) "GMT" , 0x048C9B }, + { (char*) "GMT+0" , 0x048D16 }, + { (char*) "GMT-0" , 0x048D91 }, + { (char*) "GMT0" , 0x048E0C }, + { (char*) "Greenwich" , 0x048E87 }, + { (char*) "Hongkong" , 0x048F02 }, + { (char*) "HST" , 0x049215 }, + { (char*) "Iceland" , 0x049291 }, + { (char*) "Indian/Antananarivo" , 0x04931F }, + { (char*) "Indian/Chagos" , 0x0493CB }, + { (char*) "Indian/Christmas" , 0x04946F }, + { (char*) "Indian/Cocos" , 0x049500 }, + { (char*) "Indian/Comoro" , 0x049598 }, + { (char*) "Indian/Kerguelen" , 0x049627 }, + { (char*) "Indian/Mahe" , 0x0496B8 }, + { (char*) "Indian/Maldives" , 0x049749 }, + { (char*) "Indian/Mauritius" , 0x0497ED }, + { (char*) "Indian/Mayotte" , 0x0498AC }, + { (char*) "Indian/Reunion" , 0x04993B }, + { (char*) "Iran" , 0x0499CC }, + { (char*) "Israel" , 0x049D04 }, + { (char*) "Jamaica" , 0x04A142 }, + { (char*) "Japan" , 0x04A2A1 }, + { (char*) "Kwajalein" , 0x04A382 }, + { (char*) "Libya" , 0x04A469 }, + { (char*) "MET" , 0x04A624 }, + { (char*) "Mexico/BajaNorte" , 0x04A89D }, + { (char*) "Mexico/BajaSur" , 0x04ACAA }, + { (char*) "Mexico/General" , 0x04AF84 }, + { (char*) "MST" , 0x04B295 }, + { (char*) "MST7MDT" , 0x04B310 }, + { (char*) "Navajo" , 0x04B6D3 }, + { (char*) "NZ" , 0x04BAF1 }, + { (char*) "NZ-CHAT" , 0x04BF10 }, + { (char*) "Pacific/Apia" , 0x04C244 }, + { (char*) "Pacific/Auckland" , 0x04C3E7 }, + { (char*) "Pacific/Bougainville" , 0x04C81E }, + { (char*) "Pacific/Chatham" , 0x04C8FF }, + { (char*) "Pacific/Chuuk" , 0x04CC42 }, + { (char*) "Pacific/Easter" , 0x04CD20 }, + { (char*) "Pacific/Efate" , 0x04D1CF }, + { (char*) "Pacific/Enderbury" , 0x04D331 }, + { (char*) "Pacific/Fakaofo" , 0x04D3E9 }, + { (char*) "Pacific/Fiji" , 0x04D48E }, + { (char*) "Pacific/Funafuti" , 0x04D626 }, + { (char*) "Pacific/Galapagos" , 0x04D6B8 }, + { (char*) "Pacific/Gambier" , 0x04D784 }, + { (char*) "Pacific/Guadalcanal" , 0x04D823 }, + { (char*) "Pacific/Guam" , 0x04D8B5 }, + { (char*) "Pacific/Honolulu" , 0x04DA1F }, + { (char*) "Pacific/Johnston" , 0x04DB0E }, + { (char*) "Pacific/Kanton" , 0x04DBF7 }, + { (char*) "Pacific/Kiritimati" , 0x04DCBE }, + { (char*) "Pacific/Kosrae" , 0x04DD84 }, + { (char*) "Pacific/Kwajalein" , 0x04DE88 }, + { (char*) "Pacific/Majuro" , 0x04DF78 }, + { (char*) "Pacific/Marquesas" , 0x04E07B }, + { (char*) "Pacific/Midway" , 0x04E123 }, + { (char*) "Pacific/Nauru" , 0x04E1E6 }, + { (char*) "Pacific/Niue" , 0x04E2A9 }, + { (char*) "Pacific/Norfolk" , 0x04E34F }, + { (char*) "Pacific/Noumea" , 0x04E452 }, + { (char*) "Pacific/Pago_Pago" , 0x04E524 }, + { (char*) "Pacific/Palau" , 0x04E5C2 }, + { (char*) "Pacific/Pitcairn" , 0x04E662 }, + { (char*) "Pacific/Pohnpei" , 0x04E707 }, + { (char*) "Pacific/Ponape" , 0x04E7F7 }, + { (char*) "Pacific/Port_Moresby" , 0x04E889 }, + { (char*) "Pacific/Rarotonga" , 0x04E94C }, + { (char*) "Pacific/Saipan" , 0x04EAEE }, + { (char*) "Pacific/Samoa" , 0x04EC4F }, + { (char*) "Pacific/Tahiti" , 0x04ECED }, + { (char*) "Pacific/Tarawa" , 0x04ED8D }, + { (char*) "Pacific/Tongatapu" , 0x04EE2E }, + { (char*) "Pacific/Truk" , 0x04EF27 }, + { (char*) "Pacific/Wake" , 0x04EFCD }, + { (char*) "Pacific/Wallis" , 0x04F06A }, + { (char*) "Pacific/Yap" , 0x04F0FC }, + { (char*) "Poland" , 0x04F1A2 }, + { (char*) "Portugal" , 0x04F549 }, + { (char*) "PRC" , 0x04FB03 }, + { (char*) "PST8PDT" , 0x04FC98 }, + { (char*) "ROC" , 0x05005B }, + { (char*) "ROK" , 0x050266 }, + { (char*) "Singapore" , 0x050411 }, + { (char*) "Turkey" , 0x05051D }, + { (char*) "UCT" , 0x0509D9 }, + { (char*) "Universal" , 0x050A54 }, + { (char*) "US/Alaska" , 0x050ACF }, + { (char*) "US/Aleutian" , 0x050EAC }, + { (char*) "US/Arizona" , 0x051281 }, + { (char*) "US/Central" , 0x05137D }, + { (char*) "US/East-Indiana" , 0x051A63 }, + { (char*) "US/Eastern" , 0x051C82 }, + { (char*) "US/Hawaii" , 0x05235E }, + { (char*) "US/Indiana-Starke" , 0x052447 }, + { (char*) "US/Michigan" , 0x05284B }, + { (char*) "US/Mountain" , 0x052BDA }, + { (char*) "US/Pacific" , 0x052FF8 }, + { (char*) "US/Samoa" , 0x053512 }, + { (char*) "UTC" , 0x0535B0 }, + { (char*) "W-SU" , 0x05362B }, + { (char*) "WET" , 0x0539C3 }, + { (char*) "Zulu" , 0x053BBD }, }; -const unsigned char timelib_timezone_db_data_builtin[338523] = { +const unsigned char timelib_timezone_db_data_builtin[343096] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -730,13 +730,14 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xFF, -0xFF, 0xFF, 0xFF, 0x43, 0xE8, 0x19, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0xB7, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0xC0, 0xAF, 0xF2, 0x98, 0x01, 0x02, 0x03, 0x00, 0x00, 0x24, 0x74, 0x00, 0x00, -0x00, 0x00, 0x24, 0x74, 0x00, 0x04, 0x00, 0x00, 0x24, 0x68, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x4D, 0x54, 0x00, 0x45, -0x41, 0x54, 0x00, 0x0A, 0x45, 0x41, 0x54, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x8B, 0xFF, 0xD1, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0xEE, 0xDA, 0x58, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0xC7, 0xE0, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0xAD, 0x58, 0xFF, +0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0x7A, 0xD4, 0x01, 0x02, 0x01, 0x03, 0x02, 0x00, 0x00, 0x22, 0x84, +0x00, 0x00, 0x00, 0x00, 0x23, 0x28, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0A, 0x00, 0x00, +0x26, 0xAC, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x33, 0x30, 0x00, 0x45, 0x41, +0x54, 0x00, 0x2B, 0x30, 0x32, 0x34, 0x35, 0x00, 0x0A, 0x45, 0x41, 0x54, 0x2D, 0x33, 0x0A, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Africa/Bamako */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1666,12 +1667,10 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x92, 0xB8, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x11, 0x87, 0x10, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x47, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x0A, 0x47, 0x4D, 0x54, 0x30, 0x0A, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, +0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x92, 0x48, 0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, 0x4D, 0x54, +0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Africa/Tripoli */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -2813,7 +2812,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, @@ -2833,17 +2832,30 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x04, 0x01, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x04, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x05, 0x02, 0xFF, 0xFF, -0x9D, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, -0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, -0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, -0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, -0x30, 0x0A, 0x00, 0xA9, 0x11, 0x40, 0x00, 0x72, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, -0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x68, -0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6E, 0x64, 0x65, 0x72, 0x61, 0x73, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x05, 0x02, 0x05, 0x02, +0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, +0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0x9D, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, +0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x43, 0x44, +0x54, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xA9, 0x11, 0x40, 0x00, 0x72, 0x0F, 0x38, +0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, +0x20, 0x2D, 0x20, 0x42, 0x61, 0x68, 0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6E, 0x64, +0x65, 0x72, 0x61, 0x73, /* America/Barbados */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3508,7 +3520,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0x00, @@ -3518,16 +3530,38 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, -0x02, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0xFF, 0xFF, 0x9C, 0x8C, 0x00, 0x00, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, -0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, -0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, -0x37, 0x4D, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, -0x35, 0x2E, 0x30, 0x0A, 0x00, 0xB5, 0x05, 0x25, 0x00, 0x70, 0xC9, 0xB2, 0x00, 0x00, 0x00, 0x26, -0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, -0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, -0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, +0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, +0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, +0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, +0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, +0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, +0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, +0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, +0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, +0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, +0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, +0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, +0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, +0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, +0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, +0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x02, 0xFF, 0xFF, 0x9C, 0x8C, 0x00, +0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, +0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, +0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, 0x53, +0x54, 0x36, 0x0A, 0x00, 0xB5, 0x05, 0x25, 0x00, 0x70, 0xC9, 0xB2, 0x00, 0x00, 0x00, 0x26, 0x4D, +0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, +0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, +0x72, 0x65, 0x61, 0x73, 0x29, /* America/Coral_Harbour */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -3535,16 +3569,12 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x84, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x57, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0xFF, 0xFF, -0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, -0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x57, -0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xF4, 0x61, 0xE8, 0x01, +0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, 0x00, 0x04, 0xFF, 0xFF, 0xB9, +0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x0A, +0x45, 0x53, 0x54, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, /* America/Cordoba */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5699,12 +5729,13 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x01, -0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, 0x79, 0xED, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, 0x79, 0xED, 0x00, 0x00, 0x00, 0x00, /* America/La_Paz */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -5913,12 +5944,13 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x01, -0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x41, 0x53, 0x54, -0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, 0x74, 0xAD, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, 0x74, 0xAD, 0x00, 0x00, 0x00, 0x00, /* America/Maceio */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6014,10 +6046,13 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, /* America/Martinique */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6073,7 +6108,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, @@ -6084,18 +6119,39 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x01, -0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x04, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, -0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x8F, -0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, -0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x4D, 0x44, 0x54, 0x2C, -0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, -0xAC, 0xC1, 0x42, 0x00, 0x70, 0x47, 0x7D, 0x00, 0x00, 0x00, 0x35, 0x4D, 0x6F, 0x75, 0x6E, 0x74, -0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, -0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, 0x20, 0x53, 0x75, 0x72, 0x2C, 0x20, -0x4E, 0x61, 0x79, 0x61, 0x72, 0x69, 0x74, 0x2C, 0x20, 0x53, 0x69, 0x6E, 0x61, 0x6C, 0x6F, 0x61, - +0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x04, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0x8F, 0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, +0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, 0x00, 0xAC, +0xC1, 0x42, 0x00, 0x70, 0x47, 0x7D, 0x00, 0x00, 0x00, 0x35, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, +0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, 0x43, +0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, 0x20, 0x53, 0x75, 0x72, 0x2C, 0x20, 0x4E, +0x61, 0x79, 0x61, 0x72, 0x69, 0x74, 0x2C, 0x20, 0x53, 0x69, 0x6E, 0x61, 0x6C, 0x6F, 0x61, /* America/Mendoza */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6214,7 +6270,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xDA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16, 0x86, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0x4C, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, @@ -6222,15 +6278,37 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x01, -0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0xFF, -0xFF, 0xAB, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, -0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x45, -0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, -0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, -0xA9, 0x52, 0x5A, 0x00, 0x89, 0xE9, 0xFD, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, -0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x61, 0x6D, 0x70, 0x65, 0x63, -0x68, 0x65, 0x2C, 0x20, 0x59, 0x75, 0x63, 0x61, 0x74, 0x61, 0x6E, +0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0xFF, 0xFF, 0xAB, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, +0x45, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xA9, +0x52, 0x5A, 0x00, 0x89, 0xE9, 0xFD, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, +0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x61, 0x6D, 0x70, 0x65, 0x63, 0x68, +0x65, 0x2C, 0x20, 0x59, 0x75, 0x63, 0x61, 0x74, 0x61, 0x6E, /* America/Metlakatla */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6280,7 +6358,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, @@ -6294,15 +6372,37 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, -0x02, 0x05, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, -0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x0A, 0x43, -0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, -0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xA6, 0xEE, 0x60, 0x00, 0x7B, 0x5E, 0x07, 0x00, 0x00, -0x00, 0x0C, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, +0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, +0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, +0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, +0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, +0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, +0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, +0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, +0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, +0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, +0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, 0x02, 0x05, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, +0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, +0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, +0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x0A, +0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xA6, 0xEE, 0x60, 0x00, 0x7B, 0x5E, 0x07, 0x00, 0x00, 0x00, +0x0C, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, /* America/Miquelon */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6446,7 +6546,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xDA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, @@ -6454,17 +6554,39 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, -0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, -0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, 0x53, -0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, -0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xB0, 0x7E, 0x4A, 0x00, 0x79, 0x96, 0x4D, 0x00, 0x00, 0x00, -0x45, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, -0x44, 0x75, 0x72, 0x61, 0x6E, 0x67, 0x6F, 0x3B, 0x20, 0x43, 0x6F, 0x61, 0x68, 0x75, 0x69, 0x6C, -0x61, 0x2C, 0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, 0x65, 0x6F, 0x6E, 0x2C, 0x20, 0x54, -0x61, 0x6D, 0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, -0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0xFF, 0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, +0x53, 0x54, 0x36, 0x0A, 0x00, 0xB0, 0x7E, 0x4A, 0x00, 0x79, 0x96, 0x4D, 0x00, 0x00, 0x00, 0x45, +0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x44, +0x75, 0x72, 0x61, 0x6E, 0x67, 0x6F, 0x3B, 0x20, 0x43, 0x6F, 0x61, 0x68, 0x75, 0x69, 0x6C, 0x61, +0x2C, 0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, 0x65, 0x6F, 0x6E, 0x2C, 0x20, 0x54, 0x61, +0x6D, 0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, +0x72, 0x65, 0x61, 0x73, 0x29, /* America/Montevideo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -6833,16 +6955,65 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { /* America/Nipigon */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x81, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x49, 0x50, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, 0xC8, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, +0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, +0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, @@ -6876,19 +7047,23 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x02, -0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xAD, 0x40, 0x00, 0x00, 0xFF, -0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, -0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, -0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, -0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, -0x2E, 0x30, 0x0A, 0x00, 0xD4, 0x1F, 0x62, 0x00, 0x8B, 0xF9, 0x55, 0x00, 0x00, 0x00, 0x21, 0x45, -0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x2D, 0x20, 0x4F, 0x4E, 0x2C, 0x20, 0x51, 0x43, 0x20, -0x28, 0x6E, 0x6F, 0x20, 0x44, 0x53, 0x54, 0x20, 0x31, 0x39, 0x36, 0x37, 0x2D, 0x37, 0x33, 0x29, - +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB5, 0x94, 0x00, +0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, +0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x0A, 0x45, 0x53, +0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, +0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, /* America/Nome */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7233,7 +7408,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0x00, @@ -7251,17 +7426,30 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, -0x00, 0x00, 0x00, 0x4B, 0x9C, 0xA5, 0x90, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, -0x02, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, -0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0xFF, 0xFF, 0x9E, 0x1C, 0x00, 0x00, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, -0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, -0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, -0x37, 0x4D, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, -0x31, 0x2E, 0x30, 0x0A, 0x00, 0xB6, 0x71, 0xBA, 0x00, 0x73, 0x54, 0xBD, 0x00, 0x00, 0x00, 0x28, -0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, 0x53, -0x20, 0x2D, 0x20, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x55, 0x53, -0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x29, +0x00, 0x00, 0x00, 0x4B, 0x9C, 0xA5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x5C, 0x80, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x7C, 0x87, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x3E, 0x80, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x5C, 0x69, 0x90, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x20, 0x80, 0x00, +0x00, 0x00, 0x00, 0x51, 0x3C, 0x4B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x76, 0x02, 0x80, 0x00, +0x00, 0x00, 0x00, 0x53, 0x1C, 0x2D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xE4, 0x80, 0x00, +0x00, 0x00, 0x00, 0x54, 0xFC, 0x0F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xC6, 0x80, 0x00, +0x00, 0x00, 0x00, 0x56, 0xE5, 0x2C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xE3, 0x00, 0x00, +0x00, 0x00, 0x00, 0x58, 0xC5, 0x0E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xC5, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xA4, 0xF0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0xA7, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5C, 0x84, 0xD2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x89, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x64, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x6B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x60, 0x4D, 0xD0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x87, 0x80, 0x00, +0x00, 0x00, 0x00, 0x62, 0x2D, 0xB2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, +0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, +0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, +0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, +0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x02, 0xFF, 0xFF, 0x9E, 0x1C, 0x00, +0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, +0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, +0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x0A, 0x43, 0x53, +0x54, 0x36, 0x0A, 0x00, 0xB6, 0x71, 0xBA, 0x00, 0x73, 0x54, 0xBD, 0x00, 0x00, 0x00, 0x28, 0x4D, +0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, 0x53, 0x20, +0x2D, 0x20, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x55, 0x53, 0x20, +0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x29, /* America/Panama */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -7567,72 +7755,98 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x65, 0x73, /* America/Rainy_River */ +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x64, 0xE4, 0xB0, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x01, 0xFB, 0xE0, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0xC3, 0xBA, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0xA0, 0x3B, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x84, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD3, 0x88, 0x68, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x53, 0x60, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xD5, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xCD, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0xB7, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0xAF, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x99, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE0, 0x91, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC8, 0x5C, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x97, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x90, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x79, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x72, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x5B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x54, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x3D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x36, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x18, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x34, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x16, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD1, 0xF8, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xE2, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xC4, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xC4, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xBC, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xA4, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x31, 0x62, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x4A, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x76, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x67, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x58, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x49, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x3A, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x2B, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x1C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x98, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xFE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x77, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0x1A, 0x80, 0x00, +0x00, 0x00, 0x00, 0x04, 0x61, 0x0B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0xFC, 0x80, 0x00, +0x00, 0x00, 0x00, 0x06, 0x40, 0xED, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xDE, 0x80, 0x00, +0x00, 0x00, 0x00, 0x08, 0x20, 0xCF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xC0, 0x80, 0x00, +0x00, 0x00, 0x00, 0x0A, 0x00, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0xA2, 0x80, 0x00, +0x00, 0x00, 0x00, 0x0B, 0xE0, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xBF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0xC0, 0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xA1, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xA9, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x83, 0x00, 0x00, +0x00, 0x00, 0x00, 0x11, 0x89, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x65, 0x00, 0x00, +0x00, 0x00, 0x00, 0x13, 0x69, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x47, 0x00, 0x00, +0x00, 0x00, 0x00, 0x15, 0x49, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x29, 0x00, 0x00, +0x00, 0x00, 0x00, 0x17, 0x29, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x45, 0x80, 0x00, +0x00, 0x00, 0x00, 0x19, 0x08, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x27, 0x80, 0x00, +0x00, 0x00, 0x00, 0x1A, 0xF2, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x09, 0x80, 0x00, +0x00, 0x00, 0x00, 0x1C, 0xD1, 0xFA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xEB, 0x80, 0x00, +0x00, 0x00, 0x00, 0x1E, 0xB1, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xCD, 0x80, 0x00, +0x00, 0x00, 0x00, 0x20, 0x76, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xAF, 0x80, 0x00, +0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xCC, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x35, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xAE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x26, 0x15, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x90, 0x00, 0x00, +0x00, 0x00, 0x00, 0x27, 0xFE, 0xD1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x72, 0x00, 0x00, +0x00, 0x00, 0x00, 0x29, 0xDE, 0xB3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x54, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xBE, 0x95, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x70, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x9E, 0x77, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x52, 0x80, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x7E, 0x59, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x34, 0x80, 0x00, +0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, +0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, +0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, +0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, +0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xC6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0xBB, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, +0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, +0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, +0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, +0x00, 0x00, 0x00, 0x45, 0xF3, 0xB7, 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x04, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xA4, 0xEC, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, +0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, +0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x57, +0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, +0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + +/* America/Rankin_Inlet */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x87, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x57, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xCF, 0x80, 0x00, -0x00, 0x00, 0x00, 0x09, 0x10, 0xB2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xB1, 0x80, 0x00, -0x00, 0x00, 0x00, 0x0A, 0xF0, 0x94, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x93, 0x80, 0x00, -0x00, 0x00, 0x00, 0x0C, 0xD9, 0xB0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x75, 0x80, 0x00, -0x00, 0x00, 0x00, 0x0E, 0xB9, 0x92, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x92, 0x00, 0x00, -0x00, 0x00, 0x00, 0x10, 0x99, 0x74, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x74, 0x00, 0x00, -0x00, 0x00, 0x00, 0x12, 0x79, 0x56, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x56, 0x00, 0x00, -0x00, 0x00, 0x00, 0x14, 0x59, 0x38, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x38, 0x00, 0x00, -0x00, 0x00, 0x00, 0x16, 0x39, 0x1A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x1A, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x22, 0x37, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xFC, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1A, 0x02, 0x19, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x18, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xE1, 0xFB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xFA, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1D, 0xC1, 0xDD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xDC, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1F, 0xA1, 0xBF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x21, 0x81, 0xA1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, 0x00, 0x00, -0x00, 0x00, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xD3, 0x00, 0x00, -0x00, 0x00, 0x00, 0x25, 0x4A, 0x9F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xB5, 0x00, 0x00, -0x00, 0x00, 0x00, 0x27, 0x2A, 0x81, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xD1, 0x80, 0x00, -0x00, 0x00, 0x00, 0x29, 0x0A, 0x63, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xB3, 0x80, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xEA, 0x45, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x95, 0x80, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xD3, 0x62, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x77, 0x80, 0x00, -0x00, 0x00, 0x00, 0x2E, 0xB3, 0x44, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x59, 0x80, 0x00, -0x00, 0x00, 0x00, 0x30, 0x93, 0x26, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, -0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDB, 0xAC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, -0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, -0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xB7, 0x00, 0x02, -0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xA7, 0x58, 0x00, 0x00, 0xFF, -0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, -0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, -0x53, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, -0x43, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, -0x2E, 0x30, 0x0A, 0x00, 0xD3, 0xAA, 0x32, 0x00, 0x82, 0x5C, 0x65, 0x00, 0x00, 0x00, 0x22, 0x43, -0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x2D, 0x20, 0x4F, 0x4E, 0x20, 0x28, 0x52, 0x61, 0x69, -0x6E, 0x79, 0x20, 0x52, 0x2C, 0x20, 0x46, 0x74, 0x20, 0x46, 0x72, 0x61, 0x6E, 0x63, 0x65, 0x73, -0x29, - -/* America/Rankin_Inlet */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0x8C, 0x6E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x4C, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x56, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, +0xFF, 0xFF, 0xFF, 0xE7, 0x8C, 0x6E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x4C, 0x60, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x38, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x1A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x37, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xFC, 0x00, 0x00, @@ -8324,10 +8538,13 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, /* America/St_Johns */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -8576,194 +8793,245 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x6B, /* America/Thunder_Bay */ +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, 0xC8, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, +0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, +0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, +0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, +0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, +0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, +0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, +0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xB5, 0x94, 0x00, +0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, +0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x0A, 0x45, 0x53, +0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, +0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, + +/* America/Tijuana */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x7C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x8D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x99, 0xBA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x1B, 0x59, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, +0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, +0x00, 0x00, 0x00, 0x12, 0x79, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x72, 0x20, 0x00, +0x00, 0x00, 0x00, 0x14, 0x59, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x54, 0x20, 0x00, +0x00, 0x00, 0x00, 0x16, 0x39, 0x37, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x36, 0x20, 0x00, +0x00, 0x00, 0x00, 0x18, 0x22, 0x53, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x18, 0x20, 0x00, +0x00, 0x00, 0x00, 0x1A, 0x02, 0x35, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x34, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xE2, 0x17, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD2, 0x16, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC1, 0xF9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xF8, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA1, 0xDB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x2B, 0x20, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0xBD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x56, 0x0D, 0x20, 0x00, +0x00, 0x00, 0x00, 0x23, 0x6A, 0xDA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xEF, 0x20, 0x00, +0x00, 0x00, 0x00, 0x25, 0x4A, 0xBC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xD1, 0x20, 0x00, +0x00, 0x00, 0x00, 0x27, 0x2A, 0x9E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xED, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x29, 0x0A, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xCF, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xEA, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0xB1, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xD3, 0x7E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x93, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2E, 0xB3, 0x60, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x75, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x30, 0x93, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x92, 0x20, 0x00, +0x00, 0x00, 0x00, 0x32, 0x73, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x74, 0x20, 0x00, +0x00, 0x00, 0x00, 0x34, 0x53, 0x06, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x56, 0x20, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0xE8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x38, 0x20, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1C, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x1A, 0x20, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xFC, 0x20, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDB, 0xC9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x18, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0xAB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xFA, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x8D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xDC, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0xA9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xBE, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x8B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0xA0, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x6D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x82, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x4F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x9F, 0x20, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x31, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x81, 0x20, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE4, 0x13, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0xB3, 0xA0, 0x01, +0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0x92, +0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, +0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, +0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x50, 0x44, 0x54, +0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x0A, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, +0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, +0x0A, 0x00, 0xBA, 0xF8, 0x95, 0x00, 0x60, 0x1A, 0xDD, 0x00, 0x00, 0x00, 0x21, 0x50, 0x61, 0x63, +0x69, 0x66, 0x69, 0x63, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, 0x53, 0x20, 0x2D, 0x20, 0x42, +0x61, 0x6A, 0x61, 0x20, 0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, + +/* America/Toronto */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x82, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x24, 0x7B, 0xE0, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, 0xC8, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, +0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, 0xD0, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, -0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, -0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, -0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, -0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, -0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, -0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, -0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, -0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, -0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, -0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, -0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x01, -0x02, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0xFF, 0xFF, 0xAC, -0x54, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, -0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, -0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, -0x00, 0x45, 0x50, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, -0x0A, 0x00, 0xD3, 0x27, 0xFD, 0x00, 0x8A, 0x79, 0x38, 0x00, 0x00, 0x00, 0x1A, 0x45, 0x61, 0x73, -0x74, 0x65, 0x72, 0x6E, 0x20, 0x2D, 0x20, 0x4F, 0x4E, 0x20, 0x28, 0x54, 0x68, 0x75, 0x6E, 0x64, -0x65, 0x72, 0x20, 0x42, 0x61, 0x79, 0x29, - -/* America/Tijuana */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, -0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x7C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x8D, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x99, 0xBA, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x1B, 0x59, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, -0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, -0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, -0x00, 0x00, 0x00, 0x10, 0x99, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, -0x00, 0x00, 0x00, 0x12, 0x79, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x72, 0x20, 0x00, -0x00, 0x00, 0x00, 0x14, 0x59, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x54, 0x20, 0x00, -0x00, 0x00, 0x00, 0x16, 0x39, 0x37, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x36, 0x20, 0x00, -0x00, 0x00, 0x00, 0x18, 0x22, 0x53, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x18, 0x20, 0x00, -0x00, 0x00, 0x00, 0x1A, 0x02, 0x35, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x34, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xE2, 0x17, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD2, 0x16, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1D, 0xC1, 0xF9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xF8, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1F, 0xA1, 0xDB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x2B, 0x20, 0x00, -0x00, 0x00, 0x00, 0x21, 0x81, 0xBD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x56, 0x0D, 0x20, 0x00, -0x00, 0x00, 0x00, 0x23, 0x6A, 0xDA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xEF, 0x20, 0x00, -0x00, 0x00, 0x00, 0x25, 0x4A, 0xBC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xD1, 0x20, 0x00, -0x00, 0x00, 0x00, 0x27, 0x2A, 0x9E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xED, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x29, 0x0A, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xCF, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xEA, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0xB1, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xD3, 0x7E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x93, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x2E, 0xB3, 0x60, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x75, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x30, 0x93, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x92, 0x20, 0x00, -0x00, 0x00, 0x00, 0x32, 0x73, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x74, 0x20, 0x00, -0x00, 0x00, 0x00, 0x34, 0x53, 0x06, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x56, 0x20, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0xE8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x38, 0x20, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1C, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x1A, 0x20, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xFC, 0x20, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDB, 0xC9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x18, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBB, 0xAB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xFA, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9B, 0x8D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xDC, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x41, 0x84, 0xA9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xBE, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x43, 0x64, 0x8B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0xA0, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x45, 0x44, 0x6D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x82, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x47, 0x24, 0x4F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x9F, 0x20, 0x00, -0x00, 0x00, 0x00, 0x49, 0x04, 0x31, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x81, 0x20, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE4, 0x13, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0xB3, 0xA0, 0x01, -0x02, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0x92, -0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, -0xFF, 0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, -0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x50, 0x44, 0x54, -0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x0A, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, -0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, -0x0A, 0x00, 0xBA, 0xF8, 0x95, 0x00, 0x60, 0x1A, 0xDD, 0x00, 0x00, 0x00, 0x21, 0x50, 0x61, 0x63, -0x69, 0x66, 0x69, 0x63, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, 0x53, 0x20, 0x2D, 0x20, 0x42, -0x61, 0x6A, 0x61, 0x20, 0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, - -/* America/Toronto */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, 0xC8, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, 0xD0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, 0xD0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, 0xD0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, -0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, -0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, +0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, 0x70, 0x00, +0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, @@ -8921,10 +9189,13 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, -0xFF, 0xFF, 0xFF, 0x91, 0xF4, 0x37, 0x60, 0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, -0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, +0x03, 0x02, 0x01, 0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, +0x53, 0x54, 0x00, 0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* America/Whitehorse */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9452,8 +9723,22 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, -0xFF, 0xFF, 0xFF, 0xE5, 0xA9, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x18, 0xFD, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0xFF, +0xFF, 0xFF, 0xFF, 0x41, 0xB7, 0x4C, 0xA8, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xB4, 0xB2, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xB1, 0x51, 0x87, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x78, 0xE5, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xB3, 0x43, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x58, 0xC7, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xB5, 0x23, 0xC7, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x38, 0xA9, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0x03, 0xA9, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x18, 0x8B, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0xEC, 0xC5, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF8, 0x6D, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xBA, 0xCC, 0xA7, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xD8, 0x4F, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xBC, 0xE3, 0xE8, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xAE, 0xF6, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xBE, 0xC3, 0xCA, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x8E, 0xD8, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0xA3, 0xAC, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x6E, 0xBA, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xC2, 0x83, 0x8E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4E, 0x9C, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xC4, 0x63, 0x70, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2E, 0x7E, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xC6, 0x4C, 0x8D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x0E, 0x60, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xC8, 0x2C, 0x6F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF7, 0x7D, 0x68, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0xDA, 0x9A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0x18, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xEF, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB8, 0xA3, 0xE0, 0x00, @@ -9487,15 +9772,18 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3E, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1E, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFE, 0x5A, 0x60, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, -0x00, 0xA8, 0xC0, 0x00, 0x09, 0x2D, 0x30, 0x30, 0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x4E, 0x5A, -0x53, 0x54, 0x00, 0x0A, 0x4E, 0x5A, 0x53, 0x54, 0x2D, 0x31, 0x32, 0x4E, 0x5A, 0x44, 0x54, 0x2C, -0x4D, 0x39, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x33, 0x0A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, +0x00, 0xA3, 0xD8, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x00, +0x09, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0E, 0x00, 0x00, 0xA8, +0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, +0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x0A, 0x4E, 0x5A, 0x53, 0x54, 0x2D, 0x31, 0x32, 0x4E, 0x5A, +0x44, 0x54, 0x2C, 0x4D, 0x39, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, +0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Antarctica/Syowa */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -9542,20 +9830,21 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x24, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x27, 0xE3, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0xD4, 0x7B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xB7, 0x4D, 0x60, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, +0xFF, 0xFF, 0xFF, 0x6F, 0xA2, 0x61, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xDA, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xD9, 0xAE, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0x9D, 0xA4, 0xB5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB9, 0x90, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0x84, 0x97, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x82, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x72, 0x16, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x62, 0x07, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xAF, 0x20, 0x90, 0xFF, -0xFF, 0xFF, 0xFF, 0xEC, 0xA8, 0x4C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x98, 0x3D, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x88, 0x2E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x78, 0x1F, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF0, 0x68, 0x10, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x58, 0x01, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF2, 0x47, 0xF2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x37, 0xE3, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF4, 0x27, 0xD4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x17, 0xC5, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF6, 0x10, 0xF0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x06, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF7, 0xF0, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xD1, 0xB6, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x58, 0xBE, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0xA1, 0x4F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x63, 0x1B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x4B, 0x23, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0xE7, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xA8, 0x73, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xB4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2C, 0x1A, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x96, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0xC1, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, @@ -9572,15 +9861,15 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, +0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x0A, 0x14, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x43, -0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x0A, 0x43, 0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, -0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, -0x30, 0x2F, 0x33, 0x0A, 0x01, 0x00, 0x59, 0x00, 0x01, 0x2B, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, - +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x0C, 0x88, 0x00, +0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, +0x43, 0x45, 0x4D, 0x54, 0x00, 0x0A, 0x43, 0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, 0x53, 0x54, 0x2C, +0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, +0x0A, 0x01, 0x00, 0x59, 0x00, 0x01, 0x2B, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, /* Asia/Aden */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x59, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -13312,20 +13601,21 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, -0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x24, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x27, 0xE3, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0xD4, 0x7B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xB7, 0x4D, 0x60, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, +0xFF, 0xFF, 0xFF, 0x6F, 0xA2, 0x61, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, +0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xDA, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xD9, 0xAE, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0x9D, 0xA4, 0xB5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB9, 0x90, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0x84, 0x97, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x82, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x72, 0x16, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x62, 0x07, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xAF, 0x20, 0x90, 0xFF, -0xFF, 0xFF, 0xFF, 0xEC, 0xA8, 0x4C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x98, 0x3D, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0x88, 0x2E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x78, 0x1F, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF0, 0x68, 0x10, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x58, 0x01, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF2, 0x47, 0xF2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x37, 0xE3, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF4, 0x27, 0xD4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x17, 0xC5, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF6, 0x10, 0xF0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x06, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xF7, 0xF0, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xD1, 0xB6, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x58, 0xBE, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xD2, 0xA1, 0x4F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x63, 0x1B, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x4B, 0x23, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xD5, 0x67, 0xE7, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xA8, 0x73, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xB4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2C, 0x1A, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x96, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0xC1, 0x90, 0xFF, +0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, @@ -13342,15 +13632,15 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, +0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x0A, 0x14, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x43, -0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x0A, 0x43, 0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, -0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, -0x30, 0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x0C, 0x88, 0x00, +0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, +0x43, 0x45, 0x4D, 0x54, 0x00, 0x0A, 0x43, 0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, 0x53, 0x54, 0x2C, +0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Atlantic/Madeira */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -20299,49 +20589,10 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0x8B, 0x60, 0x83, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x91, 0x1E, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0x9D, 0xD1, 0x88, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x72, 0x51, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0x9F, 0xD5, 0x03, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x53, 0x85, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0xB6, 0x36, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x3C, 0x27, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0xA4, 0xB9, 0x74, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x1A, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0xC7, 0x3D, 0x27, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xDA, 0x17, 0xB0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC9, 0x26, 0x43, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xC3, 0x26, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xCB, 0x06, 0x25, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xAC, 0x42, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xCD, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x8C, 0x24, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xCE, 0xBC, 0xAF, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x6C, 0x06, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD0, 0x9C, 0x91, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x4B, 0xE8, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0xAD, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x2B, 0xCA, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD4, 0x65, 0x8F, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xD6, 0x45, 0x71, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xB3, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xD8, 0x25, 0x53, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0x95, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xDA, 0x0E, 0x70, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x77, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xDB, 0xE5, 0x17, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xDD, 0xCE, 0x34, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x75, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0xAE, 0x16, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x57, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE1, 0x8D, 0xF8, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x39, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE3, 0x6D, 0xDA, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x1B, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE5, 0x4D, 0xBC, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x21, 0xFD, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0x36, 0xD8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x1A, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xBA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEA, 0xFC, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0x9C, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xDE, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0x7E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xC0, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xEE, 0xB6, 0x60, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xA2, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xF0, 0x96, 0x42, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0x84, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x5F, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xA0, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x41, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x82, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x23, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x64, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x05, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x46, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0xE7, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x28, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x03, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x45, 0x20, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x03, 0xFF, 0xFF, 0xEB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xFF, -0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x30, 0x30, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, 0x4D, 0x54, 0x30, -0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, +0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x92, 0x48, 0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, 0x4D, 0x54, +0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Indian/Antananarivo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -20805,7 +21056,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, @@ -20816,14 +21067,36 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x01, -0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x04, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, -0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x8F, -0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, -0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x4D, 0x44, 0x54, 0x2C, -0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x01, 0x04, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0x8F, 0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, +0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Mexico/General */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -20831,7 +21104,7 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, @@ -20845,15 +21118,37 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x01, 0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, -0x02, 0x05, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, -0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x0A, 0x43, -0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, -0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, +0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, +0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, +0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, +0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, +0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, +0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, +0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, +0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, +0x02, 0x01, 0x03, 0x01, 0x02, 0x04, 0x02, 0x04, 0x02, 0x05, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, +0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, +0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, +0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x0A, +0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, /* MST */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21438,9 +21733,9 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x13, 0xB1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x3B, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xD7, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x24, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB7, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x11, 0x2C, 0xE0, 0x00, @@ -21455,13 +21750,11 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x5A, 0x5A, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDD, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x39, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xC6, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x19, 0xD4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xDE, 0x07, 0x60, 0x00, -0x00, 0x00, 0x00, 0x60, 0x02, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6F, 0xA6, 0xE0, 0x02, +0x00, 0x00, 0x00, 0x60, 0x02, 0xF1, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0xA7, -0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, -0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, -0x3E, 0x2D, 0x31, 0x32, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x32, 0x2E, -0x30, 0x2C, 0x4D, 0x31, 0x2E, 0x32, 0x2E, 0x33, 0x2F, 0x39, 0x39, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, +0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, +0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, +0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82, 0x00, 0x00, 0x00, 0x00, /* Pacific/Funafuti */ @@ -21813,14 +22106,9 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xB9, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x20, 0xAC, 0xFF, -0xFF, 0xFF, 0xFF, 0x98, 0x11, 0x95, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x01, 0x02, 0x03, 0x02, 0x04, 0x03, 0x02, 0xFF, 0xFF, -0x42, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x94, 0x54, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, +0xFF, 0xFF, 0xFF, 0x94, 0x4F, 0x33, 0x8C, 0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, 0x00, 0x00, +0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21955,14 +22243,12 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xBF, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x26, 0xB4, 0xFF, -0xFF, 0xFF, 0xFF, 0x98, 0x11, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x01, -0x02, 0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x4C, 0x00, -0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, -0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, +0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, 0x90, 0x01, +0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Wake */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -21994,14 +22280,12 @@ const unsigned char timelib_timezone_db_data_builtin[338523] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xBF, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x26, 0xB4, 0xFF, -0xFF, 0xFF, 0xFF, 0x98, 0x11, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, -0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x01, -0x02, 0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x4C, 0x00, -0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, -0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, +0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, 0x90, 0x01, +0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Poland */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -23266,600 +23550,600 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[596] = { { (char*) "Africa/Algiers" , 0x000595 }, { (char*) "Africa/Asmara" , 0x000880 }, { (char*) "Africa/Asmera" , 0x000958 }, - { (char*) "Africa/Bamako" , 0x000A30 }, - { (char*) "Africa/Bangui" , 0x000B0C }, - { (char*) "Africa/Banjul" , 0x000BAD }, - { (char*) "Africa/Bissau" , 0x000C91 }, - { (char*) "Africa/Blantyre" , 0x000D5F }, - { (char*) "Africa/Brazzaville" , 0x000E3C }, - { (char*) "Africa/Bujumbura" , 0x000EDD }, - { (char*) "Africa/Cairo" , 0x000F7E }, - { (char*) "Africa/Casablanca" , 0x00172D }, - { (char*) "Africa/Ceuta" , 0x0020B6 }, - { (char*) "Africa/Conakry" , 0x0028D4 }, - { (char*) "Africa/Dakar" , 0x0029B0 }, - { (char*) "Africa/Dar_es_Salaam" , 0x002A72 }, - { (char*) "Africa/Djibouti" , 0x002B53 }, - { (char*) "Africa/Douala" , 0x002BF4 }, - { (char*) "Africa/El_Aaiun" , 0x002C95 }, - { (char*) "Africa/Freetown" , 0x003598 }, - { (char*) "Africa/Gaborone" , 0x003774 }, - { (char*) "Africa/Harare" , 0x00386B }, - { (char*) "Africa/Johannesburg" , 0x00390C }, - { (char*) "Africa/Juba" , 0x003A0E }, - { (char*) "Africa/Kampala" , 0x003CC1 }, - { (char*) "Africa/Khartoum" , 0x003DC8 }, - { (char*) "Africa/Kigali" , 0x00407B }, - { (char*) "Africa/Kinshasa" , 0x00411C }, - { (char*) "Africa/Lagos" , 0x0041D6 }, - { (char*) "Africa/Libreville" , 0x0042CD }, - { (char*) "Africa/Lome" , 0x00436E }, - { (char*) "Africa/Luanda" , 0x00440E }, - { (char*) "Africa/Lubumbashi" , 0x0044D5 }, - { (char*) "Africa/Lusaka" , 0x0045B1 }, - { (char*) "Africa/Malabo" , 0x004652 }, - { (char*) "Africa/Maputo" , 0x004715 }, - { (char*) "Africa/Maseru" , 0x0047B6 }, - { (char*) "Africa/Mbabane" , 0x004882 }, - { (char*) "Africa/Mogadishu" , 0x004926 }, - { (char*) "Africa/Monrovia" , 0x004A07 }, - { (char*) "Africa/Nairobi" , 0x004AE3 }, - { (char*) "Africa/Ndjamena" , 0x004BF8 }, - { (char*) "Africa/Niamey" , 0x004CCB }, - { (char*) "Africa/Nouakchott" , 0x004DB0 }, - { (char*) "Africa/Ouagadougou" , 0x004E8C }, - { (char*) "Africa/Porto-Novo" , 0x004F2C }, - { (char*) "Africa/Sao_Tome" , 0x004FEF }, - { (char*) "Africa/Timbuktu" , 0x0050F9 }, - { (char*) "Africa/Tripoli" , 0x0051D5 }, - { (char*) "Africa/Tunis" , 0x005452 }, - { (char*) "Africa/Windhoek" , 0x00570F }, - { (char*) "America/Adak" , 0x005AD6 }, - { (char*) "America/Anchorage" , 0x006426 }, - { (char*) "America/Anguilla" , 0x006D88 }, - { (char*) "America/Antigua" , 0x006E28 }, - { (char*) "America/Araguaina" , 0x006EEA }, - { (char*) "America/Argentina/Buenos_Aires" , 0x007273 }, - { (char*) "America/Argentina/Catamarca" , 0x0076C8 }, - { (char*) "America/Argentina/ComodRivadavia" , 0x007B23 }, - { (char*) "America/Argentina/Cordoba" , 0x007F63 }, - { (char*) "America/Argentina/Jujuy" , 0x0083D9 }, - { (char*) "America/Argentina/La_Rioja" , 0x008807 }, - { (char*) "America/Argentina/Mendoza" , 0x008C62 }, - { (char*) "America/Argentina/Rio_Gallegos" , 0x0090AE }, - { (char*) "America/Argentina/Salta" , 0x0094FD }, - { (char*) "America/Argentina/San_Juan" , 0x009937 }, - { (char*) "America/Argentina/San_Luis" , 0x009D92 }, - { (char*) "America/Argentina/Tucuman" , 0x00A1F9 }, - { (char*) "America/Argentina/Ushuaia" , 0x00A661 }, - { (char*) "America/Aruba" , 0x00AAB6 }, - { (char*) "America/Asuncion" , 0x00AB7C }, - { (char*) "America/Atikokan" , 0x00B384 }, - { (char*) "America/Atka" , 0x00B501 }, - { (char*) "America/Bahia" , 0x00BE41 }, - { (char*) "America/Bahia_Banderas" , 0x00C252 }, - { (char*) "America/Barbados" , 0x00C8B4 }, - { (char*) "America/Belem" , 0x00CA74 }, - { (char*) "America/Belize" , 0x00CCD2 }, - { (char*) "America/Blanc-Sablon" , 0x00D32C }, - { (char*) "America/Boa_Vista" , 0x00D47E }, - { (char*) "America/Bogota" , 0x00D709 }, - { (char*) "America/Boise" , 0x00D80B }, - { (char*) "America/Buenos_Aires" , 0x00E1A1 }, - { (char*) "America/Cambridge_Bay" , 0x00E5E1 }, - { (char*) "America/Campo_Grande" , 0x00EE25 }, - { (char*) "America/Cancun" , 0x00F3E7 }, - { (char*) "America/Caracas" , 0x00F759 }, - { (char*) "America/Catamarca" , 0x00F86D }, - { (char*) "America/Cayenne" , 0x00FCAD }, - { (char*) "America/Cayman" , 0x00FD7F }, - { (char*) "America/Chicago" , 0x00FE41 }, - { (char*) "America/Chihuahua" , 0x010C69 }, - { (char*) "America/Coral_Harbour" , 0x01128F }, - { (char*) "America/Cordoba" , 0x0113EB }, - { (char*) "America/Costa_Rica" , 0x01182B }, - { (char*) "America/Creston" , 0x011973 }, - { (char*) "America/Cuiaba" , 0x011A61 }, - { (char*) "America/Curacao" , 0x012000 }, - { (char*) "America/Danmarkshavn" , 0x0120C6 }, - { (char*) "America/Dawson" , 0x0123A6 }, - { (char*) "America/Dawson_Creek" , 0x012A12 }, - { (char*) "America/Denver" , 0x012E58 }, - { (char*) "America/Detroit" , 0x013815 }, - { (char*) "America/Dominica" , 0x0140F0 }, - { (char*) "America/Edmonton" , 0x014190 }, - { (char*) "America/Eirunepe" , 0x014AD5 }, - { (char*) "America/El_Salvador" , 0x014D80 }, - { (char*) "America/Ensenada" , 0x014E6C }, - { (char*) "America/Fort_Nelson" , 0x0157BE }, - { (char*) "America/Fort_Wayne" , 0x01609E }, - { (char*) "America/Fortaleza" , 0x01673C }, - { (char*) "America/Glace_Bay" , 0x016A3A }, - { (char*) "America/Godthab" , 0x0172F1 }, - { (char*) "America/Goose_Bay" , 0x017A53 }, - { (char*) "America/Grand_Turk" , 0x018709 }, - { (char*) "America/Grenada" , 0x018E3F }, - { (char*) "America/Guadeloupe" , 0x018EDF }, - { (char*) "America/Guatemala" , 0x018F7F }, - { (char*) "America/Guayaquil" , 0x0190A3 }, - { (char*) "America/Guyana" , 0x0191B7 }, - { (char*) "America/Halifax" , 0x0192C9 }, - { (char*) "America/Havana" , 0x01A053 }, - { (char*) "America/Hermosillo" , 0x01A9CF }, - { (char*) "America/Indiana/Indianapolis" , 0x01ABC2 }, - { (char*) "America/Indiana/Knox" , 0x01B279 }, - { (char*) "America/Indiana/Marengo" , 0x01BC26 }, - { (char*) "America/Indiana/Petersburg" , 0x01C313 }, - { (char*) "America/Indiana/Tell_City" , 0x01CAB2 }, - { (char*) "America/Indiana/Vevay" , 0x01D176 }, - { (char*) "America/Indiana/Vincennes" , 0x01D732 }, - { (char*) "America/Indiana/Winamac" , 0x01DE08 }, - { (char*) "America/Indianapolis" , 0x01E52C }, - { (char*) "America/Inuvik" , 0x01EBCA }, - { (char*) "America/Iqaluit" , 0x01F350 }, - { (char*) "America/Jamaica" , 0x01FB6A }, - { (char*) "America/Jujuy" , 0x01FD58 }, - { (char*) "America/Juneau" , 0x02017C }, - { (char*) "America/Kentucky/Louisville" , 0x020ACD }, - { (char*) "America/Kentucky/Monticello" , 0x0215DB }, - { (char*) "America/Knox_IN" , 0x021F3B }, - { (char*) "America/Kralendijk" , 0x0228D3 }, - { (char*) "America/La_Paz" , 0x022999 }, - { (char*) "America/Lima" , 0x022A8D }, - { (char*) "America/Los_Angeles" , 0x022C2F }, - { (char*) "America/Louisville" , 0x023766 }, - { (char*) "America/Lower_Princes" , 0x024256 }, - { (char*) "America/Maceio" , 0x02431C }, - { (char*) "America/Managua" , 0x024620 }, - { (char*) "America/Manaus" , 0x0247DA }, - { (char*) "America/Marigot" , 0x024A51 }, - { (char*) "America/Martinique" , 0x024AF1 }, - { (char*) "America/Matamoros" , 0x024BE5 }, - { (char*) "America/Mazatlan" , 0x0251B9 }, - { (char*) "America/Mendoza" , 0x025818 }, - { (char*) "America/Menominee" , 0x025C58 }, - { (char*) "America/Merida" , 0x026565 }, - { (char*) "America/Metlakatla" , 0x026B33 }, - { (char*) "America/Mexico_City" , 0x0270E5 }, - { (char*) "America/Miquelon" , 0x027779 }, - { (char*) "America/Moncton" , 0x027E07 }, - { (char*) "America/Monterrey" , 0x028A7D }, - { (char*) "America/Montevideo" , 0x029058 }, - { (char*) "America/Montreal" , 0x02964A }, - { (char*) "America/Montserrat" , 0x02A3FC }, - { (char*) "America/Nassau" , 0x02A49C }, - { (char*) "America/New_York" , 0x02ADFC }, - { (char*) "America/Nipigon" , 0x02BBFC }, - { (char*) "America/Nome" , 0x02C473 }, - { (char*) "America/Noronha" , 0x02CDCB }, - { (char*) "America/North_Dakota/Beulah" , 0x02D0B3 }, - { (char*) "America/North_Dakota/Center" , 0x02DA30 }, - { (char*) "America/North_Dakota/New_Salem" , 0x02E3AD }, - { (char*) "America/Nuuk" , 0x02ED30 }, - { (char*) "America/Ojinaga" , 0x02F4A8 }, - { (char*) "America/Panama" , 0x02FAD0 }, - { (char*) "America/Pangnirtung" , 0x02FB92 }, - { (char*) "America/Paramaribo" , 0x0303E6 }, - { (char*) "America/Phoenix" , 0x0304F8 }, - { (char*) "America/Port-au-Prince" , 0x030689 }, - { (char*) "America/Port_of_Spain" , 0x030C2F }, - { (char*) "America/Porto_Acre" , 0x030CCF }, - { (char*) "America/Porto_Velho" , 0x030F4F }, - { (char*) "America/Puerto_Rico" , 0x0311A3 }, - { (char*) "America/Punta_Arenas" , 0x0312A5 }, - { (char*) "America/Rainy_River" , 0x031A41 }, - { (char*) "America/Rankin_Inlet" , 0x0322B9 }, - { (char*) "America/Recife" , 0x032A3F }, - { (char*) "America/Regina" , 0x032D21 }, - { (char*) "America/Resolute" , 0x033116 }, - { (char*) "America/Rio_Branco" , 0x03389D }, - { (char*) "America/Rosario" , 0x033B21 }, - { (char*) "America/Santa_Isabel" , 0x033F61 }, - { (char*) "America/Santarem" , 0x0348B3 }, - { (char*) "America/Santiago" , 0x034B24 }, - { (char*) "America/Santo_Domingo" , 0x035523 }, - { (char*) "America/Sao_Paulo" , 0x0356F9 }, - { (char*) "America/Scoresbysund" , 0x035CDF }, - { (char*) "America/Shiprock" , 0x036484 }, - { (char*) "America/Sitka" , 0x036E2C }, - { (char*) "America/St_Barthelemy" , 0x037764 }, - { (char*) "America/St_Johns" , 0x037804 }, - { (char*) "America/St_Kitts" , 0x038679 }, - { (char*) "America/St_Lucia" , 0x038719 }, - { (char*) "America/St_Thomas" , 0x0387DB }, - { (char*) "America/St_Vincent" , 0x03887B }, - { (char*) "America/Swift_Current" , 0x03893D }, - { (char*) "America/Tegucigalpa" , 0x038B8B }, - { (char*) "America/Thule" , 0x038C93 }, - { (char*) "America/Thunder_Bay" , 0x03928B }, - { (char*) "America/Tijuana" , 0x039B4B }, - { (char*) "America/Toronto" , 0x03A4BE }, - { (char*) "America/Tortola" , 0x03B28D }, - { (char*) "America/Vancouver" , 0x03B32D }, - { (char*) "America/Virgin" , 0x03BE9E }, - { (char*) "America/Whitehorse" , 0x03BF3E }, - { (char*) "America/Winnipeg" , 0x03C5AA }, - { (char*) "America/Yakutat" , 0x03D107 }, - { (char*) "America/Yellowknife" , 0x03DA24 }, - { (char*) "Antarctica/Casey" , 0x03E1F5 }, - { (char*) "Antarctica/Davis" , 0x03E386 }, - { (char*) "Antarctica/DumontDUrville" , 0x03E4C0 }, - { (char*) "Antarctica/Macquarie" , 0x03E59E }, - { (char*) "Antarctica/Mawson" , 0x03EE8E }, - { (char*) "Antarctica/McMurdo" , 0x03EF67 }, - { (char*) "Antarctica/Palmer" , 0x03F762 }, - { (char*) "Antarctica/Rothera" , 0x03FCFE }, - { (char*) "Antarctica/South_Pole" , 0x03FDB5 }, - { (char*) "Antarctica/Syowa" , 0x04058A }, - { (char*) "Antarctica/Troll" , 0x040640 }, - { (char*) "Antarctica/Vostok" , 0x040ADB }, - { (char*) "Arctic/Longyearbyen" , 0x040B92 }, - { (char*) "Asia/Aden" , 0x041452 }, - { (char*) "Asia/Almaty" , 0x041503 }, - { (char*) "Asia/Amman" , 0x04190B }, - { (char*) "Asia/Anadyr" , 0x041EBE }, - { (char*) "Asia/Aqtau" , 0x042381 }, - { (char*) "Asia/Aqtobe" , 0x042779 }, - { (char*) "Asia/Ashgabat" , 0x042B85 }, - { (char*) "Asia/Ashkhabad" , 0x042DFC }, - { (char*) "Asia/Atyrau" , 0x043073 }, - { (char*) "Asia/Baghdad" , 0x043473 }, - { (char*) "Asia/Bahrain" , 0x043856 }, - { (char*) "Asia/Baku" , 0x04394F }, - { (char*) "Asia/Bangkok" , 0x043E26 }, - { (char*) "Asia/Barnaul" , 0x043EF9 }, - { (char*) "Asia/Beirut" , 0x0443D8 }, - { (char*) "Asia/Bishkek" , 0x044C4E }, - { (char*) "Asia/Brunei" , 0x045031 }, - { (char*) "Asia/Calcutta" , 0x045108 }, - { (char*) "Asia/Chita" , 0x045231 }, - { (char*) "Asia/Choibalsan" , 0x045716 }, - { (char*) "Asia/Chongqing" , 0x045AE9 }, - { (char*) "Asia/Chungking" , 0x045D26 }, - { (char*) "Asia/Colombo" , 0x045F63 }, - { (char*) "Asia/Dacca" , 0x0460E3 }, - { (char*) "Asia/Damascus" , 0x046240 }, - { (char*) "Asia/Dhaka" , 0x0469AB }, - { (char*) "Asia/Dili" , 0x046B08 }, - { (char*) "Asia/Dubai" , 0x046BF7 }, - { (char*) "Asia/Dushanbe" , 0x046CA8 }, - { (char*) "Asia/Famagusta" , 0x046F03 }, - { (char*) "Asia/Gaza" , 0x04770A }, - { (char*) "Asia/Harbin" , 0x048096 }, - { (char*) "Asia/Hebron" , 0x0482D3 }, - { (char*) "Asia/Ho_Chi_Minh" , 0x048C7A }, - { (char*) "Asia/Hong_Kong" , 0x048DE5 }, - { (char*) "Asia/Hovd" , 0x0492C2 }, - { (char*) "Asia/Irkutsk" , 0x049674 }, - { (char*) "Asia/Istanbul" , 0x049B75 }, - { (char*) "Asia/Jakarta" , 0x04A31C }, - { (char*) "Asia/Jayapura" , 0x04A4B4 }, - { (char*) "Asia/Jerusalem" , 0x04A5D3 }, - { (char*) "Asia/Kabul" , 0x04AF33 }, - { (char*) "Asia/Kamchatka" , 0x04B00F }, - { (char*) "Asia/Karachi" , 0x04B4BB }, - { (char*) "Asia/Kashgar" , 0x04B642 }, - { (char*) "Asia/Kathmandu" , 0x04B6F3 }, - { (char*) "Asia/Katmandu" , 0x04B7D3 }, - { (char*) "Asia/Khandyga" , 0x04B8B3 }, - { (char*) "Asia/Kolkata" , 0x04BDD4 }, - { (char*) "Asia/Krasnoyarsk" , 0x04BEFD }, - { (char*) "Asia/Kuala_Lumpur" , 0x04C3D9 }, - { (char*) "Asia/Kuching" , 0x04C578 }, - { (char*) "Asia/Kuwait" , 0x04C775 }, - { (char*) "Asia/Macao" , 0x04C826 }, - { (char*) "Asia/Macau" , 0x04CCFD }, - { (char*) "Asia/Magadan" , 0x04D1D4 }, - { (char*) "Asia/Makassar" , 0x04D6B6 }, - { (char*) "Asia/Manila" , 0x04D809 }, - { (char*) "Asia/Muscat" , 0x04D95D }, - { (char*) "Asia/Nicosia" , 0x04DA0E }, - { (char*) "Asia/Novokuznetsk" , 0x04E1FF }, - { (char*) "Asia/Novosibirsk" , 0x04E6A9 }, - { (char*) "Asia/Omsk" , 0x04EB8E }, - { (char*) "Asia/Oral" , 0x04F05E }, - { (char*) "Asia/Phnom_Penh" , 0x04F466 }, - { (char*) "Asia/Pontianak" , 0x04F599 }, - { (char*) "Asia/Pyongyang" , 0x04F71C }, - { (char*) "Asia/Qatar" , 0x04F815 }, - { (char*) "Asia/Qostanay" , 0x04F8E8 }, - { (char*) "Asia/Qyzylorda" , 0x04FD01 }, - { (char*) "Asia/Rangoon" , 0x05012B }, - { (char*) "Asia/Riyadh" , 0x050243 }, - { (char*) "Asia/Saigon" , 0x0502F4 }, - { (char*) "Asia/Sakhalin" , 0x05045F }, - { (char*) "Asia/Samarkand" , 0x050935 }, - { (char*) "Asia/Seoul" , 0x050B93 }, - { (char*) "Asia/Shanghai" , 0x050E08 }, - { (char*) "Asia/Singapore" , 0x051051 }, - { (char*) "Asia/Srednekolymsk" , 0x0511DC }, - { (char*) "Asia/Taipei" , 0x0516C2 }, - { (char*) "Asia/Tashkent" , 0x0519C7 }, - { (char*) "Asia/Tbilisi" , 0x051C33 }, - { (char*) "Asia/Tehran" , 0x05204A }, - { (char*) "Asia/Tel_Aviv" , 0x052544 }, - { (char*) "Asia/Thimbu" , 0x052EA4 }, - { (char*) "Asia/Thimphu" , 0x052F7B }, - { (char*) "Asia/Tokyo" , 0x053052 }, - { (char*) "Asia/Tomsk" , 0x053193 }, - { (char*) "Asia/Ujung_Pandang" , 0x053672 }, - { (char*) "Asia/Ulaanbaatar" , 0x05377C }, - { (char*) "Asia/Ulan_Bator" , 0x053B18 }, - { (char*) "Asia/Urumqi" , 0x053E9F }, - { (char*) "Asia/Ust-Nera" , 0x053F5D }, - { (char*) "Asia/Vientiane" , 0x054461 }, - { (char*) "Asia/Vladivostok" , 0x0545B0 }, - { (char*) "Asia/Yakutsk" , 0x054A87 }, - { (char*) "Asia/Yangon" , 0x054F5D }, - { (char*) "Asia/Yekaterinburg" , 0x055075 }, - { (char*) "Asia/Yerevan" , 0x05556A }, - { (char*) "Atlantic/Azores" , 0x0559F5 }, - { (char*) "Atlantic/Bermuda" , 0x0567BF }, - { (char*) "Atlantic/Canary" , 0x057127 }, - { (char*) "Atlantic/Cape_Verde" , 0x0578AA }, - { (char*) "Atlantic/Faeroe" , 0x0579C4 }, - { (char*) "Atlantic/Faroe" , 0x0580E7 }, - { (char*) "Atlantic/Jan_Mayen" , 0x05880A }, - { (char*) "Atlantic/Madeira" , 0x0590CA }, - { (char*) "Atlantic/Reykjavik" , 0x059E94 }, - { (char*) "Atlantic/South_Georgia" , 0x05A32A }, - { (char*) "Atlantic/St_Helena" , 0x05A3DA }, - { (char*) "Atlantic/Stanley" , 0x05A49C }, - { (char*) "Australia/ACT" , 0x05A966 }, - { (char*) "Australia/Adelaide" , 0x05B200 }, - { (char*) "Australia/Brisbane" , 0x05BABB }, - { (char*) "Australia/Broken_Hill" , 0x05BC81 }, - { (char*) "Australia/Canberra" , 0x05C55E }, - { (char*) "Australia/Currie" , 0x05CDF8 }, - { (char*) "Australia/Darwin" , 0x05D73A }, - { (char*) "Australia/Eucla" , 0x05D89D }, - { (char*) "Australia/Hobart" , 0x05DA98 }, - { (char*) "Australia/LHI" , 0x05E3E2 }, - { (char*) "Australia/Lindeman" , 0x05EB32 }, - { (char*) "Australia/Lord_Howe" , 0x05ED38 }, - { (char*) "Australia/Melbourne" , 0x05F498 }, - { (char*) "Australia/North" , 0x05FD3A }, - { (char*) "Australia/NSW" , 0x05FE8B }, - { (char*) "Australia/Perth" , 0x060725 }, - { (char*) "Australia/Queensland" , 0x06090D }, - { (char*) "Australia/South" , 0x060ABC }, - { (char*) "Australia/Sydney" , 0x061368 }, - { (char*) "Australia/Tasmania" , 0x061C1E }, - { (char*) "Australia/Victoria" , 0x062560 }, - { (char*) "Australia/West" , 0x062DFA }, - { (char*) "Australia/Yancowinna" , 0x062FC4 }, - { (char*) "Brazil/Acre" , 0x063885 }, - { (char*) "Brazil/DeNoronha" , 0x063B05 }, - { (char*) "Brazil/East" , 0x063DDD }, - { (char*) "Brazil/West" , 0x06438D }, - { (char*) "Canada/Atlantic" , 0x0645F5 }, - { (char*) "Canada/Central" , 0x065361 }, - { (char*) "Canada/Eastern" , 0x065EA1 }, - { (char*) "Canada/Mountain" , 0x066C53 }, - { (char*) "Canada/Newfoundland" , 0x06757B }, - { (char*) "Canada/Pacific" , 0x0683CE }, - { (char*) "Canada/Saskatchewan" , 0x068F26 }, - { (char*) "Canada/Yukon" , 0x069306 }, - { (char*) "CET" , 0x069960 }, - { (char*) "Chile/Continental" , 0x06A19A }, - { (char*) "Chile/EasterIsland" , 0x06AB87 }, - { (char*) "CST6CDT" , 0x06B44C }, - { (char*) "Cuba" , 0x06BD5E }, - { (char*) "EET" , 0x06C6DA }, - { (char*) "Egypt" , 0x06CE5A }, - { (char*) "Eire" , 0x06D609 }, - { (char*) "EST" , 0x06E3B9 }, - { (char*) "EST5EDT" , 0x06E437 }, - { (char*) "Etc/GMT" , 0x06ED49 }, - { (char*) "Etc/GMT+0" , 0x06EDC7 }, - { (char*) "Etc/GMT+1" , 0x06EE45 }, - { (char*) "Etc/GMT+10" , 0x06EEC5 }, - { (char*) "Etc/GMT+11" , 0x06EF46 }, - { (char*) "Etc/GMT+12" , 0x06EFC7 }, - { (char*) "Etc/GMT+2" , 0x06F048 }, - { (char*) "Etc/GMT+3" , 0x06F0C8 }, - { (char*) "Etc/GMT+4" , 0x06F148 }, - { (char*) "Etc/GMT+5" , 0x06F1C8 }, - { (char*) "Etc/GMT+6" , 0x06F248 }, - { (char*) "Etc/GMT+7" , 0x06F2C8 }, - { (char*) "Etc/GMT+8" , 0x06F348 }, - { (char*) "Etc/GMT+9" , 0x06F3C8 }, - { (char*) "Etc/GMT-0" , 0x06F448 }, - { (char*) "Etc/GMT-1" , 0x06F4C6 }, - { (char*) "Etc/GMT-10" , 0x06F547 }, - { (char*) "Etc/GMT-11" , 0x06F5C9 }, - { (char*) "Etc/GMT-12" , 0x06F64B }, - { (char*) "Etc/GMT-13" , 0x06F6CD }, - { (char*) "Etc/GMT-14" , 0x06F74F }, - { (char*) "Etc/GMT-2" , 0x06F7D1 }, - { (char*) "Etc/GMT-3" , 0x06F852 }, - { (char*) "Etc/GMT-4" , 0x06F8D3 }, - { (char*) "Etc/GMT-5" , 0x06F954 }, - { (char*) "Etc/GMT-6" , 0x06F9D5 }, - { (char*) "Etc/GMT-7" , 0x06FA56 }, - { (char*) "Etc/GMT-8" , 0x06FAD7 }, - { (char*) "Etc/GMT-9" , 0x06FB58 }, - { (char*) "Etc/GMT0" , 0x06FBD9 }, - { (char*) "Etc/Greenwich" , 0x06FC57 }, - { (char*) "Etc/UCT" , 0x06FCD5 }, - { (char*) "Etc/Universal" , 0x06FD53 }, - { (char*) "Etc/UTC" , 0x06FDD1 }, - { (char*) "Etc/Zulu" , 0x06FE4F }, - { (char*) "Europe/Amsterdam" , 0x06FECD }, - { (char*) "Europe/Andorra" , 0x070A37 }, - { (char*) "Europe/Astrakhan" , 0x071111 }, - { (char*) "Europe/Athens" , 0x0715BC }, - { (char*) "Europe/Belfast" , 0x071E9E }, - { (char*) "Europe/Belgrade" , 0x072CFA }, - { (char*) "Europe/Berlin" , 0x073486 }, - { (char*) "Europe/Bratislava" , 0x073DA0 }, - { (char*) "Europe/Brussels" , 0x0746A9 }, - { (char*) "Europe/Bucharest" , 0x07522A }, - { (char*) "Europe/Budapest" , 0x075ABE }, - { (char*) "Europe/Busingen" , 0x07640A }, - { (char*) "Europe/Chisinau" , 0x076B93 }, - { (char*) "Europe/Copenhagen" , 0x0774F5 }, - { (char*) "Europe/Dublin" , 0x077D5A }, - { (char*) "Europe/Gibraltar" , 0x078B0A }, - { (char*) "Europe/Guernsey" , 0x079712 }, - { (char*) "Europe/Helsinki" , 0x07A5B2 }, - { (char*) "Europe/Isle_of_Man" , 0x07AD2A }, - { (char*) "Europe/Istanbul" , 0x07BB76 }, - { (char*) "Europe/Jersey" , 0x07C31D }, - { (char*) "Europe/Kaliningrad" , 0x07D1BD }, - { (char*) "Europe/Kiev" , 0x07D7B2 }, - { (char*) "Europe/Kirov" , 0x07E006 }, - { (char*) "Europe/Kyiv" , 0x07E4A1 }, - { (char*) "Europe/Lisbon" , 0x07ED09 }, - { (char*) "Europe/Ljubljana" , 0x07FAD1 }, - { (char*) "Europe/London" , 0x08025D }, - { (char*) "Europe/Luxembourg" , 0x0810B9 }, - { (char*) "Europe/Madrid" , 0x081C47 }, - { (char*) "Europe/Malta" , 0x082699 }, - { (char*) "Europe/Mariehamn" , 0x0830E1 }, - { (char*) "Europe/Minsk" , 0x083859 }, - { (char*) "Europe/Monaco" , 0x083D8E }, - { (char*) "Europe/Moscow" , 0x08491A }, - { (char*) "Europe/Nicosia" , 0x084F39 }, - { (char*) "Europe/Oslo" , 0x085717 }, - { (char*) "Europe/Paris" , 0x085FD7 }, - { (char*) "Europe/Podgorica" , 0x086B75 }, - { (char*) "Europe/Prague" , 0x087301 }, - { (char*) "Europe/Riga" , 0x087C0A }, - { (char*) "Europe/Rome" , 0x0884AC }, - { (char*) "Europe/Samara" , 0x088F09 }, - { (char*) "Europe/San_Marino" , 0x0893ED }, - { (char*) "Europe/Sarajevo" , 0x089E4A }, - { (char*) "Europe/Saratov" , 0x08A5D6 }, - { (char*) "Europe/Simferopol" , 0x08AA91 }, - { (char*) "Europe/Skopje" , 0x08B060 }, - { (char*) "Europe/Sofia" , 0x08B7EC }, - { (char*) "Europe/Stockholm" , 0x08C015 }, - { (char*) "Europe/Tallinn" , 0x08C796 }, - { (char*) "Europe/Tirane" , 0x08D006 }, - { (char*) "Europe/Tiraspol" , 0x08D836 }, - { (char*) "Europe/Ulyanovsk" , 0x08E198 }, - { (char*) "Europe/Uzhgorod" , 0x08E6A9 }, - { (char*) "Europe/Vaduz" , 0x08EEFD }, - { (char*) "Europe/Vatican" , 0x08F669 }, - { (char*) "Europe/Vienna" , 0x0900C6 }, - { (char*) "Europe/Vilnius" , 0x09096A }, - { (char*) "Europe/Volgograd" , 0x0911E8 }, - { (char*) "Europe/Warsaw" , 0x091693 }, - { (char*) "Europe/Zagreb" , 0x0920FD }, - { (char*) "Europe/Zaporozhye" , 0x092889 }, - { (char*) "Europe/Zurich" , 0x0930DD }, - { (char*) "Factory" , 0x09385E }, - { (char*) "GB" , 0x0938DE }, - { (char*) "GB-Eire" , 0x09473A }, - { (char*) "GMT" , 0x095596 }, - { (char*) "GMT+0" , 0x095614 }, - { (char*) "GMT-0" , 0x095692 }, - { (char*) "GMT0" , 0x095710 }, - { (char*) "Greenwich" , 0x09578E }, - { (char*) "Hongkong" , 0x09580C }, - { (char*) "HST" , 0x095CE9 }, - { (char*) "Iceland" , 0x095D68 }, - { (char*) "Indian/Antananarivo" , 0x0961FE }, - { (char*) "Indian/Chagos" , 0x0962E5 }, - { (char*) "Indian/Christmas" , 0x0963B8 }, - { (char*) "Indian/Cocos" , 0x096469 }, - { (char*) "Indian/Comoro" , 0x096523 }, - { (char*) "Indian/Kerguelen" , 0x0965C4 }, - { (char*) "Indian/Mahe" , 0x096675 }, - { (char*) "Indian/Maldives" , 0x096726 }, - { (char*) "Indian/Mauritius" , 0x0967F9 }, - { (char*) "Indian/Mayotte" , 0x0968F6 }, - { (char*) "Indian/Reunion" , 0x096997 }, - { (char*) "Iran" , 0x096A48 }, - { (char*) "Israel" , 0x096F42 }, - { (char*) "Jamaica" , 0x0978A2 }, - { (char*) "Japan" , 0x097A90 }, - { (char*) "Kwajalein" , 0x097BD1 }, - { (char*) "Libya" , 0x097D19 }, - { (char*) "MET" , 0x097F96 }, - { (char*) "Mexico/BajaNorte" , 0x0987D0 }, - { (char*) "Mexico/BajaSur" , 0x099122 }, - { (char*) "Mexico/General" , 0x09974C }, - { (char*) "MST" , 0x099DD4 }, - { (char*) "MST7MDT" , 0x099E52 }, - { (char*) "Navajo" , 0x09A764 }, - { (char*) "NZ" , 0x09B10C }, - { (char*) "NZ-CHAT" , 0x09BA9D }, - { (char*) "Pacific/Apia" , 0x09C2BD }, - { (char*) "Pacific/Auckland" , 0x09C52D }, - { (char*) "Pacific/Bougainville" , 0x09CED6 }, - { (char*) "Pacific/Chatham" , 0x09CFFA }, - { (char*) "Pacific/Chuuk" , 0x09D829 }, - { (char*) "Pacific/Easter" , 0x09D951 }, - { (char*) "Pacific/Efate" , 0x09E223 }, - { (char*) "Pacific/Enderbury" , 0x09E449 }, - { (char*) "Pacific/Fakaofo" , 0x09E53F }, - { (char*) "Pacific/Fiji" , 0x09E613 }, - { (char*) "Pacific/Funafuti" , 0x09EA38 }, - { (char*) "Pacific/Galapagos" , 0x09EAEA }, - { (char*) "Pacific/Gambier" , 0x09EBF5 }, - { (char*) "Pacific/Guadalcanal" , 0x09ECB4 }, - { (char*) "Pacific/Guam" , 0x09ED66 }, - { (char*) "Pacific/Honolulu" , 0x09EF60 }, - { (char*) "Pacific/Johnston" , 0x09F0BB }, - { (char*) "Pacific/Kanton" , 0x09F210 }, - { (char*) "Pacific/Kiritimati" , 0x09F315 }, - { (char*) "Pacific/Kosrae" , 0x09F41B }, - { (char*) "Pacific/Kwajalein" , 0x09F58C }, - { (char*) "Pacific/Majuro" , 0x09F6DD }, - { (char*) "Pacific/Marquesas" , 0x09F83C }, - { (char*) "Pacific/Midway" , 0x09F906 }, - { (char*) "Pacific/Nauru" , 0x09F9F9 }, - { (char*) "Pacific/Niue" , 0x09FB01 }, - { (char*) "Pacific/Norfolk" , 0x09FBD8 }, - { (char*) "Pacific/Noumea" , 0x09FF54 }, - { (char*) "Pacific/Pago_Pago" , 0x0A0090 }, - { (char*) "Pacific/Palau" , 0x0A014B }, - { (char*) "Pacific/Pitcairn" , 0x0A020B }, - { (char*) "Pacific/Pohnpei" , 0x0A02E1 }, - { (char*) "Pacific/Ponape" , 0x0A042A }, - { (char*) "Pacific/Port_Moresby" , 0x0A0565 }, - { (char*) "Pacific/Rarotonga" , 0x0A0648 }, - { (char*) "Pacific/Saipan" , 0x0A08AF }, - { (char*) "Pacific/Samoa" , 0x0A0A9B }, - { (char*) "Pacific/Tahiti" , 0x0A0B56 }, - { (char*) "Pacific/Tarawa" , 0x0A0C16 }, - { (char*) "Pacific/Tongatapu" , 0x0A0CD7 }, - { (char*) "Pacific/Truk" , 0x0A0E57 }, - { (char*) "Pacific/Wake" , 0x0A0F70 }, - { (char*) "Pacific/Wallis" , 0x0A102D }, - { (char*) "Pacific/Yap" , 0x0A10DF }, - { (char*) "Poland" , 0x0A11F8 }, - { (char*) "Portugal" , 0x0A1C62 }, - { (char*) "PRC" , 0x0A2A17 }, - { (char*) "PST8PDT" , 0x0A2C54 }, - { (char*) "ROC" , 0x0A3566 }, - { (char*) "ROK" , 0x0A386B }, - { (char*) "Singapore" , 0x0A3AE0 }, - { (char*) "Turkey" , 0x0A3C6B }, - { (char*) "UCT" , 0x0A4412 }, - { (char*) "Universal" , 0x0A4490 }, - { (char*) "US/Alaska" , 0x0A450E }, - { (char*) "US/Aleutian" , 0x0A4E5D }, - { (char*) "US/Arizona" , 0x0A579D }, - { (char*) "US/Central" , 0x0A5911 }, - { (char*) "US/East-Indiana" , 0x0A6725 }, - { (char*) "US/Eastern" , 0x0A6DC3 }, - { (char*) "US/Hawaii" , 0x0A7BAF }, - { (char*) "US/Indiana-Starke" , 0x0A7D04 }, - { (char*) "US/Michigan" , 0x0A869C }, - { (char*) "US/Mountain" , 0x0A8F5E }, - { (char*) "US/Pacific" , 0x0A9906 }, - { (char*) "US/Samoa" , 0x0AA436 }, - { (char*) "UTC" , 0x0AA4F1 }, - { (char*) "W-SU" , 0x0AA56F }, - { (char*) "WET" , 0x0AAB7A }, - { (char*) "Zulu" , 0x0AB2F7 }, + { (char*) "Africa/Bamako" , 0x000A6D }, + { (char*) "Africa/Bangui" , 0x000B49 }, + { (char*) "Africa/Banjul" , 0x000BEA }, + { (char*) "Africa/Bissau" , 0x000CCE }, + { (char*) "Africa/Blantyre" , 0x000D9C }, + { (char*) "Africa/Brazzaville" , 0x000E79 }, + { (char*) "Africa/Bujumbura" , 0x000F1A }, + { (char*) "Africa/Cairo" , 0x000FBB }, + { (char*) "Africa/Casablanca" , 0x00176A }, + { (char*) "Africa/Ceuta" , 0x0020F3 }, + { (char*) "Africa/Conakry" , 0x002911 }, + { (char*) "Africa/Dakar" , 0x0029ED }, + { (char*) "Africa/Dar_es_Salaam" , 0x002AAF }, + { (char*) "Africa/Djibouti" , 0x002B90 }, + { (char*) "Africa/Douala" , 0x002C31 }, + { (char*) "Africa/El_Aaiun" , 0x002CD2 }, + { (char*) "Africa/Freetown" , 0x0035D5 }, + { (char*) "Africa/Gaborone" , 0x0037B1 }, + { (char*) "Africa/Harare" , 0x0038A8 }, + { (char*) "Africa/Johannesburg" , 0x003949 }, + { (char*) "Africa/Juba" , 0x003A4B }, + { (char*) "Africa/Kampala" , 0x003CFE }, + { (char*) "Africa/Khartoum" , 0x003E05 }, + { (char*) "Africa/Kigali" , 0x0040B8 }, + { (char*) "Africa/Kinshasa" , 0x004159 }, + { (char*) "Africa/Lagos" , 0x004213 }, + { (char*) "Africa/Libreville" , 0x00430A }, + { (char*) "Africa/Lome" , 0x0043AB }, + { (char*) "Africa/Luanda" , 0x00444B }, + { (char*) "Africa/Lubumbashi" , 0x004512 }, + { (char*) "Africa/Lusaka" , 0x0045EE }, + { (char*) "Africa/Malabo" , 0x00468F }, + { (char*) "Africa/Maputo" , 0x004752 }, + { (char*) "Africa/Maseru" , 0x0047F3 }, + { (char*) "Africa/Mbabane" , 0x0048BF }, + { (char*) "Africa/Mogadishu" , 0x004963 }, + { (char*) "Africa/Monrovia" , 0x004A44 }, + { (char*) "Africa/Nairobi" , 0x004B20 }, + { (char*) "Africa/Ndjamena" , 0x004C35 }, + { (char*) "Africa/Niamey" , 0x004D08 }, + { (char*) "Africa/Nouakchott" , 0x004DED }, + { (char*) "Africa/Ouagadougou" , 0x004EC9 }, + { (char*) "Africa/Porto-Novo" , 0x004F69 }, + { (char*) "Africa/Sao_Tome" , 0x00502C }, + { (char*) "Africa/Timbuktu" , 0x005136 }, + { (char*) "Africa/Tripoli" , 0x0051D6 }, + { (char*) "Africa/Tunis" , 0x005453 }, + { (char*) "Africa/Windhoek" , 0x005710 }, + { (char*) "America/Adak" , 0x005AD7 }, + { (char*) "America/Anchorage" , 0x006427 }, + { (char*) "America/Anguilla" , 0x006D89 }, + { (char*) "America/Antigua" , 0x006E29 }, + { (char*) "America/Araguaina" , 0x006EEB }, + { (char*) "America/Argentina/Buenos_Aires" , 0x007266 }, + { (char*) "America/Argentina/Catamarca" , 0x0076AD }, + { (char*) "America/Argentina/ComodRivadavia" , 0x007AFA }, + { (char*) "America/Argentina/Cordoba" , 0x007F2C }, + { (char*) "America/Argentina/Jujuy" , 0x008394 }, + { (char*) "America/Argentina/La_Rioja" , 0x0087B4 }, + { (char*) "America/Argentina/Mendoza" , 0x008C01 }, + { (char*) "America/Argentina/Rio_Gallegos" , 0x00903F }, + { (char*) "America/Argentina/Salta" , 0x009480 }, + { (char*) "America/Argentina/San_Juan" , 0x0098AC }, + { (char*) "America/Argentina/San_Luis" , 0x009CF9 }, + { (char*) "America/Argentina/Tucuman" , 0x00A152 }, + { (char*) "America/Argentina/Ushuaia" , 0x00A5AC }, + { (char*) "America/Aruba" , 0x00A9F3 }, + { (char*) "America/Asuncion" , 0x00AAB9 }, + { (char*) "America/Atikokan" , 0x00B2B3 }, + { (char*) "America/Atka" , 0x00B430 }, + { (char*) "America/Bahia" , 0x00BD70 }, + { (char*) "America/Bahia_Banderas" , 0x00C173 }, + { (char*) "America/Barbados" , 0x00C61F }, + { (char*) "America/Belem" , 0x00C7DF }, + { (char*) "America/Belize" , 0x00CA2F }, + { (char*) "America/Blanc-Sablon" , 0x00D089 }, + { (char*) "America/Boa_Vista" , 0x00D1DB }, + { (char*) "America/Bogota" , 0x00D458 }, + { (char*) "America/Boise" , 0x00D54C }, + { (char*) "America/Buenos_Aires" , 0x00DEE2 }, + { (char*) "America/Cambridge_Bay" , 0x00E314 }, + { (char*) "America/Campo_Grande" , 0x00EB58 }, + { (char*) "America/Cancun" , 0x00F10C }, + { (char*) "America/Caracas" , 0x00F47E }, + { (char*) "America/Catamarca" , 0x00F584 }, + { (char*) "America/Cayenne" , 0x00F9B6 }, + { (char*) "America/Cayman" , 0x00FA7A }, + { (char*) "America/Chicago" , 0x00FB3C }, + { (char*) "America/Chihuahua" , 0x010964 }, + { (char*) "America/Coral_Harbour" , 0x010DE4 }, + { (char*) "America/Cordoba" , 0x010EA6 }, + { (char*) "America/Costa_Rica" , 0x0112D8 }, + { (char*) "America/Creston" , 0x011420 }, + { (char*) "America/Cuiaba" , 0x01150E }, + { (char*) "America/Curacao" , 0x011A9F }, + { (char*) "America/Danmarkshavn" , 0x011B65 }, + { (char*) "America/Dawson" , 0x011E45 }, + { (char*) "America/Dawson_Creek" , 0x0124B1 }, + { (char*) "America/Denver" , 0x0128F7 }, + { (char*) "America/Detroit" , 0x0132B4 }, + { (char*) "America/Dominica" , 0x013B8F }, + { (char*) "America/Edmonton" , 0x013C2F }, + { (char*) "America/Eirunepe" , 0x014574 }, + { (char*) "America/El_Salvador" , 0x014811 }, + { (char*) "America/Ensenada" , 0x0148FD }, + { (char*) "America/Fort_Nelson" , 0x01524F }, + { (char*) "America/Fort_Wayne" , 0x015B2F }, + { (char*) "America/Fortaleza" , 0x0161CD }, + { (char*) "America/Glace_Bay" , 0x0164BD }, + { (char*) "America/Godthab" , 0x016D74 }, + { (char*) "America/Goose_Bay" , 0x0174C8 }, + { (char*) "America/Grand_Turk" , 0x01817E }, + { (char*) "America/Grenada" , 0x0188B4 }, + { (char*) "America/Guadeloupe" , 0x018954 }, + { (char*) "America/Guatemala" , 0x0189F4 }, + { (char*) "America/Guayaquil" , 0x018B18 }, + { (char*) "America/Guyana" , 0x018C1E }, + { (char*) "America/Halifax" , 0x018D22 }, + { (char*) "America/Havana" , 0x019AAC }, + { (char*) "America/Hermosillo" , 0x01A428 }, + { (char*) "America/Indiana/Indianapolis" , 0x01A61B }, + { (char*) "America/Indiana/Knox" , 0x01ACD2 }, + { (char*) "America/Indiana/Marengo" , 0x01B67F }, + { (char*) "America/Indiana/Petersburg" , 0x01BD6C }, + { (char*) "America/Indiana/Tell_City" , 0x01C50B }, + { (char*) "America/Indiana/Vevay" , 0x01CBCF }, + { (char*) "America/Indiana/Vincennes" , 0x01D18B }, + { (char*) "America/Indiana/Winamac" , 0x01D861 }, + { (char*) "America/Indianapolis" , 0x01DF85 }, + { (char*) "America/Inuvik" , 0x01E623 }, + { (char*) "America/Iqaluit" , 0x01EDA9 }, + { (char*) "America/Jamaica" , 0x01F5C3 }, + { (char*) "America/Jujuy" , 0x01F7B1 }, + { (char*) "America/Juneau" , 0x01FBC7 }, + { (char*) "America/Kentucky/Louisville" , 0x020518 }, + { (char*) "America/Kentucky/Monticello" , 0x021026 }, + { (char*) "America/Knox_IN" , 0x021986 }, + { (char*) "America/Kralendijk" , 0x02231E }, + { (char*) "America/La_Paz" , 0x022420 }, + { (char*) "America/Lima" , 0x022506 }, + { (char*) "America/Los_Angeles" , 0x02269A }, + { (char*) "America/Louisville" , 0x0231D1 }, + { (char*) "America/Lower_Princes" , 0x023CC1 }, + { (char*) "America/Maceio" , 0x023DC3 }, + { (char*) "America/Managua" , 0x0240B9 }, + { (char*) "America/Manaus" , 0x024273 }, + { (char*) "America/Marigot" , 0x0244DC }, + { (char*) "America/Martinique" , 0x0245DE }, + { (char*) "America/Matamoros" , 0x0246D2 }, + { (char*) "America/Mazatlan" , 0x024CA6 }, + { (char*) "America/Mendoza" , 0x02514F }, + { (char*) "America/Menominee" , 0x025581 }, + { (char*) "America/Merida" , 0x025E8E }, + { (char*) "America/Metlakatla" , 0x0262A6 }, + { (char*) "America/Mexico_City" , 0x026858 }, + { (char*) "America/Miquelon" , 0x026D36 }, + { (char*) "America/Moncton" , 0x0273B6 }, + { (char*) "America/Monterrey" , 0x02802C }, + { (char*) "America/Montevideo" , 0x028451 }, + { (char*) "America/Montreal" , 0x028A35 }, + { (char*) "America/Montserrat" , 0x0297E7 }, + { (char*) "America/Nassau" , 0x029887 }, + { (char*) "America/New_York" , 0x02A1E7 }, + { (char*) "America/Nipigon" , 0x02AFE7 }, + { (char*) "America/Nome" , 0x02BD99 }, + { (char*) "America/Noronha" , 0x02C6F1 }, + { (char*) "America/North_Dakota/Beulah" , 0x02C9CB }, + { (char*) "America/North_Dakota/Center" , 0x02D348 }, + { (char*) "America/North_Dakota/New_Salem" , 0x02DCC5 }, + { (char*) "America/Nuuk" , 0x02E648 }, + { (char*) "America/Ojinaga" , 0x02EDB2 }, + { (char*) "America/Panama" , 0x02F234 }, + { (char*) "America/Pangnirtung" , 0x02F2F6 }, + { (char*) "America/Paramaribo" , 0x02FB4A }, + { (char*) "America/Phoenix" , 0x02FC4E }, + { (char*) "America/Port-au-Prince" , 0x02FDDF }, + { (char*) "America/Port_of_Spain" , 0x030385 }, + { (char*) "America/Porto_Acre" , 0x030425 }, + { (char*) "America/Porto_Velho" , 0x030697 }, + { (char*) "America/Puerto_Rico" , 0x0308DD }, + { (char*) "America/Punta_Arenas" , 0x0309DF }, + { (char*) "America/Rainy_River" , 0x03116D }, + { (char*) "America/Rankin_Inlet" , 0x031CAD }, + { (char*) "America/Recife" , 0x032433 }, + { (char*) "America/Regina" , 0x032707 }, + { (char*) "America/Resolute" , 0x032AFC }, + { (char*) "America/Rio_Branco" , 0x033283 }, + { (char*) "America/Rosario" , 0x0334F9 }, + { (char*) "America/Santa_Isabel" , 0x03392B }, + { (char*) "America/Santarem" , 0x03427D }, + { (char*) "America/Santiago" , 0x0344E0 }, + { (char*) "America/Santo_Domingo" , 0x034ED1 }, + { (char*) "America/Sao_Paulo" , 0x0350A7 }, + { (char*) "America/Scoresbysund" , 0x03567F }, + { (char*) "America/Shiprock" , 0x035E16 }, + { (char*) "America/Sitka" , 0x0367BE }, + { (char*) "America/St_Barthelemy" , 0x0370F6 }, + { (char*) "America/St_Johns" , 0x0371F8 }, + { (char*) "America/St_Kitts" , 0x03806D }, + { (char*) "America/St_Lucia" , 0x03810D }, + { (char*) "America/St_Thomas" , 0x0381CF }, + { (char*) "America/St_Vincent" , 0x03826F }, + { (char*) "America/Swift_Current" , 0x038331 }, + { (char*) "America/Tegucigalpa" , 0x03857F }, + { (char*) "America/Thule" , 0x038687 }, + { (char*) "America/Thunder_Bay" , 0x038C7F }, + { (char*) "America/Tijuana" , 0x039A31 }, + { (char*) "America/Toronto" , 0x03A3A4 }, + { (char*) "America/Tortola" , 0x03B173 }, + { (char*) "America/Vancouver" , 0x03B213 }, + { (char*) "America/Virgin" , 0x03BD84 }, + { (char*) "America/Whitehorse" , 0x03BE86 }, + { (char*) "America/Winnipeg" , 0x03C4F2 }, + { (char*) "America/Yakutat" , 0x03D04F }, + { (char*) "America/Yellowknife" , 0x03D96C }, + { (char*) "Antarctica/Casey" , 0x03E13D }, + { (char*) "Antarctica/Davis" , 0x03E2C0 }, + { (char*) "Antarctica/DumontDUrville" , 0x03E3EC }, + { (char*) "Antarctica/Macquarie" , 0x03E4BC }, + { (char*) "Antarctica/Mawson" , 0x03EDAC }, + { (char*) "Antarctica/McMurdo" , 0x03EE77 }, + { (char*) "Antarctica/Palmer" , 0x03F672 }, + { (char*) "Antarctica/Rothera" , 0x03FC00 }, + { (char*) "Antarctica/South_Pole" , 0x03FCA9 }, + { (char*) "Antarctica/Syowa" , 0x04063A }, + { (char*) "Antarctica/Troll" , 0x0406E2 }, + { (char*) "Antarctica/Vostok" , 0x040B6F }, + { (char*) "Arctic/Longyearbyen" , 0x040C18 }, + { (char*) "Asia/Aden" , 0x04151E }, + { (char*) "Asia/Almaty" , 0x0415C1 }, + { (char*) "Asia/Amman" , 0x0419BB }, + { (char*) "Asia/Anadyr" , 0x041F60 }, + { (char*) "Asia/Aqtau" , 0x042415 }, + { (char*) "Asia/Aqtobe" , 0x0427FF }, + { (char*) "Asia/Ashgabat" , 0x042BFD }, + { (char*) "Asia/Ashkhabad" , 0x042E66 }, + { (char*) "Asia/Atyrau" , 0x0430CF }, + { (char*) "Asia/Baghdad" , 0x0434C1 }, + { (char*) "Asia/Bahrain" , 0x043896 }, + { (char*) "Asia/Baku" , 0x043981 }, + { (char*) "Asia/Bangkok" , 0x043E4A }, + { (char*) "Asia/Barnaul" , 0x043F0F }, + { (char*) "Asia/Beirut" , 0x0443E0 }, + { (char*) "Asia/Bishkek" , 0x044C56 }, + { (char*) "Asia/Brunei" , 0x04502B }, + { (char*) "Asia/Calcutta" , 0x0450F4 }, + { (char*) "Asia/Chita" , 0x04521D }, + { (char*) "Asia/Choibalsan" , 0x0456F4 }, + { (char*) "Asia/Chongqing" , 0x045AB9 }, + { (char*) "Asia/Chungking" , 0x045CF6 }, + { (char*) "Asia/Colombo" , 0x045F33 }, + { (char*) "Asia/Dacca" , 0x0460A5 }, + { (char*) "Asia/Damascus" , 0x0461F4 }, + { (char*) "Asia/Dhaka" , 0x046951 }, + { (char*) "Asia/Dili" , 0x046AA0 }, + { (char*) "Asia/Dubai" , 0x046B81 }, + { (char*) "Asia/Dushanbe" , 0x046C24 }, + { (char*) "Asia/Famagusta" , 0x046E71 }, + { (char*) "Asia/Gaza" , 0x047678 }, + { (char*) "Asia/Harbin" , 0x048004 }, + { (char*) "Asia/Hebron" , 0x048241 }, + { (char*) "Asia/Ho_Chi_Minh" , 0x048BE8 }, + { (char*) "Asia/Hong_Kong" , 0x048D45 }, + { (char*) "Asia/Hovd" , 0x049222 }, + { (char*) "Asia/Irkutsk" , 0x0495C6 }, + { (char*) "Asia/Istanbul" , 0x049AB9 }, + { (char*) "Asia/Jakarta" , 0x04A252 }, + { (char*) "Asia/Jayapura" , 0x04A3EA }, + { (char*) "Asia/Jerusalem" , 0x04A509 }, + { (char*) "Asia/Kabul" , 0x04AE69 }, + { (char*) "Asia/Kamchatka" , 0x04AF37 }, + { (char*) "Asia/Karachi" , 0x04B3D5 }, + { (char*) "Asia/Kashgar" , 0x04B55C }, + { (char*) "Asia/Kathmandu" , 0x04B5FF }, + { (char*) "Asia/Katmandu" , 0x04B6D1 }, + { (char*) "Asia/Khandyga" , 0x04B7A3 }, + { (char*) "Asia/Kolkata" , 0x04BCB6 }, + { (char*) "Asia/Krasnoyarsk" , 0x04BDDF }, + { (char*) "Asia/Kuala_Lumpur" , 0x04C2AD }, + { (char*) "Asia/Kuching" , 0x04C43E }, + { (char*) "Asia/Kuwait" , 0x04C62D }, + { (char*) "Asia/Macao" , 0x04C6D0 }, + { (char*) "Asia/Macau" , 0x04CBA7 }, + { (char*) "Asia/Magadan" , 0x04D07E }, + { (char*) "Asia/Makassar" , 0x04D552 }, + { (char*) "Asia/Manila" , 0x04D6A5 }, + { (char*) "Asia/Muscat" , 0x04D7F9 }, + { (char*) "Asia/Nicosia" , 0x04D89C }, + { (char*) "Asia/Novokuznetsk" , 0x04E08D }, + { (char*) "Asia/Novosibirsk" , 0x04E529 }, + { (char*) "Asia/Omsk" , 0x04EA00 }, + { (char*) "Asia/Oral" , 0x04EEC2 }, + { (char*) "Asia/Phnom_Penh" , 0x04F2BC }, + { (char*) "Asia/Pontianak" , 0x04F3E1 }, + { (char*) "Asia/Pyongyang" , 0x04F564 }, + { (char*) "Asia/Qatar" , 0x04F65D }, + { (char*) "Asia/Qostanay" , 0x04F722 }, + { (char*) "Asia/Qyzylorda" , 0x04FB2D }, + { (char*) "Asia/Rangoon" , 0x04FF49 }, + { (char*) "Asia/Riyadh" , 0x050053 }, + { (char*) "Asia/Saigon" , 0x0500F6 }, + { (char*) "Asia/Sakhalin" , 0x050253 }, + { (char*) "Asia/Samarkand" , 0x05071B }, + { (char*) "Asia/Seoul" , 0x05096B }, + { (char*) "Asia/Shanghai" , 0x050BE0 }, + { (char*) "Asia/Singapore" , 0x050E29 }, + { (char*) "Asia/Srednekolymsk" , 0x050FA6 }, + { (char*) "Asia/Taipei" , 0x05147E }, + { (char*) "Asia/Tashkent" , 0x051783 }, + { (char*) "Asia/Tbilisi" , 0x0519E1 }, + { (char*) "Asia/Tehran" , 0x051DEA }, + { (char*) "Asia/Tel_Aviv" , 0x0522D6 }, + { (char*) "Asia/Thimbu" , 0x052C36 }, + { (char*) "Asia/Thimphu" , 0x052CFF }, + { (char*) "Asia/Tokyo" , 0x052DC8 }, + { (char*) "Asia/Tomsk" , 0x052F09 }, + { (char*) "Asia/Ujung_Pandang" , 0x0533DA }, + { (char*) "Asia/Ulaanbaatar" , 0x0534E4 }, + { (char*) "Asia/Ulan_Bator" , 0x053872 }, + { (char*) "Asia/Urumqi" , 0x053BEB }, + { (char*) "Asia/Ust-Nera" , 0x053C9B }, + { (char*) "Asia/Vientiane" , 0x054191 }, + { (char*) "Asia/Vladivostok" , 0x0542D2 }, + { (char*) "Asia/Yakutsk" , 0x05479B }, + { (char*) "Asia/Yangon" , 0x054C63 }, + { (char*) "Asia/Yekaterinburg" , 0x054D6D }, + { (char*) "Asia/Yerevan" , 0x055254 }, + { (char*) "Atlantic/Azores" , 0x0556D1 }, + { (char*) "Atlantic/Bermuda" , 0x05648D }, + { (char*) "Atlantic/Canary" , 0x056DF5 }, + { (char*) "Atlantic/Cape_Verde" , 0x057578 }, + { (char*) "Atlantic/Faeroe" , 0x057684 }, + { (char*) "Atlantic/Faroe" , 0x057DA7 }, + { (char*) "Atlantic/Jan_Mayen" , 0x0584CA }, + { (char*) "Atlantic/Madeira" , 0x058DD0 }, + { (char*) "Atlantic/Reykjavik" , 0x059B9A }, + { (char*) "Atlantic/South_Georgia" , 0x05A030 }, + { (char*) "Atlantic/St_Helena" , 0x05A0D2 }, + { (char*) "Atlantic/Stanley" , 0x05A194 }, + { (char*) "Australia/ACT" , 0x05A650 }, + { (char*) "Australia/Adelaide" , 0x05AEEA }, + { (char*) "Australia/Brisbane" , 0x05B7A5 }, + { (char*) "Australia/Broken_Hill" , 0x05B96B }, + { (char*) "Australia/Canberra" , 0x05C248 }, + { (char*) "Australia/Currie" , 0x05CAE2 }, + { (char*) "Australia/Darwin" , 0x05D424 }, + { (char*) "Australia/Eucla" , 0x05D587 }, + { (char*) "Australia/Hobart" , 0x05D774 }, + { (char*) "Australia/LHI" , 0x05E0BE }, + { (char*) "Australia/Lindeman" , 0x05E800 }, + { (char*) "Australia/Lord_Howe" , 0x05EA06 }, + { (char*) "Australia/Melbourne" , 0x05F158 }, + { (char*) "Australia/North" , 0x05F9FA }, + { (char*) "Australia/NSW" , 0x05FB4B }, + { (char*) "Australia/Perth" , 0x0603E5 }, + { (char*) "Australia/Queensland" , 0x0605CD }, + { (char*) "Australia/South" , 0x06077C }, + { (char*) "Australia/Sydney" , 0x061028 }, + { (char*) "Australia/Tasmania" , 0x0618DE }, + { (char*) "Australia/Victoria" , 0x062220 }, + { (char*) "Australia/West" , 0x062ABA }, + { (char*) "Australia/Yancowinna" , 0x062C84 }, + { (char*) "Brazil/Acre" , 0x063545 }, + { (char*) "Brazil/DeNoronha" , 0x0637B7 }, + { (char*) "Brazil/East" , 0x063A81 }, + { (char*) "Brazil/West" , 0x064023 }, + { (char*) "Canada/Atlantic" , 0x06427D }, + { (char*) "Canada/Central" , 0x064FE9 }, + { (char*) "Canada/Eastern" , 0x065B29 }, + { (char*) "Canada/Mountain" , 0x0668DB }, + { (char*) "Canada/Newfoundland" , 0x067203 }, + { (char*) "Canada/Pacific" , 0x068056 }, + { (char*) "Canada/Saskatchewan" , 0x068BAE }, + { (char*) "Canada/Yukon" , 0x068F8E }, + { (char*) "CET" , 0x0695E8 }, + { (char*) "Chile/Continental" , 0x069E22 }, + { (char*) "Chile/EasterIsland" , 0x06A801 }, + { (char*) "CST6CDT" , 0x06B0B8 }, + { (char*) "Cuba" , 0x06B9CA }, + { (char*) "EET" , 0x06C346 }, + { (char*) "Egypt" , 0x06CAC6 }, + { (char*) "Eire" , 0x06D275 }, + { (char*) "EST" , 0x06E025 }, + { (char*) "EST5EDT" , 0x06E0A3 }, + { (char*) "Etc/GMT" , 0x06E9B5 }, + { (char*) "Etc/GMT+0" , 0x06EA33 }, + { (char*) "Etc/GMT+1" , 0x06EAB1 }, + { (char*) "Etc/GMT+10" , 0x06EB31 }, + { (char*) "Etc/GMT+11" , 0x06EBB2 }, + { (char*) "Etc/GMT+12" , 0x06EC33 }, + { (char*) "Etc/GMT+2" , 0x06ECB4 }, + { (char*) "Etc/GMT+3" , 0x06ED34 }, + { (char*) "Etc/GMT+4" , 0x06EDB4 }, + { (char*) "Etc/GMT+5" , 0x06EE34 }, + { (char*) "Etc/GMT+6" , 0x06EEB4 }, + { (char*) "Etc/GMT+7" , 0x06EF34 }, + { (char*) "Etc/GMT+8" , 0x06EFB4 }, + { (char*) "Etc/GMT+9" , 0x06F034 }, + { (char*) "Etc/GMT-0" , 0x06F0B4 }, + { (char*) "Etc/GMT-1" , 0x06F132 }, + { (char*) "Etc/GMT-10" , 0x06F1B3 }, + { (char*) "Etc/GMT-11" , 0x06F235 }, + { (char*) "Etc/GMT-12" , 0x06F2B7 }, + { (char*) "Etc/GMT-13" , 0x06F339 }, + { (char*) "Etc/GMT-14" , 0x06F3BB }, + { (char*) "Etc/GMT-2" , 0x06F43D }, + { (char*) "Etc/GMT-3" , 0x06F4BE }, + { (char*) "Etc/GMT-4" , 0x06F53F }, + { (char*) "Etc/GMT-5" , 0x06F5C0 }, + { (char*) "Etc/GMT-6" , 0x06F641 }, + { (char*) "Etc/GMT-7" , 0x06F6C2 }, + { (char*) "Etc/GMT-8" , 0x06F743 }, + { (char*) "Etc/GMT-9" , 0x06F7C4 }, + { (char*) "Etc/GMT0" , 0x06F845 }, + { (char*) "Etc/Greenwich" , 0x06F8C3 }, + { (char*) "Etc/UCT" , 0x06F941 }, + { (char*) "Etc/Universal" , 0x06F9BF }, + { (char*) "Etc/UTC" , 0x06FA3D }, + { (char*) "Etc/Zulu" , 0x06FABB }, + { (char*) "Europe/Amsterdam" , 0x06FB39 }, + { (char*) "Europe/Andorra" , 0x0706A3 }, + { (char*) "Europe/Astrakhan" , 0x070D7D }, + { (char*) "Europe/Athens" , 0x07121A }, + { (char*) "Europe/Belfast" , 0x071AFC }, + { (char*) "Europe/Belgrade" , 0x072958 }, + { (char*) "Europe/Berlin" , 0x0730E4 }, + { (char*) "Europe/Bratislava" , 0x0739FE }, + { (char*) "Europe/Brussels" , 0x074307 }, + { (char*) "Europe/Bucharest" , 0x074E88 }, + { (char*) "Europe/Budapest" , 0x07571C }, + { (char*) "Europe/Busingen" , 0x076068 }, + { (char*) "Europe/Chisinau" , 0x0767F1 }, + { (char*) "Europe/Copenhagen" , 0x077153 }, + { (char*) "Europe/Dublin" , 0x0779B8 }, + { (char*) "Europe/Gibraltar" , 0x078768 }, + { (char*) "Europe/Guernsey" , 0x079370 }, + { (char*) "Europe/Helsinki" , 0x07A210 }, + { (char*) "Europe/Isle_of_Man" , 0x07A988 }, + { (char*) "Europe/Istanbul" , 0x07B7D4 }, + { (char*) "Europe/Jersey" , 0x07BF6D }, + { (char*) "Europe/Kaliningrad" , 0x07CE0D }, + { (char*) "Europe/Kiev" , 0x07D402 }, + { (char*) "Europe/Kirov" , 0x07DC56 }, + { (char*) "Europe/Kyiv" , 0x07E0E3 }, + { (char*) "Europe/Lisbon" , 0x07E94B }, + { (char*) "Europe/Ljubljana" , 0x07F713 }, + { (char*) "Europe/London" , 0x07FE9F }, + { (char*) "Europe/Luxembourg" , 0x080CFB }, + { (char*) "Europe/Madrid" , 0x081889 }, + { (char*) "Europe/Malta" , 0x0822DB }, + { (char*) "Europe/Mariehamn" , 0x082D23 }, + { (char*) "Europe/Minsk" , 0x08349B }, + { (char*) "Europe/Monaco" , 0x0839C2 }, + { (char*) "Europe/Moscow" , 0x08454E }, + { (char*) "Europe/Nicosia" , 0x084B6D }, + { (char*) "Europe/Oslo" , 0x08534B }, + { (char*) "Europe/Paris" , 0x085C0B }, + { (char*) "Europe/Podgorica" , 0x0867A9 }, + { (char*) "Europe/Prague" , 0x086F35 }, + { (char*) "Europe/Riga" , 0x08783E }, + { (char*) "Europe/Rome" , 0x0880E0 }, + { (char*) "Europe/Samara" , 0x088B3D }, + { (char*) "Europe/San_Marino" , 0x089013 }, + { (char*) "Europe/Sarajevo" , 0x089A70 }, + { (char*) "Europe/Saratov" , 0x08A1FC }, + { (char*) "Europe/Simferopol" , 0x08A6A9 }, + { (char*) "Europe/Skopje" , 0x08AC78 }, + { (char*) "Europe/Sofia" , 0x08B404 }, + { (char*) "Europe/Stockholm" , 0x08BC2D }, + { (char*) "Europe/Tallinn" , 0x08C3AE }, + { (char*) "Europe/Tirane" , 0x08CC1E }, + { (char*) "Europe/Tiraspol" , 0x08D44E }, + { (char*) "Europe/Ulyanovsk" , 0x08DDB0 }, + { (char*) "Europe/Uzhgorod" , 0x08E2B3 }, + { (char*) "Europe/Vaduz" , 0x08EB07 }, + { (char*) "Europe/Vatican" , 0x08F273 }, + { (char*) "Europe/Vienna" , 0x08FCD0 }, + { (char*) "Europe/Vilnius" , 0x090574 }, + { (char*) "Europe/Volgograd" , 0x090DF2 }, + { (char*) "Europe/Warsaw" , 0x09128F }, + { (char*) "Europe/Zagreb" , 0x091CF9 }, + { (char*) "Europe/Zaporozhye" , 0x092485 }, + { (char*) "Europe/Zurich" , 0x092CD9 }, + { (char*) "Factory" , 0x09345A }, + { (char*) "GB" , 0x0934DA }, + { (char*) "GB-Eire" , 0x094336 }, + { (char*) "GMT" , 0x095192 }, + { (char*) "GMT+0" , 0x095210 }, + { (char*) "GMT-0" , 0x09528E }, + { (char*) "GMT0" , 0x09530C }, + { (char*) "Greenwich" , 0x09538A }, + { (char*) "Hongkong" , 0x095408 }, + { (char*) "HST" , 0x0958E5 }, + { (char*) "Iceland" , 0x095964 }, + { (char*) "Indian/Antananarivo" , 0x095A04 }, + { (char*) "Indian/Chagos" , 0x095AEB }, + { (char*) "Indian/Christmas" , 0x095BB0 }, + { (char*) "Indian/Cocos" , 0x095C53 }, + { (char*) "Indian/Comoro" , 0x095CFF }, + { (char*) "Indian/Kerguelen" , 0x095DA0 }, + { (char*) "Indian/Mahe" , 0x095E43 }, + { (char*) "Indian/Maldives" , 0x095EE6 }, + { (char*) "Indian/Mauritius" , 0x095FAB }, + { (char*) "Indian/Mayotte" , 0x09609A }, + { (char*) "Indian/Reunion" , 0x09613B }, + { (char*) "Iran" , 0x0961DE }, + { (char*) "Israel" , 0x0966CA }, + { (char*) "Jamaica" , 0x09702A }, + { (char*) "Japan" , 0x097218 }, + { (char*) "Kwajalein" , 0x097359 }, + { (char*) "Libya" , 0x097493 }, + { (char*) "MET" , 0x097710 }, + { (char*) "Mexico/BajaNorte" , 0x097F4A }, + { (char*) "Mexico/BajaSur" , 0x09889C }, + { (char*) "Mexico/General" , 0x098D10 }, + { (char*) "MST" , 0x0991E2 }, + { (char*) "MST7MDT" , 0x099260 }, + { (char*) "Navajo" , 0x099B72 }, + { (char*) "NZ" , 0x09A51A }, + { (char*) "NZ-CHAT" , 0x09AEAB }, + { (char*) "Pacific/Apia" , 0x09B6BD }, + { (char*) "Pacific/Auckland" , 0x09B91F }, + { (char*) "Pacific/Bougainville" , 0x09C2C8 }, + { (char*) "Pacific/Chatham" , 0x09C3DE }, + { (char*) "Pacific/Chuuk" , 0x09CBFF }, + { (char*) "Pacific/Easter" , 0x09CD19 }, + { (char*) "Pacific/Efate" , 0x09D5DD }, + { (char*) "Pacific/Enderbury" , 0x09D7F5 }, + { (char*) "Pacific/Fakaofo" , 0x09D8DD }, + { (char*) "Pacific/Fiji" , 0x09D9A3 }, + { (char*) "Pacific/Funafuti" , 0x09DBE3 }, + { (char*) "Pacific/Galapagos" , 0x09DC87 }, + { (char*) "Pacific/Gambier" , 0x09DD84 }, + { (char*) "Pacific/Guadalcanal" , 0x09DE35 }, + { (char*) "Pacific/Guam" , 0x09DED9 }, + { (char*) "Pacific/Honolulu" , 0x09E0D3 }, + { (char*) "Pacific/Johnston" , 0x09E22E }, + { (char*) "Pacific/Kanton" , 0x09E383 }, + { (char*) "Pacific/Kiritimati" , 0x09E47A }, + { (char*) "Pacific/Kosrae" , 0x09E572 }, + { (char*) "Pacific/Kwajalein" , 0x09E6D5 }, + { (char*) "Pacific/Majuro" , 0x09E818 }, + { (char*) "Pacific/Marquesas" , 0x09E969 }, + { (char*) "Pacific/Midway" , 0x09EA25 }, + { (char*) "Pacific/Nauru" , 0x09EB18 }, + { (char*) "Pacific/Niue" , 0x09EC12 }, + { (char*) "Pacific/Norfolk" , 0x09ECDB }, + { (char*) "Pacific/Noumea" , 0x09F049 }, + { (char*) "Pacific/Pago_Pago" , 0x09F177 }, + { (char*) "Pacific/Palau" , 0x09F232 }, + { (char*) "Pacific/Pitcairn" , 0x09F2E4 }, + { (char*) "Pacific/Pohnpei" , 0x09F3AC }, + { (char*) "Pacific/Ponape" , 0x09F4E7 }, + { (char*) "Pacific/Port_Moresby" , 0x09F58B }, + { (char*) "Pacific/Rarotonga" , 0x09F660 }, + { (char*) "Pacific/Saipan" , 0x09F8B9 }, + { (char*) "Pacific/Samoa" , 0x09FAA5 }, + { (char*) "Pacific/Tahiti" , 0x09FB60 }, + { (char*) "Pacific/Tarawa" , 0x09FC12 }, + { (char*) "Pacific/Tongatapu" , 0x09FCC5 }, + { (char*) "Pacific/Truk" , 0x09FE37 }, + { (char*) "Pacific/Wake" , 0x09FEEF }, + { (char*) "Pacific/Wallis" , 0x09FF9E }, + { (char*) "Pacific/Yap" , 0x0A0042 }, + { (char*) "Poland" , 0x0A00FA }, + { (char*) "Portugal" , 0x0A0B64 }, + { (char*) "PRC" , 0x0A1919 }, + { (char*) "PST8PDT" , 0x0A1B56 }, + { (char*) "ROC" , 0x0A2468 }, + { (char*) "ROK" , 0x0A276D }, + { (char*) "Singapore" , 0x0A29E2 }, + { (char*) "Turkey" , 0x0A2B5F }, + { (char*) "UCT" , 0x0A32F8 }, + { (char*) "Universal" , 0x0A3376 }, + { (char*) "US/Alaska" , 0x0A33F4 }, + { (char*) "US/Aleutian" , 0x0A3D43 }, + { (char*) "US/Arizona" , 0x0A4683 }, + { (char*) "US/Central" , 0x0A47F7 }, + { (char*) "US/East-Indiana" , 0x0A560B }, + { (char*) "US/Eastern" , 0x0A5CA9 }, + { (char*) "US/Hawaii" , 0x0A6A95 }, + { (char*) "US/Indiana-Starke" , 0x0A6BEA }, + { (char*) "US/Michigan" , 0x0A7582 }, + { (char*) "US/Mountain" , 0x0A7E44 }, + { (char*) "US/Pacific" , 0x0A87EC }, + { (char*) "US/Samoa" , 0x0A931C }, + { (char*) "UTC" , 0x0A93D7 }, + { (char*) "W-SU" , 0x0A9455 }, + { (char*) "WET" , 0x0A9A60 }, + { (char*) "Zulu" , 0x0AA1DD }, }; -const unsigned char timelib_timezone_db_data_builtin[701301] = { +const unsigned char timelib_timezone_db_data_builtin[696923] = { /* Africa/Abidjan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -24027,18 +24311,22 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Africa/Asmera */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, -0xC0, 0xAF, 0xF2, 0x98, 0x01, 0x02, 0x00, 0x00, 0x24, 0x74, 0x00, 0x00, 0x00, 0x00, 0x24, 0x68, -0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x4D, 0x54, -0x00, 0x45, 0x41, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x8B, 0xFF, 0xD1, 0xFC, +0xB1, 0xEE, 0xDA, 0x58, 0xB4, 0xC7, 0xE0, 0xD0, 0xC1, 0xED, 0xAD, 0x58, 0xCC, 0x6C, 0x7A, 0xD4, +0x01, 0x02, 0x01, 0x03, 0x02, 0x00, 0x00, 0x22, 0x84, 0x00, 0x00, 0x00, 0x00, 0x23, 0x28, 0x00, +0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0A, 0x00, 0x00, 0x26, 0xAC, 0x00, 0x0E, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x33, 0x30, 0x00, 0x45, 0x41, 0x54, +0x00, 0x2B, 0x30, 0x32, 0x34, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, -0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0x43, 0xE8, 0x19, 0x8C, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0xB7, -0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xAF, 0xF2, 0x98, 0x01, 0x02, 0x03, 0x00, 0x00, 0x24, 0x74, -0x00, 0x00, 0x00, 0x00, 0x24, 0x74, 0x00, 0x04, 0x00, 0x00, 0x24, 0x68, 0x00, 0x08, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x41, 0x44, 0x4D, 0x54, -0x00, 0x45, 0x41, 0x54, 0x00, 0x0A, 0x45, 0x41, 0x54, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, +0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xFF, 0xD1, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, +0xEE, 0xDA, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0xC7, 0xE0, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, +0xED, 0xAD, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0x7A, 0xD4, 0x01, 0x02, 0x01, 0x03, 0x02, +0x00, 0x00, 0x22, 0x84, 0x00, 0x00, 0x00, 0x00, 0x23, 0x28, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x0A, 0x00, 0x00, 0x26, 0xAC, 0x00, 0x0E, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0A, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x32, 0x33, 0x30, 0x00, 0x45, 0x41, 0x54, 0x00, 0x2B, 0x30, 0x32, 0x34, +0x35, 0x00, 0x0A, 0x45, 0x41, 0x54, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, /* Africa/Bamako */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -25292,18 +25580,15 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Africa/Timbuktu */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xE6, 0x96, 0x00, -0xBC, 0x92, 0xB8, 0x80, 0xEE, 0x11, 0x87, 0x10, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, -0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0x92, 0x48, +0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x47, 0x4D, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, -0xE6, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x92, 0xB8, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, -0x11, 0x87, 0x10, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, -0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x0A, 0x47, 0x4D, 0x54, 0x30, 0x0A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x92, 0x48, 0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, +0x4D, 0x54, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* Africa/Tripoli */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -25792,7 +26077,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Araguaina */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x74, 0x30, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x74, 0x30, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -25805,53 +26090,52 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x34, 0x38, 0x54, 0x30, 0x34, 0xF8, 0xC1, 0x20, 0x36, 0x20, 0x1F, 0x30, 0x36, 0xCF, 0x68, 0xA0, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x3A, 0x8F, 0x2C, 0xA0, 0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x3D, 0xC4, 0x91, 0x30, 0x3E, 0x4E, 0xF0, 0xA0, -0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, +0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD2, 0xD0, 0x00, +0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, +0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x74, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, +0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, +0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x32, 0x57, 0x20, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x6A, 0x20, 0x00, 0x00, 0x00, +0x00, 0x34, 0x38, 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xC1, 0x20, 0x00, 0x00, 0x00, +0x00, 0x36, 0x20, 0x1F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x68, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, +0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x2C, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xC4, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xF0, 0xA0, 0x00, 0x00, 0x00, +0x00, 0x50, 0x83, 0x65, 0x30, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x39, 0xA0, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD2, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x34, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, -0x74, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, -0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, -0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, -0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, -0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, -0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, -0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, -0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, -0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, -0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, -0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, -0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, -0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, -0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, -0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, -0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, -0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, -0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x20, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, -0x6A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, -0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, 0x1F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, -0x68, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, -0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, -0x2C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, -0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, -0xF0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0x65, 0x30, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, -0x39, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, -0xD2, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x7E, 0x57, 0xC0, 0x00, 0xC9, 0x1C, 0x60, 0x00, 0x00, 0x00, 0x09, -0x54, 0x6F, 0x63, 0x61, 0x6E, 0x74, 0x69, 0x6E, 0x73, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x7E, 0x57, 0xC0, 0x00, 0xC9, 0x1C, 0x60, 0x00, 0x00, +0x00, 0x09, 0x54, 0x6F, 0x63, 0x61, 0x6E, 0x74, 0x69, 0x6E, 0x73, /* America/Argentina/Buenos_Aires */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -25867,17 +26151,371 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xF1, 0x30, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC9, +0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xA8, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC9, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x54, 0x88, 0xA0, 0x00, 0xB9, 0x78, 0x78, 0x00, 0x00, +0x00, 0x15, 0x42, 0x75, 0x65, 0x6E, 0x6F, 0x73, 0x20, 0x41, 0x69, 0x72, 0x65, 0x73, 0x20, 0x28, +0x42, 0x41, 0x2C, 0x20, 0x43, 0x46, 0x29, + +/* America/Argentina/Catamarca */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, +0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, +0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, +0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, +0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, +0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, +0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, +0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, +0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, +0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, +0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, +0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, +0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, +0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x5D, 0xE4, 0x75, 0x00, 0xAE, 0x47, 0xE2, 0x00, 0x00, +0x00, 0x1B, 0x43, 0x61, 0x74, 0x61, 0x6D, 0x61, 0x72, 0x63, 0x61, 0x20, 0x28, 0x43, 0x54, 0x29, +0x3B, 0x20, 0x43, 0x68, 0x75, 0x62, 0x75, 0x74, 0x20, 0x28, 0x43, 0x48, 0x29, + +/* America/Argentina/ComodRivadavia */ +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, +0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, +0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, +0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, +0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, +0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, +0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, +0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, +0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, +0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, +0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, +0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, +0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, +0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, + +/* America/Argentina/Cordoba */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, +0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, +0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, +0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, +0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, +0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, +0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, +0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, +0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, +0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, +0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, +0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC3, +0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAD, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, +0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x59, 0x6A, 0xA0, 0x00, 0xB0, 0xB8, 0xE2, 0x00, 0x00, +0x00, 0x36, 0x41, 0x72, 0x67, 0x65, 0x6E, 0x74, 0x69, 0x6E, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, +0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x3A, 0x20, 0x43, 0x42, 0x2C, 0x20, 0x43, 0x43, 0x2C, +0x20, 0x43, 0x4E, 0x2C, 0x20, 0x45, 0x52, 0x2C, 0x20, 0x46, 0x4D, 0x2C, 0x20, 0x4D, 0x4E, 0x2C, +0x20, 0x53, 0x45, 0x2C, 0x20, 0x53, 0x46, 0x29, + +/* America/Argentina/Jujuy */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, +0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, +0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, +0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, +0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, +0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, +0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, +0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, +0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, +0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, +0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, +0x27, 0x2A, 0x57, 0xC0, 0x27, 0xE2, 0xDB, 0xB0, 0x28, 0xEE, 0x8A, 0x40, 0x29, 0xB0, 0x3A, 0xA0, +0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, +0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, +0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, +0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, +0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAE, 0xB8, 0xFF, +0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x2A, 0x57, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xE2, 0xDB, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x28, 0xEE, 0x8A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, +0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, +0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, +0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, +0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x64, 0x6D, 0xA2, 0x00, 0xAF, +0x04, 0xB0, 0x00, 0x00, 0x00, 0x0A, 0x4A, 0x75, 0x6A, 0x75, 0x79, 0x20, 0x28, 0x4A, 0x59, 0x29, + + +/* America/Argentina/La_Rioja */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, +0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, +0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, +0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, +0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, +0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, +0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, +0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, +0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, +0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, +0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xCD, 0xB5, 0xA0, 0x28, 0x26, 0x26, 0x40, 0x29, 0x00, 0xF1, 0x30, +0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, +0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, +0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC9, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, +0x04, 0x05, 0xFF, 0xFF, 0xC1, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xA8, 0x4C, 0xFF, 0xFF, +0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB0, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, @@ -25902,28 +26540,27 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xB5, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x28, 0x26, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, +0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, +0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, 0x00, 0x00, +0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC9, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, +0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC1, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x54, 0x88, 0xA0, 0x00, 0xB9, 0x78, 0x78, 0x00, 0x00, 0x00, 0x15, -0x42, 0x75, 0x65, 0x6E, 0x6F, 0x73, 0x20, 0x41, 0x69, 0x72, 0x65, 0x73, 0x20, 0x28, 0x42, 0x41, -0x2C, 0x20, 0x43, 0x46, 0x29, +0x33, 0x3E, 0x33, 0x0A, 0x00, 0x5C, 0x6A, 0xDA, 0x00, 0xAC, 0xA7, 0x38, 0x00, 0x00, 0x00, 0x0D, +0x4C, 0x61, 0x20, 0x52, 0x69, 0x6F, 0x6A, 0x61, 0x20, 0x28, 0x4C, 0x52, 0x29, -/* America/Argentina/Catamarca */ +/* America/Argentina/Mendoza */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -25936,66 +26573,64 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, 0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, -0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x27, 0x19, 0x34, 0x40, 0x27, 0xCD, 0xC3, 0xB0, 0x28, 0xFA, 0x67, 0xC0, 0x29, 0xB0, 0x48, 0xB0, +0x2A, 0xE0, 0xE1, 0x40, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x40, 0xB0, 0x13, 0xB0, 0x41, 0x56, 0x3E, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, +0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0x2C, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x5D, 0xE4, 0x75, 0x00, 0xAE, 0x47, 0xE2, 0x00, 0x00, 0x00, 0x1B, -0x43, 0x61, 0x74, 0x61, 0x6D, 0x61, 0x72, 0x63, 0x61, 0x20, 0x28, 0x43, 0x54, 0x29, 0x3B, 0x20, -0x43, 0x68, 0x75, 0x62, 0x75, 0x74, 0x20, 0x28, 0x43, 0x48, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB2, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x19, 0x34, +0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xFA, 0x67, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xE1, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xB0, 0x13, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x56, 0x3E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x57, 0x27, 0x32, 0x00, 0xA9, 0xA6, 0xFD, 0x00, 0x00, +0x00, 0x0C, 0x4D, 0x65, 0x6E, 0x64, 0x6F, 0x7A, 0x61, 0x20, 0x28, 0x4D, 0x5A, 0x29, -/* America/Argentina/ComodRivadavia */ -0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +/* America/Argentina/Rio_Gallegos */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -26008,65 +26643,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, 0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xF1, 0x30, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, +0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0x2C, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB2, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x3A, 0x8A, 0xFA, 0x00, 0xA9, 0x0A, 0xBD, 0x00, 0x00, +0x00, 0x0F, 0x53, 0x61, 0x6E, 0x74, 0x61, 0x20, 0x43, 0x72, 0x75, 0x7A, 0x20, 0x28, 0x53, 0x43, +0x29, -/* America/Argentina/Cordoba */ +/* America/Argentina/Salta */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -26081,204 +26716,58 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, 0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAD, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x59, 0x6A, 0xA0, 0x00, 0xB0, 0xB8, 0xE2, 0x00, 0x00, 0x00, 0x36, -0x41, 0x72, 0x67, 0x65, 0x6E, 0x74, 0x69, 0x6E, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, -0x61, 0x72, 0x65, 0x61, 0x73, 0x3A, 0x20, 0x43, 0x42, 0x2C, 0x20, 0x43, 0x43, 0x2C, 0x20, 0x43, -0x4E, 0x2C, 0x20, 0x45, 0x52, 0x2C, 0x20, 0x46, 0x4D, 0x2C, 0x20, 0x4D, 0x4E, 0x2C, 0x20, 0x53, -0x45, 0x2C, 0x20, 0x53, 0x46, 0x29, - -/* America/Argentina/Jujuy */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, -0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, -0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, -0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, -0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, -0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, -0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, -0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, -0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, -0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, -0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x2A, 0x57, 0xC0, 0x27, 0xE2, 0xDB, 0xB0, 0x28, 0xEE, 0x8A, 0x40, 0x29, 0xB0, 0x3A, 0xA0, -0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x72, 0x9C, 0xAE, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x57, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x27, 0xE2, 0xDB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xEE, 0x8A, 0x40, 0x00, 0x00, 0x00, 0x00, -0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x64, 0x6D, 0xA2, 0x00, 0xAF, 0x04, 0xB0, -0x00, 0x00, 0x00, 0x0A, 0x4A, 0x75, 0x6A, 0x75, 0x79, 0x20, 0x28, 0x4A, 0x59, 0x29, - -/* America/Argentina/La_Rioja */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, -0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, -0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, -0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, -0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, -0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, -0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, -0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, -0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, -0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, -0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xCD, 0xB5, 0xA0, 0x28, 0x26, 0x26, 0x40, 0x29, 0x00, 0xF1, 0x30, -0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, -0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, -0x47, 0xDC, 0x7F, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, -0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC1, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, -0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, -0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, -0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, -0x9C, 0xB0, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, -0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, -0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, -0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, -0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, -0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, -0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, -0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, -0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, -0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, -0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, -0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, -0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, -0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, -0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, -0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, -0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, -0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, -0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, -0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, -0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, -0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, -0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, -0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, -0xCD, 0xB5, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x28, 0x26, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, -0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, -0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, -0xBB, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, -0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, +0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, +0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, +0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, +0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAE, 0xD4, 0xFF, +0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, +0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC1, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, -0x33, 0x0A, 0x00, 0x5C, 0x6A, 0xDA, 0x00, 0xAC, 0xA7, 0x38, 0x00, 0x00, 0x00, 0x0D, 0x4C, 0x61, -0x20, 0x52, 0x69, 0x6F, 0x6A, 0x61, 0x20, 0x28, 0x4C, 0x52, 0x29, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xAC, 0x00, 0x00, +0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, +0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x63, 0x83, 0x42, 0x00, 0xAE, +0xD7, 0x1D, 0x00, 0x00, 0x00, 0x16, 0x53, 0x61, 0x6C, 0x74, 0x61, 0x20, 0x28, 0x53, 0x41, 0x2C, +0x20, 0x4C, 0x50, 0x2C, 0x20, 0x4E, 0x51, 0x2C, 0x20, 0x52, 0x4E, 0x29, -/* America/Argentina/Mendoza */ +/* America/Argentina/San_Juan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, @@ -26294,20 +26783,20 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, 0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x19, 0x34, 0x40, 0x27, 0xCD, 0xC3, 0xB0, 0x28, 0xFA, 0x67, 0xC0, 0x29, 0xB0, 0x48, 0xB0, -0x2A, 0xE0, 0xE1, 0x40, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x40, 0xB0, 0x13, 0xB0, 0x41, 0x56, 0x3E, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xCD, 0xB5, 0xA0, 0x28, 0x26, 0x26, 0x40, 0x29, 0x00, 0xF1, 0x30, +0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, +0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBA, 0x9F, 0xB0, 0x41, 0x03, 0x30, 0x40, 0x47, 0x77, 0x09, 0xB0, +0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xBF, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, +0x04, 0x05, 0xFF, 0xFF, 0xBF, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB2, 0x04, 0xFF, 0xFF, +0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB1, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, @@ -26332,27 +26821,27 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x19, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xC3, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x28, 0xFA, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x48, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xE1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xB0, 0x13, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x56, 0x3E, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xB5, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x28, 0x26, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, +0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, +0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBA, 0x9F, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x41, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xBF, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, +0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x57, 0x27, 0x32, 0x00, 0xA9, 0xA6, 0xFD, 0x00, 0x00, 0x00, 0x0C, -0x4D, 0x65, 0x6E, 0x64, 0x6F, 0x7A, 0x61, 0x20, 0x28, 0x4D, 0x5A, 0x29, +0x33, 0x3E, 0x33, 0x0A, 0x00, 0x59, 0x36, 0x8A, 0x00, 0xAA, 0x1C, 0x2D, 0x00, 0x00, 0x00, 0x0D, +0x53, 0x61, 0x6E, 0x20, 0x4A, 0x75, 0x61, 0x6E, 0x20, 0x28, 0x53, 0x4A, 0x29, -/* America/Argentina/Rio_Gallegos */ +/* America/Argentina/San_Luis */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -26364,92 +26853,22 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xF1, 0x30, 0x29, 0xB0, 0x3A, 0xA0, -0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xFD, 0xA5, 0xA0, +0x27, 0x19, 0x34, 0x40, 0x27, 0xCD, 0xC3, 0xB0, 0x28, 0x47, 0x1B, 0xC0, 0x37, 0xF6, 0xC6, 0xB0, +0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBA, 0x9F, 0xB0, 0x41, 0x03, 0x30, 0x40, 0x47, 0x77, 0x09, 0xB0, +0x47, 0x93, 0xFC, 0xA0, 0x47, 0xD3, 0x52, 0xB0, 0x48, 0xF1, 0x76, 0x40, 0x49, 0xB3, 0x34, 0xB0, +0x4A, 0xD1, 0x58, 0x40, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xBF, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, +0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x03, 0x02, 0x03, +0x02, 0x05, 0xFF, 0xFF, 0xC1, 0xCC, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB2, 0x64, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xBF, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x3A, 0x8A, 0xFA, 0x00, 0xA9, 0x0A, 0xBD, 0x00, 0x00, 0x00, 0x0F, -0x53, 0x61, 0x6E, 0x74, 0x61, 0x20, 0x43, 0x72, 0x75, 0x7A, 0x20, 0x28, 0x53, 0x43, 0x29, - -/* America/Argentina/Salta */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, -0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, -0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, -0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, -0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, -0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, -0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, -0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, -0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, -0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, -0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, -0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xAC, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, +0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x72, 0x9C, 0xAE, 0xD4, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, +0x72, 0x9C, 0xAF, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, @@ -26473,24 +26892,25 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, -0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, -0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, +0x25, 0xFD, 0xA5, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x19, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, +0x27, 0xCD, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x28, 0x47, 0x1B, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x40, 0xBA, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, +0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x93, 0xFC, 0xA0, 0x00, 0x00, 0x00, 0x00, +0x47, 0xD3, 0x52, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, +0x49, 0xB3, 0x34, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xAC, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x63, 0x83, 0x42, 0x00, 0xAE, 0xD7, 0x1D, -0x00, 0x00, 0x00, 0x16, 0x53, 0x61, 0x6C, 0x74, 0x61, 0x20, 0x28, 0x53, 0x41, 0x2C, 0x20, 0x4C, -0x50, 0x2C, 0x20, 0x4E, 0x51, 0x2C, 0x20, 0x52, 0x4E, 0x29, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x05, 0xFF, 0xFF, 0xC1, 0xCC, 0x00, 0x00, +0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0xFF, 0xFF, +0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, +0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, +0x00, 0x56, 0x7D, 0xED, 0x00, 0xAD, 0x6A, 0x88, 0x00, 0x00, 0x00, 0x0D, 0x53, 0x61, 0x6E, 0x20, +0x4C, 0x75, 0x69, 0x73, 0x20, 0x28, 0x53, 0x4C, 0x29, -/* America/Argentina/San_Juan */ +/* America/Argentina/Tucuman */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, @@ -26506,21 +26926,21 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, 0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xCD, 0xB5, 0xA0, 0x28, 0x26, 0x26, 0x40, 0x29, 0x00, 0xF1, 0x30, -0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, -0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBA, 0x9F, 0xB0, 0x41, 0x03, 0x30, 0x40, 0x47, 0x77, 0x09, 0xB0, -0x47, 0xDC, 0x7F, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, +0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x40, 0xBB, 0xF1, 0x30, 0x40, 0xCB, 0xD1, 0x40, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, +0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, -0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xBF, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0xC3, +0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, +0x05, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xDC, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, -0x9C, 0xB1, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, +0x9C, 0xAE, 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, @@ -26545,27 +26965,27 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, -0xCD, 0xB5, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x28, 0x26, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, -0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, -0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, -0xBA, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, -0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, +0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, +0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, +0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, +0xCB, 0xD1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, +0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, +0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xBF, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, +0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, +0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xDC, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, -0x33, 0x0A, 0x00, 0x59, 0x36, 0x8A, 0x00, 0xAA, 0x1C, 0x2D, 0x00, 0x00, 0x00, 0x0D, 0x53, 0x61, -0x6E, 0x20, 0x4A, 0x75, 0x61, 0x6E, 0x20, 0x28, 0x53, 0x4A, 0x29, +0x33, 0x0A, 0x00, 0x60, 0x68, 0xFD, 0x00, 0xAF, 0x25, 0x3D, 0x00, 0x00, 0x00, 0x0C, 0x54, 0x75, +0x63, 0x75, 0x6D, 0x61, 0x6E, 0x20, 0x28, 0x54, 0x4D, 0x29, -/* America/Argentina/San_Luis */ +/* America/Argentina/Ushuaia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -26577,22 +26997,21 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xFD, 0xA5, 0xA0, -0x27, 0x19, 0x34, 0x40, 0x27, 0xCD, 0xC3, 0xB0, 0x28, 0x47, 0x1B, 0xC0, 0x37, 0xF6, 0xC6, 0xB0, -0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBA, 0x9F, 0xB0, 0x41, 0x03, 0x30, 0x40, 0x47, 0x77, 0x09, 0xB0, -0x47, 0x93, 0xFC, 0xA0, 0x47, 0xD3, 0x52, 0xB0, 0x48, 0xF1, 0x76, 0x40, 0x49, 0xB3, 0x34, 0xB0, -0x4A, 0xD1, 0x58, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, +0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xF1, 0x30, 0x29, 0xB0, 0x3A, 0xA0, +0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, +0x40, 0xB9, 0x4E, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x05, 0x03, 0x05, 0x02, 0x05, -0x04, 0x03, 0x02, 0x03, 0x02, 0x05, 0x05, 0xFF, 0xFF, 0xC1, 0xCC, 0x00, 0x00, 0xFF, 0xFF, 0xC3, -0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, -0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, +0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, -0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB1, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, @@ -26616,169 +27035,23 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xFD, 0xA5, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x19, 0x34, -0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x28, 0x47, 0x1B, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBA, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x03, 0x30, -0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x93, 0xFC, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x52, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, -0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x34, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, -0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xB9, 0x4E, +0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x03, 0x02, 0x03, 0x02, 0x05, 0x05, 0xFF, 0xFF, 0xC1, 0xCC, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, -0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, -0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x56, -0x7D, 0xED, 0x00, 0xAD, 0x6A, 0x88, 0x00, 0x00, 0x00, 0x0D, 0x53, 0x61, 0x6E, 0x20, 0x4C, 0x75, -0x69, 0x73, 0x20, 0x28, 0x53, 0x4C, 0x29, - -/* America/Argentina/Tucuman */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, -0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, -0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, -0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, -0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, -0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, -0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, -0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, -0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, -0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, -0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, -0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x40, 0xBB, 0xF1, 0x30, 0x40, 0xCB, 0xD1, 0x40, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xDC, -0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, -0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, -0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, -0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAE, 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, -0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, -0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, -0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, -0x00, 0x00, 0x00, 0x00, 0x40, 0xCB, 0xD1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x05, -0xFF, 0xFF, 0xC2, 0xDC, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, -0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, -0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, -0x00, 0x60, 0x68, 0xFD, 0x00, 0xAF, 0x25, 0x3D, 0x00, 0x00, 0x00, 0x0C, 0x54, 0x75, 0x63, 0x75, -0x6D, 0x61, 0x6E, 0x20, 0x28, 0x54, 0x4D, 0x29, - -/* America/Argentina/Ushuaia */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, -0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, -0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, -0xC0, 0x5A, 0x8F, 0xB0, 0xC1, 0x9D, 0x9D, 0x40, 0xC2, 0x3B, 0xC3, 0x30, 0xC3, 0x7E, 0xD0, 0xC0, -0xC4, 0x1C, 0xF6, 0xB0, 0xC5, 0x60, 0x04, 0x40, 0xC5, 0xFE, 0x2A, 0x30, 0xC7, 0x41, 0x37, 0xC0, -0xC7, 0xE0, 0xAF, 0x30, 0xC8, 0x81, 0x94, 0x40, 0xCA, 0x4D, 0xA1, 0xB0, 0xCA, 0xEE, 0x86, 0xC0, -0xCE, 0x4D, 0xFF, 0x30, 0xCE, 0xB0, 0xED, 0xC0, 0xD3, 0x29, 0x35, 0xB0, 0xD4, 0x43, 0x64, 0xC0, -0xF4, 0x3D, 0x08, 0x30, 0xF4, 0x9F, 0xF6, 0xC0, 0xF5, 0x05, 0x6C, 0x30, 0xF6, 0x32, 0x10, 0x40, -0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, -0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, -0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, -0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, -0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xF1, 0x30, 0x29, 0xB0, 0x3A, 0xA0, -0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x40, 0xB9, 0x4E, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xBF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB1, 0x88, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xB9, 0x4E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xBF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x35, 0xB6, 0x00, 0x00, 0xAA, 0x70, 0xD0, 0x00, 0x00, 0x00, 0x15, -0x54, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x64, 0x65, 0x6C, 0x20, 0x46, 0x75, 0x65, 0x67, 0x6F, -0x20, 0x28, 0x54, 0x46, 0x29, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x35, 0xB6, 0x00, 0x00, 0xAA, 0x70, 0xD0, 0x00, 0x00, +0x00, 0x15, 0x54, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x64, 0x65, 0x6C, 0x20, 0x46, 0x75, 0x65, +0x67, 0x6F, 0x20, 0x28, 0x54, 0x46, 0x29, /* America/Aruba */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26798,7 +27071,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Asuncion */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0xB8, 0x17, 0xF5, 0x90, 0x05, 0x2B, 0xDA, 0x40, 0x07, 0xFC, 0xF0, 0xB0, 0x0A, 0xCF, 0x74, 0xC0, 0x0B, 0x97, 0xCA, 0xB0, 0x0C, 0xB1, 0xF9, 0xC0, 0x0D, 0x78, 0xFE, 0x30, 0x0E, 0x93, 0x2D, 0x40, 0x0F, 0x5A, 0x31, 0xB0, 0x10, 0x74, 0x60, 0xC0, 0x11, 0x64, 0x43, 0xB0, 0x12, 0x55, 0x94, 0x40, @@ -26831,7 +27104,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x75, 0x11, 0x1C, 0x30, 0x76, 0x0A, 0x55, 0xC0, 0x76, 0xF0, 0xFE, 0x30, 0x77, 0xEA, 0x37, 0xC0, 0x78, 0xD0, 0xE0, 0x30, 0x79, 0xCA, 0x19, 0xC0, 0x7A, 0xB0, 0xC2, 0x30, 0x7B, 0xB3, 0x36, 0x40, 0x7C, 0x90, 0xA4, 0x30, 0x7D, 0x93, 0x18, 0x40, 0x7E, 0x70, 0x86, 0x30, 0x7F, 0x72, 0xFA, 0x40, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, @@ -26839,92 +27112,91 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x04, 0xFF, 0xFF, 0xC9, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xC9, 0xF0, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0xFF, 0xFF, -0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x11, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0x17, 0xF5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2B, 0xDA, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xFC, 0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCF, 0x74, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x0B, 0x97, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xB1, 0xF9, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x0D, 0x78, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x2D, 0x40, 0x00, 0x00, -0x00, 0x00, 0x0F, 0x5A, 0x31, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x60, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x11, 0x64, 0x43, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x55, 0x94, 0x40, 0x00, 0x00, -0x00, 0x00, 0x13, 0x46, 0xC8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x38, 0x19, 0x40, 0x00, 0x00, -0x00, 0x00, 0x15, 0x27, 0xFC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x16, 0x19, 0x4C, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x17, 0x09, 0x2F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x80, 0x40, 0x00, 0x00, -0x00, 0x00, 0x18, 0xEA, 0x63, 0x30, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0xB3, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x1A, 0xCC, 0xE8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBE, 0x38, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x1C, 0xAE, 0x1B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9F, 0x6C, 0x40, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x8F, 0x4F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x9F, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x70, 0x82, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x61, 0xD3, 0x40, 0x00, 0x00, -0x00, 0x00, 0x22, 0x53, 0x07, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x44, 0x58, 0x40, 0x00, 0x00, -0x00, 0x00, 0x24, 0x34, 0x3B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x41, 0x3B, 0x40, 0x00, 0x00, -0x00, 0x00, 0x26, 0x15, 0x6E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x06, 0xBF, 0x40, 0x00, 0x00, -0x00, 0x00, 0x27, 0xF6, 0xA2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xEE, 0x8A, 0x40, 0x00, 0x00, -0x00, 0x00, 0x29, 0xB0, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCF, 0xBD, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x2B, 0xB9, 0x09, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAB, 0xAB, 0x40, 0x00, 0x00, -0x00, 0x00, 0x2D, 0x70, 0x0C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8C, 0xDE, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x2F, 0x4F, 0xEE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6E, 0x12, 0x40, 0x00, 0x00, -0x00, 0x00, 0x31, 0x36, 0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x2E, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x33, 0x0F, 0xB2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x37, 0x10, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x34, 0xF8, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x16, 0xF2, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x36, 0xE1, 0xEB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xD4, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x38, 0xC1, 0xCD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD6, 0xB6, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x3A, 0xA1, 0xAF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0xD3, 0x40, 0x00, 0x00, -0x00, 0x00, 0x3C, 0xAF, 0xB6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x71, 0x90, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x3E, 0x8F, 0x98, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x5A, 0xAD, 0x40, 0x00, 0x00, -0x00, 0x00, 0x40, 0x6F, 0x7A, 0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0x71, 0xEE, 0x40, 0x00, 0x00, -0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, 0xD0, 0x40, 0x00, 0x00, -0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, -0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x1A, 0xCE, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0xD3, 0x52, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xB0, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x49, 0xB3, 0x34, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x92, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x4B, 0xC1, 0x3B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xA7, 0xFF, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x4D, 0xA1, 0x1D, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x87, 0xE1, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x4F, 0x80, 0xFF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x50, 0x70, 0xFE, 0x40, 0x00, 0x00, -0x00, 0x00, 0x51, 0x4E, 0x6C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x52, 0x50, 0xE0, 0x40, 0x00, 0x00, -0x00, 0x00, 0x53, 0x2E, 0x4E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x54, 0x30, 0xC2, 0x40, 0x00, 0x00, -0x00, 0x00, 0x55, 0x0E, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0x10, 0xA4, 0x40, 0x00, 0x00, -0x00, 0x00, 0x56, 0xF7, 0x4C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xF0, 0x86, 0x40, 0x00, 0x00, -0x00, 0x00, 0x58, 0xD7, 0x2E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xD0, 0x68, 0x40, 0x00, 0x00, -0x00, 0x00, 0x5A, 0xB7, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xB9, 0x84, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x5C, 0x96, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x99, 0x66, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x5E, 0x76, 0xD4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x79, 0x48, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x60, 0x5F, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x61, 0x59, 0x2A, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x62, 0x3F, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x63, 0x39, 0x0C, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x64, 0x1F, 0xB5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x65, 0x18, 0xEE, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x65, 0xFF, 0x97, 0x30, 0x00, 0x00, 0x00, 0x00, 0x67, 0x02, 0x0B, 0x40, 0x00, 0x00, -0x00, 0x00, 0x67, 0xDF, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x68, 0xE1, 0xED, 0x40, 0x00, 0x00, -0x00, 0x00, 0x69, 0xBF, 0x5B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xC1, 0xCF, 0x40, 0x00, 0x00, -0x00, 0x00, 0x6B, 0xA8, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xA1, 0xB1, 0x40, 0x00, 0x00, -0x00, 0x00, 0x6D, 0x88, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x81, 0x93, 0x40, 0x00, 0x00, -0x00, 0x00, 0x6F, 0x68, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x6A, 0xAF, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x71, 0x48, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x4A, 0x91, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x73, 0x27, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x2A, 0x73, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x75, 0x11, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x76, 0x0A, 0x55, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x76, 0xF0, 0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x77, 0xEA, 0x37, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x78, 0xD0, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x79, 0xCA, 0x19, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x7A, 0xB0, 0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xB3, 0x36, 0x40, 0x00, 0x00, -0x00, 0x00, 0x7C, 0x90, 0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x93, 0x18, 0x40, 0x00, 0x00, -0x00, 0x00, 0x7E, 0x70, 0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x72, 0xFA, 0x40, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x04, 0xFF, 0xFF, 0xC9, 0xF0, 0x00, 0x00, 0xFF, 0xFF, -0xC9, 0xF0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x41, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, -0x2F, 0x30, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x30, 0x2F, 0x30, 0x0A, 0x00, 0x62, 0xC6, 0x75, -0x00, 0xBA, 0xAA, 0x75, 0x00, 0x00, 0x00, 0x00, +0x04, 0xFF, 0xFF, 0xC9, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xC9, 0xF0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, +0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, +0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, +0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x11, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x17, 0xF5, +0x90, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2B, 0xDA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0xF0, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCF, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x97, 0xCA, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xB1, 0xF9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x78, 0xFE, +0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x2D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x5A, 0x31, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x43, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x55, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x13, 0x46, 0xC8, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x38, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xFC, +0x30, 0x00, 0x00, 0x00, 0x00, 0x16, 0x19, 0x4C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x09, 0x2F, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x63, +0x30, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0xE8, +0x30, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBE, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAE, 0x1B, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9F, 0x6C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8F, 0x4F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, 0x82, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x61, 0xD3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x53, 0x07, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x44, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x34, 0x3B, +0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x41, 0x3B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0x6E, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x06, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF6, 0xA2, +0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xEE, 0x8A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x48, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCF, 0xBD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB9, 0x09, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAB, 0xAB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x70, 0x0C, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8C, 0xDE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x4F, 0xEE, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6E, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x36, 0x68, +0x30, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x2E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x0F, 0xB2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x37, 0x10, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xCF, +0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x16, 0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xE1, 0xEB, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xC1, 0xCD, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD6, 0xB6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xA1, 0xAF, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0xD3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xB6, +0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x71, 0x90, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0x98, +0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x5A, 0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0x7A, +0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0x71, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x1A, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x52, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x34, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xC1, 0x3B, +0x30, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xA7, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xA1, 0x1D, +0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x87, 0xE1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x80, 0xFF, +0x30, 0x00, 0x00, 0x00, 0x00, 0x50, 0x70, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x4E, 0x6C, +0x30, 0x00, 0x00, 0x00, 0x00, 0x52, 0x50, 0xE0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x2E, 0x4E, +0x30, 0x00, 0x00, 0x00, 0x00, 0x54, 0x30, 0xC2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0E, 0x30, +0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0x10, 0xA4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x4C, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xF0, 0x86, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x2E, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xD0, 0x68, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB7, 0x10, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xB9, 0x84, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x96, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x99, 0x66, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x76, 0xD4, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x79, 0x48, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x61, 0x59, 0x2A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x63, 0x39, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0xB5, +0x30, 0x00, 0x00, 0x00, 0x00, 0x65, 0x18, 0xEE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x65, 0xFF, 0x97, +0x30, 0x00, 0x00, 0x00, 0x00, 0x67, 0x02, 0x0B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xDF, 0x79, +0x30, 0x00, 0x00, 0x00, 0x00, 0x68, 0xE1, 0xED, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xBF, 0x5B, +0x30, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xC1, 0xCF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x77, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xA1, 0xB1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x59, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x81, 0x93, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x3B, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x6A, 0xAF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x48, 0x1D, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x4A, 0x91, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x27, 0xFF, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x2A, 0x73, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x1C, +0x30, 0x00, 0x00, 0x00, 0x00, 0x76, 0x0A, 0x55, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xFE, +0x30, 0x00, 0x00, 0x00, 0x00, 0x77, 0xEA, 0x37, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xE0, +0x30, 0x00, 0x00, 0x00, 0x00, 0x79, 0xCA, 0x19, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xC2, +0x30, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xB3, 0x36, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x90, 0xA4, +0x30, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x93, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x70, 0x86, +0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x72, 0xFA, 0x40, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0xFF, 0xFF, 0xC9, 0xF0, 0x00, 0x00, +0xFF, 0xFF, 0xC9, 0xF0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x41, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, +0x2E, 0x30, 0x2F, 0x30, 0x2C, 0x4D, 0x33, 0x2E, 0x34, 0x2E, 0x30, 0x2F, 0x30, 0x0A, 0x00, 0x62, +0xC6, 0x75, 0x00, 0xBA, 0xAA, 0x75, 0x00, 0x00, 0x00, 0x00, /* America/Atikokan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27106,7 +27378,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Bahia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x6B, 0x1C, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x6B, 0x1C, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -27122,59 +27394,58 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x36, 0x20, 0x1F, 0x30, 0x36, 0xCF, 0x68, 0xA0, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x3A, 0x8F, 0x2C, 0xA0, 0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x3D, 0xC4, 0x91, 0x30, 0x3E, 0x4E, 0xF0, 0xA0, 0x4E, 0x9A, 0x48, 0xB0, 0x4F, 0x49, 0x92, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0xDB, 0xE4, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, -0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, -0x96, 0xAA, 0x6B, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, -0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, -0x27, 0xBD, 0xE3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, -0x29, 0x94, 0x8B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2B, 0x6B, 0x32, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xB5, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2D, 0x66, 0xC4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, 0x97, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2F, 0x46, 0xA6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, -0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x20, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x33, 0x06, 0x6A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, -0x34, 0xF8, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, 0x1F, 0x30, 0x00, 0x00, 0x00, 0x00, -0x36, 0xCF, 0x68, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3A, 0x8F, 0x2C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3E, 0x4E, 0xF0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x4F, 0x49, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xDB, 0xE4, 0x00, 0x00, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, -0x00, 0x75, 0x84, 0xA2, 0x00, 0xD7, 0xE2, 0xED, 0x00, 0x00, 0x00, 0x05, 0x42, 0x61, 0x68, 0x69, -0x61, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xDB, +0xE4, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, +0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x6B, 0x1C, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, +0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, +0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xBD, 0xE3, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x8B, 0x20, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xEA, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6B, 0x32, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xC0, 0xB5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xC4, 0x20, 0x00, +0x00, 0x00, 0x00, 0x2E, 0xA0, 0x97, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x46, 0xA6, 0x20, 0x00, +0x00, 0x00, 0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x32, 0x57, 0x20, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x6A, 0x20, 0x00, +0x00, 0x00, 0x00, 0x34, 0x38, 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xC1, 0x20, 0x00, +0x00, 0x00, 0x00, 0x36, 0x20, 0x1F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x68, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, +0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x2C, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xC4, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xF0, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x4E, 0x9A, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x49, 0x92, 0x20, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xDB, 0xE4, +0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, +0x33, 0x0A, 0x00, 0x75, 0x84, 0xA2, 0x00, 0xD7, 0xE2, 0xED, 0x00, 0x00, 0x00, 0x05, 0x42, 0x61, +0x68, 0x69, 0x61, /* America/Bahia_Banderas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0xCB, 0xEA, 0x71, 0x60, 0xD8, 0x91, 0xB4, 0xF0, 0x00, 0x00, 0x70, 0x80, 0x31, 0x67, 0x84, 0x10, 0x32, 0x73, 0x16, 0x80, 0x33, 0x47, 0x66, 0x10, 0x34, 0x52, 0xF8, 0x80, @@ -27190,91 +27461,63 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x57, 0x00, 0xCD, 0x80, 0x58, 0x15, 0x9A, 0x70, 0x58, 0xE0, 0xAF, 0x80, 0x59, 0xF5, 0x7C, 0x70, 0x5A, 0xC0, 0x91, 0x80, 0x5B, 0xD5, 0x5E, 0x70, 0x5C, 0xA9, 0xAE, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x5E, 0x89, 0x90, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x60, 0x69, 0x72, 0x00, 0x61, 0x7E, 0x3E, 0xF0, -0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x64, 0x29, 0x36, 0x00, 0x65, 0x3E, 0x02, 0xF0, -0x66, 0x12, 0x52, 0x80, 0x67, 0x1D, 0xE4, 0xF0, 0x67, 0xF2, 0x34, 0x80, 0x68, 0xFD, 0xC6, 0xF0, -0x69, 0xD2, 0x16, 0x80, 0x6A, 0xDD, 0xA8, 0xF0, 0x6B, 0xB1, 0xF8, 0x80, 0x6C, 0xC6, 0xC5, 0x70, -0x6D, 0x91, 0xDA, 0x80, 0x6E, 0xA6, 0xA7, 0x70, 0x6F, 0x71, 0xBC, 0x80, 0x70, 0x86, 0x89, 0x70, -0x71, 0x5A, 0xD9, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x73, 0x3A, 0xBB, 0x00, 0x74, 0x46, 0x4D, 0x70, -0x75, 0x1A, 0x9D, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x76, 0xFA, 0x7F, 0x00, 0x78, 0x0F, 0x4B, 0xF0, -0x78, 0xDA, 0x61, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x7A, 0xBA, 0x43, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, -0x7C, 0xA3, 0x5F, 0x80, 0x7D, 0xAE, 0xF1, 0xF0, 0x7E, 0x83, 0x41, 0x80, 0x7F, 0x8E, 0xD3, 0xF0, -0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, -0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, -0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0xFF, 0xFF, 0x9D, -0x54, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, -0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, -0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, -0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, -0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, -0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, -0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x71, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x84, -0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x66, -0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, -0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, -0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, -0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, -0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, -0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, -0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, -0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, -0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, -0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, -0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, -0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, -0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, -0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, -0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, -0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, -0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, -0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, -0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, -0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, -0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, -0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, -0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x29, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x52, -0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xE4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF2, 0x34, -0x80, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xC6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD2, 0x16, -0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xA8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xF8, -0x80, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xC5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0xDA, -0x80, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xA7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x71, 0xBC, -0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x89, 0x70, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0xD9, -0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0xBB, -0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x9D, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x7F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x61, -0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xBA, 0x43, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x5F, -0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0xF1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x83, 0x41, -0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, -0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x02, -0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, -0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, +0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0xFF, 0xFF, 0x9D, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0x9D, +0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, +0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, +0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, +0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, +0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, +0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, +0xEA, 0x71, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, +0x73, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x66, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, +0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, +0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, +0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, +0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, +0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, +0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, +0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, +0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, +0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, +0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, +0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, +0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, +0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, +0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, +0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, +0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, +0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, +0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, +0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, +0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, +0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, +0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, +0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, +0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0x06, 0x02, -0x06, 0x02, 0x06, 0x02, 0x06, 0x02, 0xFF, 0xFF, 0x9D, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, -0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, -0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x43, -0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, -0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xA9, 0x11, 0x40, 0x00, 0x72, 0x0F, 0x38, 0x00, 0x00, -0x00, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, -0x20, 0x42, 0x61, 0x68, 0x69, 0x61, 0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6E, 0x64, 0x65, 0x72, -0x61, 0x73, +0x06, 0x02, 0xFF, 0xFF, 0x9D, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, +0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, +0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, +0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, +0x00, 0xA9, 0x11, 0x40, 0x00, 0x72, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x6E, 0x74, +0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x68, 0x69, 0x61, +0x20, 0x64, 0x65, 0x20, 0x42, 0x61, 0x6E, 0x64, 0x65, 0x72, 0x61, 0x73, /* America/Barbados */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27310,7 +27553,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Belem */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x74, 0x74, +0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x74, 0x74, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -27318,34 +27561,34 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x2C, 0x30, 0xF8, 0xC7, 0xC5, 0x20, 0xFA, 0x0A, 0xD2, 0xB0, 0xFA, 0xA8, 0xF8, 0xA0, 0xFB, 0xEC, 0x06, 0x30, 0xFC, 0x8B, 0x7D, 0xA0, 0x1D, 0xC9, 0x8E, 0x30, 0x1E, 0x78, 0xD7, 0xA0, 0x1F, 0xA0, 0x35, 0xB0, 0x20, 0x33, 0xCF, 0xA0, 0x21, 0x81, 0x69, 0x30, 0x22, 0x0B, 0xC8, 0xA0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0xD2, 0x8C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, -0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD2, +0x8C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, +0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, -0x96, 0xAA, 0x74, 0x74, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, -0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xD2, 0x8C, 0x00, 0x00, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, -0x00, 0x87, 0x1D, 0xD8, 0x00, 0xC8, 0xAD, 0xB2, 0x00, 0x00, 0x00, 0x12, 0x50, 0x61, 0x72, 0x61, -0x20, 0x28, 0x65, 0x61, 0x73, 0x74, 0x29, 0x3B, 0x20, 0x41, 0x6D, 0x61, 0x70, 0x61, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x74, 0x74, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD2, 0x8C, +0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, +0x33, 0x0A, 0x00, 0x87, 0x1D, 0xD8, 0x00, 0xC8, 0xAD, 0xB2, 0x00, 0x00, 0x00, 0x12, 0x50, 0x61, +0x72, 0x61, 0x20, 0x28, 0x65, 0x61, 0x73, 0x74, 0x29, 0x3B, 0x20, 0x41, 0x6D, 0x61, 0x70, 0x61, + /* America/Belize */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27478,7 +27721,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Boa_Vista */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7F, 0xE0, +0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7F, 0xE0, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -27487,55 +27730,53 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFB, 0xEC, 0x14, 0x40, 0xFC, 0x8B, 0x8B, 0xB0, 0x1D, 0xC9, 0x9C, 0x40, 0x1E, 0x78, 0xE5, 0xB0, 0x1F, 0xA0, 0x43, 0xC0, 0x20, 0x33, 0xDD, 0xB0, 0x21, 0x81, 0x77, 0x40, 0x22, 0x0B, 0xD6, 0xB0, 0x37, 0xF6, 0xD4, 0xC0, 0x38, 0xB8, 0x93, 0x30, 0x39, 0xDF, 0xF1, 0x40, 0x39, 0xE9, 0x1D, 0xB0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xC7, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, -0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, -0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, -0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, -0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, -0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xD4, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xF1, 0x40, -0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0xC7, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x8D, 0xA0, 0x82, 0x00, 0xB6, 0x16, 0x95, -0x00, 0x00, 0x00, 0x07, 0x52, 0x6F, 0x72, 0x61, 0x69, 0x6D, 0x61, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0xFF, 0xFF, 0xC7, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, +0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, +0xAA, 0x7F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, +0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, +0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, +0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, +0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, +0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, +0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, +0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, +0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, +0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, +0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, +0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, +0xB8, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xF1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x39, +0xE9, 0x1D, 0xB0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC7, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, +0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, +0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x8D, 0xA0, 0x82, 0x00, 0xB6, +0x16, 0x95, 0x00, 0x00, 0x00, 0x07, 0x52, 0x6F, 0x72, 0x61, 0x69, 0x6D, 0x61, /* America/Bogota */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, -0x98, 0x58, 0x55, 0x70, 0x2A, 0x03, 0x73, 0x50, 0x2B, 0xBE, 0x5D, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xBA, 0x90, 0x00, 0x00, 0xFF, 0xFF, 0xBA, 0x90, 0x00, -0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x42, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x98, 0x58, 0x55, 0x70, 0x2A, 0x03, 0x73, 0x50, 0x2B, 0xBE, 0x5D, 0x40, 0x01, 0x03, 0x02, 0x03, +0xFF, 0xFF, 0xBA, 0x90, 0x00, 0x00, 0xFF, 0xFF, 0xBA, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, +0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x9C, 0x34, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x58, 0x55, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x03, 0x73, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xBA, 0x90, 0x00, 0x00, 0xFF, 0xFF, 0xBA, 0x90, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, -0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x90, 0x59, 0x20, 0x00, 0xA1, 0x9D, 0xB2, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x9C, 0x34, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, +0x98, 0x58, 0x55, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x03, 0x73, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2B, 0xBE, 0x5D, 0x40, 0x01, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xBA, 0x90, 0x00, 0x00, 0xFF, 0xFF, +0xBA, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, +0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x90, 0x59, 0x20, 0x00, 0xA1, 0x9D, 0xB2, +0x00, 0x00, 0x00, 0x00, /* America/Boise */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27696,7 +27937,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Buenos_Aires */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -27712,57 +27953,56 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xF1, 0x30, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC9, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC9, +0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xA8, 0x4C, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC9, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xA8, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC9, 0x34, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Cambridge_Bay */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27902,7 +28142,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Campo_Grande */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7A, 0x34, +0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7A, 0x34, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -27925,74 +28165,73 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x50, 0x83, 0x73, 0x40, 0x51, 0x20, 0x47, 0xB0, 0x52, 0x63, 0x55, 0x40, 0x53, 0x00, 0x29, 0xB0, 0x54, 0x43, 0x37, 0x40, 0x54, 0xE9, 0x46, 0x30, 0x56, 0x23, 0x19, 0x40, 0x56, 0xC9, 0x28, 0x30, 0x58, 0x02, 0xFB, 0x40, 0x58, 0xA9, 0x0A, 0x30, 0x59, 0xE2, 0xDD, 0x40, 0x5A, 0x88, 0xEC, 0x30, -0x5B, 0xDE, 0x6E, 0xC0, 0x5C, 0x68, 0xCE, 0x30, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, +0x5B, 0xDE, 0x6E, 0xC0, 0x5C, 0x68, 0xCE, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xCC, 0xCC, 0x00, 0x00, 0xFF, 0xFF, -0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0xFF, 0xFF, 0xCC, 0xCC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, +0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7A, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, -0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, -0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, -0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, -0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, -0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, -0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, -0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, -0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, -0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, -0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, -0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, -0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, -0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, -0x1E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x7E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, -0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, -0x1D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xBD, 0xF1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, -0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x99, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, -0x1B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6B, 0x40, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, -0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, -0xA5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x46, 0xB4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, -0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x5B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, -0x2E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, -0x62, 0x40, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, -0x2D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x76, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, -0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, -0xF1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x3A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, -0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x1C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, -0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xFE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x92, -0x0C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2E, 0xE0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x87, -0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x17, 0xFD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, -0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0xF7, 0xDF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, -0x61, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x45, 0xE0, 0xFB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, -0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xB7, 0xA3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, -0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x97, 0x85, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, -0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x80, 0xA1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, -0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x60, 0x83, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, -0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x49, 0xA0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, -0x73, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x47, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, -0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x29, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x43, -0x37, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, 0xE9, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0x23, -0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x56, 0xC9, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, -0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xA9, 0x0A, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, -0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x88, 0xEC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, -0x6E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x68, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, -0xCC, 0xCC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x34, 0x3E, 0x34, 0x0A, 0x00, 0x6A, 0x1F, 0xF8, 0x00, 0xBF, 0x51, 0xDD, 0x00, 0x00, 0x00, 0x12, -0x4D, 0x61, 0x74, 0x6F, 0x20, 0x47, 0x72, 0x6F, 0x73, 0x73, 0x6F, 0x20, 0x64, 0x6F, 0x20, 0x53, -0x75, 0x6C, +0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, +0xFF, 0x96, 0xAA, 0x7A, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, +0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x1E, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x23, 0xE2, 0x7E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x25, 0xD4, 0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x1D, 0x40, 0x00, 0x00, 0x00, +0x00, 0x27, 0xBD, 0xF1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, +0x00, 0x29, 0x94, 0x99, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x1B, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x2B, 0x6B, 0x40, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xC3, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x66, 0xD2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, 0xA5, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x46, 0xB4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, +0x00, 0x31, 0x1D, 0x5B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x2E, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x33, 0x06, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, 0x62, 0x40, 0x00, 0x00, 0x00, +0x00, 0x34, 0xF8, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, 0x2D, 0x40, 0x00, 0x00, 0x00, +0x00, 0x36, 0xCF, 0x76, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xD4, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x38, 0xB8, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xF1, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3A, 0x8F, 0x3A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x3C, 0x6F, 0x1C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, 0x9F, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x4E, 0xFE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x92, 0x0C, 0x40, 0x00, 0x00, 0x00, +0x00, 0x40, 0x2E, 0xE0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x87, 0x06, 0x40, 0x00, 0x00, 0x00, +0x00, 0x42, 0x17, 0xFD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, 0xD0, 0x40, 0x00, 0x00, 0x00, +0x00, 0x43, 0xF7, 0xDF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, 0x61, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x45, 0xE0, 0xFB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, +0x00, 0x47, 0xB7, 0xA3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xB0, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x49, 0x97, 0x85, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x92, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0x80, 0xA1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, 0x74, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x60, 0x83, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, 0x56, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x4F, 0x49, 0xA0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0x73, 0x40, 0x00, 0x00, 0x00, +0x00, 0x51, 0x20, 0x47, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x55, 0x40, 0x00, 0x00, 0x00, +0x00, 0x53, 0x00, 0x29, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x43, 0x37, 0x40, 0x00, 0x00, 0x00, +0x00, 0x54, 0xE9, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0x23, 0x19, 0x40, 0x00, 0x00, 0x00, +0x00, 0x56, 0xC9, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0xFB, 0x40, 0x00, 0x00, 0x00, +0x00, 0x58, 0xA9, 0x0A, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, 0xDD, 0x40, 0x00, 0x00, 0x00, +0x00, 0x5A, 0x88, 0xEC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x6E, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x5C, 0x68, 0xCE, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0xFF, 0xFF, 0xCC, 0xCC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x6A, 0x1F, 0xF8, 0x00, 0xBF, 0x51, 0xDD, 0x00, 0x00, +0x00, 0x12, 0x4D, 0x61, 0x74, 0x6F, 0x20, 0x47, 0x72, 0x6F, 0x73, 0x73, 0x6F, 0x20, 0x64, 0x6F, +0x20, 0x53, 0x75, 0x6C, /* America/Cancun */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -28055,27 +28294,26 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Caracas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, 0x93, 0x1E, 0x2C, 0x3C, 0xF6, 0x98, 0xEC, 0x48, 0x47, 0x5B, 0x92, 0x70, 0x57, 0x25, 0xA9, 0x70, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xC1, 0x40, 0x00, 0x00, -0xFF, 0xFF, 0xC1, 0x44, 0x00, 0x04, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, -0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, -0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2C, 0x3C, -0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xEC, 0x48, 0x00, 0x00, 0x00, 0x00, 0x47, 0x5B, 0x92, 0x70, -0x00, 0x00, 0x00, 0x00, 0x57, 0x25, 0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xC1, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0xC1, 0x44, -0x00, 0x04, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0E, 0x4C, 0x4D, -0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x99, 0x59, 0xD0, 0x00, 0xAC, 0x86, 0xAA, -0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xC1, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0xC1, 0x44, 0x00, +0x04, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, +0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, +0x87, 0x1A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2C, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, +0x98, 0xEC, 0x48, 0x00, 0x00, 0x00, 0x00, 0x47, 0x5B, 0x92, 0x70, 0x00, 0x00, 0x00, 0x00, 0x57, +0x25, 0xA9, 0x70, 0x01, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xC1, 0x40, 0x00, 0x00, 0xFF, 0xFF, +0xC1, 0x44, 0x00, 0x04, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0E, +0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, 0x2D, 0x30, +0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x99, 0x59, 0xD0, 0x00, 0xAC, +0x86, 0xAA, 0x00, 0x00, 0x00, 0x00, /* America/Catamarca */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -28091,73 +28329,71 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xBB, 0xF1, 0x30, 0x40, 0xD5, 0x0B, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, +0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0x2C, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xBB, 0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAF, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, +0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xBB, 0xF1, +0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0xD5, 0x0B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Cayenne */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x91, 0xF4, 0x2B, 0x90, -0xFB, 0xC3, 0x35, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xCE, 0xF0, 0x00, -0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xF4, 0x2B, 0x90, 0xFF, 0xFF, 0xFF, -0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0xFF, 0xFF, 0xCE, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x90, 0xDB, 0x55, 0x00, 0xC2, 0xCD, 0xCA, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x91, 0xF4, 0x2B, 0x90, +0xFB, 0xC3, 0x35, 0xC0, 0x01, 0x02, 0xFF, 0xFF, 0xCE, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, +0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xF4, 0x2B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, +0x01, 0x02, 0xFF, 0xFF, 0xCE, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, +0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x90, 0xDB, 0x55, 0x00, 0xC2, 0xCD, 0xCA, +0x00, 0x00, 0x00, 0x00, /* America/Cayman */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -28405,8 +28641,8 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Chihuahua */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, 0x33, 0x47, 0x58, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x48, 0x10, 0x36, 0x32, 0xDA, 0x80, 0x37, 0x07, 0x2A, 0x10, @@ -28421,117 +28657,82 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0x2C, 0x8C, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x58, 0x15, 0xA8, 0x80, 0x58, 0xE0, 0xBD, 0x90, 0x59, 0xF5, 0x8A, 0x80, 0x5A, 0xC0, 0x9F, 0x90, 0x5B, 0xD5, 0x6C, 0x80, 0x5C, 0xA9, 0xBC, 0x10, 0x5D, 0xB5, 0x4E, 0x80, 0x5E, 0x89, 0x9E, 0x10, 0x5F, 0x95, 0x30, 0x80, 0x60, 0x69, 0x80, 0x10, -0x61, 0x7E, 0x4D, 0x00, 0x62, 0x49, 0x62, 0x10, 0x63, 0x5E, 0x2F, 0x00, 0x64, 0x29, 0x44, 0x10, -0x65, 0x3E, 0x11, 0x00, 0x66, 0x12, 0x60, 0x90, 0x67, 0x1D, 0xF3, 0x00, 0x67, 0xF2, 0x42, 0x90, -0x68, 0xFD, 0xD5, 0x00, 0x69, 0xD2, 0x24, 0x90, 0x6A, 0xDD, 0xB7, 0x00, 0x6B, 0xB2, 0x06, 0x90, -0x6C, 0xC6, 0xD3, 0x80, 0x6D, 0x91, 0xE8, 0x90, 0x6E, 0xA6, 0xB5, 0x80, 0x6F, 0x71, 0xCA, 0x90, -0x70, 0x86, 0x97, 0x80, 0x71, 0x5A, 0xE7, 0x10, 0x72, 0x66, 0x79, 0x80, 0x73, 0x3A, 0xC9, 0x10, -0x74, 0x46, 0x5B, 0x80, 0x75, 0x1A, 0xAB, 0x10, 0x76, 0x2F, 0x78, 0x00, 0x76, 0xFA, 0x8D, 0x10, -0x78, 0x0F, 0x5A, 0x00, 0x78, 0xDA, 0x6F, 0x10, 0x79, 0xEF, 0x3C, 0x00, 0x7A, 0xBA, 0x51, 0x10, -0x7B, 0xCF, 0x1E, 0x00, 0x7C, 0xA3, 0x6D, 0x90, 0x7D, 0xAF, 0x00, 0x00, 0x7E, 0x83, 0x4F, 0x90, -0x7F, 0x8E, 0xE2, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x61, 0x7E, 0x4D, 0x00, 0x62, 0x49, 0x62, 0x10, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, +0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, -0x9C, 0x8C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, -0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x02, 0xFF, 0xFF, 0x9C, 0x8C, 0x00, 0x00, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, +0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, +0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, -0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, 0x00, -0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, 0x00, 0x00, -0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, 0x00, 0x00, -0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x29, 0x44, 0x10, 0x00, 0x00, -0x00, 0x00, 0x65, 0x3E, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x60, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x1D, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF2, 0x42, 0x90, 0x00, 0x00, -0x00, 0x00, 0x68, 0xFD, 0xD5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD2, 0x24, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xDD, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB2, 0x06, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xC6, 0xD3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0xE8, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xA6, 0xB5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x71, 0xCA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x70, 0x86, 0x97, 0x80, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0xE7, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x66, 0x79, 0x80, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0xC9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x46, 0x5B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0xAB, 0x10, 0x00, 0x00, -0x00, 0x00, 0x76, 0x2F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x8D, 0x10, 0x00, 0x00, -0x00, 0x00, 0x78, 0x0F, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x6F, 0x10, 0x00, 0x00, -0x00, 0x00, 0x79, 0xEF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xBA, 0x51, 0x10, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xCF, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x6D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x83, 0x4F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x8E, 0xE2, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, +0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, +0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, +0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, +0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, +0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, +0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, +0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, +0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, +0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, +0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, +0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, +0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, +0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, +0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, +0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, +0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, +0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, +0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, +0x05, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0xFF, 0xFF, 0x9C, 0x8C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, -0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, -0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x4D, 0x53, 0x54, -0x37, 0x4D, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, -0x35, 0x2E, 0x30, 0x0A, 0x00, 0xB5, 0x05, 0x25, 0x00, 0x70, 0xC9, 0xB2, 0x00, 0x00, 0x00, 0x26, -0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, -0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, -0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x03, 0x04, 0x03, 0x02, 0xFF, 0xFF, 0x9C, 0x8C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, +0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, +0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xB5, +0x05, 0x25, 0x00, 0x70, 0xC9, 0xB2, 0x00, 0x00, 0x00, 0x26, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, +0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, +0x68, 0x75, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, + /* America/Coral_Harbour */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, -0x9E, 0xB8, 0xA1, 0x80, 0x9F, 0xBA, 0xF9, 0x70, 0xC8, 0xF8, 0x57, 0x60, 0xCB, 0x88, 0xFE, 0x80, -0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x05, 0xFF, -0xFF, 0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, -0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, -0xB0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, -0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x84, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, -0xB8, 0xA1, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, -0xF8, 0x57, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, -0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x02, 0x01, 0x02, 0x01, 0x03, -0x04, 0x05, 0xFF, 0xFF, 0xAA, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, -0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0x8B, 0xF4, 0x61, 0xE8, 0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, +0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, +0x45, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0xF4, 0x61, 0xE8, +0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xB5, 0x18, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, +0x0A, 0x45, 0x53, 0x54, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Cordoba */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -28547,57 +28748,56 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC3, +0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAD, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAD, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, +0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Costa_Rica */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -28642,7 +28842,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Cuiaba */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7B, 0x94, +0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7B, 0x94, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -28665,71 +28865,71 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x52, 0x63, 0x55, 0x40, 0x53, 0x00, 0x29, 0xB0, 0x54, 0x43, 0x37, 0x40, 0x54, 0xE9, 0x46, 0x30, 0x56, 0x23, 0x19, 0x40, 0x56, 0xC9, 0x28, 0x30, 0x58, 0x02, 0xFB, 0x40, 0x58, 0xA9, 0x0A, 0x30, 0x59, 0xE2, 0xDD, 0x40, 0x5A, 0x88, 0xEC, 0x30, 0x5B, 0xDE, 0x6E, 0xC0, 0x5C, 0x68, 0xCE, 0x30, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, -0xCB, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7B, 0x94, -0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x1E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x7E, 0x30, -0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xD5, 0x30, -0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x1D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xBD, 0xF1, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x99, 0x30, -0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x1B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6B, 0x40, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, -0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, 0xA5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x46, 0xB4, 0x30, -0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x5B, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x2E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x78, 0x30, -0x00, 0x00, 0x00, 0x00, 0x34, 0x38, 0x62, 0x40, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xCF, 0x30, -0x00, 0x00, 0x00, 0x00, 0x36, 0x20, 0x2D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x76, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x93, 0x30, -0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xF1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x3A, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x1C, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xFE, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x41, 0x87, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x17, 0xFD, 0x30, -0x00, 0x00, 0x00, 0x00, 0x43, 0x51, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0xF7, 0xDF, 0x30, -0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, 0x61, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x45, 0xE0, 0xFB, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xB7, 0xA3, 0x30, -0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x97, 0x85, 0x30, -0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x80, 0xA1, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x60, 0x83, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x49, 0xA0, 0x30, -0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0x73, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x47, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x29, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x54, 0x43, 0x37, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, 0xE9, 0x46, 0x30, -0x00, 0x00, 0x00, 0x00, 0x56, 0x23, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x56, 0xC9, 0x28, 0x30, -0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xA9, 0x0A, 0x30, -0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x88, 0xEC, 0x30, -0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x6E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x68, 0xCE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0xCB, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x71, 0x8D, 0x02, 0x00, 0xBD, 0x14, 0xF2, -0x00, 0x00, 0x00, 0x0B, 0x4D, 0x61, 0x74, 0x6F, 0x20, 0x47, 0x72, 0x6F, 0x73, 0x73, 0x6F, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xCB, 0x6C, 0x00, 0x00, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x03, 0x00, +0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7B, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, +0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, +0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, +0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, +0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, +0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, +0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, +0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, +0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, +0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, +0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, +0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, +0x58, 0x1E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x7E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, +0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, +0x21, 0x1D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xBD, 0xF1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x29, +0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x99, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, +0xEA, 0x1B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6B, 0x40, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, +0xC0, 0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, +0xA0, 0xA5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x46, 0xB4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, +0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x5B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, +0x57, 0x2E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, +0x38, 0x62, 0x40, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, +0x20, 0x2D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x76, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, +0xF6, 0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, +0xDF, 0xF1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x3A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x1C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xC4, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xFE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, +0x87, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x17, 0xFD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, +0x51, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0xF7, 0xDF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x45, +0x4D, 0x61, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x45, 0xE0, 0xFB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, +0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xB7, 0xA3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, +0xFA, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x97, 0x85, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, +0xDA, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x80, 0xA1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, +0xBA, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x60, 0x83, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4E, +0x9A, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x49, 0xA0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x50, +0x83, 0x73, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x47, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, +0x63, 0x55, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x29, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, +0x43, 0x37, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, 0xE9, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, +0x23, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x56, 0xC9, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x58, +0x02, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0xA9, 0x0A, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, +0xE2, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x88, 0xEC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, +0xDE, 0x6E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x68, 0xCE, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xCB, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, +0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, +0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x71, 0x8D, 0x02, 0x00, 0xBD, +0x14, 0xF2, 0x00, 0x00, 0x00, 0x0B, 0x4D, 0x61, 0x74, 0x6F, 0x20, 0x47, 0x72, 0x6F, 0x73, 0x73, +0x6F, /* America/Curacao */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -29440,7 +29640,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Eirunepe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x88, 0x80, +0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x88, 0x80, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -29449,38 +29649,37 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, 0x2C, 0xC0, 0xD1, 0x50, 0x2D, 0x66, 0xE0, 0x40, 0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xBE, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, -0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, -0x96, 0xAA, 0x88, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x50, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xCA, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xB6, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x1B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x48, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xEE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x22, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x51, 0xD0, 0x00, 0x00, 0x00, 0x00, -0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x85, 0x50, 0x00, 0x00, 0x00, 0x00, -0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xD1, 0x50, 0x00, 0x00, 0x00, 0x00, -0x2D, 0x66, 0xE0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, 0x7F, 0x50, 0x00, 0x00, 0x00, 0x00, -0x52, 0x7F, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, -0xBE, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, -0x00, 0x7F, 0x28, 0x15, 0x00, 0xA8, 0x0C, 0xD5, 0x00, 0x00, 0x00, 0x0F, 0x41, 0x6D, 0x61, 0x7A, -0x6F, 0x6E, 0x61, 0x73, 0x20, 0x28, 0x77, 0x65, 0x73, 0x74, 0x29, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, +0x02, 0xFF, 0xFF, 0xBE, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, +0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, +0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, +0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x88, 0x80, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x50, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xCA, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xB6, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x1B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x48, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xEE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x22, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC9, 0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA0, 0x51, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0x85, 0x50, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xC0, 0xD1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xE0, 0x40, 0x00, +0x00, 0x00, 0x00, 0x48, 0x60, 0x7F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x52, 0x7F, 0x04, 0xC0, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, +0xFF, 0xFF, 0xBE, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x35, 0x3E, +0x35, 0x0A, 0x00, 0x7F, 0x28, 0x15, 0x00, 0xA8, 0x0C, 0xD5, 0x00, 0x00, 0x00, 0x0F, 0x41, 0x6D, +0x61, 0x7A, 0x6F, 0x6E, 0x61, 0x73, 0x20, 0x28, 0x77, 0x65, 0x73, 0x74, 0x29, /* America/El_Salvador */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -29907,7 +30106,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Fortaleza */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x6B, 0x18, +0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x6B, 0x18, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -29917,42 +30116,42 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x1F, 0xA0, 0x35, 0xB0, 0x20, 0x33, 0xCF, 0xA0, 0x21, 0x81, 0x69, 0x30, 0x22, 0x0B, 0xC8, 0xA0, 0x23, 0x58, 0x10, 0xB0, 0x23, 0xE2, 0x70, 0x20, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xD4, 0xC7, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x39, 0xF2, 0x4A, 0x20, -0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xDB, 0xE8, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, -0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, +0xFF, 0xDB, 0xE8, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, -0xFF, 0xFF, 0x96, 0xAA, 0x6B, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, -0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, -0x00, 0x00, 0x39, 0xF2, 0x4A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xDB, 0xE8, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x83, 0xA8, 0x6D, -0x00, 0xD7, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x26, 0x42, 0x72, 0x61, 0x7A, 0x69, 0x6C, 0x20, 0x28, -0x6E, 0x6F, 0x72, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x3A, 0x20, 0x4D, 0x41, 0x2C, 0x20, 0x50, -0x49, 0x2C, 0x20, 0x43, 0x45, 0x2C, 0x20, 0x52, 0x4E, 0x2C, 0x20, 0x50, 0x42, 0x29, +0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x6B, +0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, +0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, +0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, +0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xF2, 0x4A, +0x20, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, +0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xDB, 0xE8, 0x00, 0x00, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x83, +0xA8, 0x6D, 0x00, 0xD7, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x26, 0x42, 0x72, 0x61, 0x7A, 0x69, 0x6C, +0x20, 0x28, 0x6E, 0x6F, 0x72, 0x74, 0x68, 0x65, 0x61, 0x73, 0x74, 0x3A, 0x20, 0x4D, 0x41, 0x2C, +0x20, 0x50, 0x49, 0x2C, 0x20, 0x43, 0x45, 0x2C, 0x20, 0x52, 0x4E, 0x2C, 0x20, 0x50, 0x42, 0x29, + /* America/Glace_Bay */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -30099,7 +30298,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Godthab */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x9B, 0x80, 0x68, 0x00, +0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x9B, 0x80, 0x68, 0x00, 0x13, 0x4D, 0x7C, 0x50, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, @@ -30129,93 +30328,92 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x80, -0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, -0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, -0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, -0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, -0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, -0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, -0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, -0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, -0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, -0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, -0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, -0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, -0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, -0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, -0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, -0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, -0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, -0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, -0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, -0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, -0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, -0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, -0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, -0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, -0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, -0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, -0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, -0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, -0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, -0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, -0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, -0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, -0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, -0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, -0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, -0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, -0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, -0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, -0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, -0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, -0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, -0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, -0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, -0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, -0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, -0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, -0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, -0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, -0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, -0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, -0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, -0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, -0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, -0x7F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, +0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, -0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x3C, 0x2D, 0x30, 0x32, 0x3E, -0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x2D, 0x32, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x2D, 0x31, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, +0x02, 0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, +0xE0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x80, 0x68, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0x4D, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, +0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, +0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, +0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, +0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, +0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, +0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, +0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, +0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, +0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, +0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, +0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, +0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, +0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, +0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, +0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, +0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, +0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, +0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, +0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, +0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, +0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, +0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, +0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, +0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, +0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, +0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, +0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, +0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, +0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, +0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, +0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, +0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, +0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, +0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x04, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, +0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, +0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x3C, 0x2D, 0x30, +0x32, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x2D, 0x32, 0x2C, 0x4D, 0x31, 0x30, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x2D, 0x31, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, /* America/Goose_Bay */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -30591,42 +30789,40 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Guayaquil */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x45, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, -0xB6, 0xA4, 0x42, 0x18, 0x2B, 0x16, 0xFC, 0xD0, 0x2B, 0x71, 0xE6, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xB5, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xB6, 0x68, 0x00, -0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x51, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xB6, 0xA4, 0x42, 0x18, 0x2B, 0x16, 0xFC, 0xD0, 0x2B, 0x71, 0xE6, 0x40, 0x01, 0x03, 0x02, 0x03, +0xFF, 0xFF, 0xB5, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xB6, 0x68, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, +0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x51, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, -0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0xA4, 0x42, 0x18, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x16, 0xFC, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x71, 0xE6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xB5, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xB6, 0x68, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, -0x54, 0x00, 0x51, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x86, 0x05, 0xE5, 0x00, 0x98, 0xD7, 0x9A, 0x00, 0x00, -0x00, 0x12, 0x45, 0x63, 0x75, 0x61, 0x64, 0x6F, 0x72, 0x20, 0x28, 0x6D, 0x61, 0x69, 0x6E, 0x6C, -0x61, 0x6E, 0x64, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x26, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xB6, 0xA4, 0x42, 0x18, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x16, 0xFC, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x2B, 0x71, 0xE6, 0x40, 0x01, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xB5, 0x28, 0x00, 0x00, 0xFF, 0xFF, +0xB6, 0x68, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x0C, +0x4C, 0x4D, 0x54, 0x00, 0x51, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x86, 0x05, 0xE5, 0x00, 0x98, 0xD7, 0x9A, +0x00, 0x00, 0x00, 0x12, 0x45, 0x63, 0x75, 0x61, 0x64, 0x6F, 0x72, 0x20, 0x28, 0x6D, 0x61, 0x69, +0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x29, /* America/Guyana */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x92, 0x1D, 0x0F, 0x87, -0x98, 0xD9, 0x7B, 0x40, 0x0A, 0x7F, 0x05, 0xBC, 0x29, 0xD5, 0x40, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, -0x04, 0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0xFF, 0xFF, 0xC7, -0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, -0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x92, 0x1D, 0x0F, 0x87, +0x98, 0xD9, 0x7B, 0x40, 0x0A, 0x7F, 0x05, 0xBC, 0x29, 0xD5, 0x40, 0xC0, 0x01, 0x02, 0x03, 0x01, +0xFF, 0xFF, 0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xCB, 0x44, +0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x1D, 0x0F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xD9, 0x7B, -0x40, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x7F, 0x05, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x40, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, -0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xCB, 0x44, 0x00, 0x08, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x93, 0xB4, 0x80, 0x00, 0xB9, 0xE7, 0x25, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, +0x92, 0x1D, 0x0F, 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0xD9, 0x7B, 0x40, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x7F, 0x05, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x40, 0xC0, 0x01, 0x02, 0x03, 0x01, +0xFF, 0xFF, 0xC9, 0x79, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xCB, 0x44, +0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x34, 0x35, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x93, 0xB4, 0x80, 0x00, 0xB9, 0xE7, 0x25, +0x00, 0x00, 0x00, 0x00, /* America/Halifax */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -32372,7 +32568,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Jujuy */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -32387,56 +32583,55 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x23, 0x94, 0xB5, 0xB0, 0x24, 0x10, 0x94, 0xA0, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xF0, 0x76, 0xA0, 0x27, 0x2A, 0x57, 0xC0, 0x27, 0xE2, 0xDB, 0xB0, 0x28, 0xEE, 0x8A, 0x40, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, -0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, +0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x72, 0x9C, 0xAE, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x57, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x27, 0xE2, 0xDB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xEE, 0x8A, 0x40, 0x00, 0x00, 0x00, 0x00, -0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x04, -0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, 0xFF, 0xFF, -0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, +0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, +0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, +0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, +0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, +0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAE, 0xB8, 0xFF, +0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x2A, 0x57, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xE2, 0xDB, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x28, 0xEE, 0x8A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, +0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, +0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC2, 0xC8, 0x00, 0x00, +0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, +0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* America/Juneau */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33080,65 +33275,67 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Kralendijk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x1E, 0x2E, 0x23, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, -0x30, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, -0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, -0x79, 0xED, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x9B, 0xDE, 0xAB, 0x00, 0xAA, 0x79, 0xED, 0x00, 0x00, +0x00, 0x00, /* America/La_Paz */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, -0xB8, 0x1E, 0x96, 0xE4, 0xB8, 0xEE, 0xD5, 0xD4, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0xFF, 0xFF, 0xC0, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x1C, 0x00, 0x04, 0xFF, 0xFF, 0xCE, 0x2C, -0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x42, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xB8, 0x1E, 0x96, 0xE4, 0xB8, 0xEE, 0xD5, 0xD4, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x1C, 0x00, +0x00, 0xFF, 0xFF, 0xC0, 0x1C, 0x00, 0x04, 0xFF, 0xFF, 0xCE, 0x2C, 0x01, 0x08, 0xFF, 0xFF, 0xC7, +0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x53, 0x54, 0x00, 0x2D, +0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, -0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1B, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0x1E, 0x96, 0xE4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xEE, 0xD5, 0xD4, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xC0, 0x1C, 0x00, 0x00, 0xFF, 0xFF, -0xC0, 0x1C, 0x00, 0x04, 0xFF, 0xFF, 0xCE, 0x2C, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, -0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x70, 0x26, 0xF0, 0x00, 0xAA, 0xAB, 0x68, -0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1B, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x96, 0xE4, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0xEE, 0xD5, 0xD4, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0xC0, 0x1C, 0x00, 0x00, +0xFF, 0xFF, 0xC0, 0x1C, 0x00, 0x04, 0xFF, 0xFF, 0xCE, 0x2C, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x42, 0x53, 0x54, 0x00, 0x2D, 0x30, +0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x70, 0x26, 0xF0, 0x00, 0xAA, +0xAB, 0x68, 0x00, 0x00, 0x00, 0x00, /* America/Lima */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, 0x8C, 0x74, 0x40, 0xD4, 0xC3, 0xCF, 0x4A, 0x50, 0xC4, 0x45, 0xE3, 0x40, 0xC5, 0x2F, 0x4A, 0xD0, 0xC6, 0x1F, 0x2D, 0xC0, 0xC7, 0x0F, 0x2C, 0xD0, 0xC7, 0xFF, 0x0F, 0xC0, 0x1E, 0x18, 0xC4, 0x50, 0x1E, 0x8F, 0x5D, 0x40, 0x1F, 0xF9, 0xF7, 0xD0, 0x20, 0x70, 0x90, 0xC0, 0x25, 0x9E, 0xE3, 0xD0, -0x26, 0x15, 0x7C, 0xC0, 0x2D, 0x25, 0x03, 0x50, 0x2D, 0x9B, 0x9C, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x03, 0xFF, 0xFF, 0xB7, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0xB7, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC7, -0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, -0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, -0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x23, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x74, 0x40, -0xD4, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xCF, 0x4A, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x45, 0xE3, -0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x4A, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x1F, 0x2D, -0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x2C, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0x0F, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x18, 0xC4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8F, 0x5D, -0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF9, 0xF7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, 0x90, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x9E, 0xE3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0x7C, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x25, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9B, 0x9C, -0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xB7, 0xC4, 0x00, 0x00, -0xFF, 0xFF, 0xB7, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x76, 0xF1, 0x38, 0x00, 0x9D, 0x16, 0xD8, 0x00, 0x00, -0x00, 0x00, +0x26, 0x15, 0x7C, 0xC0, 0x2D, 0x25, 0x03, 0x50, 0x2D, 0x9B, 0x9C, 0x40, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xB7, 0xC4, +0x00, 0x00, 0xFF, 0xFF, 0xB7, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, +0x69, 0x87, 0x23, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x74, 0x40, 0xD4, 0xFF, 0xFF, 0xFF, 0xFF, +0xC3, 0xCF, 0x4A, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x45, 0xE3, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, +0xC5, 0x2F, 0x4A, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x1F, 0x2D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xC7, 0x0F, 0x2C, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x1E, 0x18, 0xC4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8F, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, +0x1F, 0xF9, 0xF7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, 0x90, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x9E, 0xE3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x2D, 0x25, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9B, 0x9C, 0x40, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xB7, 0xC4, +0x00, 0x00, 0xFF, 0xFF, 0xB7, 0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x76, 0xF1, 0x38, 0x00, 0x9D, 0x16, 0xD8, +0x00, 0x00, 0x00, 0x00, /* America/Los_Angeles */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33502,23 +33699,27 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Lower_Princes */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x93, 0x1E, 0x2E, 0x23, -0xF6, 0x98, 0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, -0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, -0x30, 0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x1E, 0x2E, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, -0xEC, 0x48, 0x01, 0x02, 0xFF, 0xFF, 0xBF, 0x5D, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xB8, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x33, 0x30, 0x00, -0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, -0x74, 0xAD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xDF, 0x92, 0x00, 0xB2, 0x74, 0xAD, 0x00, 0x00, +0x00, 0x00, /* America/Maceio */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x68, 0x7C, +0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x68, 0x7C, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -33529,42 +33730,41 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x23, 0x58, 0x10, 0xB0, 0x23, 0xE2, 0x70, 0x20, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xD4, 0xC7, 0x20, 0x30, 0x80, 0x79, 0x30, 0x31, 0x1D, 0x4D, 0xA0, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x39, 0xF2, 0x4A, 0x20, 0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, -0xDE, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x68, 0x7C, -0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, -0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, -0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, -0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, -0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, -0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, -0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x4D, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, -0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xF2, 0x4A, 0x20, -0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0xDE, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, -0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x7A, 0x94, 0x35, 0x00, 0xDC, 0x28, 0xAD, -0x00, 0x00, 0x00, 0x10, 0x41, 0x6C, 0x61, 0x67, 0x6F, 0x61, 0x73, 0x2C, 0x20, 0x53, 0x65, 0x72, -0x67, 0x69, 0x70, 0x65, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xDE, 0x84, 0x00, 0x00, 0xFF, +0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x03, 0x00, +0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x68, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, +0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, +0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, +0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, +0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, +0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, +0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, +0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, +0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, +0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, +0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, +0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, +0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, +0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, +0x80, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, +0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, +0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xF2, 0x4A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xDE, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, +0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x7A, 0x94, 0x35, 0x00, 0xDC, +0x28, 0xAD, 0x00, 0x00, 0x00, 0x10, 0x41, 0x6C, 0x61, 0x67, 0x6F, 0x61, 0x73, 0x2C, 0x20, 0x53, +0x65, 0x72, 0x67, 0x69, 0x70, 0x65, /* America/Managua */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33599,7 +33799,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Manaus */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7F, 0x44, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7F, 0x44, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -33607,49 +33807,54 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x3A, 0x40, 0xF8, 0xC7, 0xD3, 0x30, 0xFA, 0x0A, 0xE0, 0xC0, 0xFA, 0xA9, 0x06, 0xB0, 0xFB, 0xEC, 0x14, 0x40, 0xFC, 0x8B, 0x8B, 0xB0, 0x1D, 0xC9, 0x9C, 0x40, 0x1E, 0x78, 0xE5, 0xB0, 0x1F, 0xA0, 0x43, 0xC0, 0x20, 0x33, 0xDD, 0xB0, 0x21, 0x81, 0x77, 0x40, 0x22, 0x0B, 0xD6, 0xB0, -0x2C, 0xC0, 0xC3, 0x40, 0x2D, 0x66, 0xD2, 0x30, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, -0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, -0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7F, 0x44, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xC0, 0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, -0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x84, 0x8C, 0x4A, -0x00, 0xB7, 0x14, 0x7D, 0x00, 0x00, 0x00, 0x0F, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, 0x61, 0x73, -0x20, 0x28, 0x65, 0x61, 0x73, 0x74, 0x29, +0x2C, 0xC0, 0xC3, 0x40, 0x2D, 0x66, 0xD2, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, +0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7F, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, +0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, +0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, +0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, +0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, +0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xC3, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, 0x00, 0x00, 0xFF, 0xFF, +0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x84, +0x8C, 0x4A, 0x00, 0xB7, 0x14, 0x7D, 0x00, 0x00, 0x00, 0x0F, 0x41, 0x6D, 0x61, 0x7A, 0x6F, 0x6E, +0x61, 0x73, 0x20, 0x28, 0x65, 0x61, 0x73, 0x74, 0x29, /* America/Marigot */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0xE5, 0x8A, 0x00, 0xB2, 0x66, 0x92, 0x00, 0x00, +0x00, 0x00, /* America/Martinique */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -33768,7 +33973,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Mazatlan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0xCB, 0xEA, 0x71, 0x60, 0xD8, 0x91, 0xB4, 0xF0, 0x00, 0x00, 0x70, 0x80, 0x31, 0x67, 0x84, 0x10, 0x32, 0x73, 0x16, 0x80, 0x33, 0x47, 0x66, 0x10, 0x34, 0x52, 0xF8, 0x80, @@ -33784,95 +33989,68 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x57, 0x00, 0xDB, 0x90, 0x58, 0x15, 0xA8, 0x80, 0x58, 0xE0, 0xBD, 0x90, 0x59, 0xF5, 0x8A, 0x80, 0x5A, 0xC0, 0x9F, 0x90, 0x5B, 0xD5, 0x6C, 0x80, 0x5C, 0xA9, 0xBC, 0x10, 0x5D, 0xB5, 0x4E, 0x80, 0x5E, 0x89, 0x9E, 0x10, 0x5F, 0x95, 0x30, 0x80, 0x60, 0x69, 0x80, 0x10, 0x61, 0x7E, 0x4D, 0x00, -0x62, 0x49, 0x62, 0x10, 0x63, 0x5E, 0x2F, 0x00, 0x64, 0x29, 0x44, 0x10, 0x65, 0x3E, 0x11, 0x00, -0x66, 0x12, 0x60, 0x90, 0x67, 0x1D, 0xF3, 0x00, 0x67, 0xF2, 0x42, 0x90, 0x68, 0xFD, 0xD5, 0x00, -0x69, 0xD2, 0x24, 0x90, 0x6A, 0xDD, 0xB7, 0x00, 0x6B, 0xB2, 0x06, 0x90, 0x6C, 0xC6, 0xD3, 0x80, -0x6D, 0x91, 0xE8, 0x90, 0x6E, 0xA6, 0xB5, 0x80, 0x6F, 0x71, 0xCA, 0x90, 0x70, 0x86, 0x97, 0x80, -0x71, 0x5A, 0xE7, 0x10, 0x72, 0x66, 0x79, 0x80, 0x73, 0x3A, 0xC9, 0x10, 0x74, 0x46, 0x5B, 0x80, -0x75, 0x1A, 0xAB, 0x10, 0x76, 0x2F, 0x78, 0x00, 0x76, 0xFA, 0x8D, 0x10, 0x78, 0x0F, 0x5A, 0x00, -0x78, 0xDA, 0x6F, 0x10, 0x79, 0xEF, 0x3C, 0x00, 0x7A, 0xBA, 0x51, 0x10, 0x7B, 0xCF, 0x1E, 0x00, -0x7C, 0xA3, 0x6D, 0x90, 0x7D, 0xAF, 0x00, 0x00, 0x7E, 0x83, 0x4F, 0x90, 0x7F, 0x8E, 0xE2, 0x00, -0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x62, 0x49, 0x62, 0x10, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, -0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, -0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, -0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, -0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, -0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, -0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x71, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, -0x00, 0x31, 0x67, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, 0x00, 0x00, -0x00, 0x33, 0x47, 0x66, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, -0x00, 0x35, 0x27, 0x48, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, -0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, -0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, -0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, -0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, -0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, -0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, -0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, -0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x51, 0x61, 0x35, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x00, 0x53, 0x41, 0x17, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, -0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, -0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, -0x00, 0x60, 0x69, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x62, 0x49, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x64, 0x29, 0x44, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x11, 0x00, 0x00, 0x00, 0x00, -0x00, 0x66, 0x12, 0x60, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xF3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x67, 0xF2, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xD5, 0x00, 0x00, 0x00, 0x00, -0x00, 0x69, 0xD2, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xB7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x6B, 0xB2, 0x06, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xD3, 0x80, 0x00, 0x00, 0x00, -0x00, 0x6D, 0x91, 0xE8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xB5, 0x80, 0x00, 0x00, 0x00, -0x00, 0x6F, 0x71, 0xCA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x97, 0x80, 0x00, 0x00, 0x00, -0x00, 0x71, 0x5A, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x79, 0x80, 0x00, 0x00, 0x00, -0x00, 0x73, 0x3A, 0xC9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x5B, 0x80, 0x00, 0x00, 0x00, -0x00, 0x75, 0x1A, 0xAB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x76, 0xFA, 0x8D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x5A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x78, 0xDA, 0x6F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x3C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7A, 0xBA, 0x51, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x1E, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7C, 0xA3, 0x6D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7E, 0x83, 0x4F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xE2, 0x00, 0x01, 0x02, 0x04, -0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, +0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, +0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x00, +0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, +0x00, 0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x71, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x84, 0x10, 0x00, +0x00, 0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x66, 0x10, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, -0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, -0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x4D, 0x44, 0x54, 0x2C, 0x4D, -0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xAC, -0xC1, 0x42, 0x00, 0x70, 0x47, 0x7D, 0x00, 0x00, 0x00, 0x35, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, -0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, 0x43, -0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, 0x6E, 0x69, 0x61, 0x20, 0x53, 0x75, 0x72, 0x2C, 0x20, 0x4E, -0x61, 0x79, 0x61, 0x72, 0x69, 0x74, 0x2C, 0x20, 0x53, 0x69, 0x6E, 0x61, 0x6C, 0x6F, 0x61, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, +0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, +0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, 0x00, 0xAC, 0xC1, 0x42, 0x00, 0x70, 0x47, 0x7D, +0x00, 0x00, 0x00, 0x35, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, +0x65, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, 0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, +0x6E, 0x69, 0x61, 0x20, 0x53, 0x75, 0x72, 0x2C, 0x20, 0x4E, 0x61, 0x79, 0x61, 0x72, 0x69, 0x74, +0x2C, 0x20, 0x53, 0x69, 0x6E, 0x61, 0x6C, 0x6F, 0x61, /* America/Mendoza */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -33888,57 +34066,56 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x27, 0x19, 0x34, 0x40, 0x27, 0xCD, 0xC3, 0xB0, 0x28, 0xFA, 0x67, 0xC0, 0x29, 0xB0, 0x48, 0xB0, 0x2A, 0xE0, 0xE1, 0x40, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x40, 0xB0, 0x13, 0xB0, 0x41, 0x56, 0x3E, 0xC0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xBF, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, +0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB2, 0x04, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x19, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xC3, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x28, 0xFA, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x48, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xE1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x40, 0xB0, 0x13, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x56, 0x3E, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x03, 0x05, 0x02, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xBF, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xB2, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x19, 0x34, +0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCD, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xFA, 0x67, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xE1, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xB0, 0x13, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x56, 0x3E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x03, 0x05, 0x02, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xBF, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Menominee */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -34090,7 +34267,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Merida */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0xA5, 0xB6, 0xDA, 0x60, +0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0xA5, 0xB6, 0xDA, 0x60, 0x16, 0x86, 0xD5, 0x60, 0x18, 0x4C, 0x4B, 0x50, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, 0x33, 0x47, 0x58, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x3A, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x37, 0x07, 0x1C, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x38, 0xE6, 0xFE, 0x00, 0x39, 0xFB, 0xCA, 0xF0, @@ -34105,82 +34282,55 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x58, 0xE0, 0xAF, 0x80, 0x59, 0xF5, 0x7C, 0x70, 0x5A, 0xC0, 0x91, 0x80, 0x5B, 0xD5, 0x5E, 0x70, 0x5C, 0xA9, 0xAE, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x5E, 0x89, 0x90, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x60, 0x69, 0x72, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, -0x64, 0x29, 0x36, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x66, 0x12, 0x52, 0x80, 0x67, 0x1D, 0xE4, 0xF0, -0x67, 0xF2, 0x34, 0x80, 0x68, 0xFD, 0xC6, 0xF0, 0x69, 0xD2, 0x16, 0x80, 0x6A, 0xDD, 0xA8, 0xF0, -0x6B, 0xB1, 0xF8, 0x80, 0x6C, 0xC6, 0xC5, 0x70, 0x6D, 0x91, 0xDA, 0x80, 0x6E, 0xA6, 0xA7, 0x70, -0x6F, 0x71, 0xBC, 0x80, 0x70, 0x86, 0x89, 0x70, 0x71, 0x5A, 0xD9, 0x00, 0x72, 0x66, 0x6B, 0x70, -0x73, 0x3A, 0xBB, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x75, 0x1A, 0x9D, 0x00, 0x76, 0x2F, 0x69, 0xF0, -0x76, 0xFA, 0x7F, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x78, 0xDA, 0x61, 0x00, 0x79, 0xEF, 0x2D, 0xF0, -0x7A, 0xBA, 0x43, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x7C, 0xA3, 0x5F, 0x80, 0x7D, 0xAE, 0xF1, 0xF0, -0x7E, 0x83, 0x41, 0x80, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, -0xFF, 0xAB, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, -0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x43, 0x53, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, -0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x05, 0x00, -0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xDA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16, -0x86, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0x4C, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, -0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, -0x47, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, -0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, -0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, -0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, -0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, -0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, -0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, -0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, -0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, -0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, -0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, -0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, -0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, -0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, -0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, -0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, -0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, -0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, -0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, -0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, -0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, -0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, -0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, -0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, -0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, -0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x64, -0x29, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x66, -0x12, 0x52, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xE4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x67, -0xF2, 0x34, 0x80, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xC6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x69, -0xD2, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xA8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6B, -0xB1, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xC5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6D, -0x91, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xA7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6F, -0x71, 0xBC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x89, 0x70, 0x00, 0x00, 0x00, 0x00, 0x71, -0x5A, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x73, -0x3A, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x75, -0x1A, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, -0xFA, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x78, -0xDA, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7A, -0xBA, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7C, -0xA3, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0xF1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x83, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0xAB, 0xFC, 0x00, 0x00, 0xFF, +0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, +0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x45, +0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xA5, 0xB6, 0xDA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16, 0x86, 0xD5, 0x60, 0x00, 0x00, 0x00, +0x00, 0x18, 0x4C, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, +0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, 0x00, +0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, +0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, +0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, +0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, +0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, +0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, +0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, +0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, +0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, +0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, +0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, +0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, +0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, +0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, +0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, +0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, +0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0xFF, 0xFF, 0xAB, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, -0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, -0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, -0x30, 0x0A, 0x00, 0xA9, 0x52, 0x5A, 0x00, 0x89, 0xE9, 0xFD, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, -0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x61, 0x6D, -0x70, 0x65, 0x63, 0x68, 0x65, 0x2C, 0x20, 0x59, 0x75, 0x63, 0x61, 0x74, 0x61, 0x6E, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, +0xAB, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, +0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, +0x43, 0x53, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xA9, 0x52, 0x5A, +0x00, 0x89, 0xE9, 0xFD, 0x00, 0x00, 0x00, 0x20, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, +0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x43, 0x61, 0x6D, 0x70, 0x65, 0x63, 0x68, 0x65, 0x2C, +0x20, 0x59, 0x75, 0x63, 0x61, 0x74, 0x61, 0x6E, /* America/Metlakatla */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -34279,7 +34429,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Mexico_City */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0xC5, 0xDE, 0xB0, 0x60, 0xC6, 0x97, 0x34, 0x50, 0xC9, 0x55, 0xF1, 0xE0, 0xC9, 0xEA, 0xDD, 0x50, 0xCF, 0x02, 0xC6, 0xE0, 0xCF, 0xB7, 0x56, 0x50, 0xDA, 0x99, 0x15, 0xE0, @@ -34296,98 +34446,70 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0x2C, 0x7D, 0xF0, 0x57, 0x00, 0xCD, 0x80, 0x58, 0x15, 0x9A, 0x70, 0x58, 0xE0, 0xAF, 0x80, 0x59, 0xF5, 0x7C, 0x70, 0x5A, 0xC0, 0x91, 0x80, 0x5B, 0xD5, 0x5E, 0x70, 0x5C, 0xA9, 0xAE, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x5E, 0x89, 0x90, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x60, 0x69, 0x72, 0x00, -0x61, 0x7E, 0x3E, 0xF0, 0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x64, 0x29, 0x36, 0x00, -0x65, 0x3E, 0x02, 0xF0, 0x66, 0x12, 0x52, 0x80, 0x67, 0x1D, 0xE4, 0xF0, 0x67, 0xF2, 0x34, 0x80, -0x68, 0xFD, 0xC6, 0xF0, 0x69, 0xD2, 0x16, 0x80, 0x6A, 0xDD, 0xA8, 0xF0, 0x6B, 0xB1, 0xF8, 0x80, -0x6C, 0xC6, 0xC5, 0x70, 0x6D, 0x91, 0xDA, 0x80, 0x6E, 0xA6, 0xA7, 0x70, 0x6F, 0x71, 0xBC, 0x80, -0x70, 0x86, 0x89, 0x70, 0x71, 0x5A, 0xD9, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x73, 0x3A, 0xBB, 0x00, -0x74, 0x46, 0x4D, 0x70, 0x75, 0x1A, 0x9D, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x76, 0xFA, 0x7F, 0x00, -0x78, 0x0F, 0x4B, 0xF0, 0x78, 0xDA, 0x61, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x7A, 0xBA, 0x43, 0x00, -0x7B, 0xCF, 0x0F, 0xF0, 0x7C, 0xA3, 0x5F, 0x80, 0x7D, 0xAE, 0xF1, 0xF0, 0x7E, 0x83, 0x41, 0x80, -0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x06, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, +0x61, 0x7E, 0x3E, 0xF0, 0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, +0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x06, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, -0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, -0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x62, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, -0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, -0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, -0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xDE, -0xB0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x97, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x55, -0xF1, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0xDD, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x02, -0xC6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xB7, 0x56, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x99, -0x15, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x76, 0x83, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, -0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, -0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, -0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, -0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, -0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, -0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, -0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, -0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, -0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, -0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, -0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, -0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, -0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, -0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, -0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, -0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, -0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, -0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, -0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, -0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, -0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, -0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, -0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, -0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, -0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x29, -0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, -0x52, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xE4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF2, -0x34, 0x80, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xC6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD2, -0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xA8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, -0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xC5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, -0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xA7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x71, -0xBC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x89, 0x70, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, -0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, -0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, -0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, -0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, -0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xBA, -0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, -0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0xF1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x83, -0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, -0x05, 0x02, 0x05, 0x02, 0x06, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, +0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, +0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, +0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, +0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, +0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xDE, 0xB0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xC6, 0x97, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x55, 0xF1, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, +0xC9, 0xEA, 0xDD, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x02, 0xC6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, +0xCF, 0xB7, 0x56, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x99, 0x15, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, +0xDB, 0x76, 0x83, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, +0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, +0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, +0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, +0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, +0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, +0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, +0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, +0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, +0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, +0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, +0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, +0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, +0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, +0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, +0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, +0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, +0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, +0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x06, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, -0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, -0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, -0x43, 0x57, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, -0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xA6, 0xEE, 0x60, -0x00, 0x7B, 0x5E, 0x07, 0x00, 0x00, 0x00, 0x0C, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, -0x54, 0x69, 0x6D, 0x65, +0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, +0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, +0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, +0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xA6, 0xEE, 0x60, 0x00, 0x7B, 0x5E, 0x07, 0x00, 0x00, +0x00, 0x0C, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, /* America/Miquelon */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x91, 0xB6, 0x38, 0xA8, +0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x91, 0xB6, 0x38, 0xA8, 0x13, 0x6E, 0x63, 0xC0, 0x20, 0x75, 0xE4, 0xD0, 0x21, 0x81, 0x77, 0x40, 0x22, 0x55, 0xC6, 0xD0, 0x23, 0x6A, 0x93, 0xC0, 0x24, 0x35, 0xA8, 0xD0, 0x25, 0x4A, 0x75, 0xC0, 0x26, 0x15, 0x8A, 0xD0, 0x27, 0x2A, 0x57, 0xC0, 0x27, 0xFE, 0xA7, 0x50, 0x29, 0x0A, 0x39, 0xC0, 0x29, 0xDE, 0x89, 0x50, @@ -34413,83 +34535,83 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x72, 0x6F, 0x7B, 0xC0, 0x73, 0x15, 0xA6, 0xD0, 0x74, 0x4F, 0x5D, 0xC0, 0x74, 0xFE, 0xC3, 0x50, 0x76, 0x38, 0x7A, 0x40, 0x76, 0xDE, 0xA5, 0x50, 0x78, 0x18, 0x5C, 0x40, 0x78, 0xBE, 0x87, 0x50, 0x79, 0xF8, 0x3E, 0x40, 0x7A, 0x9E, 0x69, 0x50, 0x7B, 0xD8, 0x20, 0x40, 0x7C, 0x7E, 0x4B, 0x50, -0x7D, 0xB8, 0x02, 0x40, 0x7E, 0x5E, 0x2D, 0x50, 0x7F, 0x97, 0xE4, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x7D, 0xB8, 0x02, 0x40, 0x7E, 0x5E, 0x2D, 0x50, 0x7F, 0x97, 0xE4, 0x40, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xCB, 0x58, 0x00, 0x00, 0xFF, -0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, -0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, -0xFF, 0x91, 0xB6, 0x38, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x13, 0x6E, 0x63, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x20, 0x75, 0xE4, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, -0x00, 0x22, 0x55, 0xC6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0x93, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x24, 0x35, 0xA8, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x75, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x26, 0x15, 0x8A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x57, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x27, 0xFE, 0xA7, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x39, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x29, 0xDE, 0x89, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x1B, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x2B, 0xBE, 0x6B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x38, 0x40, 0x00, 0x00, 0x00, -0x00, 0x2D, 0x9E, 0x4D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x1A, 0x40, 0x00, 0x00, 0x00, -0x00, 0x2F, 0x7E, 0x2F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x92, 0xFC, 0x40, 0x00, 0x00, 0x00, -0x00, 0x31, 0x67, 0x4B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xDE, 0x40, 0x00, 0x00, 0x00, -0x00, 0x33, 0x47, 0x2D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xC0, 0x40, 0x00, 0x00, 0x00, -0x00, 0x35, 0x27, 0x0F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xA2, 0x40, 0x00, 0x00, 0x00, -0x00, 0x37, 0x06, 0xF1, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xBE, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x38, 0xE6, 0xD3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xA0, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x3A, 0xC6, 0xB5, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x82, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x3C, 0xAF, 0xD2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x64, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x3E, 0x8F, 0xB4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x46, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x40, 0x6F, 0x96, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x63, 0x40, 0x00, 0x00, 0x00, -0x00, 0x42, 0x4F, 0x78, 0x50, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x45, 0x40, 0x00, 0x00, 0x00, -0x00, 0x44, 0x2F, 0x5A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x27, 0x40, 0x00, 0x00, 0x00, -0x00, 0x45, 0xF3, 0x8C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x43, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x47, 0xD3, 0x6E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x25, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x49, 0xB3, 0x50, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x07, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x4B, 0x9C, 0x6D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x24, 0x40, 0x00, 0x00, 0x00, -0x00, 0x4D, 0x7C, 0x4F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x06, 0x40, 0x00, 0x00, 0x00, -0x00, 0x4F, 0x5C, 0x31, 0x50, 0x00, 0x00, 0x00, 0x00, 0x50, 0x95, 0xE8, 0x40, 0x00, 0x00, 0x00, -0x00, 0x51, 0x3C, 0x13, 0x50, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xCA, 0x40, 0x00, 0x00, 0x00, -0x00, 0x53, 0x1B, 0xF5, 0x50, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xAC, 0x40, 0x00, 0x00, 0x00, -0x00, 0x54, 0xFB, 0xD7, 0x50, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0x8E, 0x40, 0x00, 0x00, 0x00, -0x00, 0x56, 0xE4, 0xF3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xAA, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x58, 0xC4, 0xD5, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0x8C, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x5A, 0xA4, 0xB7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x6E, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x5C, 0x84, 0x99, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x50, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x5E, 0x64, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x32, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x60, 0x4D, 0x98, 0x50, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x4F, 0x40, 0x00, 0x00, 0x00, -0x00, 0x62, 0x2D, 0x7A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x31, 0x40, 0x00, 0x00, 0x00, -0x00, 0x64, 0x0D, 0x5C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x13, 0x40, 0x00, 0x00, 0x00, -0x00, 0x65, 0xED, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x67, 0x26, 0xF5, 0x40, 0x00, 0x00, 0x00, -0x00, 0x67, 0xCD, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xD7, 0x40, 0x00, 0x00, 0x00, -0x00, 0x69, 0xAD, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xB9, 0x40, 0x00, 0x00, 0x00, -0x00, 0x6B, 0x96, 0x1E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xD5, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x6D, 0x76, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xB7, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x6F, 0x55, 0xE2, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0x99, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x71, 0x35, 0xC4, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x7B, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x73, 0x15, 0xA6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x5D, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x74, 0xFE, 0xC3, 0x50, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x7A, 0x40, 0x00, 0x00, 0x00, -0x00, 0x76, 0xDE, 0xA5, 0x50, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x5C, 0x40, 0x00, 0x00, 0x00, -0x00, 0x78, 0xBE, 0x87, 0x50, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x3E, 0x40, 0x00, 0x00, 0x00, -0x00, 0x7A, 0x9E, 0x69, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x20, 0x40, 0x00, 0x00, 0x00, -0x00, 0x7C, 0x7E, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x02, 0x40, 0x00, 0x00, 0x00, -0x00, 0x7E, 0x5E, 0x2D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x97, 0xE4, 0x40, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, -0xCB, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x2D, 0x30, -0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x3C, 0x2D, 0x30, -0x32, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, -0x30, 0x0A, 0x00, 0xD1, 0x1F, 0x28, 0x00, 0xBC, 0xB3, 0x4A, 0x00, 0x00, 0x00, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xCB, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, +0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, +0x41, 0x53, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xB6, 0x38, 0xA8, +0x00, 0x00, 0x00, 0x00, 0x13, 0x6E, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x75, 0xE4, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xC6, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0x93, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xA8, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x75, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0x8A, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x57, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xA7, 0x50, +0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x39, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0x89, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x1B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x6B, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x38, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x4D, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x1A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x2F, 0x50, +0x00, 0x00, 0x00, 0x00, 0x30, 0x92, 0xFC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x4B, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xDE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x2D, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xC0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x0F, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xA2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xF1, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xBE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xD3, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xA0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xB5, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xD2, 0x50, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x64, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xB4, 0x50, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x46, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0x96, 0x50, +0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x63, 0x40, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x78, 0x50, +0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x45, 0x40, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x5A, 0x50, +0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x27, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x8C, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x6E, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x25, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x50, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x6D, 0x50, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x4F, 0x50, +0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x31, 0x50, +0x00, 0x00, 0x00, 0x00, 0x50, 0x95, 0xE8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x13, 0x50, +0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xCA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1B, 0xF5, 0x50, +0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xAC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xD7, 0x50, +0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0x8E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE4, 0xF3, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xAA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC4, 0xD5, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0x8C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xB7, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x6E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0x99, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0x7B, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0x98, 0x50, +0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0x7A, 0x50, +0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x31, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x5C, 0x50, +0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x3E, 0x50, +0x00, 0x00, 0x00, 0x00, 0x67, 0x26, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x20, 0x50, +0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x02, 0x50, +0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x1E, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x00, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x55, 0xE2, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xC4, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xA6, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xC3, 0x50, +0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x7A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xA5, 0x50, +0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0x87, 0x50, +0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0x69, 0x50, +0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x4B, 0x50, +0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x2D, 0x50, +0x00, 0x00, 0x00, 0x00, 0x7F, 0x97, 0xE4, 0x40, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0xFF, 0xFF, 0xCB, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x3C, +0x2D, 0x30, 0x32, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, +0x31, 0x2E, 0x30, 0x0A, 0x00, 0xD1, 0x1F, 0x28, 0x00, 0xBC, 0xB3, 0x4A, 0x00, 0x00, 0x00, 0x00, + /* America/Moncton */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -34696,7 +34818,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Monterrey */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xA5, 0xB6, 0xDA, 0x60, +0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xA5, 0xB6, 0xDA, 0x60, 0x22, 0x55, 0xF1, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, 0x33, 0x47, 0x58, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x3A, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x37, 0x07, 0x1C, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x38, 0xE6, 0xFE, 0x00, 0x39, 0xFB, 0xCA, 0xF0, @@ -34711,88 +34833,61 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x58, 0xE0, 0xAF, 0x80, 0x59, 0xF5, 0x7C, 0x70, 0x5A, 0xC0, 0x91, 0x80, 0x5B, 0xD5, 0x5E, 0x70, 0x5C, 0xA9, 0xAE, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x5E, 0x89, 0x90, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x60, 0x69, 0x72, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, -0x64, 0x29, 0x36, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x66, 0x12, 0x52, 0x80, 0x67, 0x1D, 0xE4, 0xF0, -0x67, 0xF2, 0x34, 0x80, 0x68, 0xFD, 0xC6, 0xF0, 0x69, 0xD2, 0x16, 0x80, 0x6A, 0xDD, 0xA8, 0xF0, -0x6B, 0xB1, 0xF8, 0x80, 0x6C, 0xC6, 0xC5, 0x70, 0x6D, 0x91, 0xDA, 0x80, 0x6E, 0xA6, 0xA7, 0x70, -0x6F, 0x71, 0xBC, 0x80, 0x70, 0x86, 0x89, 0x70, 0x71, 0x5A, 0xD9, 0x00, 0x72, 0x66, 0x6B, 0x70, -0x73, 0x3A, 0xBB, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x75, 0x1A, 0x9D, 0x00, 0x76, 0x2F, 0x69, 0xF0, -0x76, 0xFA, 0x7F, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x78, 0xDA, 0x61, 0x00, 0x79, 0xEF, 0x2D, 0xF0, -0x7A, 0xBA, 0x43, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x7C, 0xA3, 0x5F, 0x80, 0x7D, 0xAE, 0xF1, 0xF0, -0x7E, 0x83, 0x41, 0x80, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, -0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, -0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, -0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, -0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xDA, 0x60, 0x00, -0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, -0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, -0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, -0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, -0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, -0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, -0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, -0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, -0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, -0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, -0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, -0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, -0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x64, 0x29, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x66, 0x12, 0x52, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xE4, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x67, 0xF2, 0x34, 0x80, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xC6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x69, 0xD2, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xA8, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x6B, 0xB1, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xC5, 0x70, 0x00, -0x00, 0x00, 0x00, 0x6D, 0x91, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xA7, 0x70, 0x00, -0x00, 0x00, 0x00, 0x6F, 0x71, 0xBC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x89, 0x70, 0x00, -0x00, 0x00, 0x00, 0x71, 0x5A, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x00, -0x00, 0x00, 0x00, 0x73, 0x3A, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x75, 0x1A, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x76, 0xFA, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x78, 0xDA, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x7A, 0xBA, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x7C, 0xA3, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0xF1, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x7E, 0x83, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, +0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, +0x04, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xDA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, +0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, +0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, +0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, +0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, +0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, +0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, +0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, +0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, +0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, +0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, +0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, +0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, +0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, +0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, +0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, +0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, +0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, +0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, +0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, +0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, +0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, +0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, +0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, +0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, -0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0x4C, 0x4D, -0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, -0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0xB0, 0x7E, 0x4A, 0x00, 0x79, -0x96, 0x4D, 0x00, 0x00, 0x00, 0x45, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, -0x6D, 0x65, 0x20, 0x2D, 0x20, 0x44, 0x75, 0x72, 0x61, 0x6E, 0x67, 0x6F, 0x3B, 0x20, 0x43, 0x6F, -0x61, 0x68, 0x75, 0x69, 0x6C, 0x61, 0x2C, 0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, 0x65, -0x6F, 0x6E, 0x2C, 0x20, 0x54, 0x61, 0x6D, 0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, 0x20, 0x28, -0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x02, 0x03, 0xFF, 0xFF, 0xA1, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x01, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, +0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0A, 0x43, +0x53, 0x54, 0x36, 0x0A, 0x00, 0xB0, 0x7E, 0x4A, 0x00, 0x79, 0x96, 0x4D, 0x00, 0x00, 0x00, 0x45, +0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x2D, 0x20, 0x44, +0x75, 0x72, 0x61, 0x6E, 0x67, 0x6F, 0x3B, 0x20, 0x43, 0x6F, 0x61, 0x68, 0x75, 0x69, 0x6C, 0x61, +0x2C, 0x20, 0x4E, 0x75, 0x65, 0x76, 0x6F, 0x20, 0x4C, 0x65, 0x6F, 0x6E, 0x2C, 0x20, 0x54, 0x61, +0x6D, 0x61, 0x75, 0x6C, 0x69, 0x70, 0x61, 0x73, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, +0x72, 0x65, 0x61, 0x73, 0x29, /* America/Montevideo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x26, 0x8C, 0x34, 0xE5, 0x33, +0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x26, 0x8C, 0x34, 0xE5, 0x33, 0xA2, 0x92, 0x87, 0xB3, 0xA8, 0xFF, 0xDB, 0x40, 0xA9, 0xF1, 0x0F, 0xB0, 0xAA, 0xE2, 0x59, 0x38, 0xAB, 0xD2, 0x43, 0x30, 0xAC, 0xC3, 0x8C, 0xB8, 0xAD, 0xB3, 0x76, 0xB0, 0xBB, 0xF4, 0xB5, 0xB8, 0xBC, 0xBF, 0xB5, 0xB0, 0xBD, 0xD4, 0x97, 0xB8, 0xBE, 0x9F, 0x97, 0xB0, 0xBF, 0xB4, 0x79, 0xB8, @@ -34814,78 +34909,77 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x49, 0xB3, 0x42, 0xC0, 0x4A, 0xC8, 0x2B, 0xD0, 0x4B, 0x9C, 0x5F, 0x40, 0x4C, 0xA8, 0x0D, 0xD0, 0x4D, 0x7C, 0x41, 0x40, 0x4E, 0x87, 0xEF, 0xD0, 0x4F, 0x5C, 0x23, 0x40, 0x50, 0x71, 0x0C, 0x50, 0x51, 0x3C, 0x05, 0x40, 0x52, 0x50, 0xEE, 0x50, 0x53, 0x1B, 0xE7, 0x40, 0x54, 0x30, 0xD0, 0x50, -0x54, 0xFB, 0xC9, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x54, 0xFB, 0xC9, 0x40, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, +0x05, 0x07, 0x05, 0x07, 0x05, 0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x08, 0x06, 0x05, 0x07, 0x05, +0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, +0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, +0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0xFF, 0xFF, 0xCB, 0x4D, 0x00, 0x00, +0xFF, 0xFF, 0xCB, 0x4D, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xCE, 0xC8, +0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x12, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x12, 0xFF, 0xFF, +0xDC, 0xD8, 0x01, 0x16, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0xFF, 0xFF, 0xEA, 0xE8, 0x01, 0x20, +0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x34, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x33, +0x30, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, +0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0xE5, 0x33, +0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x87, 0xB3, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xFF, 0xDB, 0x40, +0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xF1, 0x0F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE2, 0x59, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xD2, 0x43, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x8C, 0xB8, +0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xB3, 0x76, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF4, 0xB5, 0xB8, +0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBF, 0xB5, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD4, 0x97, 0xB8, +0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x97, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xB4, 0x79, 0xB8, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0x79, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x94, 0x5B, 0xB8, +0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x5F, 0x5B, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7D, 0x78, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x3D, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x5D, 0x5A, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x1F, 0x1F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x18, 0x52, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x08, 0x3C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x1D, 0x1E, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xE8, 0x1E, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x8B, 0x9F, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x1E, 0xC6, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x66, 0x28, +0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x0B, 0x85, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xF2, 0x35, 0x28, +0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x45, 0x4A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x85, 0xD6, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x72, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFA, 0x1B, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x3E, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF6, 0x11, 0x28, +0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x75, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x52, 0x20, +0x00, 0x00, 0x00, 0x00, 0x04, 0x57, 0x8A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x04, 0xC6, 0x3A, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x07, 0x96, 0x1B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xDA, 0x98, +0x00, 0x00, 0x00, 0x00, 0x08, 0xC6, 0x9F, 0x28, 0x00, 0x00, 0x00, 0x00, 0x09, 0x5A, 0x4E, 0x30, +0x00, 0x00, 0x00, 0x00, 0x09, 0xDB, 0x73, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x1A, 0x12, 0x30, +0x00, 0x00, 0x00, 0x00, 0x0D, 0x7F, 0x87, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xE7, 0x7F, 0x30, +0x00, 0x00, 0x00, 0x00, 0x0F, 0x5F, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD9, 0xD6, 0x30, +0x00, 0x00, 0x00, 0x00, 0x11, 0x3F, 0x4B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x2D, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x13, 0x31, 0xA2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0xC3, 0x54, 0x30, +0x00, 0x00, 0x00, 0x00, 0x22, 0x27, 0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 0x23, 0xA1, 0xE4, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x67, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x25, 0xE7, 0x3C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, +0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x2B, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, +0x00, 0x00, 0x00, 0x00, 0x2B, 0x90, 0x1C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x4C, 0xF6, 0x30, +0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0xA3, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x9C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1F, 0x4B, 0x50, +0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x7E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x08, 0x67, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xE8, 0x49, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x42, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xC8, 0x2B, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x5F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xA8, 0x0D, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x41, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x87, 0xEF, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x23, 0x40, 0x00, 0x00, 0x00, 0x00, 0x50, 0x71, 0x0C, 0x50, +0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x05, 0x40, 0x00, 0x00, 0x00, 0x00, 0x52, 0x50, 0xEE, 0x50, +0x00, 0x00, 0x00, 0x00, 0x53, 0x1B, 0xE7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, 0x30, 0xD0, 0x50, +0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xC9, 0x40, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, 0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x08, 0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, -0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x05, 0xFF, -0xFF, 0xCB, 0x4D, 0x00, 0x00, 0xFF, 0xFF, 0xCB, 0x4D, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, -0x08, 0xFF, 0xFF, 0xCE, 0xC8, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x12, 0xFF, 0xFF, 0xD5, -0xD0, 0x00, 0x12, 0xFF, 0xFF, 0xDC, 0xD8, 0x01, 0x16, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0xFF, -0xFF, 0xEA, 0xE8, 0x01, 0x20, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, -0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, -0x00, 0x2D, 0x30, 0x32, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x33, 0x30, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, -0xFF, 0x8C, 0x34, 0xE5, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x87, 0xB3, 0xFF, 0xFF, 0xFF, -0xFF, 0xA8, 0xFF, 0xDB, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0xF1, 0x0F, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0xE2, 0x59, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xD2, 0x43, 0x30, 0xFF, 0xFF, 0xFF, -0xFF, 0xAC, 0xC3, 0x8C, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xB3, 0x76, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xBB, 0xF4, 0xB5, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xBF, 0xB5, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xBD, 0xD4, 0x97, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x97, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xBF, 0xB4, 0x79, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0x79, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xC1, 0x94, 0x5B, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x5F, 0x5B, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xC3, 0x7D, 0x78, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x3D, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xC5, 0x5D, 0x5A, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x1F, 0x1F, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xC7, 0x18, 0x52, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x08, 0x3C, 0x30, 0xFF, 0xFF, 0xFF, -0xFF, 0xC9, 0x1D, 0x1E, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xE8, 0x1E, 0x30, 0xFF, 0xFF, 0xFF, -0xFF, 0xCA, 0x8B, 0x9F, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x1E, 0xC6, 0x30, 0xFF, 0xFF, 0xFF, -0xFF, 0xCD, 0x95, 0x66, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x0B, 0x85, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xEC, 0xF2, 0x35, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x45, 0x4A, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xED, 0x85, 0xD6, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x72, 0xB0, 0xFF, 0xFF, 0xFF, -0xFF, 0xF7, 0xFA, 0x1B, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFE, 0x3E, 0x30, 0xFF, 0xFF, 0xFF, -0xFF, 0xFD, 0xF6, 0x11, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x75, 0x30, 0x00, 0x00, 0x00, -0x00, 0x00, 0xD8, 0x52, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x57, 0x8A, 0xB0, 0x00, 0x00, 0x00, -0x00, 0x04, 0xC6, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x96, 0x1B, 0xB0, 0x00, 0x00, 0x00, -0x00, 0x07, 0xDF, 0xDA, 0x98, 0x00, 0x00, 0x00, 0x00, 0x08, 0xC6, 0x9F, 0x28, 0x00, 0x00, 0x00, -0x00, 0x09, 0x5A, 0x4E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x09, 0xDB, 0x73, 0x20, 0x00, 0x00, 0x00, -0x00, 0x0D, 0x1A, 0x12, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7F, 0x87, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x0E, 0xE7, 0x7F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x5F, 0x69, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x10, 0xD9, 0xD6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3F, 0x4B, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x11, 0x89, 0x2D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x31, 0xA2, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x21, 0xC3, 0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x27, 0x78, 0x20, 0x00, 0x00, 0x00, -0x00, 0x23, 0xA1, 0xE4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x4A, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xE7, 0x3C, 0x20, 0x00, 0x00, 0x00, -0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x29, 0x0A, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x90, 0x1C, 0xA0, 0x00, 0x00, 0x00, -0x00, 0x41, 0x4C, 0xF6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x2F, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x43, 0x48, 0xA3, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x9C, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x45, 0x1F, 0x4B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x7E, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x47, 0x08, 0x67, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x60, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x48, 0xE8, 0x49, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x42, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x4A, 0xC8, 0x2B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x5F, 0x40, 0x00, 0x00, 0x00, -0x00, 0x4C, 0xA8, 0x0D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x41, 0x40, 0x00, 0x00, 0x00, -0x00, 0x4E, 0x87, 0xEF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x23, 0x40, 0x00, 0x00, 0x00, -0x00, 0x50, 0x71, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x05, 0x40, 0x00, 0x00, 0x00, -0x00, 0x52, 0x50, 0xEE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1B, 0xE7, 0x40, 0x00, 0x00, 0x00, -0x00, 0x54, 0x30, 0xD0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xC9, 0x40, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x06, 0x05, -0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x06, 0x05, 0x07, 0x05, 0x07, 0x05, 0x08, 0x06, 0x05, 0x07, -0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, -0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, -0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x05, 0xFF, 0xFF, 0xCB, 0x4D, -0x00, 0x00, 0xFF, 0xFF, 0xCB, 0x4D, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, -0xCE, 0xC8, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x12, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x12, -0xFF, 0xFF, 0xDC, 0xD8, 0x01, 0x16, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0xFF, 0xFF, 0xEA, 0xE8, -0x01, 0x20, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, -0x32, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x33, 0x30, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x54, 0x0F, 0xDB, 0x00, 0xBC, 0xE2, 0x7E, 0x00, 0x00, -0x00, 0x00, +0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0x07, 0x05, 0xFF, 0xFF, +0xCB, 0x4D, 0x00, 0x00, 0xFF, 0xFF, 0xCB, 0x4D, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, +0xFF, 0xFF, 0xCE, 0xC8, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x12, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x12, 0xFF, 0xFF, 0xDC, 0xD8, 0x01, 0x16, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0xFF, 0xFF, +0xEA, 0xE8, 0x01, 0x20, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x2D, 0x30, 0x32, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x33, 0x30, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x54, 0x0F, 0xDB, 0x00, 0xBC, 0xE2, 0x7E, +0x00, 0x00, 0x00, 0x00, /* America/Montreal */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -35503,247 +35597,331 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Nipigon */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xC8, 0xF8, 0x49, 0x50, 0xCB, 0x88, 0xF0, 0x70, -0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xFB, 0xE0, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, -0x0A, 0x00, 0xA3, 0x70, 0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, -0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, -0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, -0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, -0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, -0x1C, 0xD1, 0xEC, 0x70, 0x1D, 0xC1, 0xCF, 0x60, 0x1E, 0xB1, 0xCE, 0x70, 0x1F, 0xA1, 0xB1, 0x60, -0x20, 0x76, 0x00, 0xF0, 0x21, 0x81, 0x93, 0x60, 0x22, 0x55, 0xE2, 0xF0, 0x23, 0x6A, 0xAF, 0xE0, -0x24, 0x35, 0xC4, 0xF0, 0x25, 0x4A, 0x91, 0xE0, 0x26, 0x15, 0xA6, 0xF0, 0x27, 0x2A, 0x73, 0xE0, -0x27, 0xFE, 0xC3, 0x70, 0x29, 0x0A, 0x55, 0xE0, 0x29, 0xDE, 0xA5, 0x70, 0x2A, 0xEA, 0x37, 0xE0, -0x2B, 0xBE, 0x87, 0x70, 0x2C, 0xD3, 0x54, 0x60, 0x2D, 0x9E, 0x69, 0x70, 0x2E, 0xB3, 0x36, 0x60, -0x2F, 0x7E, 0x4B, 0x70, 0x30, 0x93, 0x18, 0x60, 0x31, 0x67, 0x67, 0xF0, 0x32, 0x72, 0xFA, 0x60, -0x33, 0x47, 0x49, 0xF0, 0x34, 0x52, 0xDC, 0x60, 0x35, 0x27, 0x2B, 0xF0, 0x36, 0x32, 0xBE, 0x60, -0x37, 0x07, 0x0D, 0xF0, 0x38, 0x1B, 0xDA, 0xE0, 0x38, 0xE6, 0xEF, 0xF0, 0x39, 0xFB, 0xBC, 0xE0, -0x3A, 0xC6, 0xD1, 0xF0, 0x3B, 0xDB, 0x9E, 0xE0, 0x3C, 0xAF, 0xEE, 0x70, 0x3D, 0xBB, 0x80, 0xE0, -0x3E, 0x8F, 0xD0, 0x70, 0x3F, 0x9B, 0x62, 0xE0, 0x40, 0x6F, 0xB2, 0x70, 0x41, 0x84, 0x7F, 0x60, -0x42, 0x4F, 0x94, 0x70, 0x43, 0x64, 0x61, 0x60, 0x44, 0x2F, 0x76, 0x70, 0x45, 0x44, 0x43, 0x60, -0x45, 0xF3, 0xA8, 0xF0, 0x47, 0x2D, 0x5F, 0xE0, 0x47, 0xD3, 0x8A, 0xF0, 0x49, 0x0D, 0x41, 0xE0, -0x49, 0xB3, 0x6C, 0xF0, 0x4A, 0xED, 0x23, 0xE0, 0x4B, 0x9C, 0x89, 0x70, 0x4C, 0xD6, 0x40, 0x60, -0x4D, 0x7C, 0x6B, 0x70, 0x4E, 0xB6, 0x22, 0x60, 0x4F, 0x5C, 0x4D, 0x70, 0x50, 0x96, 0x04, 0x60, -0x51, 0x3C, 0x2F, 0x70, 0x52, 0x75, 0xE6, 0x60, 0x53, 0x1C, 0x11, 0x70, 0x54, 0x55, 0xC8, 0x60, -0x54, 0xFB, 0xF3, 0x70, 0x56, 0x35, 0xAA, 0x60, 0x56, 0xE5, 0x0F, 0xF0, 0x58, 0x1E, 0xC6, 0xE0, -0x58, 0xC4, 0xF1, 0xF0, 0x59, 0xFE, 0xA8, 0xE0, 0x5A, 0xA4, 0xD3, 0xF0, 0x5B, 0xDE, 0x8A, 0xE0, -0x5C, 0x84, 0xB5, 0xF0, 0x5D, 0xBE, 0x6C, 0xE0, 0x5E, 0x64, 0x97, 0xF0, 0x5F, 0x9E, 0x4E, 0xE0, -0x60, 0x4D, 0xB4, 0x70, 0x61, 0x87, 0x6B, 0x60, 0x62, 0x2D, 0x96, 0x70, 0x63, 0x67, 0x4D, 0x60, -0x64, 0x0D, 0x78, 0x70, 0x65, 0x47, 0x2F, 0x60, 0x65, 0xED, 0x5A, 0x70, 0x67, 0x27, 0x11, 0x60, -0x67, 0xCD, 0x3C, 0x70, 0x69, 0x06, 0xF3, 0x60, 0x69, 0xAD, 0x1E, 0x70, 0x6A, 0xE6, 0xD5, 0x60, -0x6B, 0x96, 0x3A, 0xF0, 0x6C, 0xCF, 0xF1, 0xE0, 0x6D, 0x76, 0x1C, 0xF0, 0x6E, 0xAF, 0xD3, 0xE0, -0x6F, 0x55, 0xFE, 0xF0, 0x70, 0x8F, 0xB5, 0xE0, 0x71, 0x35, 0xE0, 0xF0, 0x72, 0x6F, 0x97, 0xE0, -0x73, 0x15, 0xC2, 0xF0, 0x74, 0x4F, 0x79, 0xE0, 0x74, 0xFE, 0xDF, 0x70, 0x76, 0x38, 0x96, 0x60, -0x76, 0xDE, 0xC1, 0x70, 0x78, 0x18, 0x78, 0x60, 0x78, 0xBE, 0xA3, 0x70, 0x79, 0xF8, 0x5A, 0x60, -0x7A, 0x9E, 0x85, 0x70, 0x7B, 0xD8, 0x3C, 0x60, 0x7C, 0x7E, 0x67, 0x70, 0x7D, 0xB8, 0x1E, 0x60, -0x7E, 0x5E, 0x49, 0x70, 0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, +0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x2E, 0xC8, 0xA1, 0x9A, 0xB1, 0x40, +0xA2, 0x94, 0x06, 0xF0, 0xA3, 0x55, 0xA9, 0x40, 0xA4, 0x86, 0x5D, 0xF0, 0xA5, 0x28, 0x78, 0x60, +0xA6, 0x66, 0x3F, 0xF0, 0xA7, 0x0C, 0x4E, 0xE0, 0xA8, 0x46, 0x21, 0xF0, 0xA8, 0xEC, 0x30, 0xE0, +0xAA, 0x1C, 0xC9, 0x70, 0xAA, 0xD5, 0x4D, 0x60, 0xAB, 0xFC, 0xAB, 0x70, 0xAC, 0xB5, 0x2F, 0x60, +0xAD, 0xDC, 0x8D, 0x70, 0xAE, 0x95, 0x11, 0x60, 0xAF, 0xBC, 0x6F, 0x70, 0xB0, 0x7E, 0x2D, 0xE0, +0xB1, 0x9C, 0x51, 0x70, 0xB2, 0x67, 0x4A, 0x60, 0xB3, 0x7C, 0x33, 0x70, 0xB4, 0x47, 0x2C, 0x60, +0xB5, 0x5C, 0x15, 0x70, 0xB6, 0x27, 0x0E, 0x60, 0xB7, 0x3B, 0xF7, 0x70, 0xB8, 0x06, 0xF0, 0x60, +0xB9, 0x25, 0x13, 0xF0, 0xB9, 0xE6, 0xD2, 0x60, 0xBB, 0x04, 0xF5, 0xF0, 0xBB, 0xCF, 0xEE, 0xE0, +0xBC, 0xE4, 0xD7, 0xF0, 0xBD, 0xAF, 0xD0, 0xE0, 0xBE, 0xC4, 0xB9, 0xF0, 0xBF, 0x8F, 0xB2, 0xE0, +0xC0, 0xA4, 0x9B, 0xF0, 0xC1, 0x6F, 0x94, 0xE0, 0xC2, 0x84, 0x7D, 0xF0, 0xC3, 0x4F, 0x76, 0xE0, +0xC4, 0x64, 0x5F, 0xF0, 0xC5, 0x2F, 0x58, 0xE0, 0xC6, 0x4D, 0x7C, 0x70, 0xC7, 0x0F, 0x3A, 0xE0, +0xC8, 0x2D, 0x5E, 0x70, 0xCB, 0x88, 0xF0, 0x70, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xFB, 0xE0, +0xD3, 0x75, 0xE4, 0xF0, 0xD4, 0x40, 0xDD, 0xE0, 0xD5, 0x55, 0xAA, 0xD0, 0xD6, 0x20, 0xA3, 0xC0, +0xD7, 0x35, 0x8C, 0xD0, 0xD8, 0x00, 0x85, 0xC0, 0xD9, 0x15, 0x6E, 0xD0, 0xDA, 0x33, 0x76, 0x40, +0xDA, 0xFE, 0xA7, 0x70, 0xDC, 0x13, 0x74, 0x60, 0xDC, 0xDE, 0x89, 0x70, 0xDD, 0xA9, 0x82, 0x60, +0xDE, 0xBE, 0x6B, 0x70, 0xDF, 0x89, 0x64, 0x60, 0xE0, 0x9E, 0x4D, 0x70, 0xE1, 0x69, 0x46, 0x60, +0xE2, 0x7E, 0x2F, 0x70, 0xE3, 0x49, 0x28, 0x60, 0xE4, 0x5E, 0x11, 0x70, 0xE5, 0x29, 0x0A, 0x60, +0xE6, 0x47, 0x2D, 0xF0, 0xE7, 0x12, 0x26, 0xE0, 0xE8, 0x27, 0x0F, 0xF0, 0xE9, 0x16, 0xF2, 0xE0, +0xEA, 0x06, 0xF1, 0xF0, 0xEA, 0xF6, 0xD4, 0xE0, 0xEB, 0xE6, 0xD3, 0xF0, 0xEC, 0xD6, 0xB6, 0xE0, +0xED, 0xC6, 0xB5, 0xF0, 0xEE, 0xBF, 0xD3, 0x60, 0xEF, 0xAF, 0xD2, 0x70, 0xF0, 0x9F, 0xB5, 0x60, +0xF1, 0x8F, 0xB4, 0x70, 0xF2, 0x7F, 0x97, 0x60, 0xF3, 0x6F, 0x96, 0x70, 0xF4, 0x5F, 0x79, 0x60, +0xF5, 0x4F, 0x78, 0x70, 0xF6, 0x3F, 0x5B, 0x60, 0xF7, 0x2F, 0x5A, 0x70, 0xF8, 0x28, 0x77, 0xE0, +0xF9, 0x0F, 0x3C, 0x70, 0xFA, 0x08, 0x59, 0xE0, 0xFA, 0xF8, 0x58, 0xF0, 0xFB, 0xE8, 0x3B, 0xE0, +0xFC, 0xD8, 0x3A, 0xF0, 0xFD, 0xC8, 0x1D, 0xE0, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, 0xA7, 0xFF, 0xE0, +0x00, 0x97, 0xFE, 0xF0, 0x01, 0x87, 0xE1, 0xE0, 0x02, 0x77, 0xE0, 0xF0, 0x03, 0x70, 0xFE, 0x60, +0x04, 0x60, 0xFD, 0x70, 0x05, 0x50, 0xE0, 0x60, 0x06, 0x40, 0xDF, 0x70, 0x07, 0x30, 0xC2, 0x60, +0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x0A, 0x00, 0xA3, 0x70, 0x0A, 0xF0, 0x86, 0x60, +0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, +0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, +0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, +0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, +0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, 0x1C, 0xD1, 0xEC, 0x70, 0x1D, 0xC1, 0xCF, 0x60, +0x1E, 0xB1, 0xCE, 0x70, 0x1F, 0xA1, 0xB1, 0x60, 0x20, 0x76, 0x00, 0xF0, 0x21, 0x81, 0x93, 0x60, +0x22, 0x55, 0xE2, 0xF0, 0x23, 0x6A, 0xAF, 0xE0, 0x24, 0x35, 0xC4, 0xF0, 0x25, 0x4A, 0x91, 0xE0, +0x26, 0x15, 0xA6, 0xF0, 0x27, 0x2A, 0x73, 0xE0, 0x27, 0xFE, 0xC3, 0x70, 0x29, 0x0A, 0x55, 0xE0, +0x29, 0xDE, 0xA5, 0x70, 0x2A, 0xEA, 0x37, 0xE0, 0x2B, 0xBE, 0x87, 0x70, 0x2C, 0xD3, 0x54, 0x60, +0x2D, 0x9E, 0x69, 0x70, 0x2E, 0xB3, 0x36, 0x60, 0x2F, 0x7E, 0x4B, 0x70, 0x30, 0x93, 0x18, 0x60, +0x31, 0x67, 0x67, 0xF0, 0x32, 0x72, 0xFA, 0x60, 0x33, 0x47, 0x49, 0xF0, 0x34, 0x52, 0xDC, 0x60, +0x35, 0x27, 0x2B, 0xF0, 0x36, 0x32, 0xBE, 0x60, 0x37, 0x07, 0x0D, 0xF0, 0x38, 0x1B, 0xDA, 0xE0, +0x38, 0xE6, 0xEF, 0xF0, 0x39, 0xFB, 0xBC, 0xE0, 0x3A, 0xC6, 0xD1, 0xF0, 0x3B, 0xDB, 0x9E, 0xE0, +0x3C, 0xAF, 0xEE, 0x70, 0x3D, 0xBB, 0x80, 0xE0, 0x3E, 0x8F, 0xD0, 0x70, 0x3F, 0x9B, 0x62, 0xE0, +0x40, 0x6F, 0xB2, 0x70, 0x41, 0x84, 0x7F, 0x60, 0x42, 0x4F, 0x94, 0x70, 0x43, 0x64, 0x61, 0x60, +0x44, 0x2F, 0x76, 0x70, 0x45, 0x44, 0x43, 0x60, 0x45, 0xF3, 0xA8, 0xF0, 0x47, 0x2D, 0x5F, 0xE0, +0x47, 0xD3, 0x8A, 0xF0, 0x49, 0x0D, 0x41, 0xE0, 0x49, 0xB3, 0x6C, 0xF0, 0x4A, 0xED, 0x23, 0xE0, +0x4B, 0x9C, 0x89, 0x70, 0x4C, 0xD6, 0x40, 0x60, 0x4D, 0x7C, 0x6B, 0x70, 0x4E, 0xB6, 0x22, 0x60, +0x4F, 0x5C, 0x4D, 0x70, 0x50, 0x96, 0x04, 0x60, 0x51, 0x3C, 0x2F, 0x70, 0x52, 0x75, 0xE6, 0x60, +0x53, 0x1C, 0x11, 0x70, 0x54, 0x55, 0xC8, 0x60, 0x54, 0xFB, 0xF3, 0x70, 0x56, 0x35, 0xAA, 0x60, +0x56, 0xE5, 0x0F, 0xF0, 0x58, 0x1E, 0xC6, 0xE0, 0x58, 0xC4, 0xF1, 0xF0, 0x59, 0xFE, 0xA8, 0xE0, +0x5A, 0xA4, 0xD3, 0xF0, 0x5B, 0xDE, 0x8A, 0xE0, 0x5C, 0x84, 0xB5, 0xF0, 0x5D, 0xBE, 0x6C, 0xE0, +0x5E, 0x64, 0x97, 0xF0, 0x5F, 0x9E, 0x4E, 0xE0, 0x60, 0x4D, 0xB4, 0x70, 0x61, 0x87, 0x6B, 0x60, +0x62, 0x2D, 0x96, 0x70, 0x63, 0x67, 0x4D, 0x60, 0x64, 0x0D, 0x78, 0x70, 0x65, 0x47, 0x2F, 0x60, +0x65, 0xED, 0x5A, 0x70, 0x67, 0x27, 0x11, 0x60, 0x67, 0xCD, 0x3C, 0x70, 0x69, 0x06, 0xF3, 0x60, +0x69, 0xAD, 0x1E, 0x70, 0x6A, 0xE6, 0xD5, 0x60, 0x6B, 0x96, 0x3A, 0xF0, 0x6C, 0xCF, 0xF1, 0xE0, +0x6D, 0x76, 0x1C, 0xF0, 0x6E, 0xAF, 0xD3, 0xE0, 0x6F, 0x55, 0xFE, 0xF0, 0x70, 0x8F, 0xB5, 0xE0, +0x71, 0x35, 0xE0, 0xF0, 0x72, 0x6F, 0x97, 0xE0, 0x73, 0x15, 0xC2, 0xF0, 0x74, 0x4F, 0x79, 0xE0, +0x74, 0xFE, 0xDF, 0x70, 0x76, 0x38, 0x96, 0x60, 0x76, 0xDE, 0xC1, 0x70, 0x78, 0x18, 0x78, 0x60, +0x78, 0xBE, 0xA3, 0x70, 0x79, 0xF8, 0x5A, 0x60, 0x7A, 0x9E, 0x85, 0x70, 0x7B, 0xD8, 0x3C, 0x60, +0x7C, 0x7E, 0x67, 0x70, 0x7D, 0xB8, 0x1E, 0x60, 0x7E, 0x5E, 0x49, 0x70, 0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, -0xFF, 0xAD, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, -0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, -0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, -0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x81, 0x40, 0xFF, -0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x49, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, -0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, -0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, -0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, -0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, -0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, -0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, -0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, -0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, -0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x5F, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x47, 0xD3, 0x8A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x41, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x49, 0xB3, 0x6C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x23, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x4B, 0x9C, 0x89, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x40, 0x60, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x7C, 0x6B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x22, 0x60, 0x00, -0x00, 0x00, 0x00, 0x4F, 0x5C, 0x4D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x04, 0x60, 0x00, -0x00, 0x00, 0x00, 0x51, 0x3C, 0x2F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xE6, 0x60, 0x00, -0x00, 0x00, 0x00, 0x53, 0x1C, 0x11, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xC8, 0x60, 0x00, -0x00, 0x00, 0x00, 0x54, 0xFB, 0xF3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xAA, 0x60, 0x00, -0x00, 0x00, 0x00, 0x56, 0xE5, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xC6, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x58, 0xC4, 0xF1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xA8, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x5A, 0xA4, 0xD3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x8A, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x5C, 0x84, 0xB5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x6C, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x64, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x4E, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x60, 0x4D, 0xB4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x6B, 0x60, 0x00, -0x00, 0x00, 0x00, 0x62, 0x2D, 0x96, 0x70, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x4D, 0x60, 0x00, -0x00, 0x00, 0x00, 0x64, 0x0D, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x2F, 0x60, 0x00, -0x00, 0x00, 0x00, 0x65, 0xED, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x11, 0x60, 0x00, -0x00, 0x00, 0x00, 0x67, 0xCD, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xF3, 0x60, 0x00, -0x00, 0x00, 0x00, 0x69, 0xAD, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xD5, 0x60, 0x00, -0x00, 0x00, 0x00, 0x6B, 0x96, 0x3A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xF1, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x6D, 0x76, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xD3, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x6F, 0x55, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xB5, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x71, 0x35, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x97, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x73, 0x15, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x79, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x74, 0xFE, 0xDF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x96, 0x60, 0x00, -0x00, 0x00, 0x00, 0x76, 0xDE, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x78, 0x60, 0x00, -0x00, 0x00, 0x00, 0x78, 0xBE, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x5A, 0x60, 0x00, -0x00, 0x00, 0x00, 0x7A, 0x9E, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x3C, 0x60, 0x00, -0x00, 0x00, 0x00, 0x7C, 0x7E, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x1E, 0x60, 0x00, -0x00, 0x00, 0x00, 0x7E, 0x5E, 0x49, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x00, 0x60, 0x02, -0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xAD, 0x40, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, -0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, -0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, -0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x01, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, -0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xD4, 0x1F, 0x62, 0x00, 0x8B, -0xF9, 0x55, 0x00, 0x00, 0x00, 0x21, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x2D, 0x20, -0x4F, 0x4E, 0x2C, 0x20, 0x51, 0x43, 0x20, 0x28, 0x6E, 0x6F, 0x20, 0x44, 0x53, 0x54, 0x20, 0x31, -0x39, 0x36, 0x37, 0x2D, 0x37, 0x33, 0x29, - -/* America/Nome */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x26, 0x80, 0x00, 0x00, 0x00, -0xCB, 0x89, 0x44, 0xD0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x61, 0x50, 0x40, 0xFA, 0xD2, 0x55, 0xB0, -0xFE, 0xB8, 0x71, 0x50, 0xFF, 0xA8, 0x54, 0x40, 0x00, 0x98, 0x53, 0x50, 0x01, 0x88, 0x36, 0x40, -0x02, 0x78, 0x35, 0x50, 0x03, 0x71, 0x52, 0xC0, 0x04, 0x61, 0x51, 0xD0, 0x05, 0x51, 0x34, 0xC0, -0x06, 0x41, 0x33, 0xD0, 0x07, 0x31, 0x16, 0xC0, 0x07, 0x8D, 0x6D, 0xD0, 0x09, 0x10, 0xF8, 0xC0, -0x09, 0xAD, 0xE9, 0x50, 0x0A, 0xF0, 0xDA, 0xC0, 0x0B, 0xE0, 0xD9, 0xD0, 0x0C, 0xD9, 0xF7, 0x40, -0x0D, 0xC0, 0xBB, 0xD0, 0x0E, 0xB9, 0xD9, 0x40, 0x0F, 0xA9, 0xD8, 0x50, 0x10, 0x99, 0xBB, 0x40, -0x11, 0x89, 0xBA, 0x50, 0x12, 0x79, 0x9D, 0x40, 0x13, 0x69, 0x9C, 0x50, 0x14, 0x59, 0x7F, 0x40, -0x15, 0x49, 0x7E, 0x50, 0x16, 0x39, 0x61, 0x40, 0x17, 0x29, 0x60, 0x50, 0x18, 0x22, 0x7D, 0xC0, -0x19, 0x09, 0x42, 0x50, 0x1A, 0x02, 0x5F, 0xC0, 0x1A, 0x2B, 0x14, 0x10, 0x1A, 0xF2, 0x42, 0xB0, -0x1B, 0xE2, 0x25, 0xA0, 0x1C, 0xD2, 0x24, 0xB0, 0x1D, 0xC2, 0x07, 0xA0, 0x1E, 0xB2, 0x06, 0xB0, -0x1F, 0xA1, 0xE9, 0xA0, 0x20, 0x76, 0x39, 0x30, 0x21, 0x81, 0xCB, 0xA0, 0x22, 0x56, 0x1B, 0x30, -0x23, 0x6A, 0xE8, 0x20, 0x24, 0x35, 0xFD, 0x30, 0x25, 0x4A, 0xCA, 0x20, 0x26, 0x15, 0xDF, 0x30, -0x27, 0x2A, 0xAC, 0x20, 0x27, 0xFE, 0xFB, 0xB0, 0x29, 0x0A, 0x8E, 0x20, 0x29, 0xDE, 0xDD, 0xB0, -0x2A, 0xEA, 0x70, 0x20, 0x2B, 0xBE, 0xBF, 0xB0, 0x2C, 0xD3, 0x8C, 0xA0, 0x2D, 0x9E, 0xA1, 0xB0, -0x2E, 0xB3, 0x6E, 0xA0, 0x2F, 0x7E, 0x83, 0xB0, 0x30, 0x93, 0x50, 0xA0, 0x31, 0x67, 0xA0, 0x30, -0x32, 0x73, 0x32, 0xA0, 0x33, 0x47, 0x82, 0x30, 0x34, 0x53, 0x14, 0xA0, 0x35, 0x27, 0x64, 0x30, -0x36, 0x32, 0xF6, 0xA0, 0x37, 0x07, 0x46, 0x30, 0x38, 0x1C, 0x13, 0x20, 0x38, 0xE7, 0x28, 0x30, -0x39, 0xFB, 0xF5, 0x20, 0x3A, 0xC7, 0x0A, 0x30, 0x3B, 0xDB, 0xD7, 0x20, 0x3C, 0xB0, 0x26, 0xB0, -0x3D, 0xBB, 0xB9, 0x20, 0x3E, 0x90, 0x08, 0xB0, 0x3F, 0x9B, 0x9B, 0x20, 0x40, 0x6F, 0xEA, 0xB0, -0x41, 0x84, 0xB7, 0xA0, 0x42, 0x4F, 0xCC, 0xB0, 0x43, 0x64, 0x99, 0xA0, 0x44, 0x2F, 0xAE, 0xB0, -0x45, 0x44, 0x7B, 0xA0, 0x45, 0xF3, 0xE1, 0x30, 0x47, 0x2D, 0x98, 0x20, 0x47, 0xD3, 0xC3, 0x30, -0x49, 0x0D, 0x7A, 0x20, 0x49, 0xB3, 0xA5, 0x30, 0x4A, 0xED, 0x5C, 0x20, 0x4B, 0x9C, 0xC1, 0xB0, -0x4C, 0xD6, 0x78, 0xA0, 0x4D, 0x7C, 0xA3, 0xB0, 0x4E, 0xB6, 0x5A, 0xA0, 0x4F, 0x5C, 0x85, 0xB0, -0x50, 0x96, 0x3C, 0xA0, 0x51, 0x3C, 0x67, 0xB0, 0x52, 0x76, 0x1E, 0xA0, 0x53, 0x1C, 0x49, 0xB0, -0x54, 0x56, 0x00, 0xA0, 0x54, 0xFC, 0x2B, 0xB0, 0x56, 0x35, 0xE2, 0xA0, 0x56, 0xE5, 0x48, 0x30, -0x58, 0x1E, 0xFF, 0x20, 0x58, 0xC5, 0x2A, 0x30, 0x59, 0xFE, 0xE1, 0x20, 0x5A, 0xA5, 0x0C, 0x30, -0x5B, 0xDE, 0xC3, 0x20, 0x5C, 0x84, 0xEE, 0x30, 0x5D, 0xBE, 0xA5, 0x20, 0x5E, 0x64, 0xD0, 0x30, -0x5F, 0x9E, 0x87, 0x20, 0x60, 0x4D, 0xEC, 0xB0, 0x61, 0x87, 0xA3, 0xA0, 0x62, 0x2D, 0xCE, 0xB0, -0x63, 0x67, 0x85, 0xA0, 0x64, 0x0D, 0xB0, 0xB0, 0x65, 0x47, 0x67, 0xA0, 0x65, 0xED, 0x92, 0xB0, -0x67, 0x27, 0x49, 0xA0, 0x67, 0xCD, 0x74, 0xB0, 0x69, 0x07, 0x2B, 0xA0, 0x69, 0xAD, 0x56, 0xB0, -0x6A, 0xE7, 0x0D, 0xA0, 0x6B, 0x96, 0x73, 0x30, 0x6C, 0xD0, 0x2A, 0x20, 0x6D, 0x76, 0x55, 0x30, -0x6E, 0xB0, 0x0C, 0x20, 0x6F, 0x56, 0x37, 0x30, 0x70, 0x8F, 0xEE, 0x20, 0x71, 0x36, 0x19, 0x30, -0x72, 0x6F, 0xD0, 0x20, 0x73, 0x15, 0xFB, 0x30, 0x74, 0x4F, 0xB2, 0x20, 0x74, 0xFF, 0x17, 0xB0, -0x76, 0x38, 0xCE, 0xA0, 0x76, 0xDE, 0xF9, 0xB0, 0x78, 0x18, 0xB0, 0xA0, 0x78, 0xBE, 0xDB, 0xB0, -0x79, 0xF8, 0x92, 0xA0, 0x7A, 0x9E, 0xBD, 0xB0, 0x7B, 0xD8, 0x74, 0xA0, 0x7C, 0x7E, 0x9F, 0xB0, -0x7D, 0xB8, 0x56, 0xA0, 0x7E, 0x5E, 0x81, 0xB0, 0x7F, 0x98, 0x38, 0xA0, 0x01, 0x02, 0x03, 0x01, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x00, 0x00, 0xB6, 0x6E, -0x00, 0x00, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x08, 0xFF, 0xFF, -0x73, 0x60, 0x01, 0x0C, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x10, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x14, -0xFF, 0xFF, 0x81, 0x70, 0x00, 0x18, 0xFF, 0xFF, 0x8F, 0x80, 0x01, 0x1C, 0xFF, 0xFF, 0x81, 0x70, -0x00, 0x21, 0x4C, 0x4D, 0x54, 0x00, 0x4E, 0x53, 0x54, 0x00, 0x4E, 0x57, 0x54, 0x00, 0x4E, 0x50, -0x54, 0x00, 0x42, 0x53, 0x54, 0x00, 0x42, 0x44, 0x54, 0x00, 0x59, 0x53, 0x54, 0x00, 0x41, 0x4B, -0x44, 0x54, 0x00, 0x41, 0x4B, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xC2, 0xFD, 0xD1, 0xFF, 0xFF, -0xFF, 0xFF, 0x7D, 0x87, 0x4F, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x89, 0x44, 0xD0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x50, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD2, 0x55, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x71, 0x50, 0xFF, 0xFF, -0xFF, 0xFF, 0xFF, 0xA8, 0x54, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x53, 0x50, 0x00, 0x00, -0x00, 0x00, 0x01, 0x88, 0x36, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x35, 0x50, 0x00, 0x00, -0x00, 0x00, 0x03, 0x71, 0x52, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x51, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x05, 0x51, 0x34, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x41, 0x33, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x07, 0x31, 0x16, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8D, 0x6D, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x09, 0x10, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAD, 0xE9, 0x50, 0x00, 0x00, -0x00, 0x00, 0x0A, 0xF0, 0xDA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xD9, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x0C, 0xD9, 0xF7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0xBB, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x0E, 0xB9, 0xD9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xD8, 0x50, 0x00, 0x00, -0x00, 0x00, 0x10, 0x99, 0xBB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0xBA, 0x50, 0x00, 0x00, -0x00, 0x00, 0x12, 0x79, 0x9D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x9C, 0x50, 0x00, 0x00, -0x00, 0x00, 0x14, 0x59, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x7E, 0x50, 0x00, 0x00, -0x00, 0x00, 0x16, 0x39, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x60, 0x50, 0x00, 0x00, -0x00, 0x00, 0x18, 0x22, 0x7D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x42, 0x50, 0x00, 0x00, -0x00, 0x00, 0x1A, 0x02, 0x5F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x2B, 0x14, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1A, 0xF2, 0x42, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x25, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x1C, 0xD2, 0x24, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC2, 0x07, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x1E, 0xB2, 0x06, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xE9, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x76, 0x39, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xCB, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x22, 0x56, 0x1B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xE8, 0x20, 0x00, 0x00, -0x00, 0x00, 0x24, 0x35, 0xFD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xCA, 0x20, 0x00, 0x00, -0x00, 0x00, 0x26, 0x15, 0xDF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0xAC, 0x20, 0x00, 0x00, -0x00, 0x00, 0x27, 0xFE, 0xFB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x8E, 0x20, 0x00, 0x00, -0x00, 0x00, 0x29, 0xDE, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x70, 0x20, 0x00, 0x00, -0x00, 0x00, 0x2B, 0xBE, 0xBF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x8C, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2D, 0x9E, 0xA1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x6E, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2F, 0x7E, 0x83, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x50, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x31, 0x67, 0xA0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x32, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x33, 0x47, 0x82, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x53, 0x14, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x35, 0x27, 0x64, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xF6, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x37, 0x07, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x13, 0x20, 0x00, 0x00, -0x00, 0x00, 0x38, 0xE7, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xF5, 0x20, 0x00, 0x00, -0x00, 0x00, 0x3A, 0xC7, 0x0A, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0xD7, 0x20, 0x00, 0x00, -0x00, 0x00, 0x3C, 0xB0, 0x26, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0xB9, 0x20, 0x00, 0x00, -0x00, 0x00, 0x3E, 0x90, 0x08, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x9B, 0x20, 0x00, 0x00, -0x00, 0x00, 0x40, 0x6F, 0xEA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0xB7, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x42, 0x4F, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x99, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x44, 0x2F, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x7B, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x45, 0xF3, 0xE1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x98, 0x20, 0x00, 0x00, -0x00, 0x00, 0x47, 0xD3, 0xC3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x7A, 0x20, 0x00, 0x00, -0x00, 0x00, 0x49, 0xB3, 0xA5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x5C, 0x20, 0x00, 0x00, -0x00, 0x00, 0x4B, 0x9C, 0xC1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x78, 0xA0, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x94, 0x00, 0x00, 0xFF, +0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, +0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, +0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, +0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, +0x70, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, +0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, +0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, +0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, +0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, +0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, +0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, +0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, +0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x5F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x8A, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x6C, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x23, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x89, +0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x6B, +0x70, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x4D, +0x70, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x2F, +0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x11, +0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xF3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x0F, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xC6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC4, 0xF1, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xD3, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x8A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xB5, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0x97, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xB4, +0x70, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0x96, +0x70, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x78, +0x70, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x2F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x5A, +0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x11, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x3C, +0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xF3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x1E, +0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x3A, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x1C, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xD3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x55, 0xFE, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xB5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xE0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x97, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xC2, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xDF, +0x70, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xC1, +0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xA3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0x85, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x67, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x49, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x94, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, +0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, +0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x45, +0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, +0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, + +/* America/Nome */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x26, 0x80, 0x00, 0x00, 0x00, +0xCB, 0x89, 0x44, 0xD0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x61, 0x50, 0x40, 0xFA, 0xD2, 0x55, 0xB0, +0xFE, 0xB8, 0x71, 0x50, 0xFF, 0xA8, 0x54, 0x40, 0x00, 0x98, 0x53, 0x50, 0x01, 0x88, 0x36, 0x40, +0x02, 0x78, 0x35, 0x50, 0x03, 0x71, 0x52, 0xC0, 0x04, 0x61, 0x51, 0xD0, 0x05, 0x51, 0x34, 0xC0, +0x06, 0x41, 0x33, 0xD0, 0x07, 0x31, 0x16, 0xC0, 0x07, 0x8D, 0x6D, 0xD0, 0x09, 0x10, 0xF8, 0xC0, +0x09, 0xAD, 0xE9, 0x50, 0x0A, 0xF0, 0xDA, 0xC0, 0x0B, 0xE0, 0xD9, 0xD0, 0x0C, 0xD9, 0xF7, 0x40, +0x0D, 0xC0, 0xBB, 0xD0, 0x0E, 0xB9, 0xD9, 0x40, 0x0F, 0xA9, 0xD8, 0x50, 0x10, 0x99, 0xBB, 0x40, +0x11, 0x89, 0xBA, 0x50, 0x12, 0x79, 0x9D, 0x40, 0x13, 0x69, 0x9C, 0x50, 0x14, 0x59, 0x7F, 0x40, +0x15, 0x49, 0x7E, 0x50, 0x16, 0x39, 0x61, 0x40, 0x17, 0x29, 0x60, 0x50, 0x18, 0x22, 0x7D, 0xC0, +0x19, 0x09, 0x42, 0x50, 0x1A, 0x02, 0x5F, 0xC0, 0x1A, 0x2B, 0x14, 0x10, 0x1A, 0xF2, 0x42, 0xB0, +0x1B, 0xE2, 0x25, 0xA0, 0x1C, 0xD2, 0x24, 0xB0, 0x1D, 0xC2, 0x07, 0xA0, 0x1E, 0xB2, 0x06, 0xB0, +0x1F, 0xA1, 0xE9, 0xA0, 0x20, 0x76, 0x39, 0x30, 0x21, 0x81, 0xCB, 0xA0, 0x22, 0x56, 0x1B, 0x30, +0x23, 0x6A, 0xE8, 0x20, 0x24, 0x35, 0xFD, 0x30, 0x25, 0x4A, 0xCA, 0x20, 0x26, 0x15, 0xDF, 0x30, +0x27, 0x2A, 0xAC, 0x20, 0x27, 0xFE, 0xFB, 0xB0, 0x29, 0x0A, 0x8E, 0x20, 0x29, 0xDE, 0xDD, 0xB0, +0x2A, 0xEA, 0x70, 0x20, 0x2B, 0xBE, 0xBF, 0xB0, 0x2C, 0xD3, 0x8C, 0xA0, 0x2D, 0x9E, 0xA1, 0xB0, +0x2E, 0xB3, 0x6E, 0xA0, 0x2F, 0x7E, 0x83, 0xB0, 0x30, 0x93, 0x50, 0xA0, 0x31, 0x67, 0xA0, 0x30, +0x32, 0x73, 0x32, 0xA0, 0x33, 0x47, 0x82, 0x30, 0x34, 0x53, 0x14, 0xA0, 0x35, 0x27, 0x64, 0x30, +0x36, 0x32, 0xF6, 0xA0, 0x37, 0x07, 0x46, 0x30, 0x38, 0x1C, 0x13, 0x20, 0x38, 0xE7, 0x28, 0x30, +0x39, 0xFB, 0xF5, 0x20, 0x3A, 0xC7, 0x0A, 0x30, 0x3B, 0xDB, 0xD7, 0x20, 0x3C, 0xB0, 0x26, 0xB0, +0x3D, 0xBB, 0xB9, 0x20, 0x3E, 0x90, 0x08, 0xB0, 0x3F, 0x9B, 0x9B, 0x20, 0x40, 0x6F, 0xEA, 0xB0, +0x41, 0x84, 0xB7, 0xA0, 0x42, 0x4F, 0xCC, 0xB0, 0x43, 0x64, 0x99, 0xA0, 0x44, 0x2F, 0xAE, 0xB0, +0x45, 0x44, 0x7B, 0xA0, 0x45, 0xF3, 0xE1, 0x30, 0x47, 0x2D, 0x98, 0x20, 0x47, 0xD3, 0xC3, 0x30, +0x49, 0x0D, 0x7A, 0x20, 0x49, 0xB3, 0xA5, 0x30, 0x4A, 0xED, 0x5C, 0x20, 0x4B, 0x9C, 0xC1, 0xB0, +0x4C, 0xD6, 0x78, 0xA0, 0x4D, 0x7C, 0xA3, 0xB0, 0x4E, 0xB6, 0x5A, 0xA0, 0x4F, 0x5C, 0x85, 0xB0, +0x50, 0x96, 0x3C, 0xA0, 0x51, 0x3C, 0x67, 0xB0, 0x52, 0x76, 0x1E, 0xA0, 0x53, 0x1C, 0x49, 0xB0, +0x54, 0x56, 0x00, 0xA0, 0x54, 0xFC, 0x2B, 0xB0, 0x56, 0x35, 0xE2, 0xA0, 0x56, 0xE5, 0x48, 0x30, +0x58, 0x1E, 0xFF, 0x20, 0x58, 0xC5, 0x2A, 0x30, 0x59, 0xFE, 0xE1, 0x20, 0x5A, 0xA5, 0x0C, 0x30, +0x5B, 0xDE, 0xC3, 0x20, 0x5C, 0x84, 0xEE, 0x30, 0x5D, 0xBE, 0xA5, 0x20, 0x5E, 0x64, 0xD0, 0x30, +0x5F, 0x9E, 0x87, 0x20, 0x60, 0x4D, 0xEC, 0xB0, 0x61, 0x87, 0xA3, 0xA0, 0x62, 0x2D, 0xCE, 0xB0, +0x63, 0x67, 0x85, 0xA0, 0x64, 0x0D, 0xB0, 0xB0, 0x65, 0x47, 0x67, 0xA0, 0x65, 0xED, 0x92, 0xB0, +0x67, 0x27, 0x49, 0xA0, 0x67, 0xCD, 0x74, 0xB0, 0x69, 0x07, 0x2B, 0xA0, 0x69, 0xAD, 0x56, 0xB0, +0x6A, 0xE7, 0x0D, 0xA0, 0x6B, 0x96, 0x73, 0x30, 0x6C, 0xD0, 0x2A, 0x20, 0x6D, 0x76, 0x55, 0x30, +0x6E, 0xB0, 0x0C, 0x20, 0x6F, 0x56, 0x37, 0x30, 0x70, 0x8F, 0xEE, 0x20, 0x71, 0x36, 0x19, 0x30, +0x72, 0x6F, 0xD0, 0x20, 0x73, 0x15, 0xFB, 0x30, 0x74, 0x4F, 0xB2, 0x20, 0x74, 0xFF, 0x17, 0xB0, +0x76, 0x38, 0xCE, 0xA0, 0x76, 0xDE, 0xF9, 0xB0, 0x78, 0x18, 0xB0, 0xA0, 0x78, 0xBE, 0xDB, 0xB0, +0x79, 0xF8, 0x92, 0xA0, 0x7A, 0x9E, 0xBD, 0xB0, 0x7B, 0xD8, 0x74, 0xA0, 0x7C, 0x7E, 0x9F, 0xB0, +0x7D, 0xB8, 0x56, 0xA0, 0x7E, 0x5E, 0x81, 0xB0, 0x7F, 0x98, 0x38, 0xA0, 0x01, 0x02, 0x03, 0x01, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x00, 0x00, 0xB6, 0x6E, +0x00, 0x00, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x08, 0xFF, 0xFF, +0x73, 0x60, 0x01, 0x0C, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x10, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x14, +0xFF, 0xFF, 0x81, 0x70, 0x00, 0x18, 0xFF, 0xFF, 0x8F, 0x80, 0x01, 0x1C, 0xFF, 0xFF, 0x81, 0x70, +0x00, 0x21, 0x4C, 0x4D, 0x54, 0x00, 0x4E, 0x53, 0x54, 0x00, 0x4E, 0x57, 0x54, 0x00, 0x4E, 0x50, +0x54, 0x00, 0x42, 0x53, 0x54, 0x00, 0x42, 0x44, 0x54, 0x00, 0x59, 0x53, 0x54, 0x00, 0x41, 0x4B, +0x44, 0x54, 0x00, 0x41, 0x4B, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, +0x00, 0x0A, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xC2, 0xFD, 0xD1, 0xFF, 0xFF, +0xFF, 0xFF, 0x7D, 0x87, 0x4F, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x89, 0x44, 0xD0, 0xFF, 0xFF, +0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x50, 0x40, 0xFF, 0xFF, +0xFF, 0xFF, 0xFA, 0xD2, 0x55, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x71, 0x50, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xA8, 0x54, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x53, 0x50, 0x00, 0x00, +0x00, 0x00, 0x01, 0x88, 0x36, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x78, 0x35, 0x50, 0x00, 0x00, +0x00, 0x00, 0x03, 0x71, 0x52, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x51, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x05, 0x51, 0x34, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x41, 0x33, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x07, 0x31, 0x16, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x8D, 0x6D, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x09, 0x10, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAD, 0xE9, 0x50, 0x00, 0x00, +0x00, 0x00, 0x0A, 0xF0, 0xDA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xD9, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x0C, 0xD9, 0xF7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0xBB, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x0E, 0xB9, 0xD9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xD8, 0x50, 0x00, 0x00, +0x00, 0x00, 0x10, 0x99, 0xBB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0xBA, 0x50, 0x00, 0x00, +0x00, 0x00, 0x12, 0x79, 0x9D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x9C, 0x50, 0x00, 0x00, +0x00, 0x00, 0x14, 0x59, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x7E, 0x50, 0x00, 0x00, +0x00, 0x00, 0x16, 0x39, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x60, 0x50, 0x00, 0x00, +0x00, 0x00, 0x18, 0x22, 0x7D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x42, 0x50, 0x00, 0x00, +0x00, 0x00, 0x1A, 0x02, 0x5F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x2B, 0x14, 0x10, 0x00, 0x00, +0x00, 0x00, 0x1A, 0xF2, 0x42, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x25, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x1C, 0xD2, 0x24, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC2, 0x07, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x1E, 0xB2, 0x06, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xE9, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x20, 0x76, 0x39, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xCB, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x22, 0x56, 0x1B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xE8, 0x20, 0x00, 0x00, +0x00, 0x00, 0x24, 0x35, 0xFD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xCA, 0x20, 0x00, 0x00, +0x00, 0x00, 0x26, 0x15, 0xDF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0xAC, 0x20, 0x00, 0x00, +0x00, 0x00, 0x27, 0xFE, 0xFB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x8E, 0x20, 0x00, 0x00, +0x00, 0x00, 0x29, 0xDE, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x70, 0x20, 0x00, 0x00, +0x00, 0x00, 0x2B, 0xBE, 0xBF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x8C, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x2D, 0x9E, 0xA1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x6E, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x2F, 0x7E, 0x83, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x50, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x31, 0x67, 0xA0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x32, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x33, 0x47, 0x82, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x53, 0x14, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x35, 0x27, 0x64, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xF6, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x37, 0x07, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x13, 0x20, 0x00, 0x00, +0x00, 0x00, 0x38, 0xE7, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xF5, 0x20, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xC7, 0x0A, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0xD7, 0x20, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xB0, 0x26, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0xB9, 0x20, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x90, 0x08, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x9B, 0x20, 0x00, 0x00, +0x00, 0x00, 0x40, 0x6F, 0xEA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0xB7, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x42, 0x4F, 0xCC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x99, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x44, 0x2F, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x7B, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x45, 0xF3, 0xE1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x98, 0x20, 0x00, 0x00, +0x00, 0x00, 0x47, 0xD3, 0xC3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x7A, 0x20, 0x00, 0x00, +0x00, 0x00, 0x49, 0xB3, 0xA5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x5C, 0x20, 0x00, 0x00, +0x00, 0x00, 0x4B, 0x9C, 0xC1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x78, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0xA3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x5A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x85, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x3C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x76, 0x1E, 0xA0, 0x00, 0x00, @@ -35795,7 +35973,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Noronha */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x65, 0x64, +0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x65, 0x64, 0xB8, 0x0F, 0x3B, 0xD0, 0xB8, 0xFD, 0x32, 0x90, 0xB9, 0xF1, 0x26, 0x20, 0xBA, 0xDE, 0x66, 0x10, 0xDA, 0x38, 0xA0, 0x20, 0xDA, 0xEB, 0xEC, 0x20, 0xDC, 0x19, 0xD3, 0xA0, 0xDC, 0xB9, 0x4B, 0x10, 0xDD, 0xFB, 0x07, 0x20, 0xDE, 0x9B, 0xD0, 0x10, 0xDF, 0xDD, 0x8C, 0x20, 0xE0, 0x54, 0x25, 0x10, @@ -35805,41 +35983,40 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x1F, 0xA0, 0x27, 0xA0, 0x20, 0x33, 0xC1, 0x90, 0x21, 0x81, 0x5B, 0x20, 0x22, 0x0B, 0xBA, 0x90, 0x23, 0x58, 0x02, 0xA0, 0x23, 0xE2, 0x62, 0x10, 0x25, 0x37, 0xE4, 0xA0, 0x25, 0xD4, 0xB9, 0x10, 0x37, 0xF6, 0xB8, 0xA0, 0x38, 0xB8, 0x77, 0x10, 0x39, 0xDF, 0xD5, 0x20, 0x39, 0xE9, 0x01, 0x90, -0x3B, 0xC8, 0xF1, 0xA0, 0x3C, 0x6F, 0x00, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x04, -0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, -0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, -0xFF, 0xFF, 0x96, 0xAA, 0x65, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x3B, 0xD0, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFD, 0x32, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x26, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xDE, 0x66, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xA0, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0xEB, 0xEC, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xD3, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x07, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0x9B, 0xD0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x8C, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x54, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xF1, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x50, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x56, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x0E, 0x10, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x1E, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xB7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xC4, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xA8, 0xEA, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEB, 0xF8, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0x8B, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x80, 0x20, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x78, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x27, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x33, 0xC1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x5B, 0x20, 0x00, 0x00, -0x00, 0x00, 0x22, 0x0B, 0xBA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x02, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0xE2, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xE4, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0xD4, 0xB9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xB8, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x38, 0xB8, 0x77, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xD5, 0x20, 0x00, 0x00, -0x00, 0x00, 0x39, 0xE9, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xF1, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x3C, 0x6F, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, -0x01, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x32, 0x3E, 0x32, 0x0A, 0x00, 0x83, 0x74, 0x58, -0x00, 0xE1, 0x31, 0xBD, 0x00, 0x00, 0x00, 0x10, 0x41, 0x74, 0x6C, 0x61, 0x6E, 0x74, 0x69, 0x63, -0x20, 0x69, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x3B, 0xC8, 0xF1, 0xA0, 0x3C, 0x6F, 0x00, 0x90, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, +0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, +0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x65, +0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x3B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x32, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x26, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x66, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xA0, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xEC, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xD3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x4B, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x07, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xD0, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x8C, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x25, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xF1, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x50, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x56, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x10, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x1E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xB7, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xC4, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xEA, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEB, 0xF8, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x6F, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xC9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x27, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xC1, +0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x5B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xBA, +0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x02, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x62, +0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xB9, +0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xB8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x77, +0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xD5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x01, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xF1, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x00, +0x90, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, +0xF1, 0xF0, 0x01, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x32, 0x3E, 0x32, 0x0A, 0x00, 0x83, +0x74, 0x58, 0x00, 0xE1, 0x31, 0xBD, 0x00, 0x00, 0x00, 0x10, 0x41, 0x74, 0x6C, 0x61, 0x6E, 0x74, +0x69, 0x63, 0x20, 0x69, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* America/North_Dakota/Beulah */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -36307,7 +36484,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Nuuk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x9B, 0x80, 0x68, 0x00, +0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x9B, 0x80, 0x68, 0x00, 0x13, 0x4D, 0x7C, 0x50, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, @@ -36337,99 +36514,98 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x76, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x80, -0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, -0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, -0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, -0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, -0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, -0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, -0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, -0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, -0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, -0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, -0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, -0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, -0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, -0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, -0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, -0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, -0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, -0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, -0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, -0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, -0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, -0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, -0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, -0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, -0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, -0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, -0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, -0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, -0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, -0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, -0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, -0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, -0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, -0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, -0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, -0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, -0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, -0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, -0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, -0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, -0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, -0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, -0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, -0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, -0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, -0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, -0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, -0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, -0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, -0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, -0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, -0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, -0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, -0x7F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, +0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, -0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x3C, 0x2D, 0x30, 0x32, 0x3E, -0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x2D, 0x32, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x2D, 0x31, 0x0A, 0x00, 0xEB, 0x43, 0xDD, 0x00, 0xC3, 0xB8, 0x2A, 0x00, 0x00, -0x00, 0x16, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x20, 0x28, 0x6D, 0x6F, 0x73, -0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x02, 0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, +0xE0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x80, 0x68, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0x4D, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, +0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, +0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, +0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, +0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, +0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, +0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, +0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, +0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, +0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, +0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, +0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, +0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, +0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, +0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, +0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, +0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, +0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, +0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, +0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, +0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, +0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, +0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, +0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, +0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, +0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, +0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, +0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, +0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, +0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, +0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, +0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, +0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, +0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, +0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x04, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, +0xD5, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x08, +0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x01, 0x01, +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x3C, 0x2D, 0x30, +0x32, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x2D, 0x32, 0x2C, 0x4D, 0x31, 0x30, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x2D, 0x31, 0x0A, 0x00, 0xEB, 0x43, 0xDD, 0x00, 0xC3, 0xB8, 0x2A, +0x00, 0x00, 0x00, 0x16, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x6C, 0x61, 0x6E, 0x64, 0x20, 0x28, 0x6D, +0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, /* America/Ojinaga */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, 0x33, 0x47, 0x58, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x48, 0x10, 0x36, 0x32, 0xDA, 0x80, 0x37, 0x07, 0x2A, 0x10, @@ -36444,88 +36620,62 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0x35, 0xC6, 0x80, 0x56, 0xE5, 0x2C, 0x10, 0x58, 0x1E, 0xE3, 0x00, 0x58, 0xC5, 0x0E, 0x10, 0x59, 0xFE, 0xC5, 0x00, 0x5A, 0xA4, 0xF0, 0x10, 0x5B, 0xDE, 0xA7, 0x00, 0x5C, 0x84, 0xD2, 0x10, 0x5D, 0xBE, 0x89, 0x00, 0x5E, 0x64, 0xB4, 0x10, 0x5F, 0x9E, 0x6B, 0x00, 0x60, 0x4D, 0xD0, 0x90, -0x61, 0x87, 0x87, 0x80, 0x62, 0x2D, 0xB2, 0x90, 0x63, 0x67, 0x69, 0x80, 0x64, 0x0D, 0x94, 0x90, -0x65, 0x47, 0x4B, 0x80, 0x65, 0xED, 0x76, 0x90, 0x67, 0x27, 0x2D, 0x80, 0x67, 0xCD, 0x58, 0x90, -0x69, 0x07, 0x0F, 0x80, 0x69, 0xAD, 0x3A, 0x90, 0x6A, 0xE6, 0xF1, 0x80, 0x6B, 0x96, 0x57, 0x10, -0x6C, 0xD0, 0x0E, 0x00, 0x6D, 0x76, 0x39, 0x10, 0x6E, 0xAF, 0xF0, 0x00, 0x6F, 0x56, 0x1B, 0x10, -0x70, 0x8F, 0xD2, 0x00, 0x71, 0x35, 0xFD, 0x10, 0x72, 0x6F, 0xB4, 0x00, 0x73, 0x15, 0xDF, 0x10, -0x74, 0x4F, 0x96, 0x00, 0x74, 0xFE, 0xFB, 0x90, 0x76, 0x38, 0xB2, 0x80, 0x76, 0xDE, 0xDD, 0x90, -0x78, 0x18, 0x94, 0x80, 0x78, 0xBE, 0xBF, 0x90, 0x79, 0xF8, 0x76, 0x80, 0x7A, 0x9E, 0xA1, 0x90, -0x7B, 0xD8, 0x58, 0x80, 0x7C, 0x7E, 0x83, 0x90, 0x7D, 0xB8, 0x3A, 0x80, 0x7E, 0x5E, 0x65, 0x90, -0x7F, 0x98, 0x1C, 0x80, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x61, 0x87, 0x87, 0x80, 0x62, 0x2D, 0xB2, 0x90, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, +0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, -0x9E, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, -0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x02, 0xFF, 0xFF, 0x9E, 0x1C, 0x00, 0x00, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, +0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, +0x01, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, -0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, -0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0xA5, 0x90, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xD6, 0x5C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x87, 0x90, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xB6, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x69, 0x90, 0x00, 0x00, -0x00, 0x00, 0x50, 0x96, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x4B, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x76, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x2D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x55, 0xE4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFC, 0x0F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x35, 0xC6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x2C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x58, 0x1E, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC5, 0x0E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x59, 0xFE, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xF0, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xDE, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xD2, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xBE, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0xB4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x9E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xD0, 0x90, 0x00, 0x00, -0x00, 0x00, 0x61, 0x87, 0x87, 0x80, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0xB2, 0x90, 0x00, 0x00, -0x00, 0x00, 0x63, 0x67, 0x69, 0x80, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x94, 0x90, 0x00, 0x00, -0x00, 0x00, 0x65, 0x47, 0x4B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x76, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x27, 0x2D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x58, 0x90, 0x00, 0x00, -0x00, 0x00, 0x69, 0x07, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x3A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xE6, 0xF1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x57, 0x10, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xD0, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x39, 0x10, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xAF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x56, 0x1B, 0x10, 0x00, 0x00, -0x00, 0x00, 0x70, 0x8F, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xFD, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x6F, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xDF, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x4F, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xFB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x76, 0x38, 0xB2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xDD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x78, 0x18, 0x94, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xBF, 0x90, 0x00, 0x00, -0x00, 0x00, 0x79, 0xF8, 0x76, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0xA1, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xD8, 0x58, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x83, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xB8, 0x3A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x65, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x98, 0x1C, 0x80, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, +0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, +0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, +0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, +0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, +0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, +0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, +0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, +0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, +0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, +0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0xA5, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x5C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x87, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x69, 0x90, +0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x4B, 0x90, +0x00, 0x00, 0x00, 0x00, 0x52, 0x76, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x2D, 0x90, +0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xE4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFC, 0x0F, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xC6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x2C, 0x10, +0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC5, 0x0E, 0x10, +0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xF0, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xD2, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0xB4, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xD0, 0x90, +0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x87, 0x80, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0xB2, 0x90, +0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, +0x05, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0xFF, 0xFF, 0x9E, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, -0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, -0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x4D, 0x53, 0x54, -0x37, 0x4D, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, -0x31, 0x2E, 0x30, 0x0A, 0x00, 0xB6, 0x71, 0xBA, 0x00, 0x73, 0x54, 0xBD, 0x00, 0x00, 0x00, 0x28, -0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, 0x53, -0x20, 0x2D, 0x20, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x55, 0x53, -0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x29, +0x03, 0x04, 0x03, 0x02, 0xFF, 0xFF, 0x9E, 0x1C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, +0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, +0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0xB6, +0x71, 0xBA, 0x00, 0x73, 0x54, 0xBD, 0x00, 0x00, 0x00, 0x28, 0x4D, 0x6F, 0x75, 0x6E, 0x74, 0x61, +0x69, 0x6E, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, 0x53, 0x20, 0x2D, 0x20, 0x43, 0x68, 0x69, +0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x28, 0x55, 0x53, 0x20, 0x62, 0x6F, 0x72, 0x64, 0x65, +0x72, 0x29, /* America/Panama */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -36681,22 +36831,21 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Paramaribo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x91, 0x05, 0x8E, 0xB8, -0xBE, 0x2A, 0x4B, 0xC4, 0xD2, 0x62, 0x2C, 0xB4, 0x1B, 0xBE, 0x31, 0xB8, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x04, 0xFF, 0xFF, 0xCC, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0x3C, 0x00, -0x04, 0xFF, 0xFF, 0xCC, 0x4C, 0x00, 0x04, 0xFF, 0xFF, 0xCE, 0xC8, 0x00, 0x08, 0xFF, 0xFF, 0xD5, -0xD0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, -0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x91, 0x05, 0x8E, 0xB8, +0xBE, 0x2A, 0x4B, 0xC4, 0xD2, 0x62, 0x2C, 0xB4, 0x1B, 0xBE, 0x31, 0xB8, 0x01, 0x02, 0x03, 0x04, +0xFF, 0xFF, 0xCC, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0x3C, 0x00, 0x04, 0xFF, 0xFF, 0xCC, 0x4C, +0x00, 0x04, 0xFF, 0xFF, 0xCE, 0xC8, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0x4C, 0x4D, +0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x05, 0x8E, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x2A, 0x4B, -0xC4, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x62, 0x2C, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBE, 0x31, -0xB8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x04, 0xFF, 0xFF, -0xCC, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0x3C, 0x00, 0x04, 0xFF, 0xFF, 0xCC, 0x4C, 0x00, 0x04, -0xFF, 0xFF, 0xCE, 0xC8, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, -0x50, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, -0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x92, 0x3A, 0xE5, 0x00, 0xBE, 0x7B, 0x05, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, +0x91, 0x05, 0x8E, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x2A, 0x4B, 0xC4, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x62, 0x2C, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBE, 0x31, 0xB8, 0x01, 0x02, 0x03, 0x04, +0xFF, 0xFF, 0xCC, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0x3C, 0x00, 0x04, 0xFF, 0xFF, 0xCC, 0x4C, +0x00, 0x04, 0xFF, 0xFF, 0xCE, 0xC8, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0E, 0x4C, 0x4D, +0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x92, 0x3A, 0xE5, 0x00, 0xBE, 0x7B, 0x05, +0x00, 0x00, 0x00, 0x00, /* America/Phoenix */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -36835,7 +36984,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Porto_Acre */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -36843,42 +36992,41 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xC0, 0x70, -0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x86, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, -0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, -0x50, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, -0xCA, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, -0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, -0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, -0xB6, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, -0x1B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, -0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, -0x48, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, -0xEE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, -0x22, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, -0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0x51, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, -0x85, 0x50, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, -0x7F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x52, 0x7F, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, -0x02, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x35, 0x3E, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, +0xFF, 0x96, 0xAA, 0x86, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x66, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x50, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xCA, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x31, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xB6, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x1B, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x80, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x48, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xEE, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x22, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0xAA, 0x50, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x51, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x85, 0x50, 0x00, 0x00, 0x00, +0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, 0x7F, 0x50, 0x00, 0x00, 0x00, +0x00, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, +0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Porto_Velho */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x82, 0xE8, +0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x82, 0xE8, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -36886,34 +37034,33 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x3A, 0x40, 0xF8, 0xC7, 0xD3, 0x30, 0xFA, 0x0A, 0xE0, 0xC0, 0xFA, 0xA9, 0x06, 0xB0, 0xFB, 0xEC, 0x14, 0x40, 0xFC, 0x8B, 0x8B, 0xB0, 0x1D, 0xC9, 0x9C, 0x40, 0x1E, 0x78, 0xE5, 0xB0, 0x1F, 0xA0, 0x43, 0xC0, 0x20, 0x33, 0xDD, 0xB0, 0x21, 0x81, 0x77, 0x40, 0x22, 0x0B, 0xD6, 0xB0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0xC4, 0x18, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC4, +0x18, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, +0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, -0x96, 0xAA, 0x82, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, -0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, -0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, -0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xC4, 0x18, 0x00, 0x00, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, -0x00, 0x7B, 0xF3, 0xC5, 0x00, 0xB1, 0x27, 0x90, 0x00, 0x00, 0x00, 0x08, 0x52, 0x6F, 0x6E, 0x64, -0x6F, 0x6E, 0x69, 0x61, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x82, 0xE8, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, +0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, +0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, +0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC4, 0x18, +0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, +0x34, 0x0A, 0x00, 0x7B, 0xF3, 0xC5, 0x00, 0xB1, 0x27, 0x90, 0x00, 0x00, 0x00, 0x08, 0x52, 0x6F, +0x6E, 0x64, 0x6F, 0x6E, 0x69, 0x61, /* America/Puerto_Rico */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -36937,7 +37084,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Punta_Arenas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, @@ -36967,234 +37114,278 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0, 0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0, 0x54, 0x0B, 0xD8, 0x40, 0x57, 0x37, 0xE6, 0x30, 0x57, 0xAF, 0xEC, 0xC0, 0x58, 0x43, 0x86, 0xB0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x04, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, -0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, -0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x76, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, -0x1D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, -0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, -0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, -0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, -0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, -0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, -0xD7, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x9B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, -0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x1C, -0x6E, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x17, -0xE3, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x33, 0x55, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x76, -0x92, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, -0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, -0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, -0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, -0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, -0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, -0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, -0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, -0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, -0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, -0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, -0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x12, 0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, -0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, 0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, -0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, -0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, -0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, -0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, -0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, -0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, -0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, -0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, -0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, -0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, -0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, -0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, -0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, -0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, -0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, -0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, -0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, -0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, -0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, -0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, -0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, -0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, -0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, -0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, -0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, -0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, -0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, -0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, -0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, -0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, -0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, -0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, -0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, -0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, -0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x43, -0x86, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x04, 0x02, 0x03, 0x05, +0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, +0x02, 0x03, 0x04, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x07, -0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, -0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, -0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x10, -0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, -0x2D, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x38, 0x3A, 0x88, -0x00, 0xA6, 0x72, 0xAD, 0x00, 0x00, 0x00, 0x14, 0x52, 0x65, 0x67, 0x69, 0x6F, 0x6E, 0x20, 0x6F, -0x66, 0x20, 0x4D, 0x61, 0x67, 0x61, 0x6C, 0x6C, 0x61, 0x6E, 0x65, 0x73, +0x06, 0x05, 0x06, 0x05, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, +0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, +0xFF, 0xD5, 0xD0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, +0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xFC, 0xFF, 0xFF, 0xFF, +0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xD7, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB7, 0xE4, 0x9B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB9, 0xC7, 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x1C, 0x6E, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xCC, 0x6C, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x17, 0xE3, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xD5, 0x33, 0x55, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x76, 0x92, 0x40, 0xFF, 0xFF, 0xFF, +0xFF, 0xFD, 0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x01, 0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x03, 0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x05, 0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x07, 0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x08, 0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x0A, 0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, +0x00, 0x0C, 0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, +0x00, 0x0E, 0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, +0x00, 0x10, 0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, +0x00, 0x12, 0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, +0x00, 0x14, 0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x16, 0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, +0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, +0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, +0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, +0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, +0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, +0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, +0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, +0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, +0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, +0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, +0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x43, 0x86, 0xB0, 0x01, 0x02, 0x01, +0x03, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x04, +0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x07, 0xFF, 0xFF, 0xBD, 0x84, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, +0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, +0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x38, +0x3A, 0x88, 0x00, 0xA6, 0x72, 0xAD, 0x00, 0x00, 0x00, 0x14, 0x52, 0x65, 0x67, 0x69, 0x6F, 0x6E, +0x20, 0x6F, 0x66, 0x20, 0x4D, 0x61, 0x67, 0x61, 0x6C, 0x6C, 0x61, 0x6E, 0x65, 0x73, /* America/Rainy_River */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, -0x9E, 0xB8, 0xA1, 0x80, 0x9F, 0xBA, 0xF9, 0x70, 0xC8, 0xF8, 0x57, 0x60, 0xCB, 0x88, 0xFE, 0x80, -0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x61, 0x09, 0xF0, 0x08, 0x20, 0xCF, 0x80, 0x09, 0x10, 0xB2, 0x70, -0x0A, 0x00, 0xB1, 0x80, 0x0A, 0xF0, 0x94, 0x70, 0x0B, 0xE0, 0x93, 0x80, 0x0C, 0xD9, 0xB0, 0xF0, -0x0D, 0xC0, 0x75, 0x80, 0x0E, 0xB9, 0x92, 0xF0, 0x0F, 0xA9, 0x92, 0x00, 0x10, 0x99, 0x74, 0xF0, -0x11, 0x89, 0x74, 0x00, 0x12, 0x79, 0x56, 0xF0, 0x13, 0x69, 0x56, 0x00, 0x14, 0x59, 0x38, 0xF0, -0x15, 0x49, 0x38, 0x00, 0x16, 0x39, 0x1A, 0xF0, 0x17, 0x29, 0x1A, 0x00, 0x18, 0x22, 0x37, 0x70, -0x19, 0x08, 0xFC, 0x00, 0x1A, 0x02, 0x19, 0x70, 0x1A, 0xF2, 0x18, 0x80, 0x1B, 0xE1, 0xFB, 0x70, -0x1C, 0xD1, 0xFA, 0x80, 0x1D, 0xC1, 0xDD, 0x70, 0x1E, 0xB1, 0xDC, 0x80, 0x1F, 0xA1, 0xBF, 0x70, -0x20, 0x76, 0x0F, 0x00, 0x21, 0x81, 0xA1, 0x70, 0x22, 0x55, 0xF1, 0x00, 0x23, 0x6A, 0xBD, 0xF0, -0x24, 0x35, 0xD3, 0x00, 0x25, 0x4A, 0x9F, 0xF0, 0x26, 0x15, 0xB5, 0x00, 0x27, 0x2A, 0x81, 0xF0, -0x27, 0xFE, 0xD1, 0x80, 0x29, 0x0A, 0x63, 0xF0, 0x29, 0xDE, 0xB3, 0x80, 0x2A, 0xEA, 0x45, 0xF0, -0x2B, 0xBE, 0x95, 0x80, 0x2C, 0xD3, 0x62, 0x70, 0x2D, 0x9E, 0x77, 0x80, 0x2E, 0xB3, 0x44, 0x70, -0x2F, 0x7E, 0x59, 0x80, 0x30, 0x93, 0x26, 0x70, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x08, 0x70, -0x33, 0x47, 0x58, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x35, 0x27, 0x3A, 0x00, 0x36, 0x32, 0xCC, 0x70, -0x37, 0x07, 0x1C, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x38, 0xE6, 0xFE, 0x00, 0x39, 0xFB, 0xCA, 0xF0, -0x3A, 0xC6, 0xE0, 0x00, 0x3B, 0xDB, 0xAC, 0xF0, 0x3C, 0xAF, 0xFC, 0x80, 0x3D, 0xBB, 0x8E, 0xF0, -0x3E, 0x8F, 0xDE, 0x80, 0x3F, 0x9B, 0x70, 0xF0, 0x40, 0x6F, 0xC0, 0x80, 0x41, 0x84, 0x8D, 0x70, -0x42, 0x4F, 0xA2, 0x80, 0x43, 0x64, 0x6F, 0x70, 0x44, 0x2F, 0x84, 0x80, 0x45, 0x44, 0x51, 0x70, -0x45, 0xF3, 0xB7, 0x00, 0x47, 0x2D, 0x6D, 0xF0, 0x47, 0xD3, 0x99, 0x00, 0x49, 0x0D, 0x4F, 0xF0, -0x49, 0xB3, 0x7B, 0x00, 0x4A, 0xED, 0x31, 0xF0, 0x4B, 0x9C, 0x97, 0x80, 0x4C, 0xD6, 0x4E, 0x70, -0x4D, 0x7C, 0x79, 0x80, 0x4E, 0xB6, 0x30, 0x70, 0x4F, 0x5C, 0x5B, 0x80, 0x50, 0x96, 0x12, 0x70, -0x51, 0x3C, 0x3D, 0x80, 0x52, 0x75, 0xF4, 0x70, 0x53, 0x1C, 0x1F, 0x80, 0x54, 0x55, 0xD6, 0x70, -0x54, 0xFC, 0x01, 0x80, 0x56, 0x35, 0xB8, 0x70, 0x56, 0xE5, 0x1E, 0x00, 0x58, 0x1E, 0xD4, 0xF0, -0x58, 0xC5, 0x00, 0x00, 0x59, 0xFE, 0xB6, 0xF0, 0x5A, 0xA4, 0xE2, 0x00, 0x5B, 0xDE, 0x98, 0xF0, -0x5C, 0x84, 0xC4, 0x00, 0x5D, 0xBE, 0x7A, 0xF0, 0x5E, 0x64, 0xA6, 0x00, 0x5F, 0x9E, 0x5C, 0xF0, -0x60, 0x4D, 0xC2, 0x80, 0x61, 0x87, 0x79, 0x70, 0x62, 0x2D, 0xA4, 0x80, 0x63, 0x67, 0x5B, 0x70, -0x64, 0x0D, 0x86, 0x80, 0x65, 0x47, 0x3D, 0x70, 0x65, 0xED, 0x68, 0x80, 0x67, 0x27, 0x1F, 0x70, -0x67, 0xCD, 0x4A, 0x80, 0x69, 0x07, 0x01, 0x70, 0x69, 0xAD, 0x2C, 0x80, 0x6A, 0xE6, 0xE3, 0x70, -0x6B, 0x96, 0x49, 0x00, 0x6C, 0xCF, 0xFF, 0xF0, 0x6D, 0x76, 0x2B, 0x00, 0x6E, 0xAF, 0xE1, 0xF0, -0x6F, 0x56, 0x0D, 0x00, 0x70, 0x8F, 0xC3, 0xF0, 0x71, 0x35, 0xEF, 0x00, 0x72, 0x6F, 0xA5, 0xF0, -0x73, 0x15, 0xD1, 0x00, 0x74, 0x4F, 0x87, 0xF0, 0x74, 0xFE, 0xED, 0x80, 0x76, 0x38, 0xA4, 0x70, -0x76, 0xDE, 0xCF, 0x80, 0x78, 0x18, 0x86, 0x70, 0x78, 0xBE, 0xB1, 0x80, 0x79, 0xF8, 0x68, 0x70, -0x7A, 0x9E, 0x93, 0x80, 0x7B, 0xD8, 0x4A, 0x70, 0x7C, 0x7E, 0x75, 0x80, 0x7D, 0xB8, 0x2C, 0x70, -0x7E, 0x5E, 0x57, 0x80, 0x7F, 0x98, 0x0E, 0x70, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, -0xFF, 0xA7, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, -0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, -0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, -0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x87, 0x28, 0xFF, -0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x57, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x08, 0x20, 0xCF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xB2, 0x70, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x94, 0x70, 0x00, -0x00, 0x00, 0x00, 0x0B, 0xE0, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xB0, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x0D, 0xC0, 0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x92, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x0F, 0xA9, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x74, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x11, 0x89, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x56, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x13, 0x69, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x38, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x15, 0x49, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x1A, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x29, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x37, 0x70, 0x00, -0x00, 0x00, 0x00, 0x19, 0x08, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x19, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xF2, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xFB, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xD1, 0xFA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xDD, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1E, 0xB1, 0xDC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xBF, 0x70, 0x00, -0x00, 0x00, 0x00, 0x20, 0x76, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xA1, 0x70, 0x00, -0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xBD, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x24, 0x35, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x9F, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x26, 0x15, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x81, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xFE, 0xD1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x63, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xDE, 0xB3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x45, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xBE, 0x95, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x62, 0x70, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x9E, 0x77, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x44, 0x70, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x7E, 0x59, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x26, 0x70, 0x00, -0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, -0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, -0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, -0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xC6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0xAC, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, -0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, -0x00, 0x00, 0x00, 0x45, 0xF3, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x6D, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x47, 0xD3, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x4F, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x49, 0xB3, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x31, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x4B, 0x9C, 0x97, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x4E, 0x70, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x7C, 0x79, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x30, 0x70, 0x00, -0x00, 0x00, 0x00, 0x4F, 0x5C, 0x5B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x12, 0x70, 0x00, -0x00, 0x00, 0x00, 0x51, 0x3C, 0x3D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xF4, 0x70, 0x00, -0x00, 0x00, 0x00, 0x53, 0x1C, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xD6, 0x70, 0x00, -0x00, 0x00, 0x00, 0x54, 0xFC, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xB8, 0x70, 0x00, -0x00, 0x00, 0x00, 0x56, 0xE5, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xD4, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x58, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xB6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x5A, 0xA4, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x98, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x5C, 0x84, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x7A, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x64, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x5C, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x60, 0x4D, 0xC2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x79, 0x70, 0x00, -0x00, 0x00, 0x00, 0x62, 0x2D, 0xA4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x5B, 0x70, 0x00, -0x00, 0x00, 0x00, 0x64, 0x0D, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x3D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x65, 0xED, 0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x1F, 0x70, 0x00, -0x00, 0x00, 0x00, 0x67, 0xCD, 0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x69, 0x07, 0x01, 0x70, 0x00, -0x00, 0x00, 0x00, 0x69, 0xAD, 0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xE3, 0x70, 0x00, -0x00, 0x00, 0x00, 0x6B, 0x96, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xFF, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x6D, 0x76, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xE1, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x6F, 0x56, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xC3, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x71, 0x35, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0xA5, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x73, 0x15, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x87, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x74, 0xFE, 0xED, 0x80, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0xA4, 0x70, 0x00, -0x00, 0x00, 0x00, 0x76, 0xDE, 0xCF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x86, 0x70, 0x00, -0x00, 0x00, 0x00, 0x78, 0xBE, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x68, 0x70, 0x00, -0x00, 0x00, 0x00, 0x7A, 0x9E, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x4A, 0x70, 0x00, -0x00, 0x00, 0x00, 0x7C, 0x7E, 0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x2C, 0x70, 0x00, -0x00, 0x00, 0x00, 0x7E, 0x5E, 0x57, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x0E, 0x70, 0x02, -0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x9B, 0x01, 0xFB, 0xE0, 0x9B, 0xC3, 0xBA, 0x50, 0x9E, 0xB8, 0xA1, 0x80, 0x9F, 0xBA, 0xF9, 0x70, +0xC2, 0xA0, 0x3B, 0x80, 0xC3, 0x4F, 0x84, 0xF0, 0xCB, 0x88, 0xFE, 0x80, 0xD2, 0x23, 0xF4, 0x70, +0xD2, 0x61, 0x09, 0xF0, 0xD3, 0x88, 0x68, 0x00, 0xD4, 0x53, 0x60, 0xF0, 0xD5, 0x55, 0xD5, 0x00, +0xD6, 0x20, 0xCD, 0xF0, 0xD7, 0x35, 0xB7, 0x00, 0xD8, 0x00, 0xAF, 0xF0, 0xD9, 0x15, 0x99, 0x00, +0xD9, 0xE0, 0x91, 0xF0, 0xDB, 0x00, 0x07, 0x00, 0xDB, 0xC8, 0x5C, 0xF0, 0xDC, 0xDE, 0x97, 0x80, +0xDD, 0xA9, 0x90, 0x70, 0xDE, 0xBE, 0x79, 0x80, 0xDF, 0x89, 0x72, 0x70, 0xE0, 0x9E, 0x5B, 0x80, +0xE1, 0x69, 0x54, 0x70, 0xE2, 0x7E, 0x3D, 0x80, 0xE3, 0x49, 0x36, 0x70, 0xE4, 0x5E, 0x1F, 0x80, +0xE5, 0x29, 0x18, 0x70, 0xE6, 0x47, 0x3C, 0x00, 0xE7, 0x12, 0x34, 0xF0, 0xE8, 0x27, 0x1E, 0x00, +0xE8, 0xF2, 0x16, 0xF0, 0xEA, 0x07, 0x00, 0x00, 0xEA, 0xD1, 0xF8, 0xF0, 0xEB, 0xE6, 0xE2, 0x00, +0xEC, 0xD6, 0xC4, 0xF0, 0xED, 0xC6, 0xC4, 0x00, 0xEE, 0x91, 0xBC, 0xF0, 0xF3, 0x6F, 0xA4, 0x80, +0xF4, 0x31, 0x62, 0xF0, 0xF9, 0x0F, 0x4A, 0x80, 0xFA, 0x08, 0x76, 0x00, 0xFA, 0xF8, 0x67, 0x00, +0xFB, 0xE8, 0x58, 0x00, 0xFC, 0xD8, 0x49, 0x00, 0xFD, 0xC8, 0x3A, 0x00, 0xFE, 0xB8, 0x2B, 0x00, +0xFF, 0xA8, 0x1C, 0x00, 0x00, 0x98, 0x0D, 0x00, 0x01, 0x87, 0xFE, 0x00, 0x02, 0x77, 0xEF, 0x00, +0x03, 0x71, 0x1A, 0x80, 0x04, 0x61, 0x0B, 0x80, 0x05, 0x50, 0xFC, 0x80, 0x06, 0x40, 0xED, 0x80, +0x07, 0x30, 0xDE, 0x80, 0x08, 0x20, 0xCF, 0x80, 0x09, 0x10, 0xC0, 0x80, 0x0A, 0x00, 0xB1, 0x80, +0x0A, 0xF0, 0xA2, 0x80, 0x0B, 0xE0, 0x93, 0x80, 0x0C, 0xD9, 0xBF, 0x00, 0x0D, 0xC0, 0x75, 0x80, +0x0E, 0xB9, 0xA1, 0x00, 0x0F, 0xA9, 0x92, 0x00, 0x10, 0x99, 0x83, 0x00, 0x11, 0x89, 0x74, 0x00, +0x12, 0x79, 0x65, 0x00, 0x13, 0x69, 0x56, 0x00, 0x14, 0x59, 0x47, 0x00, 0x15, 0x49, 0x38, 0x00, +0x16, 0x39, 0x29, 0x00, 0x17, 0x29, 0x1A, 0x00, 0x18, 0x22, 0x45, 0x80, 0x19, 0x08, 0xFC, 0x00, +0x1A, 0x02, 0x27, 0x80, 0x1A, 0xF2, 0x18, 0x80, 0x1B, 0xE2, 0x09, 0x80, 0x1C, 0xD1, 0xFA, 0x80, +0x1D, 0xC1, 0xEB, 0x80, 0x1E, 0xB1, 0xDC, 0x80, 0x1F, 0xA1, 0xCD, 0x80, 0x20, 0x76, 0x0F, 0x00, +0x21, 0x81, 0xAF, 0x80, 0x22, 0x55, 0xF1, 0x00, 0x23, 0x6A, 0xCC, 0x00, 0x24, 0x35, 0xD3, 0x00, +0x25, 0x4A, 0xAE, 0x00, 0x26, 0x15, 0xB5, 0x00, 0x27, 0x2A, 0x90, 0x00, 0x27, 0xFE, 0xD1, 0x80, +0x29, 0x0A, 0x72, 0x00, 0x29, 0xDE, 0xB3, 0x80, 0x2A, 0xEA, 0x54, 0x00, 0x2B, 0xBE, 0x95, 0x80, +0x2C, 0xD3, 0x70, 0x80, 0x2D, 0x9E, 0x77, 0x80, 0x2E, 0xB3, 0x52, 0x80, 0x2F, 0x7E, 0x59, 0x80, +0x30, 0x93, 0x34, 0x80, 0x31, 0x67, 0x76, 0x00, 0x32, 0x73, 0x16, 0x80, 0x33, 0x47, 0x58, 0x00, +0x34, 0x52, 0xF8, 0x80, 0x35, 0x27, 0x3A, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x37, 0x07, 0x1C, 0x00, +0x38, 0x1B, 0xF7, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x3A, 0xC6, 0xE0, 0x00, +0x3B, 0xDB, 0xBB, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x3D, 0xBB, 0x9D, 0x00, 0x3E, 0x8F, 0xDE, 0x80, +0x3F, 0x9B, 0x7F, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x41, 0x84, 0x9B, 0x80, 0x42, 0x4F, 0xA2, 0x80, +0x43, 0x64, 0x7D, 0x80, 0x44, 0x2F, 0x84, 0x80, 0x45, 0x44, 0x51, 0x70, 0x45, 0xF3, 0xB7, 0x00, +0x47, 0x2D, 0x6D, 0xF0, 0x47, 0xD3, 0x99, 0x00, 0x49, 0x0D, 0x4F, 0xF0, 0x49, 0xB3, 0x7B, 0x00, +0x4A, 0xED, 0x31, 0xF0, 0x4B, 0x9C, 0x97, 0x80, 0x4C, 0xD6, 0x4E, 0x70, 0x4D, 0x7C, 0x79, 0x80, +0x4E, 0xB6, 0x30, 0x70, 0x4F, 0x5C, 0x5B, 0x80, 0x50, 0x96, 0x12, 0x70, 0x51, 0x3C, 0x3D, 0x80, +0x52, 0x75, 0xF4, 0x70, 0x53, 0x1C, 0x1F, 0x80, 0x54, 0x55, 0xD6, 0x70, 0x54, 0xFC, 0x01, 0x80, +0x56, 0x35, 0xB8, 0x70, 0x56, 0xE5, 0x1E, 0x00, 0x58, 0x1E, 0xD4, 0xF0, 0x58, 0xC5, 0x00, 0x00, +0x59, 0xFE, 0xB6, 0xF0, 0x5A, 0xA4, 0xE2, 0x00, 0x5B, 0xDE, 0x98, 0xF0, 0x5C, 0x84, 0xC4, 0x00, +0x5D, 0xBE, 0x7A, 0xF0, 0x5E, 0x64, 0xA6, 0x00, 0x5F, 0x9E, 0x5C, 0xF0, 0x60, 0x4D, 0xC2, 0x80, +0x61, 0x87, 0x79, 0x70, 0x62, 0x2D, 0xA4, 0x80, 0x63, 0x67, 0x5B, 0x70, 0x64, 0x0D, 0x86, 0x80, +0x65, 0x47, 0x3D, 0x70, 0x65, 0xED, 0x68, 0x80, 0x67, 0x27, 0x1F, 0x70, 0x67, 0xCD, 0x4A, 0x80, +0x69, 0x07, 0x01, 0x70, 0x69, 0xAD, 0x2C, 0x80, 0x6A, 0xE6, 0xE3, 0x70, 0x6B, 0x96, 0x49, 0x00, +0x6C, 0xCF, 0xFF, 0xF0, 0x6D, 0x76, 0x2B, 0x00, 0x6E, 0xAF, 0xE1, 0xF0, 0x6F, 0x56, 0x0D, 0x00, +0x70, 0x8F, 0xC3, 0xF0, 0x71, 0x35, 0xEF, 0x00, 0x72, 0x6F, 0xA5, 0xF0, 0x73, 0x15, 0xD1, 0x00, +0x74, 0x4F, 0x87, 0xF0, 0x74, 0xFE, 0xED, 0x80, 0x76, 0x38, 0xA4, 0x70, 0x76, 0xDE, 0xCF, 0x80, +0x78, 0x18, 0x86, 0x70, 0x78, 0xBE, 0xB1, 0x80, 0x79, 0xF8, 0x68, 0x70, 0x7A, 0x9E, 0x93, 0x80, +0x7B, 0xD8, 0x4A, 0x70, 0x7C, 0x7E, 0x75, 0x80, 0x7D, 0xB8, 0x2C, 0x70, 0x7E, 0x5E, 0x57, 0x80, +0x7F, 0x98, 0x0E, 0x70, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x04, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, +0xA4, 0xEC, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, +0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, +0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, +0x43, 0x53, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x00, 0x00, +0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0xE4, 0xB0, 0x94, 0xFF, 0xFF, +0xFF, 0xFF, 0x9B, 0x01, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xC3, 0xBA, 0x50, 0xFF, 0xFF, +0xFF, 0xFF, 0x9E, 0xB8, 0xA1, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xF9, 0x70, 0xFF, 0xFF, +0xFF, 0xFF, 0xC2, 0xA0, 0x3B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x84, 0xF0, 0xFF, 0xFF, +0xFF, 0xFF, 0xCB, 0x88, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, +0xFF, 0xFF, 0xD2, 0x61, 0x09, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x88, 0x68, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xD4, 0x53, 0x60, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xD5, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xD6, 0x20, 0xCD, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0xB7, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xD8, 0x00, 0xAF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x99, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xD9, 0xE0, 0x91, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x00, 0x07, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xDB, 0xC8, 0x5C, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x97, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xDD, 0xA9, 0x90, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x79, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xDF, 0x89, 0x72, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x5B, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xE1, 0x69, 0x54, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x3D, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xE3, 0x49, 0x36, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x1F, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xE5, 0x29, 0x18, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x3C, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xE7, 0x12, 0x34, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x1E, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xE8, 0xF2, 0x16, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xEA, 0xD1, 0xF8, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xE2, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xEC, 0xD6, 0xC4, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xC4, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xEE, 0x91, 0xBC, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0xA4, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xF4, 0x31, 0x62, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x4A, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xFA, 0x08, 0x76, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x67, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFB, 0xE8, 0x58, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x49, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFD, 0xC8, 0x3A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x2B, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xA8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x87, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xEF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0x71, 0x1A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0x0B, 0x80, 0x00, 0x00, +0x00, 0x00, 0x05, 0x50, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xED, 0x80, 0x00, 0x00, +0x00, 0x00, 0x07, 0x30, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xCF, 0x80, 0x00, 0x00, +0x00, 0x00, 0x09, 0x10, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xB1, 0x80, 0x00, 0x00, +0x00, 0x00, 0x0A, 0xF0, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x93, 0x80, 0x00, 0x00, +0x00, 0x00, 0x0C, 0xD9, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x75, 0x80, 0x00, 0x00, +0x00, 0x00, 0x0E, 0xB9, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x92, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x99, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x74, 0x00, 0x00, 0x00, +0x00, 0x00, 0x12, 0x79, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x56, 0x00, 0x00, 0x00, +0x00, 0x00, 0x14, 0x59, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x38, 0x00, 0x00, 0x00, +0x00, 0x00, 0x16, 0x39, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x1A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x18, 0x22, 0x45, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xFC, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1A, 0x02, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x18, 0x80, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xE2, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xFA, 0x80, 0x00, 0x00, +0x00, 0x00, 0x1D, 0xC1, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xDC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x1F, 0xA1, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x0F, 0x00, 0x00, 0x00, +0x00, 0x00, 0x21, 0x81, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xF1, 0x00, 0x00, 0x00, +0x00, 0x00, 0x23, 0x6A, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xD3, 0x00, 0x00, 0x00, +0x00, 0x00, 0x25, 0x4A, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xB5, 0x00, 0x00, 0x00, +0x00, 0x00, 0x27, 0x2A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xD1, 0x80, 0x00, 0x00, +0x00, 0x00, 0x29, 0x0A, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xB3, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xEA, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x95, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xD3, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x77, 0x80, 0x00, 0x00, +0x00, 0x00, 0x2E, 0xB3, 0x52, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x59, 0x80, 0x00, 0x00, +0x00, 0x00, 0x30, 0x93, 0x34, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, +0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, +0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, +0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xDB, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, +0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, +0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, +0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xB7, 0x00, 0x00, 0x00, +0x00, 0x00, 0x47, 0x2D, 0x6D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x99, 0x00, 0x00, 0x00, +0x00, 0x00, 0x49, 0x0D, 0x4F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x7B, 0x00, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xED, 0x31, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x97, 0x80, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xD6, 0x4E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x79, 0x80, 0x00, 0x00, +0x00, 0x00, 0x4E, 0xB6, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x5B, 0x80, 0x00, 0x00, +0x00, 0x00, 0x50, 0x96, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x3D, 0x80, 0x00, 0x00, +0x00, 0x00, 0x52, 0x75, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x1F, 0x80, 0x00, 0x00, +0x00, 0x00, 0x54, 0x55, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFC, 0x01, 0x80, 0x00, 0x00, +0x00, 0x00, 0x56, 0x35, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x1E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x58, 0x1E, 0xD4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC5, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x59, 0xFE, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xE2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xDE, 0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xC4, 0x00, 0x00, 0x00, +0x00, 0x00, 0x5D, 0xBE, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0xA6, 0x00, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x9E, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xC2, 0x80, 0x00, 0x00, +0x00, 0x00, 0x61, 0x87, 0x79, 0x70, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0xA4, 0x80, 0x00, 0x00, +0x00, 0x00, 0x63, 0x67, 0x5B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x86, 0x80, 0x00, 0x00, +0x00, 0x00, 0x65, 0x47, 0x3D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x68, 0x80, 0x00, 0x00, +0x00, 0x00, 0x67, 0x27, 0x1F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x4A, 0x80, 0x00, 0x00, +0x00, 0x00, 0x69, 0x07, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x2C, 0x80, 0x00, 0x00, +0x00, 0x00, 0x6A, 0xE6, 0xE3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x49, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xCF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x2B, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6E, 0xAF, 0xE1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x56, 0x0D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x70, 0x8F, 0xC3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xEF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x72, 0x6F, 0xA5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xD1, 0x00, 0x00, 0x00, +0x00, 0x00, 0x74, 0x4F, 0x87, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xED, 0x80, 0x00, 0x00, +0x00, 0x00, 0x76, 0x38, 0xA4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xCF, 0x80, 0x00, 0x00, +0x00, 0x00, 0x78, 0x18, 0x86, 0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xB1, 0x80, 0x00, 0x00, +0x00, 0x00, 0x79, 0xF8, 0x68, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0x93, 0x80, 0x00, 0x00, +0x00, 0x00, 0x7B, 0xD8, 0x4A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x75, 0x80, 0x00, 0x00, +0x00, 0x00, 0x7D, 0xB8, 0x2C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x57, 0x80, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x98, 0x0E, 0x70, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x04, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xA7, 0x58, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, -0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, -0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, -0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x01, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, -0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xD3, 0xAA, 0x32, 0x00, 0x82, -0x5C, 0x65, 0x00, 0x00, 0x00, 0x22, 0x43, 0x65, 0x6E, 0x74, 0x72, 0x61, 0x6C, 0x20, 0x2D, 0x20, -0x4F, 0x4E, 0x20, 0x28, 0x52, 0x61, 0x69, 0x6E, 0x79, 0x20, 0x52, 0x2C, 0x20, 0x46, 0x74, 0x20, -0x46, 0x72, 0x61, 0x6E, 0x63, 0x65, 0x73, 0x29, +0xFF, 0xFF, 0xA4, 0xEC, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, +0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x0C, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, +0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x44, +0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x43, 0x50, 0x54, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, +0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, +0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* America/Rankin_Inlet */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -37322,7 +37513,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Recife */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x67, 0xB8, +0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x67, 0xB8, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -37332,41 +37523,40 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x1F, 0xA0, 0x35, 0xB0, 0x20, 0x33, 0xCF, 0xA0, 0x21, 0x81, 0x69, 0x30, 0x22, 0x0B, 0xC8, 0xA0, 0x23, 0x58, 0x10, 0xB0, 0x23, 0xE2, 0x70, 0x20, 0x25, 0x37, 0xF2, 0xB0, 0x25, 0xD4, 0xC7, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xB8, 0x85, 0x20, 0x39, 0xDF, 0xE3, 0x30, 0x39, 0xE9, 0x0F, 0xA0, -0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, +0x3B, 0xC8, 0xFF, 0xB0, 0x3C, 0x6F, 0x0E, 0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xDF, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, -0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, +0xFF, 0xDF, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, -0xFF, 0xFF, 0x96, 0xAA, 0x67, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, -0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, -0x00, 0x00, 0x39, 0xE9, 0x0F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xDF, 0x48, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, -0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x7D, 0x0B, 0xB8, -0x00, 0xDD, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x0A, 0x50, 0x65, 0x72, 0x6E, 0x61, 0x6D, 0x62, 0x75, -0x63, 0x6F, +0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x67, +0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xFF, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, +0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, +0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, +0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x0F, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, +0xA0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xDF, 0x48, 0x00, 0x00, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x7D, +0x0B, 0xB8, 0x00, 0xDD, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x0A, 0x50, 0x65, 0x72, 0x6E, 0x61, 0x6D, +0x62, 0x75, 0x63, 0x6F, /* America/Regina */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -37560,7 +37750,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Rio_Branco */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -37568,42 +37758,41 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xC0, 0x70, -0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x86, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, -0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, -0x50, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, -0xCA, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, -0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, -0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, -0xB6, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, -0x1B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, -0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, -0x48, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, -0xEE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, -0x22, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, -0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0x51, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, -0x85, 0x50, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, -0x7F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x52, 0x7F, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, -0x02, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x35, 0x3E, 0x35, 0x0A, 0x00, 0x7A, 0x1F, 0x05, 0x00, 0xAB, 0x34, 0x20, 0x00, 0x00, 0x00, 0x04, -0x41, 0x63, 0x72, 0x65, - -/* America/Rosario */ +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, +0xFF, 0x96, 0xAA, 0x86, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x66, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x50, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xCA, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x31, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xB6, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x1B, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x80, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x48, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xEE, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x22, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0xAA, 0x50, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x51, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x85, 0x50, 0x00, 0x00, 0x00, +0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, 0x7F, 0x50, 0x00, 0x00, 0x00, +0x00, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, +0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x7A, 0x1F, 0x05, 0x00, 0xAB, 0x34, 0x20, 0x00, 0x00, +0x00, 0x04, 0x41, 0x63, 0x72, 0x65, + +/* America/Rosario */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x92, 0x8F, 0x30, 0xB6, 0x7B, 0x52, 0x40, 0xB7, 0x1A, 0xC9, 0xB0, 0xB8, 0x1E, 0x8F, 0x40, 0xB8, 0xD4, 0x70, 0x30, 0xBA, 0x17, 0x7D, 0xC0, 0xBA, 0xB5, 0xA3, 0xB0, 0xBB, 0xF8, 0xB1, 0x40, 0xBC, 0x96, 0xD7, 0x30, 0xBD, 0xD9, 0xE4, 0xC0, 0xBE, 0x78, 0x0A, 0xB0, 0xBF, 0xBB, 0x18, 0x40, @@ -37619,57 +37808,56 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x27, 0x21, 0x0F, 0x30, 0x27, 0xD0, 0x58, 0xA0, 0x29, 0x00, 0xFF, 0x40, 0x29, 0xB0, 0x3A, 0xA0, 0x2A, 0xE0, 0xD3, 0x30, 0x2B, 0x99, 0x57, 0x20, 0x37, 0xF6, 0xC6, 0xB0, 0x38, 0xBF, 0x2A, 0xB0, 0x47, 0x77, 0x09, 0xB0, 0x47, 0xDC, 0x7F, 0x20, 0x48, 0xFA, 0xA2, 0xB0, 0x49, 0xBC, 0x61, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, -0x05, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC3, +0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, +0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAD, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xA2, 0x92, 0x8F, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB7, 0x1A, 0xC9, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xD4, 0x70, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xB5, 0xA3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xBC, 0x96, 0xD7, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xBE, 0x78, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC0, 0x5A, 0x8F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC2, 0x3B, 0xC3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC4, 0x1C, 0xF6, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xC5, 0xFE, 0x2A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xE0, 0xAF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xCA, 0x4D, 0xA1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0x4D, 0xFF, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x29, 0x35, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x3D, 0x08, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, -0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x94, 0xB5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x29, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xE0, 0xD3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, -0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x47, 0x77, 0x09, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, -0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, 0x03, 0x05, 0x04, -0x05, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x04, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, 0x54, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x9C, 0xAD, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x92, 0x8F, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x7B, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xC9, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x1E, 0x8F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD4, 0x70, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x17, 0x7D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xB5, 0xA3, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xF8, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0x96, 0xD7, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xD9, 0xE4, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x78, 0x0A, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xBB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x5A, 0x8F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x9D, 0x9D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x3B, 0xC3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x7E, 0xD0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x1C, 0xF6, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x60, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xFE, 0x2A, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x41, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xE0, 0xAF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x94, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x4D, 0xA1, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xEE, 0x86, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x4D, 0xFF, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xB0, 0xED, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x29, 0x35, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3D, 0x08, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x9F, 0xF6, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x32, 0x10, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, +0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, +0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x94, 0xB5, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0x94, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, +0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xFF, +0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xB0, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE0, 0xD3, +0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x99, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xBF, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x77, 0x09, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xDC, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, +0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x61, 0x20, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x02, 0x04, 0x05, 0x04, 0x05, +0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0xFF, 0xFF, 0xC3, 0xD0, 0x00, 0x00, 0xFF, 0xFF, 0xC3, 0xD0, +0x00, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Santa_Isabel */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -37826,7 +38014,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Santarem */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7A, 0x48, +0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7A, 0x48, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -37834,41 +38022,40 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x3A, 0x40, 0xF8, 0xC7, 0xD3, 0x30, 0xFA, 0x0A, 0xE0, 0xC0, 0xFA, 0xA9, 0x06, 0xB0, 0xFB, 0xEC, 0x14, 0x40, 0xFC, 0x8B, 0x8B, 0xB0, 0x1D, 0xC9, 0x9C, 0x40, 0x1E, 0x78, 0xE5, 0xB0, 0x1F, 0xA0, 0x43, 0xC0, 0x20, 0x33, 0xDD, 0xB0, 0x21, 0x81, 0x77, 0x40, 0x22, 0x0B, 0xD6, 0xB0, -0x48, 0x60, 0x71, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x48, 0x60, 0x71, 0x40, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xCC, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0xD5, -0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x4C, -0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x02, 0x03, 0xFF, 0xFF, 0xCC, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, +0xC7, 0xC0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, -0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7A, 0x48, 0xFF, -0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, -0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, -0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, -0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, -0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, -0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, -0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, -0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, -0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x48, 0x60, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, -0xCC, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, -0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x85, 0x9D, 0xBA, 0x00, 0xBE, -0xF0, 0x35, 0x00, 0x00, 0x00, 0x0B, 0x50, 0x61, 0x72, 0x61, 0x20, 0x28, 0x77, 0x65, 0x73, 0x74, -0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7A, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, +0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, +0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, +0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, +0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, +0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, +0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, +0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, +0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, +0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, +0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, +0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, +0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, +0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, +0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, +0x71, 0x40, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, +0xFF, 0xFF, 0xCC, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x85, 0x9D, 0xBA, +0x00, 0xBE, 0xF0, 0x35, 0x00, 0x00, 0x00, 0x0B, 0x50, 0x61, 0x72, 0x61, 0x20, 0x28, 0x77, 0x65, +0x73, 0x74, 0x29, /* America/Santiago */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, @@ -37908,124 +38095,124 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x3A, 0x74, 0xB0, 0x74, 0x05, 0x89, 0xC0, 0x75, 0x1A, 0x56, 0xB0, 0x75, 0xE5, 0x6B, 0xC0, 0x76, 0xFA, 0x38, 0xB0, 0x77, 0xC5, 0x4D, 0xC0, 0x78, 0xDA, 0x1A, 0xB0, 0x79, 0xA5, 0x2F, 0xC0, 0x7A, 0xC3, 0x37, 0x30, 0x7B, 0x85, 0x11, 0xC0, 0x7C, 0xA3, 0x19, 0x30, 0x7D, 0x6E, 0x2E, 0x40, -0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, -0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, -0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, 0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, -0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, -0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, -0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB7, 0x1A, 0xD7, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x9B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xCC, 0x1C, 0x6E, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xD3, 0xDC, 0x8F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x17, 0xD5, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xD5, 0x33, 0x55, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x76, 0x92, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xFD, 0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x01, 0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x03, 0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x05, 0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x07, 0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x08, 0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x0A, 0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x0C, 0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, -0x0E, 0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, -0x10, 0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, -0x12, 0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, -0x14, 0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x16, 0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, -0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, -0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, -0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, -0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, -0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, -0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, -0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, -0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, -0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, -0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, -0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, -0x59, 0x8F, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, -0x5B, 0x6F, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x5D, 0x74, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x5F, 0x54, 0x5E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x61, 0x34, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x63, 0x1D, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x64, 0xF4, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, -0x66, 0xDD, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x68, 0xBD, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, -0x6A, 0x9C, 0xE5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, -0x6C, 0x7C, 0xC7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, -0x6E, 0x5C, 0xA9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x70, 0x3C, 0x8B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x72, 0x25, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x74, 0x05, 0x89, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x75, 0xE5, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x77, 0xC5, 0x4D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x79, 0xA5, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, -0x7B, 0x85, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, -0x7D, 0x6E, 0x2E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, -0x7F, 0x4E, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, -0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, -0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, -0x31, 0x2E, 0x36, 0x2F, 0x32, 0x34, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x34, -0x0A, 0x00, 0x56, 0x49, 0xD8, 0x00, 0xA6, 0xD4, 0x55, 0x00, 0x00, 0x00, 0x12, 0x43, 0x68, 0x69, -0x6C, 0x65, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x00, 0xFF, 0xFF, 0xBD, +0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, +0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, +0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x33, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xD7, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x9B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x1C, 0x6E, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xDC, 0x8F, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x17, 0xD5, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x33, 0x55, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD5, 0x76, 0x92, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xD1, 0x3C, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x75, 0x50, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x32, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3E, 0x4F, 0x40, 0x00, +0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0B, 0xBC, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x13, 0x40, 0x00, +0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xF5, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xBD, 0xD7, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x9D, 0xB9, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD5, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x12, 0x66, 0xB7, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, 0x46, 0x99, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x26, 0x7B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, +0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, +0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, +0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, +0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, +0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, +0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, +0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, +0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, +0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, +0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, +0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, +0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, +0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, +0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, +0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, 0x8F, 0xCE, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x6F, 0xB0, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x74, 0x7C, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x54, 0x5E, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x34, 0x40, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x1D, 0x5D, 0x40, 0x00, +0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x64, 0xF4, 0x04, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x66, 0xDD, 0x21, 0x40, 0x00, +0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x68, 0xBD, 0x03, 0x40, 0x00, +0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x9C, 0xE5, 0x40, 0x00, +0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x7C, 0xC7, 0x40, 0x00, +0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x5C, 0xA9, 0x40, 0x00, +0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x3C, 0x8B, 0x40, 0x00, +0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x25, 0xA7, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x05, 0x89, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x75, 0xE5, 0x6B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xC5, 0x4D, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xA5, 0x2F, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x85, 0x11, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x6E, 0x2E, 0x40, 0x00, +0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x4E, 0x10, 0x40, 0x01, +0x02, 0x01, 0x03, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, +0x03, 0x05, 0x04, 0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0xFF, 0xFF, +0xBD, 0xBB, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, +0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, +0x39, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x34, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, +0x32, 0x34, 0x0A, 0x00, 0x56, 0x49, 0xD8, 0x00, 0xA6, 0xD4, 0x55, 0x00, 0x00, 0x00, 0x12, 0x43, +0x68, 0x69, 0x6C, 0x65, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, +0x29, /* America/Santo_Domingo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x44, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -38062,7 +38249,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Sao_Paulo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x72, 0xB4, +0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x72, 0xB4, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -38085,81 +38272,80 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x52, 0x63, 0x47, 0x30, 0x53, 0x00, 0x1B, 0xA0, 0x54, 0x43, 0x29, 0x30, 0x54, 0xE9, 0x38, 0x20, 0x56, 0x23, 0x0B, 0x30, 0x56, 0xC9, 0x1A, 0x20, 0x58, 0x02, 0xED, 0x30, 0x58, 0xA8, 0xFC, 0x20, 0x59, 0xE2, 0xCF, 0x30, 0x5A, 0x88, 0xDE, 0x20, -0x5B, 0xDE, 0x60, 0xB0, 0x5C, 0x68, 0xC0, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, +0x5B, 0xDE, 0x60, 0xB0, 0x5C, 0x68, 0xC0, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, -0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x72, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, -0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, -0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, -0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, -0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, -0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, -0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5A, -0x09, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, -0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, -0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, -0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, -0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, -0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, -0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, -0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, -0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, -0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xBD, 0xE3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, -0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x8B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, -0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6B, 0x32, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, -0xB5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xC4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, -0x97, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x46, 0xA6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, -0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, -0x20, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x6A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, -0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, -0x1F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x68, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, -0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, -0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x2C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, -0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, -0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xF0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x91, -0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2E, 0xD2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x86, -0xF8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x42, 0x17, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, -0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, 0xF7, 0xD1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, -0x53, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0xE0, 0xED, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, -0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x47, 0xB7, 0x95, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, -0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x97, 0x77, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, -0x84, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x80, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, -0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x60, 0x75, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, -0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x49, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, -0x65, 0x30, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x39, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, -0x47, 0x30, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x1B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x43, -0x29, 0x30, 0x00, 0x00, 0x00, 0x00, 0x54, 0xE9, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x56, 0x23, -0x0B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0xC9, 0x1A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, -0xED, 0x30, 0x00, 0x00, 0x00, 0x00, 0x58, 0xA8, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, -0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x88, 0xDE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, -0x60, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x68, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, -0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x65, 0x6B, 0x8A, 0x00, 0xCB, 0x86, 0xDD, 0x00, 0x00, 0x00, 0x36, -0x42, 0x72, 0x61, 0x7A, 0x69, 0x6C, 0x20, 0x28, 0x73, 0x6F, 0x75, 0x74, 0x68, 0x65, 0x61, 0x73, -0x74, 0x3A, 0x20, 0x47, 0x4F, 0x2C, 0x20, 0x44, 0x46, 0x2C, 0x20, 0x4D, 0x47, 0x2C, 0x20, 0x45, -0x53, 0x2C, 0x20, 0x52, 0x4A, 0x2C, 0x20, 0x53, 0x50, 0x2C, 0x20, 0x50, 0x52, 0x2C, 0x20, 0x53, -0x43, 0x2C, 0x20, 0x52, 0x53, 0x29, +0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, +0xFF, 0x96, 0xAA, 0x72, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5A, 0x09, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, +0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, +0x00, 0x27, 0xBD, 0xE3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, +0x00, 0x29, 0x94, 0x8B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x0D, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x2B, 0x6B, 0x32, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xB5, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x66, 0xC4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, 0x97, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x46, 0xA6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, +0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x20, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x33, 0x06, 0x6A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, 0x54, 0x30, 0x00, 0x00, 0x00, +0x00, 0x34, 0xF8, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, 0x1F, 0x30, 0x00, 0x00, 0x00, +0x00, 0x36, 0xCF, 0x68, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3A, 0x8F, 0x2C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, 0x91, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x4E, 0xF0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x91, 0xFE, 0x30, 0x00, 0x00, 0x00, +0x00, 0x40, 0x2E, 0xD2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x86, 0xF8, 0x30, 0x00, 0x00, 0x00, +0x00, 0x42, 0x17, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, 0xC2, 0x30, 0x00, 0x00, 0x00, +0x00, 0x43, 0xF7, 0xD1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, 0x53, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x45, 0xE0, 0xED, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x86, 0x30, 0x00, 0x00, 0x00, +0x00, 0x47, 0xB7, 0x95, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x49, 0x97, 0x77, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x84, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0x80, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, 0x66, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x60, 0x75, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, 0x48, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4F, 0x49, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0x65, 0x30, 0x00, 0x00, 0x00, +0x00, 0x51, 0x20, 0x39, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x47, 0x30, 0x00, 0x00, 0x00, +0x00, 0x53, 0x00, 0x1B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x43, 0x29, 0x30, 0x00, 0x00, 0x00, +0x00, 0x54, 0xE9, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x56, 0x23, 0x0B, 0x30, 0x00, 0x00, 0x00, +0x00, 0x56, 0xC9, 0x1A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0xED, 0x30, 0x00, 0x00, 0x00, +0x00, 0x58, 0xA8, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, 0xCF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x5A, 0x88, 0xDE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x60, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x5C, 0x68, 0xC0, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0xFF, 0xFF, 0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x65, 0x6B, 0x8A, 0x00, 0xCB, 0x86, 0xDD, 0x00, 0x00, +0x00, 0x36, 0x42, 0x72, 0x61, 0x7A, 0x69, 0x6C, 0x20, 0x28, 0x73, 0x6F, 0x75, 0x74, 0x68, 0x65, +0x61, 0x73, 0x74, 0x3A, 0x20, 0x47, 0x4F, 0x2C, 0x20, 0x44, 0x46, 0x2C, 0x20, 0x4D, 0x47, 0x2C, +0x20, 0x45, 0x53, 0x2C, 0x20, 0x52, 0x4A, 0x2C, 0x20, 0x53, 0x50, 0x2C, 0x20, 0x50, 0x52, 0x2C, +0x20, 0x53, 0x43, 0x2C, 0x20, 0x52, 0x53, 0x29, /* America/Scoresbysund */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x9B, 0x80, 0x4C, 0x18, +0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x9B, 0x80, 0x4C, 0x18, 0x13, 0x4D, 0x6E, 0x40, 0x14, 0x34, 0x24, 0xC0, 0x15, 0x23, 0xF9, 0xA0, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, @@ -38189,97 +38375,96 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x04, 0xFF, 0xFF, 0xEB, 0x68, 0x00, 0x00, -0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, -0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, -0x00, 0x00, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, -0x2B, 0x30, 0x30, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0x9B, 0x80, 0x4C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x6E, 0x40, 0x00, 0x00, -0x00, 0x00, 0x14, 0x34, 0x24, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xF9, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, -0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, -0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, -0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, -0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, -0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, -0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, -0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, -0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, -0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x04, 0xFF, 0xFF, 0xEB, 0x68, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, -0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, -0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x31, 0x3E, 0x31, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, -0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xF4, 0xE0, 0xCD, -0x00, 0xF1, 0x23, 0xC5, 0x00, 0x00, 0x00, 0x1D, 0x53, 0x63, 0x6F, 0x72, 0x65, 0x73, 0x62, 0x79, -0x73, 0x75, 0x6E, 0x64, 0x2F, 0x49, 0x74, 0x74, 0x6F, 0x71, 0x71, 0x6F, 0x72, 0x74, 0x6F, 0x6F, -0x72, 0x6D, 0x69, 0x69, 0x74, +0x04, 0x05, 0x04, 0x05, 0x04, 0xFF, 0xFF, 0xEB, 0x68, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, +0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, +0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x4C, +0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x75, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x80, 0x4C, +0x18, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x6E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x14, 0x34, 0x24, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xF9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xDC, +0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xBE, +0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xA0, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xBD, +0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x9F, +0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x81, +0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x63, +0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x45, +0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x27, +0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x43, +0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x25, +0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x07, +0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, +0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, +0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, +0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, +0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, +0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, +0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, +0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, +0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, +0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, +0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, +0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, +0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, +0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, +0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, +0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, +0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, +0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, +0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, +0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, +0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, +0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, +0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, +0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, +0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, +0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, +0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, +0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, +0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, +0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, +0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, +0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, +0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, +0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, +0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, +0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, +0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, +0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, +0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, +0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, +0x90, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0xFF, 0xFF, 0xEB, 0x68, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, +0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, +0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, +0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2B, 0x30, 0x30, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x31, 0x3E, 0x31, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, +0x30, 0x2F, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xF4, +0xE0, 0xCD, 0x00, 0xF1, 0x23, 0xC5, 0x00, 0x00, 0x00, 0x1D, 0x53, 0x63, 0x6F, 0x72, 0x65, 0x73, +0x62, 0x79, 0x73, 0x75, 0x6E, 0x64, 0x2F, 0x49, 0x74, 0x74, 0x6F, 0x71, 0x71, 0x6F, 0x72, 0x74, +0x6F, 0x6F, 0x72, 0x6D, 0x69, 0x69, 0x74, /* America/Shiprock */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -38590,16 +38775,22 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/St_Barthelemy */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x93, 0x37, 0x33, 0xAC, -0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x37, 0x33, 0xAC, 0x01, 0xFF, 0xFF, 0xC6, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0xA4, 0x9D, 0xED, 0x00, 0xB2, 0xC1, 0xB8, 0x00, 0x00, +0x00, 0x00, /* America/St_Johns */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -39048,304 +39239,383 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x50, 0x69, 0x74, 0x75, 0x66, 0x66, 0x69, 0x6B, /* America/Thunder_Bay */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, -0x8F, 0x24, 0x7B, 0xE0, 0xCB, 0x88, 0xF0, 0x70, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xFB, 0xE0, -0x00, 0x97, 0xFE, 0xF0, 0x01, 0x87, 0xE1, 0xE0, 0x02, 0x77, 0xE0, 0xF0, 0x03, 0x70, 0xFE, 0x60, -0x04, 0x60, 0xFD, 0x70, 0x05, 0x50, 0xE0, 0x60, 0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, -0x0A, 0x00, 0xA3, 0x70, 0x0A, 0xF0, 0x86, 0x60, 0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, -0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, 0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, -0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, 0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, -0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, 0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, -0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, 0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, -0x1C, 0xD1, 0xEC, 0x70, 0x1D, 0xC1, 0xCF, 0x60, 0x1E, 0xB1, 0xCE, 0x70, 0x1F, 0xA1, 0xB1, 0x60, -0x20, 0x76, 0x00, 0xF0, 0x21, 0x81, 0x93, 0x60, 0x22, 0x55, 0xE2, 0xF0, 0x23, 0x6A, 0xAF, 0xE0, -0x24, 0x35, 0xC4, 0xF0, 0x25, 0x4A, 0x91, 0xE0, 0x26, 0x15, 0xA6, 0xF0, 0x27, 0x2A, 0x73, 0xE0, -0x27, 0xFE, 0xC3, 0x70, 0x29, 0x0A, 0x55, 0xE0, 0x29, 0xDE, 0xA5, 0x70, 0x2A, 0xEA, 0x37, 0xE0, -0x2B, 0xBE, 0x87, 0x70, 0x2C, 0xD3, 0x54, 0x60, 0x2D, 0x9E, 0x69, 0x70, 0x2E, 0xB3, 0x36, 0x60, -0x2F, 0x7E, 0x4B, 0x70, 0x30, 0x93, 0x18, 0x60, 0x31, 0x67, 0x67, 0xF0, 0x32, 0x72, 0xFA, 0x60, -0x33, 0x47, 0x49, 0xF0, 0x34, 0x52, 0xDC, 0x60, 0x35, 0x27, 0x2B, 0xF0, 0x36, 0x32, 0xBE, 0x60, -0x37, 0x07, 0x0D, 0xF0, 0x38, 0x1B, 0xDA, 0xE0, 0x38, 0xE6, 0xEF, 0xF0, 0x39, 0xFB, 0xBC, 0xE0, -0x3A, 0xC6, 0xD1, 0xF0, 0x3B, 0xDB, 0x9E, 0xE0, 0x3C, 0xAF, 0xEE, 0x70, 0x3D, 0xBB, 0x80, 0xE0, -0x3E, 0x8F, 0xD0, 0x70, 0x3F, 0x9B, 0x62, 0xE0, 0x40, 0x6F, 0xB2, 0x70, 0x41, 0x84, 0x7F, 0x60, -0x42, 0x4F, 0x94, 0x70, 0x43, 0x64, 0x61, 0x60, 0x44, 0x2F, 0x76, 0x70, 0x45, 0x44, 0x43, 0x60, -0x45, 0xF3, 0xA8, 0xF0, 0x47, 0x2D, 0x5F, 0xE0, 0x47, 0xD3, 0x8A, 0xF0, 0x49, 0x0D, 0x41, 0xE0, -0x49, 0xB3, 0x6C, 0xF0, 0x4A, 0xED, 0x23, 0xE0, 0x4B, 0x9C, 0x89, 0x70, 0x4C, 0xD6, 0x40, 0x60, -0x4D, 0x7C, 0x6B, 0x70, 0x4E, 0xB6, 0x22, 0x60, 0x4F, 0x5C, 0x4D, 0x70, 0x50, 0x96, 0x04, 0x60, -0x51, 0x3C, 0x2F, 0x70, 0x52, 0x75, 0xE6, 0x60, 0x53, 0x1C, 0x11, 0x70, 0x54, 0x55, 0xC8, 0x60, -0x54, 0xFB, 0xF3, 0x70, 0x56, 0x35, 0xAA, 0x60, 0x56, 0xE5, 0x0F, 0xF0, 0x58, 0x1E, 0xC6, 0xE0, -0x58, 0xC4, 0xF1, 0xF0, 0x59, 0xFE, 0xA8, 0xE0, 0x5A, 0xA4, 0xD3, 0xF0, 0x5B, 0xDE, 0x8A, 0xE0, -0x5C, 0x84, 0xB5, 0xF0, 0x5D, 0xBE, 0x6C, 0xE0, 0x5E, 0x64, 0x97, 0xF0, 0x5F, 0x9E, 0x4E, 0xE0, -0x60, 0x4D, 0xB4, 0x70, 0x61, 0x87, 0x6B, 0x60, 0x62, 0x2D, 0x96, 0x70, 0x63, 0x67, 0x4D, 0x60, -0x64, 0x0D, 0x78, 0x70, 0x65, 0x47, 0x2F, 0x60, 0x65, 0xED, 0x5A, 0x70, 0x67, 0x27, 0x11, 0x60, -0x67, 0xCD, 0x3C, 0x70, 0x69, 0x06, 0xF3, 0x60, 0x69, 0xAD, 0x1E, 0x70, 0x6A, 0xE6, 0xD5, 0x60, -0x6B, 0x96, 0x3A, 0xF0, 0x6C, 0xCF, 0xF1, 0xE0, 0x6D, 0x76, 0x1C, 0xF0, 0x6E, 0xAF, 0xD3, 0xE0, -0x6F, 0x55, 0xFE, 0xF0, 0x70, 0x8F, 0xB5, 0xE0, 0x71, 0x35, 0xE0, 0xF0, 0x72, 0x6F, 0x97, 0xE0, -0x73, 0x15, 0xC2, 0xF0, 0x74, 0x4F, 0x79, 0xE0, 0x74, 0xFE, 0xDF, 0x70, 0x76, 0x38, 0x96, 0x60, -0x76, 0xDE, 0xC1, 0x70, 0x78, 0x18, 0x78, 0x60, 0x78, 0xBE, 0xA3, 0x70, 0x79, 0xF8, 0x5A, 0x60, -0x7A, 0x9E, 0x85, 0x70, 0x7B, 0xD8, 0x3C, 0x60, 0x7C, 0x7E, 0x67, 0x70, 0x7D, 0xB8, 0x1E, 0x60, -0x7E, 0x5E, 0x49, 0x70, 0x7F, 0x98, 0x00, 0x60, 0x01, 0x02, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, -0x02, 0x05, 0x02, 0xFF, 0xFF, 0xAC, 0x54, 0x00, 0x00, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, -0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, -0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x45, -0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x82, 0x2C, 0xFF, -0xFF, 0xFF, 0xFF, 0x8F, 0x24, 0x7B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, -0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, -0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x11, 0x89, 0x65, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x13, 0x69, 0x47, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x15, 0x49, 0x29, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, -0x00, 0x00, 0x00, 0x19, 0x08, 0xED, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, -0x00, 0x00, 0x00, 0x20, 0x76, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, -0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, -0x00, 0x00, 0x00, 0x31, 0x67, 0x67, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, -0x00, 0x00, 0x00, 0x33, 0x47, 0x49, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, -0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, -0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, -0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, -0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, -0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x5F, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x47, 0xD3, 0x8A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x41, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x49, 0xB3, 0x6C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x23, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x4B, 0x9C, 0x89, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x40, 0x60, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x7C, 0x6B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x22, 0x60, 0x00, -0x00, 0x00, 0x00, 0x4F, 0x5C, 0x4D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x04, 0x60, 0x00, -0x00, 0x00, 0x00, 0x51, 0x3C, 0x2F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xE6, 0x60, 0x00, -0x00, 0x00, 0x00, 0x53, 0x1C, 0x11, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xC8, 0x60, 0x00, -0x00, 0x00, 0x00, 0x54, 0xFB, 0xF3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xAA, 0x60, 0x00, -0x00, 0x00, 0x00, 0x56, 0xE5, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xC6, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x58, 0xC4, 0xF1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xA8, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x5A, 0xA4, 0xD3, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x8A, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x5C, 0x84, 0xB5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x6C, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x64, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x4E, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x60, 0x4D, 0xB4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x6B, 0x60, 0x00, -0x00, 0x00, 0x00, 0x62, 0x2D, 0x96, 0x70, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x4D, 0x60, 0x00, -0x00, 0x00, 0x00, 0x64, 0x0D, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x2F, 0x60, 0x00, -0x00, 0x00, 0x00, 0x65, 0xED, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x11, 0x60, 0x00, -0x00, 0x00, 0x00, 0x67, 0xCD, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xF3, 0x60, 0x00, -0x00, 0x00, 0x00, 0x69, 0xAD, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xD5, 0x60, 0x00, -0x00, 0x00, 0x00, 0x6B, 0x96, 0x3A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xF1, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x6D, 0x76, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xD3, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x6F, 0x55, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xB5, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x71, 0x35, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x97, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x73, 0x15, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x79, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x74, 0xFE, 0xDF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x96, 0x60, 0x00, -0x00, 0x00, 0x00, 0x76, 0xDE, 0xC1, 0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x78, 0x60, 0x00, -0x00, 0x00, 0x00, 0x78, 0xBE, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x5A, 0x60, 0x00, -0x00, 0x00, 0x00, 0x7A, 0x9E, 0x85, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x3C, 0x60, 0x00, -0x00, 0x00, 0x00, 0x7C, 0x7E, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x1E, 0x60, 0x00, -0x00, 0x00, 0x00, 0x7E, 0x5E, 0x49, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x00, 0x60, 0x01, -0x02, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xAC, 0x54, 0x00, 0x00, -0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, -0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x14, 0x4C, 0x4D, -0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, -0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x0A, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, -0x30, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xD3, 0x27, 0xFD, 0x00, 0x8A, -0x79, 0x38, 0x00, 0x00, 0x00, 0x1A, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x2D, 0x20, -0x4F, 0x4E, 0x20, 0x28, 0x54, 0x68, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x42, 0x61, 0x79, 0x29, - - -/* America/Tijuana */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, -0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF2, 0x7C, 0xF0, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, -0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x99, 0xBA, 0x70, -0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, -0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, -0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, -0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, -0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, -0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, -0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, -0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, 0x19, 0x09, 0x18, 0x20, 0x1A, 0x02, 0x35, 0x90, -0x1A, 0xF2, 0x34, 0xA0, 0x1B, 0xE2, 0x17, 0x90, 0x1C, 0xD2, 0x16, 0xA0, 0x1D, 0xC1, 0xF9, 0x90, -0x1E, 0xB1, 0xF8, 0xA0, 0x1F, 0xA1, 0xDB, 0x90, 0x20, 0x76, 0x2B, 0x20, 0x21, 0x81, 0xBD, 0x90, -0x22, 0x56, 0x0D, 0x20, 0x23, 0x6A, 0xDA, 0x10, 0x24, 0x35, 0xEF, 0x20, 0x25, 0x4A, 0xBC, 0x10, -0x26, 0x15, 0xD1, 0x20, 0x27, 0x2A, 0x9E, 0x10, 0x27, 0xFE, 0xED, 0xA0, 0x29, 0x0A, 0x80, 0x10, -0x29, 0xDE, 0xCF, 0xA0, 0x2A, 0xEA, 0x62, 0x10, 0x2B, 0xBE, 0xB1, 0xA0, 0x2C, 0xD3, 0x7E, 0x90, -0x2D, 0x9E, 0x93, 0xA0, 0x2E, 0xB3, 0x60, 0x90, 0x2F, 0x7E, 0x75, 0xA0, 0x30, 0x93, 0x42, 0x90, -0x31, 0x67, 0x92, 0x20, 0x32, 0x73, 0x24, 0x90, 0x33, 0x47, 0x74, 0x20, 0x34, 0x53, 0x06, 0x90, -0x35, 0x27, 0x56, 0x20, 0x36, 0x32, 0xE8, 0x90, 0x37, 0x07, 0x38, 0x20, 0x38, 0x1C, 0x05, 0x10, -0x38, 0xE7, 0x1A, 0x20, 0x39, 0xFB, 0xE7, 0x10, 0x3A, 0xC6, 0xFC, 0x20, 0x3B, 0xDB, 0xC9, 0x10, -0x3C, 0xB0, 0x18, 0xA0, 0x3D, 0xBB, 0xAB, 0x10, 0x3E, 0x8F, 0xFA, 0xA0, 0x3F, 0x9B, 0x8D, 0x10, -0x40, 0x6F, 0xDC, 0xA0, 0x41, 0x84, 0xA9, 0x90, 0x42, 0x4F, 0xBE, 0xA0, 0x43, 0x64, 0x8B, 0x90, -0x44, 0x2F, 0xA0, 0xA0, 0x45, 0x44, 0x6D, 0x90, 0x46, 0x0F, 0x82, 0xA0, 0x47, 0x24, 0x4F, 0x90, -0x47, 0xF8, 0x9F, 0x20, 0x49, 0x04, 0x31, 0x90, 0x49, 0xD8, 0x81, 0x20, 0x4A, 0xE4, 0x13, 0x90, -0x4B, 0x9C, 0xB3, 0xA0, 0x4C, 0xD6, 0x6A, 0x90, 0x4D, 0x7C, 0x95, 0xA0, 0x4E, 0xB6, 0x4C, 0x90, -0x4F, 0x5C, 0x77, 0xA0, 0x50, 0x96, 0x2E, 0x90, 0x51, 0x3C, 0x59, 0xA0, 0x52, 0x76, 0x10, 0x90, -0x53, 0x1C, 0x3B, 0xA0, 0x54, 0x55, 0xF2, 0x90, 0x54, 0xFC, 0x1D, 0xA0, 0x56, 0x35, 0xD4, 0x90, -0x56, 0xE5, 0x3A, 0x20, 0x58, 0x1E, 0xF1, 0x10, 0x58, 0xC5, 0x1C, 0x20, 0x59, 0xFE, 0xD3, 0x10, -0x5A, 0xA4, 0xFE, 0x20, 0x5B, 0xDE, 0xB5, 0x10, 0x5C, 0x84, 0xE0, 0x20, 0x5D, 0xBE, 0x97, 0x10, -0x5E, 0x64, 0xC2, 0x20, 0x5F, 0x9E, 0x79, 0x10, 0x60, 0x4D, 0xDE, 0xA0, 0x61, 0x87, 0x95, 0x90, -0x62, 0x2D, 0xC0, 0xA0, 0x63, 0x67, 0x77, 0x90, 0x64, 0x0D, 0xA2, 0xA0, 0x65, 0x47, 0x59, 0x90, -0x65, 0xED, 0x84, 0xA0, 0x67, 0x27, 0x3B, 0x90, 0x67, 0xCD, 0x66, 0xA0, 0x69, 0x07, 0x1D, 0x90, -0x69, 0xAD, 0x48, 0xA0, 0x6A, 0xE6, 0xFF, 0x90, 0x6B, 0x96, 0x65, 0x20, 0x6C, 0xD0, 0x1C, 0x10, -0x6D, 0x76, 0x47, 0x20, 0x6E, 0xAF, 0xFE, 0x10, 0x6F, 0x56, 0x29, 0x20, 0x70, 0x8F, 0xE0, 0x10, -0x71, 0x36, 0x0B, 0x20, 0x72, 0x6F, 0xC2, 0x10, 0x73, 0x15, 0xED, 0x20, 0x74, 0x4F, 0xA4, 0x10, -0x74, 0xFF, 0x09, 0xA0, 0x76, 0x38, 0xC0, 0x90, 0x76, 0xDE, 0xEB, 0xA0, 0x78, 0x18, 0xA2, 0x90, -0x78, 0xBE, 0xCD, 0xA0, 0x79, 0xF8, 0x84, 0x90, 0x7A, 0x9E, 0xAF, 0xA0, 0x7B, 0xD8, 0x66, 0x90, -0x7C, 0x7E, 0x91, 0xA0, 0x7D, 0xB8, 0x48, 0x90, 0x7E, 0x5E, 0x73, 0xA0, 0x7F, 0x98, 0x2A, 0x90, -0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x06, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, -0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, -0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, -0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0xFF, -0xFF, 0x8F, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, -0x00, 0x50, 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x95, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x7C, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, -0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x8D, -0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x99, 0xBA, -0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x1B, 0x59, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, -0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, -0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, -0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, -0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, -0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, -0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x73, -0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x55, -0x10, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x54, 0x20, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x37, -0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x36, 0x20, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x53, -0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x35, -0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x34, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x17, -0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD2, 0x16, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xF9, -0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xF8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xDB, -0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x2B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xBD, -0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x56, 0x0D, 0x20, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xDA, -0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xBC, -0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xD1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x9E, -0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xED, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x80, -0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x62, -0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0xB1, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x7E, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x60, -0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x75, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x42, -0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x24, -0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x74, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x53, 0x06, -0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x56, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xE8, -0x90, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x05, -0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x1A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xE7, -0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0xC9, -0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x18, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0xAB, -0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xFA, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x8D, -0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xDC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0xA9, -0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xBE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x8B, -0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x6D, -0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x82, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x4F, -0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x9F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x31, -0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x13, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0xB3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x6A, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x95, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x4C, -0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x77, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x2E, -0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x59, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x76, 0x10, -0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x3B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xF2, -0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFC, 0x1D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xD4, -0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x3A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xF1, -0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC5, 0x1C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xD3, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0xB5, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x97, -0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0xC2, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x79, -0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xDE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x95, -0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0xC0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x77, -0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0xA2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x59, -0x90, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x84, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x3B, -0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x66, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x69, 0x07, 0x1D, -0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x48, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xFF, -0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x65, 0x20, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xD0, 0x1C, -0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xFE, -0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x56, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xE0, -0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x36, 0x0B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0xC2, -0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xED, 0x20, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0xA4, -0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x09, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0xC0, -0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xEB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0xA2, -0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xCD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x84, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x66, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x48, -0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x73, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x2A, -0x90, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x06, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, -0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, -0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, -0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, -0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, -0x54, 0x00, 0x50, 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x50, -0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, -0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xBA, 0xF8, 0x95, 0x00, 0x60, 0x1A, 0xDD, 0x00, 0x00, -0x00, 0x21, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, -0x53, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, 0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, -0x6E, 0x69, 0x61, - -/* America/Toronto */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x2E, 0xC8, 0xA1, 0x9A, 0xB1, 0x40, +0xA2, 0x94, 0x06, 0xF0, 0xA3, 0x55, 0xA9, 0x40, 0xA4, 0x86, 0x5D, 0xF0, 0xA5, 0x28, 0x78, 0x60, +0xA6, 0x66, 0x3F, 0xF0, 0xA7, 0x0C, 0x4E, 0xE0, 0xA8, 0x46, 0x21, 0xF0, 0xA8, 0xEC, 0x30, 0xE0, +0xAA, 0x1C, 0xC9, 0x70, 0xAA, 0xD5, 0x4D, 0x60, 0xAB, 0xFC, 0xAB, 0x70, 0xAC, 0xB5, 0x2F, 0x60, +0xAD, 0xDC, 0x8D, 0x70, 0xAE, 0x95, 0x11, 0x60, 0xAF, 0xBC, 0x6F, 0x70, 0xB0, 0x7E, 0x2D, 0xE0, +0xB1, 0x9C, 0x51, 0x70, 0xB2, 0x67, 0x4A, 0x60, 0xB3, 0x7C, 0x33, 0x70, 0xB4, 0x47, 0x2C, 0x60, +0xB5, 0x5C, 0x15, 0x70, 0xB6, 0x27, 0x0E, 0x60, 0xB7, 0x3B, 0xF7, 0x70, 0xB8, 0x06, 0xF0, 0x60, +0xB9, 0x25, 0x13, 0xF0, 0xB9, 0xE6, 0xD2, 0x60, 0xBB, 0x04, 0xF5, 0xF0, 0xBB, 0xCF, 0xEE, 0xE0, +0xBC, 0xE4, 0xD7, 0xF0, 0xBD, 0xAF, 0xD0, 0xE0, 0xBE, 0xC4, 0xB9, 0xF0, 0xBF, 0x8F, 0xB2, 0xE0, +0xC0, 0xA4, 0x9B, 0xF0, 0xC1, 0x6F, 0x94, 0xE0, 0xC2, 0x84, 0x7D, 0xF0, 0xC3, 0x4F, 0x76, 0xE0, +0xC4, 0x64, 0x5F, 0xF0, 0xC5, 0x2F, 0x58, 0xE0, 0xC6, 0x4D, 0x7C, 0x70, 0xC7, 0x0F, 0x3A, 0xE0, +0xC8, 0x2D, 0x5E, 0x70, 0xCB, 0x88, 0xF0, 0x70, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xFB, 0xE0, +0xD3, 0x75, 0xE4, 0xF0, 0xD4, 0x40, 0xDD, 0xE0, 0xD5, 0x55, 0xAA, 0xD0, 0xD6, 0x20, 0xA3, 0xC0, +0xD7, 0x35, 0x8C, 0xD0, 0xD8, 0x00, 0x85, 0xC0, 0xD9, 0x15, 0x6E, 0xD0, 0xDA, 0x33, 0x76, 0x40, +0xDA, 0xFE, 0xA7, 0x70, 0xDC, 0x13, 0x74, 0x60, 0xDC, 0xDE, 0x89, 0x70, 0xDD, 0xA9, 0x82, 0x60, +0xDE, 0xBE, 0x6B, 0x70, 0xDF, 0x89, 0x64, 0x60, 0xE0, 0x9E, 0x4D, 0x70, 0xE1, 0x69, 0x46, 0x60, +0xE2, 0x7E, 0x2F, 0x70, 0xE3, 0x49, 0x28, 0x60, 0xE4, 0x5E, 0x11, 0x70, 0xE5, 0x29, 0x0A, 0x60, +0xE6, 0x47, 0x2D, 0xF0, 0xE7, 0x12, 0x26, 0xE0, 0xE8, 0x27, 0x0F, 0xF0, 0xE9, 0x16, 0xF2, 0xE0, +0xEA, 0x06, 0xF1, 0xF0, 0xEA, 0xF6, 0xD4, 0xE0, 0xEB, 0xE6, 0xD3, 0xF0, 0xEC, 0xD6, 0xB6, 0xE0, +0xED, 0xC6, 0xB5, 0xF0, 0xEE, 0xBF, 0xD3, 0x60, 0xEF, 0xAF, 0xD2, 0x70, 0xF0, 0x9F, 0xB5, 0x60, +0xF1, 0x8F, 0xB4, 0x70, 0xF2, 0x7F, 0x97, 0x60, 0xF3, 0x6F, 0x96, 0x70, 0xF4, 0x5F, 0x79, 0x60, +0xF5, 0x4F, 0x78, 0x70, 0xF6, 0x3F, 0x5B, 0x60, 0xF7, 0x2F, 0x5A, 0x70, 0xF8, 0x28, 0x77, 0xE0, +0xF9, 0x0F, 0x3C, 0x70, 0xFA, 0x08, 0x59, 0xE0, 0xFA, 0xF8, 0x58, 0xF0, 0xFB, 0xE8, 0x3B, 0xE0, +0xFC, 0xD8, 0x3A, 0xF0, 0xFD, 0xC8, 0x1D, 0xE0, 0xFE, 0xB8, 0x1C, 0xF0, 0xFF, 0xA7, 0xFF, 0xE0, +0x00, 0x97, 0xFE, 0xF0, 0x01, 0x87, 0xE1, 0xE0, 0x02, 0x77, 0xE0, 0xF0, 0x03, 0x70, 0xFE, 0x60, +0x04, 0x60, 0xFD, 0x70, 0x05, 0x50, 0xE0, 0x60, 0x06, 0x40, 0xDF, 0x70, 0x07, 0x30, 0xC2, 0x60, +0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x0A, 0x00, 0xA3, 0x70, 0x0A, 0xF0, 0x86, 0x60, +0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0, +0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0, +0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0, +0x17, 0x29, 0x0B, 0xF0, 0x18, 0x22, 0x29, 0x60, 0x19, 0x08, 0xED, 0xF0, 0x1A, 0x02, 0x0B, 0x60, +0x1A, 0xF2, 0x0A, 0x70, 0x1B, 0xE1, 0xED, 0x60, 0x1C, 0xD1, 0xEC, 0x70, 0x1D, 0xC1, 0xCF, 0x60, +0x1E, 0xB1, 0xCE, 0x70, 0x1F, 0xA1, 0xB1, 0x60, 0x20, 0x76, 0x00, 0xF0, 0x21, 0x81, 0x93, 0x60, +0x22, 0x55, 0xE2, 0xF0, 0x23, 0x6A, 0xAF, 0xE0, 0x24, 0x35, 0xC4, 0xF0, 0x25, 0x4A, 0x91, 0xE0, +0x26, 0x15, 0xA6, 0xF0, 0x27, 0x2A, 0x73, 0xE0, 0x27, 0xFE, 0xC3, 0x70, 0x29, 0x0A, 0x55, 0xE0, +0x29, 0xDE, 0xA5, 0x70, 0x2A, 0xEA, 0x37, 0xE0, 0x2B, 0xBE, 0x87, 0x70, 0x2C, 0xD3, 0x54, 0x60, +0x2D, 0x9E, 0x69, 0x70, 0x2E, 0xB3, 0x36, 0x60, 0x2F, 0x7E, 0x4B, 0x70, 0x30, 0x93, 0x18, 0x60, +0x31, 0x67, 0x67, 0xF0, 0x32, 0x72, 0xFA, 0x60, 0x33, 0x47, 0x49, 0xF0, 0x34, 0x52, 0xDC, 0x60, +0x35, 0x27, 0x2B, 0xF0, 0x36, 0x32, 0xBE, 0x60, 0x37, 0x07, 0x0D, 0xF0, 0x38, 0x1B, 0xDA, 0xE0, +0x38, 0xE6, 0xEF, 0xF0, 0x39, 0xFB, 0xBC, 0xE0, 0x3A, 0xC6, 0xD1, 0xF0, 0x3B, 0xDB, 0x9E, 0xE0, +0x3C, 0xAF, 0xEE, 0x70, 0x3D, 0xBB, 0x80, 0xE0, 0x3E, 0x8F, 0xD0, 0x70, 0x3F, 0x9B, 0x62, 0xE0, +0x40, 0x6F, 0xB2, 0x70, 0x41, 0x84, 0x7F, 0x60, 0x42, 0x4F, 0x94, 0x70, 0x43, 0x64, 0x61, 0x60, +0x44, 0x2F, 0x76, 0x70, 0x45, 0x44, 0x43, 0x60, 0x45, 0xF3, 0xA8, 0xF0, 0x47, 0x2D, 0x5F, 0xE0, +0x47, 0xD3, 0x8A, 0xF0, 0x49, 0x0D, 0x41, 0xE0, 0x49, 0xB3, 0x6C, 0xF0, 0x4A, 0xED, 0x23, 0xE0, +0x4B, 0x9C, 0x89, 0x70, 0x4C, 0xD6, 0x40, 0x60, 0x4D, 0x7C, 0x6B, 0x70, 0x4E, 0xB6, 0x22, 0x60, +0x4F, 0x5C, 0x4D, 0x70, 0x50, 0x96, 0x04, 0x60, 0x51, 0x3C, 0x2F, 0x70, 0x52, 0x75, 0xE6, 0x60, +0x53, 0x1C, 0x11, 0x70, 0x54, 0x55, 0xC8, 0x60, 0x54, 0xFB, 0xF3, 0x70, 0x56, 0x35, 0xAA, 0x60, +0x56, 0xE5, 0x0F, 0xF0, 0x58, 0x1E, 0xC6, 0xE0, 0x58, 0xC4, 0xF1, 0xF0, 0x59, 0xFE, 0xA8, 0xE0, +0x5A, 0xA4, 0xD3, 0xF0, 0x5B, 0xDE, 0x8A, 0xE0, 0x5C, 0x84, 0xB5, 0xF0, 0x5D, 0xBE, 0x6C, 0xE0, +0x5E, 0x64, 0x97, 0xF0, 0x5F, 0x9E, 0x4E, 0xE0, 0x60, 0x4D, 0xB4, 0x70, 0x61, 0x87, 0x6B, 0x60, +0x62, 0x2D, 0x96, 0x70, 0x63, 0x67, 0x4D, 0x60, 0x64, 0x0D, 0x78, 0x70, 0x65, 0x47, 0x2F, 0x60, +0x65, 0xED, 0x5A, 0x70, 0x67, 0x27, 0x11, 0x60, 0x67, 0xCD, 0x3C, 0x70, 0x69, 0x06, 0xF3, 0x60, +0x69, 0xAD, 0x1E, 0x70, 0x6A, 0xE6, 0xD5, 0x60, 0x6B, 0x96, 0x3A, 0xF0, 0x6C, 0xCF, 0xF1, 0xE0, +0x6D, 0x76, 0x1C, 0xF0, 0x6E, 0xAF, 0xD3, 0xE0, 0x6F, 0x55, 0xFE, 0xF0, 0x70, 0x8F, 0xB5, 0xE0, +0x71, 0x35, 0xE0, 0xF0, 0x72, 0x6F, 0x97, 0xE0, 0x73, 0x15, 0xC2, 0xF0, 0x74, 0x4F, 0x79, 0xE0, +0x74, 0xFE, 0xDF, 0x70, 0x76, 0x38, 0x96, 0x60, 0x76, 0xDE, 0xC1, 0x70, 0x78, 0x18, 0x78, 0x60, +0x78, 0xBE, 0xA3, 0x70, 0x79, 0xF8, 0x5A, 0x60, 0x7A, 0x9E, 0x85, 0x70, 0x7B, 0xD8, 0x3C, 0x60, +0x7C, 0x7E, 0x67, 0x70, 0x7D, 0xB8, 0x1E, 0x60, 0x7E, 0x5E, 0x49, 0x70, 0x7F, 0x98, 0x00, 0x60, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x94, 0x00, 0x00, 0xFF, +0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, +0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, +0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, 0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xEE, 0x78, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB8, 0x93, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xBA, 0xEB, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x87, 0x2E, +0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x9A, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x94, 0x06, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x55, 0xA9, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x86, 0x5D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x28, 0x78, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x66, 0x3F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x0C, 0x4E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x46, 0x21, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0xEC, 0x30, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x1C, 0xC9, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xD5, 0x4D, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xFC, 0xAB, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xB5, 0x2F, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xDC, 0x8D, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x95, 0x11, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xBC, 0x6F, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x7E, 0x2D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x9C, 0x51, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x67, 0x4A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x7C, 0x33, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x47, 0x2C, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x5C, 0x15, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x27, 0x0E, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x3B, 0xF7, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x06, 0xF0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x25, 0x13, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xE6, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0x04, 0xF5, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xCF, 0xEE, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE4, 0xD7, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xAF, 0xD0, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC4, 0xB9, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x8F, 0xB2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA4, 0x9B, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x6F, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x84, 0x7D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x76, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x64, 0x5F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x58, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4D, 0x7C, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x0F, 0x3A, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2D, 0x5E, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x88, 0xF0, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xFB, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x75, 0xE4, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x40, 0xDD, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x55, 0xAA, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x20, 0xA3, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x35, 0x8C, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x85, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x15, 0x6E, +0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x33, 0x76, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xFE, 0xA7, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x13, 0x74, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xDE, 0x89, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA9, 0x82, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xBE, 0x6B, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x89, 0x64, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x9E, 0x4D, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x69, 0x46, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x2F, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x11, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x2D, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x26, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x0F, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xF2, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x06, 0xF1, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0xD4, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xD3, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0xB6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xB5, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xBF, 0xD3, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xAF, 0xD2, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x9F, 0xB5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0xB4, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x6F, 0x96, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x79, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x4F, 0x78, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x5B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x5A, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x28, 0x77, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0F, 0x3C, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x08, 0x59, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF8, 0x58, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x3B, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xD8, 0x3A, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC8, 0x1D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xB8, 0x1C, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFE, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x87, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x77, 0xE0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x70, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0xFD, +0x70, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x06, 0x40, 0xDF, +0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x30, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0xC1, +0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xA3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF0, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0x85, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x67, +0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x83, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x65, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x48, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x47, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x2A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x29, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x0C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x0B, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0x08, 0xED, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x0A, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xEC, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xCF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xCE, +0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xB1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x00, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x55, 0xE2, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xAF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xC4, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0x91, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xA6, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xC3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x55, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xA5, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x37, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0x87, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x54, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x69, +0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x36, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x4B, +0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x67, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x49, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x2B, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x0D, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xDA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xEF, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xD1, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x9E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xEE, +0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xD0, +0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x62, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xB2, +0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x7F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x94, +0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x61, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x76, +0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x43, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0xA8, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2D, 0x5F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD3, 0x8A, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0D, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB3, 0x6C, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xED, 0x23, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0x89, +0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x6B, +0x70, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x4D, +0x70, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x2F, +0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x75, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x11, +0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFB, 0xF3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x0F, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xC6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC4, 0xF1, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xD3, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x8A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xB5, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0x97, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xB4, +0x70, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0x96, +0x70, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0x78, +0x70, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x2F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x5A, +0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x11, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x3C, +0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x06, 0xF3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x1E, +0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x3A, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xCF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x1C, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xD3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x55, 0xFE, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xB5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x35, 0xE0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0x97, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xC2, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFE, 0xDF, +0x70, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xC1, +0x70, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xA3, +0x70, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0x85, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x67, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x49, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x00, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0xFF, 0xFF, 0xB5, 0x94, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x10, +0x4C, 0x4D, 0x54, 0x00, 0x45, 0x44, 0x54, 0x00, 0x45, 0x53, 0x54, 0x00, 0x45, 0x57, 0x54, 0x00, +0x45, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0A, 0x45, +0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, +0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, + +/* America/Tijuana */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0xA9, 0x79, 0x4F, 0x70, 0xAF, 0xF2, 0x7C, 0xF0, 0xB6, 0x66, 0x64, 0x70, 0xB7, 0x1B, 0x10, 0x00, +0xB8, 0x0A, 0xF2, 0xF0, 0xCB, 0xEA, 0x8D, 0x80, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x99, 0xBA, 0x70, +0xD7, 0x1B, 0x59, 0x00, 0xD8, 0x91, 0xB4, 0xF0, 0xE2, 0x7E, 0x4B, 0x90, 0xE3, 0x49, 0x52, 0x90, +0xE4, 0x5E, 0x2D, 0x90, 0xE5, 0x29, 0x34, 0x90, 0xE6, 0x47, 0x4A, 0x10, 0xE7, 0x12, 0x51, 0x10, +0xE8, 0x27, 0x2C, 0x10, 0xE8, 0xF2, 0x33, 0x10, 0xEA, 0x07, 0x0E, 0x10, 0xEA, 0xD2, 0x15, 0x10, +0xEB, 0xE6, 0xF0, 0x10, 0xEC, 0xB1, 0xF7, 0x10, 0xED, 0xC6, 0xD2, 0x10, 0xEE, 0x91, 0xD9, 0x10, +0x0B, 0xE0, 0xAF, 0xA0, 0x0C, 0xD9, 0xCD, 0x10, 0x0D, 0xC0, 0x91, 0xA0, 0x0E, 0xB9, 0xAF, 0x10, +0x0F, 0xA9, 0xAE, 0x20, 0x10, 0x99, 0x91, 0x10, 0x11, 0x89, 0x90, 0x20, 0x12, 0x79, 0x73, 0x10, +0x13, 0x69, 0x72, 0x20, 0x14, 0x59, 0x55, 0x10, 0x15, 0x49, 0x54, 0x20, 0x16, 0x39, 0x37, 0x10, +0x17, 0x29, 0x36, 0x20, 0x18, 0x22, 0x53, 0x90, 0x19, 0x09, 0x18, 0x20, 0x1A, 0x02, 0x35, 0x90, +0x1A, 0xF2, 0x34, 0xA0, 0x1B, 0xE2, 0x17, 0x90, 0x1C, 0xD2, 0x16, 0xA0, 0x1D, 0xC1, 0xF9, 0x90, +0x1E, 0xB1, 0xF8, 0xA0, 0x1F, 0xA1, 0xDB, 0x90, 0x20, 0x76, 0x2B, 0x20, 0x21, 0x81, 0xBD, 0x90, +0x22, 0x56, 0x0D, 0x20, 0x23, 0x6A, 0xDA, 0x10, 0x24, 0x35, 0xEF, 0x20, 0x25, 0x4A, 0xBC, 0x10, +0x26, 0x15, 0xD1, 0x20, 0x27, 0x2A, 0x9E, 0x10, 0x27, 0xFE, 0xED, 0xA0, 0x29, 0x0A, 0x80, 0x10, +0x29, 0xDE, 0xCF, 0xA0, 0x2A, 0xEA, 0x62, 0x10, 0x2B, 0xBE, 0xB1, 0xA0, 0x2C, 0xD3, 0x7E, 0x90, +0x2D, 0x9E, 0x93, 0xA0, 0x2E, 0xB3, 0x60, 0x90, 0x2F, 0x7E, 0x75, 0xA0, 0x30, 0x93, 0x42, 0x90, +0x31, 0x67, 0x92, 0x20, 0x32, 0x73, 0x24, 0x90, 0x33, 0x47, 0x74, 0x20, 0x34, 0x53, 0x06, 0x90, +0x35, 0x27, 0x56, 0x20, 0x36, 0x32, 0xE8, 0x90, 0x37, 0x07, 0x38, 0x20, 0x38, 0x1C, 0x05, 0x10, +0x38, 0xE7, 0x1A, 0x20, 0x39, 0xFB, 0xE7, 0x10, 0x3A, 0xC6, 0xFC, 0x20, 0x3B, 0xDB, 0xC9, 0x10, +0x3C, 0xB0, 0x18, 0xA0, 0x3D, 0xBB, 0xAB, 0x10, 0x3E, 0x8F, 0xFA, 0xA0, 0x3F, 0x9B, 0x8D, 0x10, +0x40, 0x6F, 0xDC, 0xA0, 0x41, 0x84, 0xA9, 0x90, 0x42, 0x4F, 0xBE, 0xA0, 0x43, 0x64, 0x8B, 0x90, +0x44, 0x2F, 0xA0, 0xA0, 0x45, 0x44, 0x6D, 0x90, 0x46, 0x0F, 0x82, 0xA0, 0x47, 0x24, 0x4F, 0x90, +0x47, 0xF8, 0x9F, 0x20, 0x49, 0x04, 0x31, 0x90, 0x49, 0xD8, 0x81, 0x20, 0x4A, 0xE4, 0x13, 0x90, +0x4B, 0x9C, 0xB3, 0xA0, 0x4C, 0xD6, 0x6A, 0x90, 0x4D, 0x7C, 0x95, 0xA0, 0x4E, 0xB6, 0x4C, 0x90, +0x4F, 0x5C, 0x77, 0xA0, 0x50, 0x96, 0x2E, 0x90, 0x51, 0x3C, 0x59, 0xA0, 0x52, 0x76, 0x10, 0x90, +0x53, 0x1C, 0x3B, 0xA0, 0x54, 0x55, 0xF2, 0x90, 0x54, 0xFC, 0x1D, 0xA0, 0x56, 0x35, 0xD4, 0x90, +0x56, 0xE5, 0x3A, 0x20, 0x58, 0x1E, 0xF1, 0x10, 0x58, 0xC5, 0x1C, 0x20, 0x59, 0xFE, 0xD3, 0x10, +0x5A, 0xA4, 0xFE, 0x20, 0x5B, 0xDE, 0xB5, 0x10, 0x5C, 0x84, 0xE0, 0x20, 0x5D, 0xBE, 0x97, 0x10, +0x5E, 0x64, 0xC2, 0x20, 0x5F, 0x9E, 0x79, 0x10, 0x60, 0x4D, 0xDE, 0xA0, 0x61, 0x87, 0x95, 0x90, +0x62, 0x2D, 0xC0, 0xA0, 0x63, 0x67, 0x77, 0x90, 0x64, 0x0D, 0xA2, 0xA0, 0x65, 0x47, 0x59, 0x90, +0x65, 0xED, 0x84, 0xA0, 0x67, 0x27, 0x3B, 0x90, 0x67, 0xCD, 0x66, 0xA0, 0x69, 0x07, 0x1D, 0x90, +0x69, 0xAD, 0x48, 0xA0, 0x6A, 0xE6, 0xFF, 0x90, 0x6B, 0x96, 0x65, 0x20, 0x6C, 0xD0, 0x1C, 0x10, +0x6D, 0x76, 0x47, 0x20, 0x6E, 0xAF, 0xFE, 0x10, 0x6F, 0x56, 0x29, 0x20, 0x70, 0x8F, 0xE0, 0x10, +0x71, 0x36, 0x0B, 0x20, 0x72, 0x6F, 0xC2, 0x10, 0x73, 0x15, 0xED, 0x20, 0x74, 0x4F, 0xA4, 0x10, +0x74, 0xFF, 0x09, 0xA0, 0x76, 0x38, 0xC0, 0x90, 0x76, 0xDE, 0xEB, 0xA0, 0x78, 0x18, 0xA2, 0x90, +0x78, 0xBE, 0xCD, 0xA0, 0x79, 0xF8, 0x84, 0x90, 0x7A, 0x9E, 0xAF, 0xA0, 0x7B, 0xD8, 0x66, 0x90, +0x7C, 0x7E, 0x91, 0xA0, 0x7D, 0xB8, 0x48, 0x90, 0x7E, 0x5E, 0x73, 0xA0, 0x7F, 0x98, 0x2A, 0x90, +0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x06, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, +0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x9D, +0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, 0xFF, +0xFF, 0x8F, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, 0x54, +0x00, 0x50, 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x95, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x79, 0x4F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x7C, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x64, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1B, 0x10, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0A, 0xF2, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x8D, +0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x99, 0xBA, +0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x1B, 0x59, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x7E, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x49, 0x52, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x5E, 0x2D, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x29, 0x34, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x47, 0x4A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x12, 0x51, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x27, 0x2C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xF2, 0x33, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x07, 0x0E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xD2, 0x15, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xE6, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xB1, 0xF7, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xC6, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x91, 0xD9, +0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE0, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0xCD, +0x10, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC0, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB9, 0xAF, +0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0xAE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10, 0x99, 0x91, +0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0x89, 0x90, 0x20, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x73, +0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x69, 0x72, 0x20, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x55, +0x10, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x54, 0x20, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x37, +0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x29, 0x36, 0x20, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x53, +0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0x09, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x35, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF2, 0x34, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x17, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD2, 0x16, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0xF9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xB1, 0xF8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xDB, +0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x76, 0x2B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xBD, +0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x56, 0x0D, 0x20, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xDA, +0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x35, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xBC, +0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0xD1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0x9E, +0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFE, 0xED, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x0A, 0x80, +0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0xDE, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x62, +0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBE, 0xB1, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD3, 0x7E, +0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9E, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB3, 0x60, +0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7E, 0x75, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x93, 0x42, +0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x24, +0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x74, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x53, 0x06, +0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x56, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xE8, +0x90, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x05, +0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x1A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xE7, +0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0xC9, +0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x18, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0xAB, +0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xFA, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x8D, +0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xDC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0xA9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xBE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x8B, +0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x6D, +0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x82, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x4F, +0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x9F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x31, +0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x13, +0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x9C, 0xB3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xD6, 0x6A, +0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x7C, 0x95, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xB6, 0x4C, +0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x5C, 0x77, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x96, 0x2E, +0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3C, 0x59, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x76, 0x10, +0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x1C, 0x3B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0xF2, +0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFC, 0x1D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x35, 0xD4, +0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xE5, 0x3A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1E, 0xF1, +0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xC5, 0x1C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFE, 0xD3, +0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0xFE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0xB5, +0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x84, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xBE, 0x97, +0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x64, 0xC2, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9E, 0x79, +0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x4D, 0xDE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x87, 0x95, +0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x2D, 0xC0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x67, 0x77, +0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0D, 0xA2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x47, 0x59, +0x90, 0x00, 0x00, 0x00, 0x00, 0x65, 0xED, 0x84, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x67, 0x27, 0x3B, +0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xCD, 0x66, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x69, 0x07, 0x1D, +0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xAD, 0x48, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xE6, 0xFF, +0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x96, 0x65, 0x20, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xD0, 0x1C, +0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x76, 0x47, 0x20, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xAF, 0xFE, +0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x56, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x70, 0x8F, 0xE0, +0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x36, 0x0B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x72, 0x6F, 0xC2, +0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x15, 0xED, 0x20, 0x00, 0x00, 0x00, 0x00, 0x74, 0x4F, 0xA4, +0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x09, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x38, 0xC0, +0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDE, 0xEB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0xA2, +0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xBE, 0xCD, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xF8, 0x84, +0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x9E, 0xAF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xD8, 0x66, +0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x91, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xB8, 0x48, +0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x5E, 0x73, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x98, 0x2A, +0x90, 0x01, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x06, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, +0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0xFF, 0xFF, 0x92, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, +0x9D, 0x90, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x01, 0x14, +0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x50, 0x53, +0x54, 0x00, 0x50, 0x44, 0x54, 0x00, 0x50, 0x57, 0x54, 0x00, 0x50, 0x50, 0x54, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x50, +0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, 0x31, +0x31, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0xBA, 0xF8, 0x95, 0x00, 0x60, 0x1A, 0xDD, 0x00, 0x00, +0x00, 0x21, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x20, 0x55, +0x53, 0x20, 0x2D, 0x20, 0x42, 0x61, 0x6A, 0x61, 0x20, 0x43, 0x61, 0x6C, 0x69, 0x66, 0x6F, 0x72, +0x6E, 0x69, 0x61, + +/* America/Toronto */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x9E, 0xB8, 0x93, 0x70, 0x9F, 0xBA, 0xEB, 0x60, 0xA0, 0x87, 0x2E, 0xC8, 0xA1, 0x9A, 0xB1, 0x40, @@ -39768,16 +40038,22 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* America/Virgin */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xF4, 0x37, 0x60, -0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x41, 0x53, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xF4, 0x37, 0x60, 0x01, 0xFF, 0xFF, 0xC3, 0x20, 0x00, 0x00, -0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, 0x0A, 0x41, -0x53, 0x54, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCB, 0xF6, 0x32, 0xC0, 0xD2, 0x23, 0xF4, 0x70, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0x7A, 0xE6, 0x95, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF6, 0x32, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x23, 0xF4, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x60, 0xED, 0xD0, 0x01, 0x03, 0x02, 0x01, +0xFF, 0xFF, 0xC2, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x53, 0x54, 0x00, +0x41, 0x50, 0x54, 0x00, 0x41, 0x57, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, +0x0A, 0x41, 0x53, 0x54, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* America/Whitehorse */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -40347,68 +40623,66 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Antarctica/Casey */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFE, 0x1E, 0xCC, 0x80, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFE, 0x1E, 0xCC, 0x80, 0x4A, 0xDA, 0x06, 0x20, 0x4B, 0x8F, 0xCA, 0xF0, 0x4E, 0xA9, 0x9C, 0x20, 0x4F, 0x43, 0xCD, 0x90, 0x58, 0x0A, 0x3B, 0x80, 0x5A, 0xA4, 0x0F, 0x10, 0x5B, 0xB9, 0x14, 0x40, 0x5C, 0x8D, 0x1D, 0x80, -0x5D, 0x96, 0x45, 0x30, 0x5E, 0x63, 0xC5, 0x00, 0x5F, 0x78, 0xA0, 0x3C, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, -0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, -0xFF, 0xFE, 0x1E, 0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x06, 0x20, 0x00, 0x00, 0x00, -0x00, 0x4B, 0x8F, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA9, 0x9C, 0x20, 0x00, 0x00, 0x00, -0x00, 0x4F, 0x43, 0xCD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0A, 0x3B, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5A, 0xA4, 0x0F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xB9, 0x14, 0x40, 0x00, 0x00, 0x00, -0x00, 0x5C, 0x8D, 0x1D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x96, 0x45, 0x30, 0x00, 0x00, 0x00, -0x00, 0x5E, 0x63, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x78, 0xA0, 0x3C, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, -0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, -0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, -0x00, 0x24, 0x30, 0x52, 0x01, 0xBB, 0x4B, 0x12, 0x00, 0x00, 0x00, 0x05, 0x43, 0x61, 0x73, 0x65, -0x79, +0x5D, 0x96, 0x45, 0x30, 0x5E, 0x63, 0xC5, 0x00, 0x5F, 0x78, 0xA0, 0x3C, 0x01, 0x02, 0x01, 0x02, +0x03, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, +0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x1E, 0xCC, 0x80, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x8F, 0xCA, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x4E, 0xA9, 0x9C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x43, 0xCD, 0x90, +0x00, 0x00, 0x00, 0x00, 0x58, 0x0A, 0x3B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xA4, 0x0F, 0x10, +0x00, 0x00, 0x00, 0x00, 0x5B, 0xB9, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x8D, 0x1D, 0x80, +0x00, 0x00, 0x00, 0x00, 0x5D, 0x96, 0x45, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x63, 0xC5, 0x00, +0x00, 0x00, 0x00, 0x00, 0x5F, 0x78, 0xA0, 0x3C, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, +0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, +0x31, 0x0A, 0x00, 0x24, 0x30, 0x52, 0x01, 0xBB, 0x4B, 0x12, 0x00, 0x00, 0x00, 0x05, 0x43, 0x61, +0x73, 0x65, 0x79, /* Antarctica/Davis */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xE7, 0x9C, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xE7, 0x9C, 0x40, 0x00, 0xF6, 0x47, 0xDF, 0x10, 0xFE, 0x47, 0xAB, 0x00, 0x4A, 0xDA, 0x14, 0x30, 0x4B, 0x97, 0xFA, 0x40, -0x4E, 0xA9, 0xAA, 0x30, 0x4F, 0x43, 0xF7, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x02, -0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, -0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, -0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, -0xE7, 0x9C, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x47, 0xDF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, -0xFE, 0x47, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, -0x4B, 0x97, 0xFA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA9, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, -0x4F, 0x43, 0xF7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x02, -0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, -0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, -0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, -0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x20, 0xAD, 0xE2, 0x01, 0x89, 0xA0, -0x3A, 0x00, 0x00, 0x00, 0x05, 0x44, 0x61, 0x76, 0x69, 0x73, +0x4E, 0xA9, 0xAA, 0x30, 0x4F, 0x43, 0xF7, 0xC0, 0x01, 0x00, 0x01, 0x02, 0x03, 0x02, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, +0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, +0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x9C, 0x40, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0x47, 0xDF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x47, 0xAB, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xDA, 0x14, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x97, 0xFA, 0x40, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xA9, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x43, 0xF7, 0xC0, 0x01, +0x00, 0x01, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x2D, 0x30, +0x30, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x20, 0xAD, 0xE2, 0x01, +0x89, 0xA0, 0x3A, 0x00, 0x00, 0x00, 0x05, 0x44, 0x61, 0x76, 0x69, 0x73, /* Antarctica/DumontDUrville */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xD4, 0xBC, 0x76, 0x80, -0xDE, 0x34, 0x60, 0x60, 0xE7, 0x3C, 0x02, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x01, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, -0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xD4, 0xBC, 0x76, 0x80, +0xDE, 0x34, 0x60, 0x60, 0xE7, 0x3C, 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, -0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0xBC, 0x76, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x34, 0x60, 0x60, -0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x3C, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, -0x2D, 0x30, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, -0x30, 0x0A, 0x00, 0x23, 0x9A, 0x95, 0x01, 0xE8, 0x4E, 0x82, 0x00, 0x00, 0x00, 0x10, 0x44, 0x75, -0x6D, 0x6F, 0x6E, 0x74, 0x2D, 0x64, 0x27, 0x55, 0x72, 0x76, 0x69, 0x6C, 0x6C, 0x65, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, +0xBC, 0x76, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x34, 0x60, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, +0x3C, 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, +0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, +0x2D, 0x31, 0x30, 0x0A, 0x00, 0x23, 0x9A, 0x95, 0x01, 0xE8, 0x4E, 0x82, 0x00, 0x00, 0x00, 0x10, +0x44, 0x75, 0x6D, 0x6F, 0x6E, 0x74, 0x2D, 0x64, 0x27, 0x55, 0x72, 0x76, 0x69, 0x6C, 0x6C, 0x65, + /* Antarctica/Macquarie */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -40559,18 +40833,17 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Antarctica/Mawson */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xE2, 0x20, 0x32, 0x80, -0x4A, 0xDA, 0x22, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x2D, 0x30, 0x30, -0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xE2, 0x20, 0x32, 0x80, +0x4A, 0xDA, 0x22, 0x40, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, +0x2B, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x20, 0x32, 0x80, 0x00, 0x00, 0x00, -0x00, 0x4A, 0xDA, 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, -0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x22, 0x2E, 0x00, 0x01, 0x72, 0x9C, 0x4D, 0x00, -0x00, 0x00, 0x06, 0x4D, 0x61, 0x77, 0x73, 0x6F, 0x6E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x20, 0x32, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x22, 0x40, +0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, +0x46, 0x50, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x22, 0x2E, 0x00, 0x01, 0x72, 0x9C, +0x4D, 0x00, 0x00, 0x00, 0x06, 0x4D, 0x61, 0x77, 0x73, 0x6F, 0x6E, /* Antarctica/McMurdo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -40705,7 +40978,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Antarctica/Palmer */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xF6, 0x98, 0xAD, 0x00, +0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xF6, 0x98, 0xAD, 0x00, 0xF6, 0xE6, 0x9F, 0xB0, 0xF8, 0x13, 0x43, 0xC0, 0xF8, 0xC7, 0xD3, 0x30, 0xF9, 0xF4, 0x77, 0x40, 0xFA, 0xD3, 0x36, 0xB0, 0xFB, 0xC3, 0x35, 0xC0, 0xFC, 0xBC, 0x53, 0x30, 0xFD, 0xAC, 0x52, 0x40, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0x8C, 0x34, 0x40, 0x07, 0xA3, 0x4A, 0xB0, 0x08, 0x24, 0x6F, 0xA0, @@ -40726,92 +40999,97 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x4B, 0xB8, 0x00, 0xB0, 0x4C, 0xB1, 0x3A, 0x40, 0x4D, 0xC6, 0x07, 0x30, 0x4E, 0x50, 0x82, 0xC0, 0x4F, 0x9C, 0xAE, 0xB0, 0x50, 0x42, 0xD9, 0xC0, 0x51, 0x7C, 0x90, 0xB0, 0x52, 0x2B, 0xF6, 0x40, 0x53, 0x5C, 0x72, 0xB0, 0x54, 0x0B, 0xD8, 0x40, 0x57, 0x37, 0xE6, 0x30, 0x57, 0xAF, 0xEC, 0xC0, -0x58, 0x43, 0x86, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x04, 0x03, 0x04, 0x01, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x58, 0x43, 0x86, 0xB0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, +0x04, 0x01, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, -0xE0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, -0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2D, -0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xAD, 0x00, 0xFF, -0xFF, 0xFF, 0xFF, 0xF6, 0xE6, 0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, -0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, -0xFF, 0xFF, 0xFF, 0xFA, 0xD3, 0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, -0xFF, 0xFF, 0xFF, 0xFC, 0xBC, 0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, -0xFF, 0xFF, 0xFF, 0xFE, 0x9C, 0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, -0x00, 0x00, 0x00, 0x07, 0xA3, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x30, 0xBC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, -0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, -0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, -0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, -0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, -0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, -0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, -0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, -0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, -0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, -0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, -0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, -0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, -0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, -0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x58, 0x43, 0x86, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x01, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, -0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x26, 0x73, 0xC0, 0x00, 0xB0, -0xD9, 0x70, 0x00, 0x00, 0x00, 0x06, 0x50, 0x61, 0x6C, 0x6D, 0x65, 0x72, +0x05, 0x06, 0x05, 0x06, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x0C, 0xFF, 0xFF, +0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, +0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x98, 0xAD, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xE6, +0x9F, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x13, 0x43, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, +0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xF4, 0x77, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xD3, +0x36, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC3, 0x35, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xBC, +0x53, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xAC, 0x52, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x9C, +0x35, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8C, 0x34, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xA3, +0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x30, +0xBC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, +0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, +0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, +0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, +0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, +0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, +0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, +0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, +0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, +0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, +0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, +0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, +0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, +0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, +0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, +0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, +0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, +0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, +0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, +0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, +0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, +0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, +0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, +0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, +0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, +0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, +0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, +0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, +0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, +0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, +0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, +0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, +0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x43, +0x86, 0xB0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x04, 0x03, 0x04, 0x01, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, +0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, +0xD5, 0xD0, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x2D, 0x30, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x26, 0x73, 0xC0, +0x00, 0xB0, 0xD9, 0x70, 0x00, 0x00, 0x00, 0x06, 0x50, 0x61, 0x6C, 0x6D, 0x65, 0x72, /* Antarctica/Rothera */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x0D, 0x02, 0x2D, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, -0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x0D, 0x02, 0x2D, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x2D, 0x30, 0x30, +0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x02, 0x2D, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, -0xD5, 0xD0, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x22, 0x3B, 0x05, 0x00, 0xAA, 0xB1, 0xEA, 0x00, 0x00, 0x00, 0x07, -0x52, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x61, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x02, 0x2D, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x22, 0x3B, 0x05, 0x00, 0xAA, 0xB1, 0xEA, 0x00, 0x00, +0x00, 0x07, 0x52, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x61, /* Antarctica/South_Pole */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0xE5, 0xA9, 0xE9, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x80, 0x00, 0x00, 0x00, +0xB0, 0xB4, 0xB2, 0xE8, 0xB1, 0x51, 0x87, 0x58, 0xB2, 0x78, 0xE5, 0x68, 0xB3, 0x43, 0xE5, 0x60, +0xB4, 0x58, 0xC7, 0x68, 0xB5, 0x23, 0xC7, 0x60, 0xB6, 0x38, 0xA9, 0x68, 0xB7, 0x03, 0xA9, 0x60, +0xB8, 0x18, 0x8B, 0x68, 0xB8, 0xEC, 0xC5, 0xE0, 0xB9, 0xF8, 0x6D, 0x68, 0xBA, 0xCC, 0xA7, 0xE0, +0xBB, 0xD8, 0x4F, 0x68, 0xBC, 0xE3, 0xE8, 0xE0, 0xBD, 0xAE, 0xF6, 0xE8, 0xBE, 0xC3, 0xCA, 0xE0, +0xBF, 0x8E, 0xD8, 0xE8, 0xC0, 0xA3, 0xAC, 0xE0, 0xC1, 0x6E, 0xBA, 0xE8, 0xC2, 0x83, 0x8E, 0xE0, +0xC3, 0x4E, 0x9C, 0xE8, 0xC4, 0x63, 0x70, 0xE0, 0xC5, 0x2E, 0x7E, 0xE8, 0xC6, 0x4C, 0x8D, 0x60, +0xC7, 0x0E, 0x60, 0xE8, 0xC8, 0x2C, 0x6F, 0x60, 0xC8, 0xF7, 0x7D, 0x68, 0xD2, 0xDA, 0x9A, 0x40, 0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, 0x13, 0x1E, 0x84, 0xE0, @@ -40843,117 +41121,137 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x72, 0x40, 0x92, 0x60, 0x73, 0x39, 0xBD, 0xE0, 0x74, 0x20, 0x74, 0x60, 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, -0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x03, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x09, 0x2D, 0x30, 0x30, 0x00, 0x4E, 0x5A, 0x44, 0x54, 0x00, 0x4E, 0x5A, 0x53, -0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, -0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0xA9, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x18, -0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xEF, -0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8, -0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB8, -0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x5E, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x98, -0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3E, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x78, -0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1E, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x58, -0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x38, -0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE7, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0x21, -0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC7, 0x65, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, -0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x47, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, -0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x87, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC0, -0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x67, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, -0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x30, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x69, -0xCE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0F, 0xEB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x2E, -0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x02, 0x42, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x0D, -0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xE2, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xED, -0xC5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCD, -0xA7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xAB, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAD, -0x89, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8D, -0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x6A, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6D, -0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x4A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x56, -0x69, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x2A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x36, -0x4B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x16, -0x2D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF3, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, -0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x8B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD5, -0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xB3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, -0x0E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x93, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x9E, -0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x73, 0x31, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7E, -0xD2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5C, 0x4E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x5E, -0xB4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3E, -0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1E, -0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFE, -0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF7, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xDE, -0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD7, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xBE, -0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB7, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x9E, -0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, -0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x66, -0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x46, -0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x26, -0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x06, -0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, -0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, -0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, -0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, -0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, -0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x4F, -0x2B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, -0x0D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0E, -0xEF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x55, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0xF8, -0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, 0xD7, -0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xB7, -0xCF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x97, -0xB1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x77, -0x93, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x60, -0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x40, -0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x20, -0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, -0x56, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE0, -0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC0, -0x1A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xA9, -0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x89, -0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x68, -0xFA, 0xE0, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x09, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x09, 0x2D, 0x30, 0x30, 0x00, 0x4E, 0x5A, -0x44, 0x54, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x4E, 0x5A, 0x53, -0x54, 0x2D, 0x31, 0x32, 0x4E, 0x5A, 0x44, 0x54, 0x2C, 0x4D, 0x39, 0x2E, 0x35, 0x2E, 0x30, 0x2C, -0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, +0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, 0x02, 0x01, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0xA3, 0xD8, 0x00, 0x00, 0x00, 0x00, +0xAF, 0xC8, 0x01, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x09, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, +0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0E, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, +0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, 0x00, +0x4E, 0x5A, 0x44, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xB7, 0x4C, 0xA8, +0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xB4, 0xB2, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x51, 0x87, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x78, 0xE5, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x43, 0xE5, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x58, 0xC7, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x23, 0xC7, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x38, 0xA9, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x03, 0xA9, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x18, 0x8B, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xEC, 0xC5, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF8, 0x6D, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xCC, 0xA7, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xBB, 0xD8, 0x4F, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE3, 0xE8, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xAE, 0xF6, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xC3, 0xCA, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x8E, 0xD8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xA3, 0xAC, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x6E, 0xBA, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x83, 0x8E, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4E, 0x9C, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x63, 0x70, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2E, 0x7E, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x4C, 0x8D, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x0E, 0x60, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x2C, 0x6F, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF7, 0x7D, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xDA, 0x9A, 0x40, +0x00, 0x00, 0x00, 0x00, 0x09, 0x18, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x0A, 0xEF, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x0E, 0xB8, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x5E, 0xC0, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x10, 0x98, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3E, 0xA2, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x12, 0x78, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1E, 0x84, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x14, 0x58, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x16, 0x38, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE7, 0x83, 0x60, +0x00, 0x00, 0x00, 0x00, 0x18, 0x21, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC7, 0x65, 0x60, +0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x47, 0x60, +0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x87, 0x29, 0x60, +0x00, 0x00, 0x00, 0x00, 0x1D, 0xC0, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x67, 0x0B, 0x60, +0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0xED, 0x60, +0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x30, 0x09, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x23, 0x69, 0xCE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0F, 0xEB, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x25, 0x2E, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x02, 0x42, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x27, 0x0D, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xE2, 0x24, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x28, 0xED, 0xC5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0x06, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x2A, 0xCD, 0xA7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xAB, 0x23, 0x60, +0x00, 0x00, 0x00, 0x00, 0x2C, 0xAD, 0x89, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x05, 0x60, +0x00, 0x00, 0x00, 0x00, 0x2E, 0x8D, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x6A, 0xE7, 0x60, +0x00, 0x00, 0x00, 0x00, 0x30, 0x6D, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x4A, 0xC9, 0x60, +0x00, 0x00, 0x00, 0x00, 0x32, 0x56, 0x69, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x2A, 0xAB, 0x60, +0x00, 0x00, 0x00, 0x00, 0x34, 0x36, 0x4B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0A, 0x8D, 0x60, +0x00, 0x00, 0x00, 0x00, 0x36, 0x16, 0x2D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF3, 0xA9, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x8B, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x39, 0xD5, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xB3, 0x6D, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0x0E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x93, 0x4F, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x3D, 0x9E, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x73, 0x31, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x7E, 0xD2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5C, 0x4E, 0x60, +0x00, 0x00, 0x00, 0x00, 0x41, 0x5E, 0xB4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, +0x00, 0x00, 0x00, 0x00, 0x43, 0x3E, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, +0x00, 0x00, 0x00, 0x00, 0x45, 0x1E, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, +0x00, 0x00, 0x00, 0x00, 0x46, 0xFE, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF7, 0x85, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x48, 0xDE, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD7, 0x67, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xBE, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB7, 0x49, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x4C, 0x9E, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, +0x00, 0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, +0x00, 0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, +0x00, 0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, +0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, +0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, +0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x61, 0x4F, 0x2B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, 0x0D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x65, 0x0E, 0xEF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x55, 0x60, +0x00, 0x00, 0x00, 0x00, 0x66, 0xF8, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, +0x00, 0x00, 0x00, 0x00, 0x68, 0xD7, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, +0x00, 0x00, 0x00, 0x00, 0x6A, 0xB7, 0xCF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, +0x00, 0x00, 0x00, 0x00, 0x6C, 0x97, 0xB1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, +0x00, 0x00, 0x00, 0x00, 0x6E, 0x77, 0x93, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, +0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x72, 0x40, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x74, 0x20, 0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x56, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x77, 0xE0, 0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x79, 0xC0, 0x1A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x7B, 0xA9, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, +0x00, 0x00, 0x00, 0x00, 0x7D, 0x89, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, +0x00, 0x00, 0x00, 0x00, 0x7F, 0x68, 0xFA, 0xE0, 0x02, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0xA3, 0xD8, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x04, +0x00, 0x00, 0xA1, 0xB8, 0x00, 0x09, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0xB6, 0xD0, +0x01, 0x0E, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, +0x54, 0x00, 0x4E, 0x5A, 0x53, 0x54, 0x00, 0x4E, 0x5A, 0x4D, 0x54, 0x00, 0x4E, 0x5A, 0x44, 0x54, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x4E, 0x5A, 0x53, 0x54, 0x2D, 0x31, 0x32, +0x4E, 0x5A, 0x44, 0x54, 0x2C, 0x4D, 0x39, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, 0x31, +0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, /* Antarctica/Syowa */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xE7, 0xB1, 0x58, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xE7, 0xB1, 0x58, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x2D, 0x30, 0x30, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xB1, 0x58, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x20, 0x08, 0xBC, 0x01, 0x4F, 0x11, 0x58, 0x00, 0x00, 0x00, -0x05, 0x53, 0x79, 0x6F, 0x77, 0x61, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xB1, 0x58, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x20, 0x08, 0xBC, 0x01, 0x4F, 0x11, 0x58, 0x00, +0x00, 0x00, 0x05, 0x53, 0x79, 0x6F, 0x77, 0x61, /* Antarctica/Troll */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x42, 0x0D, 0x47, 0x00, +0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x42, 0x0D, 0x47, 0x00, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, @@ -40970,237 +41268,238 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, -0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0x02, 0x01, +0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x32, 0x00, -0x2B, 0x30, 0x30, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x42, 0x0D, 0x47, 0x00, -0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, -0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, -0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, -0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, -0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, -0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, -0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, -0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, -0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, -0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, -0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, -0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, -0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, -0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, -0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, -0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, -0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, -0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, -0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, -0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, -0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, -0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, -0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, -0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, -0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, -0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, -0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, -0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, -0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, -0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, -0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x30, 0x3C, -0x2B, 0x30, 0x32, 0x3E, 0x2D, 0x32, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x2C, -0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0x1B, 0x72, 0xCD, 0x01, 0x16, -0x86, 0xBC, 0x00, 0x00, 0x00, 0x05, 0x54, 0x72, 0x6F, 0x6C, 0x6C, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x00, +0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x42, 0x0D, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, +0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, +0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, +0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, +0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, +0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, +0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, +0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, +0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, +0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, +0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, +0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, +0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, +0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, +0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, +0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, +0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, +0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, +0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, +0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, +0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, +0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, +0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, +0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, +0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, +0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, +0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, +0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, +0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, +0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, +0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, +0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x03, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x32, 0x00, 0x2B, 0x30, +0x30, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x30, 0x3E, +0x30, 0x3C, 0x2B, 0x30, 0x32, 0x3E, 0x2D, 0x32, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, +0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0x1B, 0x72, 0xCD, +0x01, 0x16, 0x86, 0xBC, 0x00, 0x00, 0x00, 0x05, 0x54, 0x72, 0x6F, 0x6C, 0x6C, /* Antarctica/Vostok */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xE9, 0x58, 0x89, 0x80, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xE9, 0x58, 0x89, 0x80, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x2D, 0x30, 0x30, +0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x58, 0x89, 0x80, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x54, 0x60, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x11, 0xB3, 0x3F, 0x01, 0xB5, 0xC6, 0x4F, 0x00, 0x00, 0x00, -0x06, 0x56, 0x6F, 0x73, 0x74, 0x6F, 0x6B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x58, 0x89, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x11, 0xB3, 0x3F, 0x01, 0xB5, 0xC6, 0x4F, 0x00, +0x00, 0x00, 0x06, 0x56, 0x6F, 0x73, 0x74, 0x6F, 0x6B, /* Arctic/Longyearbyen */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, -0x9B, 0x27, 0xE3, 0x00, 0x9B, 0xD4, 0x7B, 0x60, 0xC8, 0xB7, 0x4D, 0x60, 0xCC, 0xE7, 0x4B, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, +0x9B, 0x0C, 0x17, 0x60, 0x9B, 0xD5, 0xDA, 0xF0, 0x9C, 0xD9, 0xAE, 0x90, 0x9D, 0xA4, 0xB5, 0x90, +0x9E, 0xB9, 0x90, 0x90, 0x9F, 0x84, 0x97, 0x90, 0xC8, 0x09, 0x71, 0x90, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xD0, 0x82, 0x25, 0x10, -0xD1, 0x72, 0x16, 0x10, 0xD2, 0x62, 0x07, 0x10, 0xEB, 0xAF, 0x20, 0x90, 0xEC, 0xA8, 0x4C, 0x10, -0xED, 0x98, 0x3D, 0x10, 0xEE, 0x88, 0x2E, 0x10, 0xEF, 0x78, 0x1F, 0x10, 0xF0, 0x68, 0x10, 0x10, -0xF1, 0x58, 0x01, 0x10, 0xF2, 0x47, 0xF2, 0x10, 0xF3, 0x37, 0xE3, 0x10, 0xF4, 0x27, 0xD4, 0x10, -0xF5, 0x17, 0xC5, 0x10, 0xF6, 0x10, 0xF0, 0x90, 0xF7, 0x2F, 0x06, 0x10, 0xF7, 0xF0, 0xD2, 0x90, -0x13, 0x4D, 0x44, 0x10, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, -0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, -0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, -0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, -0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, -0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, -0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, -0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, -0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, -0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, -0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, -0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, -0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, -0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, -0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, -0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, -0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, -0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, -0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, -0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, -0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, -0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, -0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, -0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, -0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, -0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, -0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, -0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x00, 0x00, 0x0A, -0x14, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, -0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, -0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, -0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, -0xFF, 0xFF, 0x72, 0xEE, 0x24, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x27, 0xE3, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0x9B, 0xD4, 0x7B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xB7, 0x4D, 0x60, 0xFF, 0xFF, -0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD0, 0x82, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x72, 0x16, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD2, 0x62, 0x07, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xAF, 0x20, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xEC, 0xA8, 0x4C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x98, 0x3D, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xEE, 0x88, 0x2E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x78, 0x1F, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF0, 0x68, 0x10, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x58, 0x01, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF2, 0x47, 0xF2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x37, 0xE3, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x27, 0xD4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x17, 0xC5, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0x10, 0xF0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x06, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0xF0, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, 0x00, -0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, -0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, -0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, -0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, -0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, -0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, -0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, -0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, -0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x00, 0x00, 0x0A, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, -0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, -0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x43, 0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, -0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, -0x30, 0x2F, 0x33, 0x0A, 0x01, 0x00, 0x59, 0x00, 0x01, 0x2B, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, - +0xD1, 0x72, 0x16, 0x10, 0xD1, 0xB6, 0x96, 0x00, 0xD2, 0x58, 0xBE, 0x80, 0xD2, 0xA1, 0x4F, 0x10, +0xD3, 0x63, 0x1B, 0x90, 0xD4, 0x4B, 0x23, 0x90, 0xD5, 0x39, 0xD1, 0x20, 0xD5, 0x67, 0xE7, 0x90, +0xD5, 0xA8, 0x73, 0x00, 0xD6, 0x29, 0xB4, 0x10, 0xD7, 0x2C, 0x1A, 0x10, 0xD8, 0x09, 0x96, 0x10, +0xD9, 0x02, 0xC1, 0x90, 0xD9, 0xE9, 0x78, 0x10, 0x13, 0x4D, 0x44, 0x10, 0x14, 0x33, 0xFA, 0x90, +0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, +0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, +0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, +0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, +0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, +0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, +0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, +0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, +0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, +0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, +0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, +0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, +0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, +0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, +0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, +0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, +0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, +0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, +0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, +0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, +0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, +0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, +0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, +0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, +0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, +0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, +0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, +0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, +0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x02, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x01, 0x04, 0x03, 0x04, 0x03, 0x06, 0x01, 0x04, 0x03, +0x04, 0x03, 0x04, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x00, 0x00, 0x0C, 0x88, 0x00, 0x00, 0x00, 0x00, 0x1C, +0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, +0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x0D, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, +0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x4D, 0x54, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, +0xFF, 0x6F, 0xA2, 0x61, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, 0xFF, 0xFF, +0xFF, 0x9B, 0xD5, 0xDA, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xD9, 0xAE, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0x9D, 0xA4, 0xB5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB9, 0x90, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0x9F, 0x84, 0x97, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD0, 0x82, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x72, 0x16, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD1, 0xB6, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x58, 0xBE, 0x80, 0xFF, 0xFF, 0xFF, +0xFF, 0xD2, 0xA1, 0x4F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x63, 0x1B, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xD4, 0x4B, 0x23, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xD5, 0x67, 0xE7, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xA8, 0x73, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xD6, 0x29, 0xB4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2C, 0x1A, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD8, 0x09, 0x96, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0xC1, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xD9, 0xE9, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, 0x00, 0x00, +0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, +0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, +0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, +0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, +0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, +0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, +0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, +0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, +0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, +0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, +0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, +0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, +0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, +0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, +0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, +0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, +0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, +0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, +0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, +0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, +0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, +0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, +0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, +0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, +0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, +0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, +0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, +0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, +0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, +0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, +0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, +0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, +0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, +0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, +0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, +0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, +0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, +0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x02, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x05, 0x01, 0x04, 0x03, 0x04, 0x03, 0x06, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x00, 0x00, 0x0C, 0x88, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, +0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, +0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x43, +0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, +0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x01, 0x00, 0x59, 0x00, 0x01, 0x2B, +0x12, 0x80, 0x00, 0x00, 0x00, 0x00, /* Asia/Aden */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x59, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xDA, 0x61, 0x38, 0x56, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xDA, 0x61, 0x38, 0x56, +0x01, 0x00, 0x00, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x61, 0x38, 0x56, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2A, 0x2A, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x9C, 0xC8, 0xB8, 0x01, 0x57, 0xA0, 0xC0, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x61, 0x38, 0x56, 0x01, 0x00, 0x00, 0x2A, 0x2A, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x9C, 0xC8, 0xB8, 0x01, 0x57, 0xA0, 0xC0, 0x00, +0x00, 0x00, 0x00, /* Asia/Almaty */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x7B, 0xDC, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x7B, 0xDC, 0xB5, 0xA3, 0xEF, 0x30, 0x15, 0x27, 0x7D, 0xA0, 0x16, 0x18, 0xB2, 0x10, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xE5, 0x90, 0x18, 0xE9, 0xE4, 0xA0, 0x19, 0xDB, 0x19, 0x10, 0x1A, 0xCC, 0x69, 0xA0, 0x1B, 0xBC, 0x76, 0xC0, 0x1C, 0xAC, 0x67, 0xC0, 0x1D, 0x9C, 0x58, 0xC0, 0x1E, 0x8C, 0x49, 0xC0, @@ -41213,61 +41512,60 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x35, 0x1D, 0x56, 0xC0, 0x36, 0x32, 0x31, 0xC0, 0x36, 0xFD, 0x38, 0xC0, 0x38, 0x1B, 0x4E, 0x40, 0x38, 0xDD, 0x1A, 0xC0, 0x39, 0xFB, 0x30, 0x40, 0x3A, 0xBC, 0xFC, 0xC0, 0x3B, 0xDB, 0x12, 0x40, 0x3C, 0xA6, 0x19, 0x40, 0x3D, 0xBA, 0xF4, 0x40, 0x3E, 0x85, 0xFB, 0x40, 0x3F, 0x9A, 0xD6, 0x40, -0x40, 0x65, 0xDD, 0x40, 0x41, 0x83, 0xF2, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x04, -0x00, 0x00, 0x48, 0x24, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, -0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, -0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, -0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x7B, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, -0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, -0xB2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, -0xE5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, -0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, -0x76, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, -0x58, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, -0x3A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, -0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, -0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, -0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, -0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, -0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x95, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, -0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, -0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, -0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, -0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, -0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x6D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, -0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x4F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, -0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, -0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x4E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, -0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, -0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, -0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, -0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, -0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x40, 0x65, 0xDD, 0x40, 0x41, 0x83, 0xF2, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x48, 0x24, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, -0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, -0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, -0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, -0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, -0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xCB, 0x52, 0xC8, 0x01, 0x88, 0x13, 0x18, 0x00, 0x00, 0x00, -0x17, 0x4B, 0x61, 0x7A, 0x61, 0x6B, 0x68, 0x73, 0x74, 0x61, 0x6E, 0x20, 0x28, 0x6D, 0x6F, 0x73, -0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0x48, 0x24, 0x00, +0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, +0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, +0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, +0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, +0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xAA, 0x19, 0x7B, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x15, 0x27, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, +0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, +0x00, 0x18, 0xE9, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1A, 0xCC, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xAC, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x8C, 0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x6C, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x22, 0x4C, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x24, 0x2B, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x26, 0x0B, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF4, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, +0x00, 0x29, 0x78, 0x95, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xD0, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC4, 0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xB2, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x94, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, 0x00, +0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x32, 0x72, 0x6D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x34, 0x52, 0x4F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x36, 0x32, 0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x38, 0x1B, 0x4E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x39, 0xFB, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xDB, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xBA, 0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x9A, 0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, +0x00, 0x41, 0x83, 0xF2, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0x48, 0x24, 0x00, 0x00, 0x00, 0x00, +0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, +0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, +0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, +0x54, 0x60, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, +0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xCB, 0x52, 0xC8, 0x01, 0x88, 0x13, 0x18, 0x00, +0x00, 0x00, 0x17, 0x4B, 0x61, 0x7A, 0x61, 0x6B, 0x68, 0x73, 0x74, 0x61, 0x6E, 0x20, 0x28, 0x6D, +0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, /* Asia/Amman */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4A, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xD6, 0xD0, +0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0xB6, 0xA3, 0xD6, 0xD0, 0x06, 0x72, 0x79, 0xE0, 0x07, 0x0C, 0xAB, 0x50, 0x08, 0x24, 0x37, 0x60, 0x08, 0xED, 0xDE, 0xD0, 0x0A, 0x05, 0x6A, 0xE0, 0x0A, 0xCF, 0x12, 0x50, 0x0B, 0xE7, 0xEF, 0xE0, 0x0C, 0xDA, 0x75, 0xD0, 0x0D, 0xC9, 0x23, 0x60, 0x0E, 0x92, 0xCA, 0xD0, 0x0F, 0xA9, 0x05, 0x60, 0x10, 0x72, 0xAC, 0xD0, @@ -41289,79 +41587,78 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0xFD, 0x9D, 0xE0, 0x58, 0x12, 0x78, 0xE0, 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xF2, 0x5A, 0xE0, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xD2, 0x3C, 0xE0, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB2, 0x1E, 0xE0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x9B, 0x3B, 0x60, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x7B, 0x1D, 0x60, -0x62, 0x17, 0xFF, 0xE0, 0x63, 0x5A, 0xFF, 0x60, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, -0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x62, 0x17, 0xFF, 0xE0, 0x63, 0x5A, 0xFF, 0x60, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x02, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x05, 0x00, +0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, +0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, +0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0xA3, 0xD6, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x06, 0x72, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0xAB, 0x50, 0x00, 0x00, +0x00, 0x00, 0x08, 0x24, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0xED, 0xDE, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x05, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCF, 0x12, 0x50, 0x00, 0x00, +0x00, 0x00, 0x0B, 0xE7, 0xEF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xDA, 0x75, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x0D, 0xC9, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x92, 0xCA, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xA9, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x10, 0x72, 0xAC, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x1C, 0xAD, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9F, 0x09, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x1E, 0x92, 0xFD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x82, 0xE0, 0x50, 0x00, 0x00, +0x00, 0x00, 0x20, 0x72, 0xDF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, 0x62, 0xC2, 0x50, 0x00, 0x00, +0x00, 0x00, 0x22, 0x52, 0xC1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x23, 0x4B, 0xDE, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x24, 0x64, 0xBC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x25, 0x2B, 0xC0, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x26, 0x37, 0x6F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0x0B, 0xA2, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x28, 0x0B, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE2, 0x4A, 0x50, 0x00, 0x00, +0x00, 0x00, 0x29, 0xE4, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCB, 0x66, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x2B, 0xBB, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAB, 0x48, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x2D, 0x9B, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x78, 0xB5, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x2F, 0x84, 0x64, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x58, 0xA5, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x31, 0x64, 0x46, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x41, 0xC2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x33, 0x44, 0x28, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x21, 0xA4, 0x60, 0x00, 0x00, +0x00, 0x00, 0x35, 0x24, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x01, 0x86, 0x60, 0x00, 0x00, +0x00, 0x00, 0x37, 0x7A, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0xEA, 0xA2, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x38, 0xE2, 0x7C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD3, 0xBF, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xC2, 0x5E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB3, 0xA1, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xA3, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x93, 0x83, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x83, 0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x98, 0x4F, 0x60, 0x00, 0x00, +0x00, 0x00, 0x40, 0x63, 0x56, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x6E, 0xF6, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x42, 0x4C, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x63, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x44, 0x2C, 0x54, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x41, 0x2F, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x46, 0x0C, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x21, 0x11, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x47, 0xEC, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0A, 0x2E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x49, 0xCB, 0xFA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xEA, 0x10, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4B, 0xAB, 0xDC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xC9, 0xF2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4D, 0x94, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA9, 0xD4, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4F, 0x74, 0xDB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0xB3, 0x5E, 0x50, 0x00, 0x00, +0x00, 0x00, 0x53, 0x34, 0x9F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x52, 0xB4, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x55, 0x14, 0x81, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x32, 0x96, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x56, 0xFD, 0x9D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x12, 0x78, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x58, 0xDD, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF2, 0x5A, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5A, 0xBD, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD2, 0x3C, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB2, 0x1E, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5E, 0x7D, 0x25, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9B, 0x3B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x60, 0x5D, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x1D, 0x60, 0x00, 0x00, +0x00, 0x00, 0x62, 0x17, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xFF, 0x60, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, -0x03, 0x01, 0x05, 0x05, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, -0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, -0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, -0xA3, 0xD6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x72, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0C, 0xAB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, -0xED, 0xDE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, -0xCF, 0x12, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE7, 0xEF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, -0xDA, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC9, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0E, -0x92, 0xCA, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA9, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x10, -0x72, 0xAC, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAD, 0xD5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, -0x9F, 0x09, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x92, 0xFD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x82, 0xE0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x72, 0xDF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, -0x62, 0xC2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x22, 0x52, 0xC1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x23, -0x4B, 0xDE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x64, 0xBC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x25, -0x2B, 0xC0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x37, 0x6F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, -0x0B, 0xA2, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x28, 0x0B, 0x73, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, -0xE2, 0x4A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xE4, 0xBE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xCB, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBB, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2C, -0xAB, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9B, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2E, -0x78, 0xB5, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x84, 0x64, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, -0x58, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x64, 0x46, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, -0x41, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x44, 0x28, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, -0x21, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x24, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, -0x01, 0x86, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, 0x7A, 0x93, 0x60, 0x00, 0x00, 0x00, 0x00, 0x37, -0xEA, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE2, 0x7C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, -0xD3, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC2, 0x5E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xB3, 0xA1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA3, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, -0x93, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x83, 0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x98, 0x4F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x63, 0x56, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, -0x6E, 0xF6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4C, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x43, -0x3C, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2C, 0x54, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x45, -0x41, 0x2F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0C, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, -0x21, 0x11, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEC, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, -0x0A, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCB, 0xFA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, -0xEA, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAB, 0xDC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, -0xC9, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x94, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, -0xA9, 0xD4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x74, 0xDB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, -0xB3, 0x5E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x53, 0x34, 0x9F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, -0x52, 0xB4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x14, 0x81, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, -0x32, 0x96, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFD, 0x9D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, -0x12, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDD, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x59, -0xF2, 0x5A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBD, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, -0xD2, 0x3C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, -0xB2, 0x1E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7D, 0x25, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, -0x9B, 0x3B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5D, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, -0x7B, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x17, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, -0x5A, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, -0x01, 0x03, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, -0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x02, -0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, -0x01, 0x05, 0x05, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, -0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, -0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, 0x7C, 0xF5, 0x00, -0x00, 0x00, 0x00, +0x03, 0x01, 0x02, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, 0x03, 0x01, +0x03, 0x01, 0x03, 0x01, 0x05, 0x00, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xBA, 0x14, 0xB8, 0x01, 0x49, 0x7C, +0xF5, 0x00, 0x00, 0x00, 0x00, /* Asia/Anadyr */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xAA, 0x19, 0x1D, 0x9C, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xAA, 0x19, 0x1D, 0x9C, 0xB5, 0xA3, 0x8C, 0xC0, 0x15, 0x27, 0x1B, 0x30, 0x16, 0x18, 0x4F, 0xA0, 0x17, 0x08, 0x4E, 0xB0, 0x17, 0xF9, 0x91, 0x30, 0x18, 0xE9, 0x90, 0x40, 0x19, 0xDA, 0xC4, 0xB0, 0x1A, 0xCC, 0x15, 0x40, 0x1B, 0xBC, 0x22, 0x60, 0x1C, 0xAC, 0x13, 0x60, 0x1D, 0x9C, 0x04, 0x60, 0x1E, 0x8B, 0xF5, 0x60, @@ -41377,70 +41674,69 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x40, 0x65, 0x88, 0xE0, 0x41, 0x83, 0x9E, 0x60, 0x42, 0x45, 0x6A, 0xE0, 0x43, 0x63, 0x80, 0x60, 0x44, 0x25, 0x4C, 0xE0, 0x45, 0x43, 0x62, 0x60, 0x46, 0x05, 0x2E, 0xE0, 0x47, 0x23, 0x44, 0x60, 0x47, 0xEE, 0x4B, 0x60, 0x49, 0x03, 0x26, 0x60, 0x49, 0xCE, 0x2D, 0x60, 0x4A, 0xE3, 0x08, 0x60, -0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x04, 0x01, 0x04, 0x01, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x01, 0x03, 0x02, 0x03, +0x04, 0x01, 0x04, 0x01, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, -0x05, 0x00, 0x00, 0xA6, 0x64, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xC4, -0xE0, 0x01, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, -0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, -0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x31, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, -0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x1D, 0x9C, 0xFF, -0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0x8C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x1B, 0x30, 0x00, -0x00, 0x00, 0x00, 0x16, 0x18, 0x4F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x4E, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x17, 0xF9, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0x90, 0x40, 0x00, -0x00, 0x00, 0x00, 0x19, 0xDA, 0xC4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x15, 0x40, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xBC, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x13, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1D, 0x9C, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8B, 0xF5, 0x60, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x7B, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xD7, 0x60, 0x00, -0x00, 0x00, 0x00, 0x21, 0x5B, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xB9, 0x60, 0x00, -0x00, 0x00, 0x00, 0x23, 0x3B, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0x9B, 0x60, 0x00, -0x00, 0x00, 0x00, 0x25, 0x1B, 0x8C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x7D, 0x60, 0x00, -0x00, 0x00, 0x00, 0x27, 0x04, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0x99, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x40, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x6C, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0x5D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x4E, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x30, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0x21, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x12, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0x3E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x19, 0x60, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x51, 0xFB, 0x60, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xDD, 0x60, 0x00, -0x00, 0x00, 0x00, 0x36, 0xFC, 0xE4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1A, 0xF9, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x38, 0xDC, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, 0xDB, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xBC, 0xA8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xBD, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA5, 0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0x9F, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x85, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x81, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x65, 0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0x9E, 0x60, 0x00, -0x00, 0x00, 0x00, 0x42, 0x45, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x80, 0x60, 0x00, -0x00, 0x00, 0x00, 0x44, 0x25, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x62, 0x60, 0x00, -0x00, 0x00, 0x00, 0x46, 0x05, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x44, 0x60, 0x00, -0x00, 0x00, 0x00, 0x47, 0xEE, 0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x26, 0x60, 0x00, -0x00, 0x00, 0x00, 0x49, 0xCE, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x08, 0x60, 0x00, -0x00, 0x00, 0x00, 0x4B, 0xAE, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x04, 0x01, 0x04, 0x01, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x05, -0x00, 0x00, 0xA6, 0x64, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xC4, 0xE0, -0x01, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, -0x00, 0x00, 0x9A, 0xB0, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x31, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, -0x2D, 0x31, 0x32, 0x0A, 0x00, 0xEC, 0x21, 0x38, 0x02, 0x21, 0x79, 0xED, 0x00, 0x00, 0x00, 0x13, -0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x39, 0x20, 0x2D, 0x20, 0x42, 0x65, 0x72, 0x69, 0x6E, 0x67, 0x20, -0x53, 0x65, 0x61, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x00, 0x00, 0xA6, 0x64, +0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x08, 0x00, 0x00, +0xB6, 0xD0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, +0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, +0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, +0x2B, 0x31, 0x34, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, +0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x1D, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, +0x8C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x1B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, +0x4F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x4E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, +0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0x90, 0x40, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, +0xC4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x15, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, +0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x13, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, +0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8B, 0xF5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, +0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xD7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, +0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xB9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, +0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0x9B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, +0x8C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x7D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, +0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0x99, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, +0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x40, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, +0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, +0x5D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, +0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, +0x21, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x12, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, +0x3E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x51, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, +0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, +0xE4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1A, 0xF9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, +0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, +0xA8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, +0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, +0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, +0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0x9E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, +0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, +0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, +0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, +0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x26, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, +0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, +0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8D, +0xFF, 0x70, 0x01, 0x03, 0x02, 0x03, 0x04, 0x01, 0x04, 0x01, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, +0x08, 0x05, 0x00, 0x00, 0xA6, 0x64, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, +0xC4, 0xE0, 0x01, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, +0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x0C, 0x00, 0x00, 0xA8, 0xC0, +0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, +0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, +0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0xEC, 0x21, 0x38, 0x02, 0x21, 0x79, 0xED, 0x00, 0x00, +0x00, 0x13, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x39, 0x20, 0x2D, 0x20, 0x42, 0x65, 0x72, 0x69, 0x6E, +0x67, 0x20, 0x53, 0x65, 0x61, /* Asia/Aqtau */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x94, 0xE0, +0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x94, 0xE0, 0xB5, 0xA3, 0xFD, 0x40, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, 0x1F, 0x7C, 0x48, 0xD0, @@ -41453,60 +41749,59 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x36, 0x32, 0x4D, 0xE0, 0x36, 0xFD, 0x54, 0xE0, 0x38, 0x1B, 0x6A, 0x60, 0x38, 0xDD, 0x36, 0xE0, 0x39, 0xFB, 0x4C, 0x60, 0x3A, 0xBD, 0x18, 0xE0, 0x3B, 0xDB, 0x2E, 0x60, 0x3C, 0xA6, 0x35, 0x60, 0x3D, 0xBB, 0x10, 0x60, 0x3E, 0x86, 0x17, 0x60, 0x3F, 0x9A, 0xF2, 0x60, 0x40, 0x65, 0xF9, 0x60, -0x41, 0x84, 0x0E, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, +0x41, 0x84, 0x0E, 0xE0, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x00, 0x00, 0x2F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, +0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, +0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, +0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x94, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, +0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, +0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, +0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x92, 0x60, +0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xAE, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x89, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x90, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x72, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x54, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x36, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x18, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x35, 0x60, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x17, 0x60, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF9, 0x60, +0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x05, 0x00, 0x00, 0x2F, 0x20, 0x00, -0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, -0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, -0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, -0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0x19, 0x94, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, -0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, -0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, -0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, -0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, -0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, -0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, -0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, -0x00, 0x2F, 0x74, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x83, 0x60, 0x00, 0x00, 0x00, -0x00, 0x31, 0x5D, 0xAE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x89, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x33, 0x3D, 0x90, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x35, 0x1D, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x36, 0xFD, 0x54, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, -0x00, 0x38, 0xDD, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, -0x00, 0x3A, 0xBD, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, -0x00, 0x3C, 0xA6, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, -0x00, 0x3E, 0x86, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, -0x00, 0x40, 0x65, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x05, 0x00, 0x00, 0x2F, 0x20, 0x00, 0x00, 0x00, 0x00, -0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, -0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, -0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, -0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, -0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xCD, 0x41, 0x92, 0x01, 0x5F, 0x5B, 0xEA, 0x00, -0x00, 0x00, 0x15, 0x4D, 0x61, 0x6E, 0x67, 0x67, 0x68, 0x79, 0x73, 0x74, 0x61, 0x75, 0x2F, 0x4D, -0x61, 0x6E, 0x6B, 0x69, 0x73, 0x74, 0x61, 0x75, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x00, 0x00, 0x2F, 0x20, 0x00, 0x00, +0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, +0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, +0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, +0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, +0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xCD, 0x41, 0x92, 0x01, 0x5F, 0x5B, +0xEA, 0x00, 0x00, 0x00, 0x15, 0x4D, 0x61, 0x6E, 0x67, 0x67, 0x68, 0x79, 0x73, 0x74, 0x61, 0x75, +0x2F, 0x4D, 0x61, 0x6E, 0x6B, 0x69, 0x73, 0x74, 0x61, 0x75, /* Asia/Aqtobe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x8E, 0x68, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x8E, 0x68, 0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, @@ -41519,145 +41814,142 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x35, 0x1D, 0x64, 0xD0, 0x36, 0x32, 0x3F, 0xD0, 0x36, 0xFD, 0x46, 0xD0, 0x38, 0x1B, 0x5C, 0x50, 0x38, 0xDD, 0x28, 0xD0, 0x39, 0xFB, 0x3E, 0x50, 0x3A, 0xBD, 0x0A, 0xD0, 0x3B, 0xDB, 0x20, 0x50, 0x3C, 0xA6, 0x27, 0x50, 0x3D, 0xBB, 0x02, 0x50, 0x3E, 0x86, 0x09, 0x50, 0x3F, 0x9A, 0xE4, 0x50, -0x40, 0x65, 0xEB, 0x50, 0x41, 0x84, 0x00, 0xD0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, +0x40, 0x65, 0xEB, 0x50, 0x41, 0x84, 0x00, 0xD0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, +0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x35, 0x98, 0x00, +0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, +0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, +0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, +0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0B, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x8E, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, +0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, +0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, +0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, 0x00, +0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, +0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x5C, 0x50, 0x00, 0x00, 0x00, 0x00, +0x38, 0xDD, 0x28, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3A, 0xBD, 0x0A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3C, 0xA6, 0x27, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3E, 0x86, 0x09, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, +0x40, 0x65, 0xEB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x00, 0xD0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, -0x00, 0x00, 0x35, 0x98, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, -0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, -0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, -0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, -0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x8E, -0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, -0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, -0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, -0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, -0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x5C, -0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x28, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x3E, -0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x0A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x20, -0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x27, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x02, -0x50, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x09, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xE4, -0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xEB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x00, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, -0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, -0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x00, 0x00, 0x35, -0x98, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, -0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, -0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, -0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, -0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, -0x2D, 0x35, 0x0A, 0x00, 0xD6, 0x0E, 0x2D, 0x01, 0x69, 0xE3, 0x3A, 0x00, 0x00, 0x00, 0x0D, 0x41, -0x71, 0x74, 0x6F, 0x62, 0x65, 0x2F, 0x41, 0x6B, 0x74, 0x6F, 0x62, 0x65, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, +0x00, 0x35, 0x98, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, +0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, +0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, +0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, +0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, +0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xD6, 0x0E, 0x2D, 0x01, 0x69, 0xE3, 0x3A, 0x00, 0x00, 0x00, +0x0D, 0x41, 0x71, 0x74, 0x6F, 0x62, 0x65, 0x2F, 0x41, 0x6B, 0x74, 0x6F, 0x62, 0x65, /* Asia/Ashgabat */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x8D, 0x44, +0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x8D, 0x44, 0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xBF, 0x30, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, 0x1F, 0x7C, 0x48, 0xD0, 0x20, 0x6C, 0x39, 0xD0, 0x21, 0x5C, 0x2A, 0xD0, 0x22, 0x4C, 0x1B, 0xD0, 0x23, 0x3C, 0x0C, 0xD0, 0x24, 0x2B, 0xFD, 0xD0, 0x25, 0x1B, 0xEE, 0xD0, 0x26, 0x0B, 0xDF, 0xD0, 0x27, 0x05, 0x0B, 0x50, 0x27, 0xF4, 0xFC, 0x50, 0x28, 0xE4, 0xFB, 0x60, 0x29, 0x78, 0xA3, 0x60, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x03, 0x03, 0x00, 0x00, -0x36, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, -0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, -0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, -0x46, 0x50, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x1A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x8D, -0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xBF, -0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, -0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, -0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, -0x07, 0x03, 0x03, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, -0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, -0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, -0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, -0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xC3, 0x3C, 0x78, 0x01, -0x6B, 0xBE, 0x7D, 0x00, 0x00, 0x00, 0x00, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x03, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x00, 0x00, +0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x00, +0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, +0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x8D, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, +0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, +0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, +0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x07, 0x03, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, +0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x46, +0x50, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, +0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, +0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xC3, 0x3C, +0x78, 0x01, 0x6B, 0xBE, 0x7D, 0x00, 0x00, 0x00, 0x00, /* Asia/Ashkhabad */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x8D, 0x44, +0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x8D, 0x44, 0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xBF, 0x30, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, 0x1F, 0x7C, 0x48, 0xD0, 0x20, 0x6C, 0x39, 0xD0, 0x21, 0x5C, 0x2A, 0xD0, 0x22, 0x4C, 0x1B, 0xD0, 0x23, 0x3C, 0x0C, 0xD0, 0x24, 0x2B, 0xFD, 0xD0, 0x25, 0x1B, 0xEE, 0xD0, 0x26, 0x0B, 0xDF, 0xD0, 0x27, 0x05, 0x0B, 0x50, 0x27, 0xF4, 0xFC, 0x50, 0x28, 0xE4, 0xFB, 0x60, 0x29, 0x78, 0xA3, 0x60, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x03, 0x03, 0x00, 0x00, -0x36, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, -0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, -0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, -0x46, 0x50, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x1A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x8D, -0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xBF, -0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, -0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, -0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, -0x07, 0x03, 0x03, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, -0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, -0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, -0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, -0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x03, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x00, 0x00, +0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x00, +0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, +0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x8D, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, +0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, +0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, +0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x07, 0x03, 0x00, 0x00, 0x36, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, +0x04, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x00, 0x00, 0x46, +0x50, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, +0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, +0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Atyrau */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xAA, 0x19, 0x93, 0x50, +0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xAA, 0x19, 0x93, 0x50, 0xB5, 0xA4, 0x0B, 0x50, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, 0x1F, 0x7C, 0x48, 0xD0, @@ -41670,61 +41962,60 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x36, 0x32, 0x3F, 0xD0, 0x36, 0xFD, 0x46, 0xD0, 0x38, 0x1B, 0x6A, 0x60, 0x38, 0xDD, 0x36, 0xE0, 0x39, 0xFB, 0x4C, 0x60, 0x3A, 0xBD, 0x18, 0xE0, 0x3B, 0xDB, 0x2E, 0x60, 0x3C, 0xA6, 0x35, 0x60, 0x3D, 0xBB, 0x10, 0x60, 0x3E, 0x86, 0x17, 0x60, 0x3F, 0x9A, 0xF2, 0x60, 0x40, 0x65, 0xF9, 0x60, -0x41, 0x84, 0x0E, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x05, 0x00, 0x00, 0x30, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, -0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, -0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, -0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, -0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x93, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, -0x50, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, -0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, -0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, -0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, -0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, -0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, -0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, -0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, -0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, -0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, -0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, -0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x05, 0x00, 0x00, 0x30, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, -0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, -0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, -0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, -0xD1, 0x39, 0x32, 0x01, 0x61, 0xE6, 0xF5, 0x00, 0x00, 0x00, 0x15, 0x41, 0x74, 0x79, 0x72, 0x61, -0x75, 0x2F, 0x41, 0x74, 0x69, 0x72, 0x61, 0x75, 0x2F, 0x47, 0x75, 0x72, 0x27, 0x79, 0x65, 0x76, - +0x41, 0x84, 0x0E, 0xE0, 0x01, 0x02, 0x03, 0x04, 0x02, 0x04, 0x02, 0x04, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x00, 0x00, 0x30, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, +0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, +0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, +0xAA, 0x19, 0x93, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, +0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, +0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, 0x00, +0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, +0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, +0x38, 0xDD, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, 0x00, +0x3A, 0xBD, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, +0x3C, 0xA6, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, +0x3E, 0x86, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, +0x40, 0x65, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x01, 0x02, 0x03, 0x04, +0x02, 0x04, 0x02, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x00, 0x00, +0x30, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, +0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, +0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, +0x38, 0x40, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, +0x0A, 0x00, 0xD1, 0x39, 0x32, 0x01, 0x61, 0xE6, 0xF5, 0x00, 0x00, 0x00, 0x15, 0x41, 0x74, 0x79, +0x72, 0x61, 0x75, 0x2F, 0x41, 0x74, 0x69, 0x72, 0x61, 0x75, 0x2F, 0x47, 0x75, 0x72, 0x27, 0x79, +0x65, 0x76, /* Asia/Baghdad */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x9E, 0x30, 0x3C, 0xE0, 0x17, 0x30, 0x68, 0x50, 0x17, 0xFA, 0x0F, 0xC0, 0x18, 0xE8, 0xBD, 0x50, 0x19, 0xDB, 0x43, 0x40, 0x1A, 0xCC, 0x93, 0xD0, 0x1B, 0xBD, 0xC8, 0x40, 0x1C, 0xAD, 0xC7, 0x50, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, 0x1F, 0x7C, 0x56, 0xE0, 0x20, 0x6C, 0x47, 0xE0, @@ -41738,76 +42029,74 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x3B, 0xB7, 0xB2, 0x00, 0x3C, 0xA7, 0xA3, 0x00, 0x3D, 0x98, 0xE5, 0x80, 0x3E, 0x88, 0xD6, 0x80, 0x3F, 0x7A, 0x19, 0x00, 0x40, 0x6B, 0x5B, 0x80, 0x41, 0x5C, 0x9E, 0x00, 0x42, 0x4C, 0x8F, 0x00, 0x43, 0x3D, 0xD1, 0x80, 0x44, 0x2D, 0xC2, 0x80, 0x45, 0x1F, 0x05, 0x00, 0x46, 0x0E, 0xF6, 0x00, -0x47, 0x00, 0x38, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x47, 0x00, 0x38, 0x80, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x04, 0x00, -0x00, 0x29, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x29, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x00, 0x00, 0x38, -0x40, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, -0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, -0x06, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0xB1, 0xDC, 0xFF, 0xFF, 0xFF, -0xFF, 0x9E, 0x30, 0x3C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x30, 0x68, 0x50, 0x00, 0x00, 0x00, -0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE8, 0xBD, 0x50, 0x00, 0x00, 0x00, -0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xBD, 0xC8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAD, 0xC7, 0x50, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF6, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x28, 0xE7, 0xBA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD8, 0xFD, 0x00, 0x00, 0x00, 0x00, -0x00, 0x2A, 0xCA, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xBA, 0x30, 0x80, 0x00, 0x00, 0x00, -0x00, 0x2C, 0xAB, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9B, 0x64, 0x00, 0x00, 0x00, 0x00, -0x00, 0x2E, 0x8C, 0xA6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7C, 0x97, 0x80, 0x00, 0x00, 0x00, -0x00, 0x30, 0x6D, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5F, 0x1C, 0x80, 0x00, 0x00, 0x00, -0x00, 0x32, 0x50, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x50, 0x00, 0x00, 0x00, 0x00, -0x00, 0x34, 0x31, 0x92, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x21, 0x83, 0x80, 0x00, 0x00, 0x00, -0x00, 0x36, 0x12, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x02, 0xB7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x37, 0xF3, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE5, 0x3C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x39, 0xD6, 0x7E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0x6F, 0x80, 0x00, 0x00, 0x00, -0x00, 0x3B, 0xB7, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA7, 0xA3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3D, 0x98, 0xE5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x88, 0xD6, 0x80, 0x00, 0x00, 0x00, -0x00, 0x3F, 0x7A, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6B, 0x5B, 0x80, 0x00, 0x00, 0x00, -0x00, 0x41, 0x5C, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4C, 0x8F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x43, 0x3D, 0xD1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2D, 0xC2, 0x80, 0x00, 0x00, 0x00, -0x00, 0x45, 0x1F, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0E, 0xF6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x47, 0x00, 0x38, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x29, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x29, 0xA0, 0x00, 0x04, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xBC, 0x37, 0x98, 0x01, 0x56, 0x6E, 0xC2, 0x00, -0x00, 0x00, 0x00, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0x29, 0xA4, 0x00, 0x00, +0x00, 0x00, 0x29, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, +0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0xB1, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x30, 0x3C, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x17, 0x30, 0x68, 0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x18, 0xE8, 0xBD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, +0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBD, 0xC8, 0x40, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xAD, 0xC7, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x19, 0x60, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF6, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE7, 0xBA, 0x80, +0x00, 0x00, 0x00, 0x00, 0x29, 0xD8, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCA, 0x3F, 0x80, +0x00, 0x00, 0x00, 0x00, 0x2B, 0xBA, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAB, 0x73, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x9B, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8C, 0xA6, 0x80, +0x00, 0x00, 0x00, 0x00, 0x2F, 0x7C, 0x97, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6D, 0xDA, 0x00, +0x00, 0x00, 0x00, 0x00, 0x31, 0x5F, 0x1C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x32, 0x50, 0x5F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x31, 0x92, 0x80, +0x00, 0x00, 0x00, 0x00, 0x35, 0x21, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x12, 0xC6, 0x00, +0x00, 0x00, 0x00, 0x00, 0x37, 0x02, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF3, 0xF9, 0x80, +0x00, 0x00, 0x00, 0x00, 0x38, 0xE5, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD6, 0x7E, 0x80, +0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0x6F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB7, 0xB2, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3C, 0xA7, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x98, 0xE5, 0x80, +0x00, 0x00, 0x00, 0x00, 0x3E, 0x88, 0xD6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7A, 0x19, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x6B, 0x5B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x5C, 0x9E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x42, 0x4C, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3D, 0xD1, 0x80, +0x00, 0x00, 0x00, 0x00, 0x44, 0x2D, 0xC2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1F, 0x05, 0x00, +0x00, 0x00, 0x00, 0x00, 0x46, 0x0E, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x38, 0x80, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x00, 0x00, 0x29, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x29, 0xA0, +0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xBC, 0x37, 0x98, 0x01, 0x56, 0x6E, +0xC2, 0x00, 0x00, 0x00, 0x00, /* Asia/Bahrain */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xCA, 0x7B, 0x6C, 0x94, -0xCF, 0x17, 0x59, 0x48, 0x04, 0x8A, 0x92, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0x00, 0x00, 0x2F, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x31, 0x38, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, -0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x33, -0x30, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xCA, 0x7B, 0x6C, 0x94, +0xCF, 0x17, 0x59, 0x48, 0x04, 0x8A, 0x92, 0xC0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x2F, 0x6C, 0x00, +0x00, 0x00, 0x00, 0x31, 0x38, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0A, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x34, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, -0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x7B, 0x6C, 0x94, 0xFF, 0xFF, -0xFF, 0xFF, 0xCF, 0x17, 0x59, 0x48, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8A, 0x92, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0x00, 0x00, 0x2F, 0x6C, 0x00, 0x00, -0x00, 0x00, 0x31, 0x38, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x34, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xB1, 0x96, -0x3D, 0x01, 0x5F, 0xD7, 0x9D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x7B, 0x6C, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x17, 0x59, +0x48, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8A, 0x92, 0xC0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x2F, 0x6C, +0x00, 0x00, 0x00, 0x00, 0x31, 0x38, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0A, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, +0xB1, 0x96, 0x3D, 0x01, 0x5F, 0xD7, 0x9D, 0x00, 0x00, 0x00, 0x00, /* Asia/Baku */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x95, 0x44, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x95, 0x44, 0xE7, 0xDA, 0x0C, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -41824,86 +42113,84 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x4A, 0xE3, 0x95, 0x00, 0x4B, 0xAE, 0x9C, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x4D, 0x8E, 0x7E, 0x00, 0x4E, 0xAC, 0x93, 0x80, 0x4F, 0x6E, 0x60, 0x00, 0x50, 0x8C, 0x75, 0x80, 0x51, 0x57, 0x7C, 0x80, 0x52, 0x6C, 0x57, 0x80, 0x53, 0x37, 0x5E, 0x80, 0x54, 0x4C, 0x39, 0x80, 0x55, 0x17, 0x40, 0x80, -0x56, 0x2C, 0x1B, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, -0x06, 0x04, 0x08, 0x09, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x56, 0x2C, 0x1B, 0x80, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x04, 0x08, 0x09, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x2E, 0xBC, 0x00, -0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, -0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, -0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, -0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, -0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x95, 0x44, 0xFF, -0xFF, 0xFF, 0xFF, 0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, -0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xAD, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x8F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x71, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x53, 0x00, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x35, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDB, 0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x51, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBB, 0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x33, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9B, 0x0E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x15, 0x80, 0x00, -0x00, 0x00, 0x00, 0x41, 0x84, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xF7, 0x80, 0x00, -0x00, 0x00, 0x00, 0x43, 0x64, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xD9, 0x80, 0x00, -0x00, 0x00, 0x00, 0x45, 0x43, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xBB, 0x80, 0x00, -0x00, 0x00, 0x00, 0x47, 0x23, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xD8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x49, 0x03, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xBA, 0x00, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE3, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x9C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x7E, 0x00, 0x00, -0x00, 0x00, 0x00, 0x4E, 0xAC, 0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x60, 0x00, 0x00, -0x00, 0x00, 0x00, 0x50, 0x8C, 0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x7C, 0x80, 0x00, -0x00, 0x00, 0x00, 0x52, 0x6C, 0x57, 0x80, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, 0x80, 0x00, -0x00, 0x00, 0x00, 0x54, 0x4C, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x40, 0x80, 0x00, -0x00, 0x00, 0x00, 0x56, 0x2C, 0x1B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x04, 0x08, 0x09, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x03, 0x00, 0x00, 0x2E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, -0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, -0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC6, 0xF2, 0xFD, 0x01, -0x5E, 0xB9, 0x28, 0x00, 0x00, 0x00, 0x00, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x2E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, +0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, +0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, +0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, +0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x95, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xDA, +0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, +0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, +0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, +0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, +0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, +0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, +0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, +0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, +0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, +0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, +0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, +0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, +0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, +0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, +0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, +0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, +0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, +0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, +0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x51, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, +0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, +0x0E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x15, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, +0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xF7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, +0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xD9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, +0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xBB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, +0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, +0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, +0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, +0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, +0x93, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, +0x75, 0x80, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, +0x57, 0x80, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x5E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, +0x39, 0x80, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, +0x1B, 0x80, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x04, 0x08, 0x09, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x2E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, +0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, +0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC6, 0xF2, +0xFD, 0x01, 0x5E, 0xB9, 0x28, 0x00, 0x00, 0x00, 0x00, /* Asia/Bangkok */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, -0xA2, 0x6A, 0x67, 0xC4, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x5E, 0x3C, 0x00, -0x00, 0x00, 0x00, 0x5E, 0x3C, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x85, 0xC4, 0xFF, 0xFF, 0xFF, -0xFF, 0xA2, 0x6A, 0x67, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0x00, 0x00, 0x5E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x3C, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x9E, 0x4F, 0x58, 0x01, 0xAC, 0x08, 0xD2, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0xA2, 0x6A, 0x67, 0xC4, 0x01, 0x02, 0x00, 0x00, 0x5E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x3C, +0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x85, 0xC4, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x6A, 0x67, 0xC4, +0x01, 0x02, 0x00, 0x00, 0x5E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x3C, 0x00, 0x04, 0x00, 0x00, +0x62, 0x70, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x9E, 0x4F, 0x58, 0x01, 0xAC, 0x08, +0xD2, 0x00, 0x00, 0x00, 0x00, /* Asia/Barnaul */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xD5, 0x7D, 0xFC, +0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xD5, 0x7D, 0xFC, 0xB5, 0xA3, 0xE1, 0x20, 0x15, 0x27, 0x6F, 0x90, 0x16, 0x18, 0xA4, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x17, 0xF9, 0xD7, 0x80, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x1B, 0xBC, 0x68, 0xB0, 0x1C, 0xAC, 0x59, 0xB0, 0x1D, 0x9C, 0x4A, 0xB0, 0x1E, 0x8C, 0x3B, 0xB0, @@ -41920,65 +42207,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0xD4, 0xC0, 0x44, 0x25, 0xA1, 0x40, 0x45, 0x43, 0xB6, 0xC0, 0x46, 0x05, 0x83, 0x40, 0x47, 0x23, 0x98, 0xC0, 0x47, 0xEE, 0x9F, 0xC0, 0x49, 0x03, 0x7A, 0xC0, 0x49, 0xCE, 0x81, 0xC0, 0x4A, 0xE3, 0x5C, 0xC0, 0x4B, 0xAE, 0x63, 0xC0, 0x4C, 0xCC, 0x79, 0x40, 0x4D, 0x8E, 0x45, 0xC0, -0x54, 0x4B, 0xF3, 0x30, 0x56, 0xF6, 0xEA, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, -0x00, 0x00, 0x4E, 0x84, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, -0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xD5, 0x7D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, -0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, -0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, -0xD7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, -0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, -0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, -0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, -0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, -0x0E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, -0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, -0xD2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, -0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, -0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, -0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, -0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, -0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, -0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xC7, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, -0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, -0x6D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, -0x4F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, -0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, -0x4E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, -0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, -0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, -0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, -0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, -0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, -0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0xB6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0x98, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0x7A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0x5C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, -0xF3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF6, 0xEA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x54, 0x4B, 0xF3, 0x30, 0x56, 0xF6, 0xEA, 0x40, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x4E, 0x84, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, -0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x70, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0A, 0x3C, 0x2B, 0x30, -0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDA, 0xC2, 0x9A, 0x01, 0x92, 0x73, 0x58, 0x00, 0x00, 0x00, -0x0E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x41, 0x6C, 0x74, 0x61, 0x69, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x4E, 0x84, 0x00, +0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, +0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, +0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, +0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, +0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xA1, 0xD5, 0x7D, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, 0x00, 0x00, +0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, 0x00, 0x00, +0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, 0x00, 0x00, +0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x86, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x68, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2F, 0xC7, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, +0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x6D, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x4F, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x31, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x4E, 0x40, 0x00, 0x00, 0x00, +0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x30, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x12, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xF4, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xD6, 0x40, 0x00, 0x00, 0x00, +0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xF2, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xD4, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xB6, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x98, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x7A, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x5C, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x79, 0x40, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xF3, 0x30, 0x00, 0x00, 0x00, +0x00, 0x56, 0xF6, 0xEA, 0x40, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x4E, 0x84, 0x00, 0x00, 0x00, 0x00, +0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, +0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, +0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, +0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0A, 0x3C, +0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDA, 0xC2, 0x9A, 0x01, 0x92, 0x73, 0x58, 0x00, +0x00, 0x00, 0x0E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x41, 0x6C, 0x74, 0x61, +0x69, /* Asia/Beirut */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -42121,7 +42408,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Bishkek */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x7E, 0x10, +0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x7E, 0x10, 0xB5, 0xA3, 0xEF, 0x30, 0x15, 0x27, 0x7D, 0xA0, 0x16, 0x18, 0xB2, 0x10, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xE5, 0x90, 0x18, 0xE9, 0xE4, 0xA0, 0x19, 0xDB, 0x19, 0x10, 0x1A, 0xCC, 0x69, 0xA0, 0x1B, 0xBC, 0x76, 0xC0, 0x1C, 0xAC, 0x67, 0xC0, 0x1D, 0x9C, 0x58, 0xC0, 0x1E, 0x8C, 0x49, 0xC0, @@ -42134,70 +42421,68 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x36, 0x32, 0x38, 0xC8, 0x36, 0xFD, 0x4D, 0xD8, 0x38, 0x1B, 0x55, 0x48, 0x38, 0xDD, 0x2F, 0xD8, 0x39, 0xFB, 0x37, 0x48, 0x3A, 0xBD, 0x11, 0xD8, 0x3B, 0xDB, 0x19, 0x48, 0x3C, 0xA6, 0x2E, 0x58, 0x3D, 0xBA, 0xFB, 0x48, 0x3E, 0x86, 0x10, 0x58, 0x3F, 0x9A, 0xDD, 0x48, 0x40, 0x65, 0xF2, 0x58, -0x41, 0x83, 0xF9, 0xC8, 0x42, 0x45, 0xD4, 0x58, 0x42, 0xFB, 0x92, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, -0x06, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, -0x07, 0x01, 0x07, 0x03, 0x03, 0x00, 0x00, 0x45, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, -0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, -0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, -0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, -0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x35, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x7E, -0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x7D, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, -0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xE4, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x69, -0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x67, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x49, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x2B, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x0D, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xEF, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xD1, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xEE, -0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xBE, 0xA3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xE7, 0x37, -0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xA5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xC7, 0x19, -0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x87, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xA6, 0xFB, -0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x69, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x86, 0xDD, -0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x4B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x31, 0x66, 0xBF, -0x30, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x67, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x89, -0xD8, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x56, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x6B, -0xD8, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x38, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x4D, -0xD8, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x55, 0x48, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x2F, -0xD8, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x37, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x11, -0xD8, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x19, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x2E, -0x58, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xFB, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x10, -0x58, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xDD, 0x48, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF2, -0x58, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xF9, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xD4, -0x58, 0x00, 0x00, 0x00, 0x00, 0x42, 0xFB, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, -0x01, 0x06, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, -0x01, 0x07, 0x01, 0x07, 0x03, 0x03, 0x00, 0x00, 0x45, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, -0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, -0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, -0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xCA, 0xCA, 0x10, 0x01, 0x84, 0x7D, 0x20, 0x00, -0x00, 0x00, 0x00, +0x41, 0x83, 0xF9, 0xC8, 0x42, 0x45, 0xD4, 0x58, 0x42, 0xFB, 0x92, 0x20, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x07, 0x01, +0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x03, +0x00, 0x00, 0x45, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, +0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, +0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x7E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, +0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, +0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, +0x28, 0xBE, 0xA3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xE7, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, +0x2A, 0xC4, 0xA5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xC7, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, +0x2C, 0xA4, 0x87, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xA6, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, +0x2E, 0x84, 0x69, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x86, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, +0x30, 0x64, 0x4B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x31, 0x66, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, +0x32, 0x4D, 0x67, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x89, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x34, 0x52, 0x56, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x6B, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x36, 0x32, 0x38, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x4D, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x38, 0x1B, 0x55, 0x48, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x2F, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x39, 0xFB, 0x37, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x11, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x3B, 0xDB, 0x19, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x2E, 0x58, 0x00, 0x00, 0x00, 0x00, +0x3D, 0xBA, 0xFB, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x10, 0x58, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x9A, 0xDD, 0x48, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF2, 0x58, 0x00, 0x00, 0x00, 0x00, +0x41, 0x83, 0xF9, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xD4, 0x58, 0x00, 0x00, 0x00, 0x00, +0x42, 0xFB, 0x92, 0x20, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x01, 0x06, 0x01, 0x06, 0x01, +0x06, 0x01, 0x06, 0x01, 0x06, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x01, +0x07, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x03, 0x00, 0x00, 0x45, 0xF0, 0x00, 0x00, 0x00, 0x00, +0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, +0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, +0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xCA, 0xCA, 0x10, 0x01, 0x84, 0x7D, +0x20, 0x00, 0x00, 0x00, 0x00, /* Asia/Brunei */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xAD, 0x8A, 0x02, 0x44, -0xBA, 0x67, 0x47, 0x88, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x6B, 0xBC, 0x00, -0x00, 0x00, 0x00, 0x69, 0x78, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xAD, 0x8A, 0x02, 0x44, +0xBA, 0x67, 0x47, 0x88, 0x01, 0x02, 0x00, 0x00, 0x6B, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x69, 0x78, +0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x8A, 0x02, 0x44, 0xFF, -0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x47, 0x88, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x02, 0x00, 0x00, 0x6B, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x69, 0x78, 0x00, 0x04, 0x00, 0x00, -0x70, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, -0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0x90, 0xDB, 0x55, 0x01, -0xC2, 0x01, 0xD2, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x8A, 0x02, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, +0x47, 0x88, 0x01, 0x02, 0x00, 0x00, 0x6B, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x69, 0x78, 0x00, 0x04, +0x00, 0x00, 0x70, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0x90, 0xDB, +0x55, 0x01, 0xC2, 0x01, 0xD2, 0x00, 0x00, 0x00, 0x00, /* Asia/Calcutta */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -42223,7 +42508,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Chita */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xDB, 0xF9, 0xA0, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xDB, 0xF9, 0xA0, 0xB5, 0xA3, 0xC5, 0x00, 0x15, 0x27, 0x53, 0x70, 0x16, 0x18, 0x87, 0xE0, 0x17, 0x08, 0x86, 0xF0, 0x17, 0xF9, 0xBB, 0x60, 0x18, 0xE9, 0xBA, 0x70, 0x19, 0xDA, 0xEE, 0xE0, 0x1A, 0xCC, 0x3F, 0x70, 0x1B, 0xBC, 0x4C, 0x90, 0x1C, 0xAC, 0x3D, 0x90, 0x1D, 0x9C, 0x2E, 0x90, 0x1E, 0x8C, 0x1F, 0x90, @@ -42240,71 +42525,70 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x77, 0x10, 0x45, 0x43, 0x8C, 0x90, 0x46, 0x05, 0x59, 0x10, 0x47, 0x23, 0x6E, 0x90, 0x47, 0xEE, 0x75, 0x90, 0x49, 0x03, 0x50, 0x90, 0x49, 0xCE, 0x57, 0x90, 0x4A, 0xE3, 0x32, 0x90, 0x4B, 0xAE, 0x39, 0x90, 0x4C, 0xCC, 0x4F, 0x10, 0x4D, 0x8E, 0x1B, 0x90, 0x54, 0x4B, 0xC9, 0x00, -0x56, 0xF6, 0xCE, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x56, 0xF6, 0xCE, 0x20, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x07, 0x03, 0x03, 0x00, 0x00, 0x6A, 0x60, 0x00, -0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, -0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, -0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, -0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xDB, 0xF9, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB5, 0xA3, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x53, 0x70, 0x00, 0x00, 0x00, 0x00, -0x16, 0x18, 0x87, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x17, 0xF9, 0xBB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xBA, 0x70, 0x00, 0x00, 0x00, 0x00, -0x19, 0xDA, 0xEE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x3F, 0x70, 0x00, 0x00, 0x00, 0x00, -0x1B, 0xBC, 0x4C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, -0x1D, 0x9C, 0x2E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, -0x1F, 0x7C, 0x10, 0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, -0x21, 0x5B, 0xF2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, -0x23, 0x3B, 0xD4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, -0x25, 0x1B, 0xB6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, -0x27, 0x04, 0xD3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, -0x28, 0xE4, 0xC3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x6B, 0x20, 0x00, 0x00, 0x00, 0x00, -0x29, 0xD4, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x97, 0x10, 0x00, 0x00, 0x00, 0x00, -0x2B, 0xB4, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x79, 0x10, 0x00, 0x00, 0x00, 0x00, -0x2D, 0x94, 0x6A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x5B, 0x10, 0x00, 0x00, 0x00, 0x00, -0x2F, 0x74, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x3D, 0x10, 0x00, 0x00, 0x00, 0x00, -0x31, 0x5D, 0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, -0x33, 0x3D, 0x4A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, -0x35, 0x1D, 0x2C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, -0x36, 0xFD, 0x0E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, -0x38, 0xDC, 0xF0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, -0x3A, 0xBC, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, -0x3C, 0xA5, 0xEF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xCA, 0x10, 0x00, 0x00, 0x00, 0x00, -0x3E, 0x85, 0xD1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xAC, 0x10, 0x00, 0x00, 0x00, 0x00, -0x40, 0x65, 0xB3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xC8, 0x90, 0x00, 0x00, 0x00, 0x00, -0x42, 0x45, 0x95, 0x10, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xAA, 0x90, 0x00, 0x00, 0x00, 0x00, -0x44, 0x25, 0x77, 0x10, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x8C, 0x90, 0x00, 0x00, 0x00, 0x00, -0x46, 0x05, 0x59, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x6E, 0x90, 0x00, 0x00, 0x00, 0x00, -0x47, 0xEE, 0x75, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x50, 0x90, 0x00, 0x00, 0x00, 0x00, -0x49, 0xCE, 0x57, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x32, 0x90, 0x00, 0x00, 0x00, 0x00, -0x4B, 0xAE, 0x39, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x4F, 0x10, 0x00, 0x00, 0x00, 0x00, -0x4D, 0x8E, 0x1B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, -0x56, 0xF6, 0xCE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x07, 0x03, 0x03, 0x00, -0x00, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, -0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, -0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, -0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0xD8, 0xC0, 0x48, 0x01, 0xBF, 0xCB, 0x6A, 0x00, 0x00, 0x00, -0x14, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x36, 0x20, 0x2D, 0x20, 0x5A, 0x61, 0x62, 0x61, 0x79, 0x6B, -0x61, 0x6C, 0x73, 0x6B, 0x79, +0x04, 0x05, 0x04, 0x08, 0x07, 0x03, 0x00, 0x00, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, +0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, +0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, +0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, +0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, +0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xA1, 0xDB, 0xF9, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xC5, 0x00, 0x00, +0x00, 0x00, 0x00, 0x15, 0x27, 0x53, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x87, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x17, 0x08, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xBB, 0x60, 0x00, +0x00, 0x00, 0x00, 0x18, 0xE9, 0xBA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0xCC, 0x3F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x4C, 0x90, 0x00, +0x00, 0x00, 0x00, 0x1C, 0xAC, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x2E, 0x90, 0x00, +0x00, 0x00, 0x00, 0x1E, 0x8C, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x10, 0x90, 0x00, +0x00, 0x00, 0x00, 0x20, 0x6C, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xF2, 0x90, 0x00, +0x00, 0x00, 0x00, 0x22, 0x4B, 0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xD4, 0x90, 0x00, +0x00, 0x00, 0x00, 0x24, 0x2B, 0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xB6, 0x90, 0x00, +0x00, 0x00, 0x00, 0x26, 0x0B, 0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xD3, 0x10, 0x00, +0x00, 0x00, 0x00, 0x27, 0xF4, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xC3, 0x20, 0x00, +0x00, 0x00, 0x00, 0x29, 0x78, 0x6B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xA6, 0x10, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xC4, 0x97, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x88, 0x10, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xA4, 0x79, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x6A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x2E, 0x84, 0x5B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x4C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x30, 0x64, 0x3D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x68, 0x90, 0x00, +0x00, 0x00, 0x00, 0x32, 0x72, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x4A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x2C, 0x90, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x0E, 0x90, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xF0, 0x90, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xD2, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDA, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xEF, 0x10, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBA, 0xCA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xD1, 0x10, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9A, 0xAC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xB3, 0x10, 0x00, +0x00, 0x00, 0x00, 0x41, 0x83, 0xC8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x95, 0x10, 0x00, +0x00, 0x00, 0x00, 0x43, 0x63, 0xAA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x77, 0x10, 0x00, +0x00, 0x00, 0x00, 0x45, 0x43, 0x8C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x59, 0x10, 0x00, +0x00, 0x00, 0x00, 0x47, 0x23, 0x6E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x75, 0x90, 0x00, +0x00, 0x00, 0x00, 0x49, 0x03, 0x50, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x57, 0x90, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE3, 0x32, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x39, 0x90, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCC, 0x4F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x1B, 0x90, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4B, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF6, 0xCE, 0x20, 0x01, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x07, +0x03, 0x00, 0x00, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, +0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, +0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, +0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, +0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0xD8, 0xC0, 0x48, 0x01, 0xBF, 0xCB, 0x6A, 0x00, +0x00, 0x00, 0x14, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x36, 0x20, 0x2D, 0x20, 0x5A, 0x61, 0x62, 0x61, +0x79, 0x6B, 0x61, 0x6C, 0x73, 0x6B, 0x79, /* Asia/Choibalsan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x86, 0xD3, 0xE7, 0x28, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x86, 0xD3, 0xE7, 0x28, 0x0F, 0x0B, 0xDC, 0x90, 0x18, 0xE9, 0xC8, 0x80, 0x19, 0xDA, 0xEE, 0xE0, 0x1A, 0xCC, 0x3F, 0x70, 0x1B, 0xBC, 0x22, 0x60, 0x1C, 0xAC, 0x21, 0x70, 0x1D, 0x9C, 0x04, 0x60, 0x1E, 0x8C, 0x03, 0x70, 0x1F, 0x7B, 0xE6, 0x60, 0x20, 0x6B, 0xE5, 0x70, 0x21, 0x5B, 0xC8, 0x60, 0x22, 0x4B, 0xC7, 0x70, @@ -42317,53 +42601,52 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x3D, 0x94, 0x80, 0x80, 0x3E, 0x84, 0x7F, 0x90, 0x3F, 0x74, 0x62, 0x80, 0x40, 0x64, 0x61, 0x90, 0x41, 0x54, 0x44, 0x80, 0x42, 0x44, 0x43, 0x90, 0x43, 0x34, 0x26, 0x80, 0x44, 0x24, 0x25, 0x90, 0x45, 0x1D, 0x43, 0x00, 0x47, 0xEF, 0xAA, 0xF0, 0x55, 0x15, 0x9A, 0xA0, 0x56, 0x05, 0x61, 0x70, -0x56, 0xF5, 0x7C, 0xA0, 0x57, 0xE5, 0x43, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, +0x56, 0xF5, 0x7C, 0xA0, 0x57, 0xE5, 0x43, 0x70, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x02, 0x05, 0x02, 0x05, 0x02, 0x02, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x02, 0x05, 0x02, 0x05, 0x02, 0x00, 0x00, 0x6B, 0x58, 0x00, +0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x7E, +0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, +0x00, 0x70, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, +0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, +0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xD3, 0xE7, 0x28, 0x00, 0x00, 0x00, +0x00, 0x0F, 0x0B, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xC8, 0x80, 0x00, 0x00, 0x00, +0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x3F, 0x70, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xBC, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x9C, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x7B, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, +0x00, 0x21, 0x5B, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, +0x00, 0x23, 0x3B, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, +0x00, 0x25, 0x1B, 0x8C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, +0x00, 0x27, 0x04, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x28, 0xE4, 0x8A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC4, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x30, 0x64, 0x12, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, +0x00, 0x32, 0x4D, 0x2F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, +0x00, 0x34, 0x2D, 0x11, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, 0x00, 0x00, +0x00, 0x36, 0x0C, 0xF3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xE9, 0xA5, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xB4, 0x9E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA4, 0x9D, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3D, 0x94, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x84, 0x7F, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x74, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x64, 0x61, 0x90, 0x00, 0x00, 0x00, +0x00, 0x41, 0x54, 0x44, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x43, 0x90, 0x00, 0x00, 0x00, +0x00, 0x43, 0x34, 0x26, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x24, 0x25, 0x90, 0x00, 0x00, 0x00, +0x00, 0x45, 0x1D, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0xAA, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x55, 0x15, 0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x61, 0x70, 0x00, 0x00, 0x00, +0x00, 0x56, 0xF5, 0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x43, 0x70, 0x01, 0x02, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x02, 0x05, 0x02, 0x05, 0x02, 0x00, 0x00, 0x6B, 0x58, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x34, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xD3, -0xE7, 0x28, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, -0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, -0x3F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, -0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, -0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, -0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, -0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, -0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x8C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, -0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, -0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x8A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, -0x89, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, -0x6B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, -0x4D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, -0x2F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x12, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, -0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x2F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, -0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x11, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, -0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0C, 0xF3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xE9, -0xA5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0x9E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA4, -0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x84, -0x7F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x62, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x64, -0x61, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x44, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, -0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x26, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x24, -0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, -0xAA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x15, 0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, -0x61, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF5, 0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, -0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x02, 0x05, 0x02, 0x05, 0x02, 0x02, 0x00, 0x00, -0x6B, 0x58, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x10, 0x00, 0x00, 0x7E, 0x90, -0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, -0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0xD2, 0xAC, 0x4A, 0x01, 0xC1, 0x5F, 0x10, 0x00, 0x00, 0x00, -0x12, 0x44, 0x6F, 0x72, 0x6E, 0x6F, 0x64, 0x2C, 0x20, 0x53, 0x75, 0x6B, 0x68, 0x62, 0x61, 0x61, -0x74, 0x61, 0x72, +0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0xD2, 0xAC, 0x4A, 0x01, 0xC1, 0x5F, 0x10, 0x00, +0x00, 0x00, 0x12, 0x44, 0x6F, 0x72, 0x6E, 0x6F, 0x64, 0x2C, 0x20, 0x53, 0x75, 0x6B, 0x68, 0x62, +0x61, 0x61, 0x74, 0x61, 0x72, /* Asia/Chongqing */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -42444,58 +42727,56 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Colombo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x87, 0x9D, 0xBD, 0x1C, 0xCB, 0x5A, 0x1C, 0x28, 0xCC, 0x95, 0x2B, 0xA0, 0xD2, 0x75, 0x80, 0x38, -0x31, 0xA6, 0x00, 0x28, 0x32, 0x71, 0x00, 0x20, 0x44, 0x3F, 0xEA, 0x28, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x02, 0x05, 0x06, 0x02, 0x02, 0x00, 0x00, 0x4A, 0xDC, 0x00, 0x00, 0x00, -0x00, 0x4A, 0xE4, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, -0x0E, 0x00, 0x00, 0x5B, 0x68, 0x01, 0x12, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x12, 0x00, 0x00, 0x54, -0x60, 0x00, 0x0E, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, -0xFF, 0x56, 0xB6, 0x99, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x9D, 0xBD, 0x1C, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0x5A, 0x1C, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x2B, 0xA0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD2, 0x75, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x31, 0xA6, 0x00, 0x28, 0x00, 0x00, 0x00, -0x00, 0x32, 0x71, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x44, 0x3F, 0xEA, 0x28, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x05, 0x06, 0x02, 0x02, 0x00, 0x00, -0x4A, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x08, -0x00, 0x00, 0x54, 0x60, 0x01, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x01, 0x12, 0x00, 0x00, 0x5B, 0x68, -0x00, 0x12, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0E, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, -0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x3E, 0x2D, 0x35, -0x3A, 0x33, 0x30, 0x0A, 0x00, 0x93, 0xE8, 0x95, 0x01, 0x8C, 0x7F, 0xE8, 0x00, 0x00, 0x00, 0x00, - +0x31, 0xA6, 0x00, 0x28, 0x32, 0x71, 0x00, 0x20, 0x44, 0x3F, 0xEA, 0x28, 0x01, 0x02, 0x03, 0x04, +0x02, 0x05, 0x06, 0x02, 0x00, 0x00, 0x4A, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x00, 0x04, +0x00, 0x00, 0x4D, 0x58, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0E, 0x00, 0x00, 0x5B, 0x68, +0x01, 0x12, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x12, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0E, 0x00, 0x00, +0x4D, 0x58, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x99, 0x24, +0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x9D, 0xBD, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x5A, 0x1C, 0x28, +0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x2B, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x75, 0x80, 0x38, +0x00, 0x00, 0x00, 0x00, 0x31, 0xA6, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x32, 0x71, 0x00, 0x20, +0x00, 0x00, 0x00, 0x00, 0x44, 0x3F, 0xEA, 0x28, 0x01, 0x02, 0x03, 0x04, 0x02, 0x05, 0x06, 0x02, +0x00, 0x00, 0x4A, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x00, 0x04, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x01, 0x12, 0x00, 0x00, +0x5B, 0x68, 0x00, 0x12, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0E, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x08, +0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, +0x36, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x3E, +0x2D, 0x35, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0x93, 0xE8, 0x95, 0x01, 0x8C, 0x7F, 0xE8, 0x00, 0x00, +0x00, 0x00, /* Asia/Dacca */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x80, 0x00, 0x00, 0x00, 0xCA, 0xDB, 0x86, 0xB0, 0xCC, 0x05, 0x71, 0x18, 0xCC, 0x95, 0x32, 0xA8, 0xDD, 0xA8, 0xD2, 0x98, -0x4A, 0x3B, 0xC4, 0x10, 0x4B, 0x3C, 0xD8, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x54, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x04, -0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x0E, 0x00, 0x00, 0x54, 0x60, -0x00, 0x14, 0x00, 0x00, 0x62, 0x70, 0x01, 0x18, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, -0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4A, 0x3B, 0xC4, 0x10, 0x4B, 0x3C, 0xD8, 0x90, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x00, +0x00, 0x54, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, +0x08, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x0E, 0x00, 0x00, 0x54, 0x60, 0x00, 0x14, 0x00, 0x00, 0x62, +0x70, 0x01, 0x18, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, +0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, -0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0x86, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xDB, 0x86, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x05, 0x71, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x32, 0xA8, -0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA8, 0xD2, 0x98, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x3B, 0xC4, 0x10, -0x00, 0x00, 0x00, 0x00, 0x4B, 0x3C, 0xD8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x54, 0xC4, 0x00, 0x00, 0x00, 0x00, -0x52, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x0E, -0x00, 0x00, 0x54, 0x60, 0x00, 0x14, 0x00, 0x00, 0x62, 0x70, 0x01, 0x18, 0x4C, 0x4D, 0x54, 0x00, -0x48, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, -0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, -0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, +0x86, 0x86, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xDB, 0x86, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, +0x05, 0x71, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x32, 0xA8, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xA8, 0xD2, 0x98, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x3B, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, +0x3C, 0xD8, 0x90, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x00, 0x00, 0x54, 0xC4, 0x00, 0x00, +0x00, 0x00, 0x52, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x0E, 0x00, 0x00, 0x54, 0x60, 0x00, 0x14, 0x00, 0x00, 0x62, 0x70, 0x01, 0x18, 0x4C, 0x4D, +0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, +0x2D, 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Damascus */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xAB, 0x78, +0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xA1, 0xF2, 0xAB, 0x78, 0xA2, 0x81, 0x2F, 0x80, 0xA3, 0x5E, 0x9D, 0x70, 0xA4, 0x61, 0x11, 0x80, 0xA5, 0x3E, 0x7F, 0x70, 0xA6, 0x40, 0xF3, 0x80, 0xA7, 0x1E, 0x61, 0x70, 0xA8, 0x20, 0xD5, 0x80, 0xA9, 0x07, 0x7D, 0xF0, 0xF1, 0x8F, 0x52, 0x00, 0xF2, 0x5B, 0x9C, 0x70, 0xF3, 0x73, 0x28, 0x80, 0xF4, 0x3B, 0x7E, 0x70, @@ -42526,187 +42807,183 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x58, 0xDD, 0x7F, 0xE0, 0x59, 0xF2, 0x4C, 0xD0, 0x5A, 0xBD, 0x61, 0xE0, 0x5B, 0xD2, 0x2E, 0xD0, 0x5C, 0x9D, 0x43, 0xE0, 0x5D, 0xB2, 0x10, 0xD0, 0x5E, 0x7D, 0x25, 0xE0, 0x5F, 0x9B, 0x2D, 0x50, 0x60, 0x5D, 0x07, 0xE0, 0x61, 0x7B, 0x0F, 0x50, 0x62, 0x3C, 0xE9, 0xE0, 0x63, 0x5A, 0xF1, 0x50, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, -0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, -0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x04, 0x00, -0x00, 0x00, 0x11, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0xAB, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, -0x81, 0x2F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x5E, 0x9D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, -0x61, 0x11, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3E, 0x7F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, -0x40, 0xF3, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x1E, 0x61, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, -0x20, 0xD5, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA9, 0x07, 0x7D, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, -0x8F, 0x52, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x5B, 0x9C, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, -0x73, 0x28, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x3B, 0x7E, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, -0x55, 0xAD, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x54, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, -0x36, 0xE1, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x36, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, -0x0E, 0xDA, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xE1, 0xBB, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, -0xF9, 0x48, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xC2, 0xEF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, -0xDB, 0xCD, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xA5, 0x74, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, -0xBD, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x9E, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x67, 0xDB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x02, -0x7F, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x49, 0x0E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x04, -0x61, 0xEC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x2B, 0x93, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x06, -0x43, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x08, -0x24, 0x53, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0xED, 0xFA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0A, -0x05, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCF, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, -0xE8, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xB1, 0xB3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0D, -0xC9, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x6B, 0x59, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, -0xAA, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4C, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, -0xF4, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1A, -0xD7, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBD, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, -0x55, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8A, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, -0x47, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x89, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, -0x3C, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6B, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, -0x32, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, -0x15, 0x44, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, -0xF6, 0x5B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE7, 0x90, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, -0xE2, 0x1B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCA, 0x15, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, -0xB2, 0x2B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA3, 0x5F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2D, -0x9B, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8C, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, -0x7C, 0x7B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6D, 0xAF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x31, -0x5F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x50, 0x34, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, -0x3E, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x31, 0x68, 0x50, 0x00, 0x00, 0x00, 0x00, 0x35, -0x1E, 0xC4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x12, 0x9B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x37, -0x02, 0x9A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF3, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, -0xE5, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD6, 0x54, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, -0xC6, 0x53, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB7, 0x87, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3C, -0xA7, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x98, 0xBB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3E, -0x88, 0xBA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x79, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x40, -0x6B, 0x3F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x5C, 0x73, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x42, -0x4C, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3D, 0xA7, 0x50, 0x00, 0x00, 0x00, 0x00, 0x44, -0x2D, 0xA6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x12, 0xFD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x46, -0x0C, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x2A, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x47, -0xF5, 0x53, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0x0B, 0x71, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, -0xCB, 0xFA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xEA, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4B, -0xB5, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xC9, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4D, -0x94, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA9, 0xC6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4F, -0x74, 0xDB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x50, 0x89, 0xA8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x51, -0x54, 0xBD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x69, 0x8A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x53, -0x34, 0x9F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x52, 0xA6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x55, -0x14, 0x81, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x32, 0x88, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x56, -0xF4, 0x63, 0x60, 0x00, 0x00, 0x00, 0x00, 0x58, 0x12, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x58, -0xDD, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF2, 0x4C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5A, -0xBD, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD2, 0x2E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5C, -0x9D, 0x43, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB2, 0x10, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5E, -0x7D, 0x25, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x9B, 0x2D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x60, -0x5D, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7B, 0x0F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x62, -0x3C, 0xE9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5A, 0xF1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, -0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x22, -0x08, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, -0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, -0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, -0xBC, 0x72, 0x30, 0x01, 0x4A, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x00, 0x00, 0x22, 0x08, 0x00, 0x00, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x00, +0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, +0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, +0xFF, 0xFF, 0xA1, 0xF2, 0xAB, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x81, 0x2F, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xA3, 0x5E, 0x9D, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x61, 0x11, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xA5, 0x3E, 0x7F, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x40, 0xF3, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xA7, 0x1E, 0x61, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xA8, 0x20, 0xD5, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xA9, 0x07, 0x7D, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8F, 0x52, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xF2, 0x5B, 0x9C, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x73, 0x28, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xF4, 0x3B, 0x7E, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x55, 0xAD, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xF6, 0x1F, 0x54, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x36, 0xE1, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xF7, 0xFF, 0x36, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x0E, 0xDA, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xF9, 0xE1, 0xBB, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xF9, 0x48, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFB, 0xC2, 0xEF, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xDB, 0xCD, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFD, 0xA5, 0x74, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBD, 0x00, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x86, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x67, 0xDB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0x67, 0x80, 0x00, 0x00, +0x00, 0x00, 0x03, 0x49, 0x0E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x61, 0xEC, 0x80, 0x00, 0x00, +0x00, 0x00, 0x05, 0x2B, 0x93, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x43, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x07, 0x0C, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x53, 0x80, 0x00, 0x00, +0x00, 0x00, 0x08, 0xED, 0xFA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x87, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0xCF, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xE8, 0x0C, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0C, 0xB1, 0xB3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xC9, 0x3F, 0x80, 0x00, 0x00, +0x00, 0x00, 0x0E, 0x6B, 0x59, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xAA, 0x73, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0x4C, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0xF4, 0xC5, 0x00, 0x00, 0x00, +0x00, 0x00, 0x19, 0xDB, 0x6D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xD7, 0x4A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xBD, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x55, 0x23, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x8A, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x47, 0x7A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x21, 0x89, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x3C, 0x74, 0x00, 0x00, 0x00, +0x00, 0x00, 0x23, 0x6B, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x32, 0xBF, 0x80, 0x00, 0x00, +0x00, 0x00, 0x25, 0x25, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x15, 0x44, 0x80, 0x00, 0x00, +0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF6, 0x5B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x28, 0xE7, 0x90, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xE2, 0x1B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xCA, 0x15, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB2, 0x2B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA3, 0x5F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x9B, 0x47, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x8C, 0x7C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x7C, 0x7B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x30, 0x6D, 0xAF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5F, 0x00, 0x60, 0x00, 0x00, +0x00, 0x00, 0x32, 0x50, 0x34, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3E, 0xE2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x34, 0x31, 0x68, 0x50, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1E, 0xC4, 0x60, 0x00, 0x00, +0x00, 0x00, 0x36, 0x12, 0x9B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x37, 0x02, 0x9A, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x37, 0xF3, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE5, 0x1F, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x39, 0xD6, 0x54, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xC6, 0x53, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xB7, 0x87, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA7, 0x86, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x3D, 0x98, 0xBB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x88, 0xBA, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x79, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6B, 0x3F, 0x60, 0x00, 0x00, +0x00, 0x00, 0x41, 0x5C, 0x73, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4C, 0x72, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x43, 0x3D, 0xA7, 0x50, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2D, 0xA6, 0x60, 0x00, 0x00, +0x00, 0x00, 0x45, 0x12, 0xFD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0C, 0x36, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x47, 0x2A, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF5, 0x53, 0x60, 0x00, 0x00, +0x00, 0x00, 0x49, 0x0B, 0x71, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCB, 0xFA, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xEA, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB5, 0x17, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xC9, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x94, 0xF9, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4E, 0xA9, 0xC6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x74, 0xDB, 0x60, 0x00, 0x00, +0x00, 0x00, 0x50, 0x89, 0xA8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x51, 0x54, 0xBD, 0x60, 0x00, 0x00, +0x00, 0x00, 0x52, 0x69, 0x8A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x53, 0x34, 0x9F, 0x60, 0x00, 0x00, +0x00, 0x00, 0x54, 0x52, 0xA6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x14, 0x81, 0x60, 0x00, 0x00, +0x00, 0x00, 0x56, 0x32, 0x88, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF4, 0x63, 0x60, 0x00, 0x00, +0x00, 0x00, 0x58, 0x12, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDD, 0x7F, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x59, 0xF2, 0x4C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBD, 0x61, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xD2, 0x2E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x9D, 0x43, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5D, 0xB2, 0x10, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7D, 0x25, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x9B, 0x2D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5D, 0x07, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x61, 0x7B, 0x0F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3C, 0xE9, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x63, 0x5A, 0xF1, 0x50, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x00, +0x00, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, +0x09, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0D, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, +0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, +0x0A, 0x00, 0xBC, 0x72, 0x30, 0x01, 0x4A, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, /* Asia/Dhaka */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0x80, 0x00, 0x00, 0x00, 0xCA, 0xDB, 0x86, 0xB0, 0xCC, 0x05, 0x71, 0x18, 0xCC, 0x95, 0x32, 0xA8, 0xDD, 0xA8, 0xD2, 0x98, -0x4A, 0x3B, 0xC4, 0x10, 0x4B, 0x3C, 0xD8, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, -0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x54, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x04, -0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x0E, 0x00, 0x00, 0x54, 0x60, -0x00, 0x14, 0x00, 0x00, 0x62, 0x70, 0x01, 0x18, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, -0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4A, 0x3B, 0xC4, 0x10, 0x4B, 0x3C, 0xD8, 0x90, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x00, +0x00, 0x54, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x52, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, +0x08, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x0E, 0x00, 0x00, 0x54, 0x60, 0x00, 0x14, 0x00, 0x00, 0x62, +0x70, 0x01, 0x18, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, +0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x54, +0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, -0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0x86, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xDB, 0x86, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x05, 0x71, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x32, 0xA8, -0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xA8, 0xD2, 0x98, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x3B, 0xC4, 0x10, -0x00, 0x00, 0x00, 0x00, 0x4B, 0x3C, 0xD8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x54, 0xC4, 0x00, 0x00, 0x00, 0x00, -0x52, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x0E, -0x00, 0x00, 0x54, 0x60, 0x00, 0x14, 0x00, 0x00, 0x62, 0x70, 0x01, 0x18, 0x4C, 0x4D, 0x54, 0x00, -0x48, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, -0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, -0x0A, 0x00, 0xAD, 0x84, 0x92, 0x01, 0x9C, 0x9F, 0x82, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, +0x86, 0x86, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xDB, 0x86, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, +0x05, 0x71, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x32, 0xA8, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xA8, 0xD2, 0x98, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x3B, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, +0x3C, 0xD8, 0x90, 0x01, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x00, 0x00, 0x54, 0xC4, 0x00, 0x00, +0x00, 0x00, 0x52, 0xD0, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x0E, 0x00, 0x00, 0x54, 0x60, 0x00, 0x14, 0x00, 0x00, 0x62, 0x70, 0x01, 0x18, 0x4C, 0x4D, +0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, +0x2D, 0x36, 0x0A, 0x00, 0xAD, 0x84, 0x92, 0x01, 0x9C, 0x9F, 0x82, 0x00, 0x00, 0x00, 0x00, /* Asia/Dili */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xE6, 0x18, 0xC4, -0xCB, 0x99, 0x32, 0xF0, 0x0B, 0xEA, 0x30, 0x70, 0x39, 0xC3, 0x99, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, -0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xE6, 0x18, 0xC4, +0xCB, 0x99, 0x32, 0xF0, 0x0B, 0xEA, 0x30, 0x70, 0x39, 0xC3, 0x99, 0x00, 0x01, 0x02, 0x01, 0x02, +0x00, 0x00, 0x75, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x18, 0xC4, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x99, 0x32, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x0B, 0xEA, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC3, 0x99, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x75, 0xBC, -0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x39, 0x3E, -0x2D, 0x39, 0x0A, 0x00, 0x7C, 0x48, 0x68, 0x01, 0xD2, 0x48, 0x7D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, +0x18, 0xC4, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x99, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xEA, +0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC3, 0x99, 0x00, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, +0x75, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, +0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0x7C, 0x48, 0x68, 0x01, 0xD2, 0x48, 0x7D, 0x00, 0x00, 0x00, +0x00, /* Asia/Dubai */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xA1, 0xF2, 0x99, 0xA8, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x33, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xA1, 0xF2, 0x99, 0xA8, +0x01, 0x00, 0x00, 0x33, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x99, 0xA8, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x33, 0xD8, 0x00, 0x00, 0x00, 0x00, -0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xAF, 0xEF, 0x10, 0x01, 0x67, 0x0A, 0x10, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x99, 0xA8, 0x01, 0x00, 0x00, 0x33, 0xD8, 0x00, 0x00, +0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xAF, 0xEF, 0x10, 0x01, 0x67, 0x0A, 0x10, 0x00, +0x00, 0x00, 0x00, /* Asia/Dushanbe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x83, 0x80, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x83, 0x80, 0xB5, 0xA3, 0xEF, 0x30, 0x15, 0x27, 0x7D, 0xA0, 0x16, 0x18, 0xB2, 0x10, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xE5, 0x90, 0x18, 0xE9, 0xE4, 0xA0, 0x19, 0xDB, 0x19, 0x10, 0x1A, 0xCC, 0x69, 0xA0, 0x1B, 0xBC, 0x76, 0xC0, 0x1C, 0xAC, 0x67, 0xC0, 0x1D, 0x9C, 0x58, 0xC0, 0x1E, 0x8C, 0x49, 0xC0, 0x1F, 0x7C, 0x3A, 0xC0, 0x20, 0x6C, 0x2B, 0xC0, 0x21, 0x5C, 0x1C, 0xC0, 0x22, 0x4C, 0x0D, 0xC0, 0x23, 0x3B, 0xFE, 0xC0, 0x24, 0x2B, 0xEF, 0xC0, 0x25, 0x1B, 0xE0, 0xC0, 0x26, 0x0B, 0xD1, 0xC0, -0x27, 0x04, 0xFD, 0x40, 0x27, 0xF4, 0xEE, 0x40, 0x28, 0xCA, 0x8F, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x07, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, -0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, -0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, -0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, -0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0x19, 0x83, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, -0x00, 0x15, 0x27, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, -0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, -0x00, 0x18, 0xE9, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, -0x00, 0x1A, 0xCC, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x1C, 0xAC, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x1E, 0x8C, 0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x20, 0x6C, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x22, 0x4C, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x24, 0x2B, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x26, 0x0B, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, -0x00, 0x27, 0xF4, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xCA, 0x8F, 0x50, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x07, 0x00, 0x00, -0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, -0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, -0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, -0xC4, 0x33, 0xDD, 0x01, 0x7B, 0xA3, 0x80, 0x00, 0x00, 0x00, 0x00, +0x27, 0x04, 0xFD, 0x40, 0x27, 0xF4, 0xEE, 0x40, 0x28, 0xCA, 0x8F, 0x50, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x07, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, +0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, +0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, +0x46, 0x50, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x83, 0x80, +0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x7D, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, +0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xE4, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x69, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x67, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x49, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x2B, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x0D, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xEF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xD1, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xEE, 0x40, +0x00, 0x00, 0x00, 0x00, 0x28, 0xCA, 0x8F, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, +0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, +0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, +0x0A, 0x00, 0xC4, 0x33, 0xDD, 0x01, 0x7B, 0xA3, 0x80, 0x00, 0x00, 0x00, 0x00, /* Asia/Famagusta */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43192,27 +43469,26 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Ho_Chi_Minh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x43, 0x8A, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x43, 0x8A, 0x91, 0xA3, 0x2B, 0x0A, 0xCD, 0x35, 0xE6, 0x80, 0xD1, 0x59, 0xCE, 0x70, 0xD2, 0x3B, 0x3E, 0xF0, 0xD5, 0x32, 0xBB, 0x10, 0xE4, 0xB6, 0xE4, 0x80, 0xED, 0x2F, 0x98, 0x00, 0x0A, 0x3D, 0xC7, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, -0x63, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, -0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, -0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x8C, 0x43, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, -0xA3, 0x2B, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x35, 0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, -0x59, 0xCE, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x3B, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, -0x32, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xB6, 0xE4, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, -0x2F, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3D, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x63, -0xF6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, -0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, -0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, -0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, -0x99, 0xBB, 0x78, 0x01, 0xB5, 0x6B, 0x2A, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x00, 0x00, +0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, +0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, +0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, +0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, +0xFF, 0xFF, 0x88, 0x8C, 0x43, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xA3, 0x2B, 0x0A, 0xFF, 0xFF, +0xFF, 0xFF, 0xCD, 0x35, 0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x59, 0xCE, 0x70, 0xFF, 0xFF, +0xFF, 0xFF, 0xD2, 0x3B, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x32, 0xBB, 0x10, 0xFF, 0xFF, +0xFF, 0xFF, 0xE4, 0xB6, 0xE4, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x2F, 0x98, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x3D, 0xC7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, +0x00, 0x63, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, +0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, +0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, +0x0A, 0x00, 0x99, 0xBB, 0x78, 0x01, 0xB5, 0x6B, 0x2A, 0x00, 0x00, 0x00, 0x00, /* Asia/Hong_Kong */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x48, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43297,7 +43573,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Hovd */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD3, 0xFC, 0x94, +0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD3, 0xFC, 0x94, 0x0F, 0x0B, 0xEA, 0xA0, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x1B, 0xBC, 0x3E, 0x80, 0x1C, 0xAC, 0x3D, 0x90, 0x1D, 0x9C, 0x20, 0x80, 0x1E, 0x8C, 0x1F, 0x90, 0x1F, 0x7C, 0x02, 0x80, 0x20, 0x6C, 0x01, 0x90, 0x21, 0x5B, 0xE4, 0x80, 0x22, 0x4B, 0xE3, 0x90, @@ -43310,56 +43586,55 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x3D, 0x94, 0x9C, 0xA0, 0x3E, 0x84, 0x9B, 0xB0, 0x3F, 0x74, 0x7E, 0xA0, 0x40, 0x64, 0x7D, 0xB0, 0x41, 0x54, 0x60, 0xA0, 0x42, 0x44, 0x5F, 0xB0, 0x43, 0x34, 0x42, 0xA0, 0x44, 0x24, 0x41, 0xB0, 0x45, 0x1D, 0x5F, 0x20, 0x55, 0x15, 0xA8, 0xB0, 0x56, 0x05, 0x6F, 0x80, 0x56, 0xF5, 0x8A, 0xB0, -0x57, 0xE5, 0x51, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x57, 0xE5, 0x51, 0x80, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x55, 0xEC, 0x00, -0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, -0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, -0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x55, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, +0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0x86, 0xD3, 0xFC, 0x94, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xEA, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x3E, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x20, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x02, 0x80, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6C, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xE4, 0x80, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xC6, 0x80, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xA8, 0x80, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xC5, 0x00, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x89, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x6B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0x6A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x4D, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x2F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x4B, 0x80, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x4A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x2D, 0x80, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x2C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x0F, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xE9, 0xC1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0xBA, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA4, 0xB9, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x9C, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x84, 0x9B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x7E, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x40, 0x64, 0x7D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x60, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x42, 0x44, 0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x42, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x44, 0x24, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x5F, 0x20, 0x00, -0x00, 0x00, 0x00, 0x55, 0x15, 0xA8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x6F, 0x80, 0x00, -0x00, 0x00, 0x00, 0x56, 0xF5, 0x8A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x51, 0x80, 0x00, -0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x55, 0xEC, 0x00, 0x00, -0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xD2, 0x98, 0xC2, 0x01, -0x9E, 0x81, 0x47, 0x00, 0x00, 0x00, 0x2B, 0x42, 0x61, 0x79, 0x61, 0x6E, 0x2D, 0x4F, 0x6C, 0x67, -0x69, 0x79, 0x2C, 0x20, 0x47, 0x6F, 0x76, 0x69, 0x2D, 0x41, 0x6C, 0x74, 0x61, 0x69, 0x2C, 0x20, -0x48, 0x6F, 0x76, 0x64, 0x2C, 0x20, 0x55, 0x76, 0x73, 0x2C, 0x20, 0x5A, 0x61, 0x76, 0x6B, 0x68, -0x61, 0x6E, +0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xD3, +0xFC, 0x94, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xEA, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, +0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xE4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xC6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, +0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, +0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, +0x6A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, +0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, +0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x4B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0x4A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x2D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, +0x2C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xE9, +0xC1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0xBA, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA4, +0xB9, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x9C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x84, +0x9B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x7E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x64, +0x7D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x60, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, +0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x42, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x24, +0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x5F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x55, 0x15, +0xA8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x6F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF5, +0x8A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x51, 0x80, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x55, 0xEC, +0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, +0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xD2, 0x98, +0xC2, 0x01, 0x9E, 0x81, 0x47, 0x00, 0x00, 0x00, 0x2B, 0x42, 0x61, 0x79, 0x61, 0x6E, 0x2D, 0x4F, +0x6C, 0x67, 0x69, 0x79, 0x2C, 0x20, 0x47, 0x6F, 0x76, 0x69, 0x2D, 0x41, 0x6C, 0x74, 0x61, 0x69, +0x2C, 0x20, 0x48, 0x6F, 0x76, 0x64, 0x2C, 0x20, 0x55, 0x76, 0x73, 0x2C, 0x20, 0x5A, 0x61, 0x76, +0x6B, 0x68, 0x61, 0x6E, /* Asia/Irkutsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xA2, 0x12, 0x0F, 0xBF, 0xB5, 0xA3, 0xD3, 0x10, 0x15, 0x27, 0x61, 0x80, 0x16, 0x18, 0x95, 0xF0, 0x17, 0x08, 0x95, 0x00, 0x17, 0xF9, 0xC9, 0x70, 0x18, 0xE9, 0xC8, 0x80, 0x19, 0xDA, 0xFC, 0xF0, 0x1A, 0xCC, 0x4D, 0x80, 0x1B, 0xBC, 0x5A, 0xA0, 0x1C, 0xAC, 0x4B, 0xA0, 0x1D, 0x9C, 0x3C, 0xA0, @@ -43376,73 +43651,72 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0xB8, 0xA0, 0x44, 0x25, 0x85, 0x20, 0x45, 0x43, 0x9A, 0xA0, 0x46, 0x05, 0x67, 0x20, 0x47, 0x23, 0x7C, 0xA0, 0x47, 0xEE, 0x83, 0xA0, 0x49, 0x03, 0x5E, 0xA0, 0x49, 0xCE, 0x65, 0xA0, 0x4A, 0xE3, 0x40, 0xA0, 0x4B, 0xAE, 0x47, 0xA0, 0x4C, 0xCC, 0x5D, 0x20, 0x4D, 0x8E, 0x29, 0xA0, -0x54, 0x4B, 0xD7, 0x10, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, -0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x54, 0x4B, 0xD7, 0x10, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x05, 0x00, 0x00, 0x61, 0xC1, 0x00, -0x00, 0x00, 0x00, 0x61, 0xC1, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x7E, -0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, -0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x10, 0x00, 0x00, 0x62, 0x70, 0x00, -0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, -0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x82, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x12, 0x0F, 0xBF, 0xFF, -0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xD3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x61, 0x80, 0x00, -0x00, 0x00, 0x00, 0x16, 0x18, 0x95, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x95, 0x00, 0x00, -0x00, 0x00, 0x00, 0x17, 0xF9, 0xC9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xC8, 0x80, 0x00, -0x00, 0x00, 0x00, 0x19, 0xDA, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x4D, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xBC, 0x5A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x4B, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1D, 0x9C, 0x3C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x2D, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x7C, 0x1E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x0F, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x21, 0x5C, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xF1, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x23, 0x3B, 0xE2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xD3, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x25, 0x1B, 0xC4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xB5, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x27, 0x04, 0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xD2, 0x20, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE4, 0xD1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x79, 0x30, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xB4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xA5, 0x20, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0x96, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x87, 0x20, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x69, 0x20, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0x5A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x4B, 0x20, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x51, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x33, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x15, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x36, 0xFD, 0x1C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x32, 0x20, 0x00, -0x00, 0x00, 0x00, 0x38, 0xDC, 0xFE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x14, 0x20, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xBC, 0xE0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xF6, 0x20, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA5, 0xFD, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xD8, 0x20, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x85, 0xDF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xBA, 0x20, 0x00, -0x00, 0x00, 0x00, 0x40, 0x65, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xD6, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x42, 0x45, 0xA3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xB8, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x44, 0x25, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x9A, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x46, 0x05, 0x67, 0x20, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x7C, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x47, 0xEE, 0x83, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x5E, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x49, 0xCE, 0x65, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x40, 0xA0, 0x00, -0x00, 0x00, 0x00, 0x4B, 0xAE, 0x47, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x5D, 0x20, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x8E, 0x29, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xD7, 0x10, 0x00, -0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x05, 0x00, 0x00, 0x61, 0xC1, 0x00, 0x00, -0x00, 0x00, 0x61, 0xC1, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, -0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, -0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x10, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, -0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, -0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0xD9, 0x14, 0xEA, 0x01, -0xB1, 0xDB, 0xB5, 0x00, 0x00, 0x00, 0x1A, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x35, 0x20, 0x2D, 0x20, -0x49, 0x72, 0x6B, 0x75, 0x74, 0x73, 0x6B, 0x2C, 0x20, 0x42, 0x75, 0x72, 0x79, 0x61, 0x74, 0x69, -0x61, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x00, 0x00, 0x61, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x61, 0xC1, +0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, +0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, +0x00, 0x00, 0x70, 0x80, 0x01, 0x10, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x4C, 0x4D, +0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, +0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, +0x82, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x12, 0x0F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, +0xD3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x61, 0x80, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, +0x95, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, +0xC9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, +0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x4D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, +0x5A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x4B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, +0x3C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x2D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, +0x1E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x0F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, +0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xF1, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, +0xE2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xD3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, +0xC4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xB5, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, +0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xD2, 0x20, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, +0xD1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, +0xB4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xA5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, +0x96, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x87, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, +0x78, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x69, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, +0x5A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x4B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, +0x76, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0x58, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, +0x3A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x15, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, +0x1C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x32, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, +0xFE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, +0xE0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xF6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, +0xFD, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xD8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, +0xDF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xBA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, +0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xD6, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, +0xA3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xB8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, +0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, +0x67, 0x20, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, +0x83, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x5E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, +0x65, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x40, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, +0x47, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x5D, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, +0x29, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xD7, 0x10, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x00, 0x00, 0x61, 0xC1, +0x00, 0x00, 0x00, 0x00, 0x61, 0xC1, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, +0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, +0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x10, 0x00, 0x00, 0x62, 0x70, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, +0x70, 0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0xD9, 0x14, +0xEA, 0x01, 0xB1, 0xDB, 0xB5, 0x00, 0x00, 0x00, 0x1A, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x35, 0x20, +0x2D, 0x20, 0x49, 0x72, 0x6B, 0x75, 0x74, 0x73, 0x6B, 0x2C, 0x20, 0x42, 0x75, 0x72, 0x79, 0x61, +0x74, 0x69, 0x61, /* Asia/Istanbul */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x90, 0x8B, 0xF5, 0x98, 0x9B, 0x0C, 0x17, 0x60, 0x9B, 0xD5, 0xBE, 0xD0, 0xA2, 0x65, 0x63, 0xE0, 0xA3, 0x7B, 0x82, 0x50, 0xA4, 0x4E, 0x80, 0x60, 0xA5, 0x3F, 0xB4, 0xD0, 0xA6, 0x25, 0x27, 0xE0, 0xA7, 0x27, 0x7F, 0xD0, 0xAA, 0x28, 0x28, 0x60, 0xAA, 0xE1, 0xFD, 0xD0, 0xAB, 0xF9, 0x89, 0xE0, @@ -43471,98 +43745,97 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8F, 0xDD, 0x90, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x38, 0xBE, 0x10, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x3E, 0x9E, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x57, 0xCF, 0x2E, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, +0x56, 0xF7, 0x30, 0x90, 0x57, 0xCF, 0x2E, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, 0x06, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, 0x04, -0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, -0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, -0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, -0xFF, 0x56, 0xB6, 0xC8, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x8B, 0xF5, 0x98, 0xFF, 0xFF, 0xFF, -0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xBE, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xA2, 0x65, 0x63, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x7B, 0x82, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xA4, 0x4E, 0x80, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3F, 0xB4, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xA6, 0x25, 0x27, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x27, 0x7F, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0x28, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE1, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAB, 0xF9, 0x89, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x31, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xC8, 0x81, 0x3F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x13, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xC9, 0x4A, 0xF5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCE, 0x80, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0xCB, 0xAE, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x6B, 0x09, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xD3, 0xA2, 0x39, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x02, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xD5, 0x4C, 0x0D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0x7B, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD7, 0x2B, 0xEF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x5D, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD9, 0x02, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x3F, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xDA, 0xEB, 0xB3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xD2, 0x5C, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xDC, 0xD4, 0xD0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x3E, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xF1, 0xF4, 0xB9, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x62, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xF5, 0x68, 0x06, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x38, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x06, 0x6E, 0x93, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x39, 0x9A, 0x70, 0x00, 0x00, 0x00, -0x00, 0x07, 0xFB, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x7C, 0x70, 0x00, 0x00, 0x00, -0x00, 0x09, 0xD0, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF9, 0x5E, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0B, 0xB1, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0x40, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0D, 0xA4, 0x55, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xA6, 0xAD, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x11, 0x50, 0x00, 0x00, 0x00, -0x00, 0x19, 0x89, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDC, 0xB0, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xE6, 0xD0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xC6, 0xEF, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9B, 0x31, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, -0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x83, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, -0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, -0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, -0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, -0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, -0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, -0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, -0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, -0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8F, 0xDD, 0x90, 0x00, 0x00, 0x00, -0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, -0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, -0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x38, 0xBE, 0x10, 0x00, 0x00, 0x00, -0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, -0x00, 0x56, 0x3E, 0x9E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, -0x00, 0x57, 0xCF, 0x2E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, -0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, -0x00, 0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, -0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, -0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, +0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x15, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, +0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, +0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xD8, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x8B, 0xF5, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xBE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x65, 0x63, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x7B, 0x82, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x4E, 0x80, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3F, 0xB4, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x25, 0x27, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x27, 0x7F, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x28, 0x28, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE1, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xF9, 0x89, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x3F, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x13, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x4A, 0xF5, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCE, 0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xCB, 0xAE, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x6B, 0x09, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xA2, 0x39, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x02, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x4C, 0x0D, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0x7B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2B, 0xEF, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x5D, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0x97, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x3F, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xB3, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xD2, 0x5C, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xD4, 0xD0, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x3E, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF4, 0xB9, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x62, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x68, 0x06, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x38, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x6E, 0x93, 0x70, +0x00, 0x00, 0x00, 0x00, 0x07, 0x39, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFB, 0x75, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0xD0, 0xCB, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0A, 0xF9, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xB1, 0xFE, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xA4, 0x55, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0E, 0xA6, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0x89, 0xB0, 0x70, +0x00, 0x00, 0x00, 0x00, 0x19, 0xDC, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE6, 0xD0, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xC6, 0xEF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9B, 0x31, 0x70, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, +0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x83, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, +0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, +0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, +0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, +0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4D, 0x8F, 0xDD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, +0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, +0x00, 0x00, 0x00, 0x00, 0x53, 0x38, 0xBE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, +0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x3E, 0x9E, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x57, 0xCF, 0x2E, 0x50, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, +0x05, 0x04, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, +0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, +0x00, 0x2A, 0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Jakarta */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43768,23 +44041,22 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Kabul */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x80, 0x00, 0x00, 0x00, -0xD0, 0xF9, 0xD7, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x40, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x48, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x34, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x80, 0x00, 0x00, 0x00, +0xD0, 0xF9, 0xD7, 0x40, 0x01, 0x02, 0x00, 0x00, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, +0x00, 0x04, 0x00, 0x00, 0x3F, 0x48, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, +0x2B, 0x30, 0x34, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0x9A, 0xA0, 0xFF, -0xFF, 0xFF, 0xFF, 0xD0, 0xF9, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x02, 0x00, 0x00, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, -0x3F, 0x48, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x34, 0x33, -0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x33, 0x30, 0x3E, 0x2D, 0x34, 0x3A, 0x33, 0x30, 0x0A, -0x00, 0xBD, 0xFF, 0x52, 0x01, 0x7C, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0x9A, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xF9, +0xD7, 0x40, 0x01, 0x02, 0x00, 0x00, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, +0x00, 0x00, 0x3F, 0x48, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, +0x34, 0x33, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x33, 0x30, 0x3E, 0x2D, 0x34, 0x3A, 0x33, +0x30, 0x0A, 0x00, 0xBD, 0xFF, 0x52, 0x01, 0x7C, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, /* Asia/Kamchatka */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xA7, 0x52, 0x96, 0xC4, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xA7, 0x52, 0x96, 0xC4, 0xB5, 0xA3, 0x9A, 0xD0, 0x15, 0x27, 0x29, 0x40, 0x16, 0x18, 0x5D, 0xB0, 0x17, 0x08, 0x5C, 0xC0, 0x17, 0xF9, 0x91, 0x30, 0x18, 0xE9, 0x90, 0x40, 0x19, 0xDA, 0xC4, 0xB0, 0x1A, 0xCC, 0x15, 0x40, 0x1B, 0xBC, 0x22, 0x60, 0x1C, 0xAC, 0x13, 0x60, 0x1D, 0x9C, 0x04, 0x60, 0x1E, 0x8B, 0xF5, 0x60, @@ -43800,63 +44072,62 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x40, 0x65, 0x88, 0xE0, 0x41, 0x83, 0x9E, 0x60, 0x42, 0x45, 0x6A, 0xE0, 0x43, 0x63, 0x80, 0x60, 0x44, 0x25, 0x4C, 0xE0, 0x45, 0x43, 0x62, 0x60, 0x46, 0x05, 0x2E, 0xE0, 0x47, 0x23, 0x44, 0x60, 0x47, 0xEE, 0x4B, 0x60, 0x49, 0x03, 0x26, 0x60, 0x49, 0xCE, 0x2D, 0x60, 0x4A, 0xE3, 0x08, 0x60, -0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x00, 0x00, 0x94, 0xBC, +0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x08, 0x00, 0x00, +0xA8, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x08, +0x00, 0x00, 0xA8, 0xC0, 0x01, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, +0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x52, 0x96, 0xC4, 0xFF, +0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0x9A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x29, 0x40, 0x00, +0x00, 0x00, 0x00, 0x16, 0x18, 0x5D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x5C, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x17, 0xF9, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0x90, 0x40, 0x00, +0x00, 0x00, 0x00, 0x19, 0xDA, 0xC4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x15, 0x40, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xBC, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x13, 0x60, 0x00, +0x00, 0x00, 0x00, 0x1D, 0x9C, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8B, 0xF5, 0x60, 0x00, +0x00, 0x00, 0x00, 0x1F, 0x7B, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xD7, 0x60, 0x00, +0x00, 0x00, 0x00, 0x21, 0x5B, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xB9, 0x60, 0x00, +0x00, 0x00, 0x00, 0x23, 0x3B, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0x9B, 0x60, 0x00, +0x00, 0x00, 0x00, 0x25, 0x1B, 0x8C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x7D, 0x60, 0x00, +0x00, 0x00, 0x00, 0x27, 0x04, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0x99, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x40, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x29, 0xD4, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x6C, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0x5D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x4E, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x30, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0x21, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x12, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0x3E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x19, 0x60, 0x00, +0x00, 0x00, 0x00, 0x33, 0x3D, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x51, 0xFB, 0x60, 0x00, +0x00, 0x00, 0x00, 0x35, 0x1D, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xDD, 0x60, 0x00, +0x00, 0x00, 0x00, 0x36, 0xFC, 0xE4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1A, 0xF9, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x38, 0xDC, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, 0xDB, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xBC, 0xA8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xBD, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x3C, 0xA5, 0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0x9F, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x85, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x81, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x40, 0x65, 0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0x9E, 0x60, 0x00, +0x00, 0x00, 0x00, 0x42, 0x45, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x80, 0x60, 0x00, +0x00, 0x00, 0x00, 0x44, 0x25, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x62, 0x60, 0x00, +0x00, 0x00, 0x00, 0x46, 0x05, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x44, 0x60, 0x00, +0x00, 0x00, 0x00, 0x47, 0xEE, 0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x26, 0x60, 0x00, +0x00, 0x00, 0x00, 0x49, 0xCE, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x08, 0x60, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xAE, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, -0x04, 0x00, 0x00, 0x94, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0xB6, -0xD0, 0x01, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x00, -0x00, 0xB6, 0xD0, 0x01, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, -0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, -0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, -0xA7, 0x52, 0x96, 0xC4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0x9A, 0xD0, 0x00, 0x00, 0x00, 0x00, -0x15, 0x27, 0x29, 0x40, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x5D, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x17, 0x08, 0x5C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0x91, 0x30, 0x00, 0x00, 0x00, 0x00, -0x18, 0xE9, 0x90, 0x40, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xC4, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1A, 0xCC, 0x15, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x22, 0x60, 0x00, 0x00, 0x00, 0x00, -0x1C, 0xAC, 0x13, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x8B, 0xF5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xE6, 0x60, 0x00, 0x00, 0x00, 0x00, -0x20, 0x6B, 0xD7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xC8, 0x60, 0x00, 0x00, 0x00, 0x00, -0x22, 0x4B, 0xB9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xAA, 0x60, 0x00, 0x00, 0x00, 0x00, -0x24, 0x2B, 0x9B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x8C, 0x60, 0x00, 0x00, 0x00, 0x00, -0x26, 0x0B, 0x7D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x27, 0xF4, 0x99, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x29, 0x78, 0x40, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x7B, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xC4, 0x6C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x5D, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x2C, 0xA4, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x84, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x21, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x30, 0x64, 0x12, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x3E, 0x60, 0x00, 0x00, 0x00, 0x00, -0x32, 0x72, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, -0x34, 0x51, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, -0x36, 0x31, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xE4, 0x60, 0x00, 0x00, 0x00, 0x00, -0x38, 0x1A, 0xF9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, -0x39, 0xFA, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xA8, 0x60, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xDA, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x3D, 0xBA, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x9A, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x41, 0x83, 0x9E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x43, 0x63, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x45, 0x43, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x47, 0x23, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, -0x49, 0x03, 0x26, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xE3, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, -0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x06, 0x07, 0x04, 0x04, 0x00, 0x00, 0x94, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, -0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0xA8, -0xC0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x0C, 0x00, -0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0xDA, -0x39, 0xE2, 0x02, 0x04, 0xBD, 0x28, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x39, -0x20, 0x2D, 0x20, 0x4B, 0x61, 0x6D, 0x63, 0x68, 0x61, 0x74, 0x6B, 0x61, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x00, 0x00, 0x94, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x9A, +0xB0, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x00, +0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, +0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, +0x00, 0xDA, 0x39, 0xE2, 0x02, 0x04, 0xBD, 0x28, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x4B, 0x2B, +0x30, 0x39, 0x20, 0x2D, 0x20, 0x4B, 0x61, 0x6D, 0x63, 0x68, 0x61, 0x74, 0x6B, 0x61, /* Asia/Karachi */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -43888,55 +44159,52 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Kashgar */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xB0, 0xFE, 0xBA, 0x64, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xB0, 0xFE, 0xBA, 0x64, +0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xFE, 0xBA, 0x64, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x54, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xFE, 0xBA, 0x64, 0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, +0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, /* Asia/Kathmandu */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x7D, 0x84, -0x1E, 0x18, 0x30, 0xA8, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, 0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x7D, -0x84, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x30, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, -0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, -0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x3E, 0x2D, 0x35, -0x3A, 0x34, 0x35, 0x0A, 0x00, 0xB3, 0x9F, 0x12, 0x01, 0x94, 0xD7, 0x52, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x7D, 0x84, +0x1E, 0x18, 0x30, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x04, 0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x7D, 0x84, 0x00, 0x00, 0x00, 0x00, +0x1E, 0x18, 0x30, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x04, 0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x3E, +0x2D, 0x35, 0x3A, 0x34, 0x35, 0x0A, 0x00, 0xB3, 0x9F, 0x12, 0x01, 0x94, 0xD7, 0x52, 0x00, 0x00, +0x00, 0x00, /* Asia/Katmandu */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x7D, 0x84, -0x1E, 0x18, 0x30, 0xA8, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, 0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x7D, -0x84, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x30, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, -0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, -0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x3E, 0x2D, 0x35, -0x3A, 0x34, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF2, 0x7D, 0x84, +0x1E, 0x18, 0x30, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x04, 0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x7D, 0x84, 0x00, 0x00, 0x00, 0x00, +0x1E, 0x18, 0x30, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x04, 0x00, 0x00, 0x50, 0xDC, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x34, 0x35, 0x3E, +0x2D, 0x35, 0x3A, 0x34, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* Asia/Khandyga */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x14, 0xA1, 0xDB, 0xE4, 0xEB, +0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x14, 0xA1, 0xDB, 0xE4, 0xEB, 0xB5, 0xA3, 0xC5, 0x00, 0x15, 0x27, 0x53, 0x70, 0x16, 0x18, 0x87, 0xE0, 0x17, 0x08, 0x86, 0xF0, 0x17, 0xF9, 0xBB, 0x60, 0x18, 0xE9, 0xBA, 0x70, 0x19, 0xDA, 0xEE, 0xE0, 0x1A, 0xCC, 0x3F, 0x70, 0x1B, 0xBC, 0x4C, 0x90, 0x1C, 0xAC, 0x3D, 0x90, 0x1D, 0x9C, 0x2E, 0x90, 0x1E, 0x8C, 0x1F, 0x90, @@ -43953,70 +44221,69 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0x9C, 0x80, 0x44, 0x25, 0x69, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x46, 0x05, 0x4B, 0x00, 0x47, 0x23, 0x60, 0x80, 0x47, 0xEE, 0x67, 0x80, 0x49, 0x03, 0x42, 0x80, 0x49, 0xCE, 0x49, 0x80, 0x4A, 0xE3, 0x24, 0x80, 0x4B, 0xAE, 0x2B, 0x80, 0x4C, 0xCC, 0x41, 0x00, 0x4D, 0x8E, 0x0D, 0x80, -0x4E, 0x6E, 0x02, 0x50, 0x54, 0x4B, 0xC9, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x0A, 0x08, 0x09, -0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0B, 0x09, 0x04, 0x04, -0x00, 0x00, 0x7F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, -0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, -0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, -0x00, 0x00, 0x9A, 0xB0, 0x01, 0x10, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, -0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, -0xDB, 0xE4, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, -0x27, 0x53, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x87, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, -0x08, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xBB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, -0xE9, 0xBA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1A, -0xCC, 0x3F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x4C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, -0xAC, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x2E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, -0x8C, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x10, 0x90, 0x00, 0x00, 0x00, 0x00, 0x20, -0x6C, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xF2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x22, -0x4B, 0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xD4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x24, -0x2B, 0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xB6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x26, -0x0B, 0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xD3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, -0xF4, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xC3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, -0x78, 0x6B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xC4, 0x97, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2C, -0xA4, 0x79, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x6A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2E, -0x84, 0x5B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, -0x64, 0x3D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x32, -0x72, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x4A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x34, -0x52, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x2C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, -0x32, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x0E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, -0x1B, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xF0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x39, -0xFB, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xDA, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xEF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3D, -0xBA, 0xCA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xD1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x9A, 0xAC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF2, 0xE4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, -0x65, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xBA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, -0x45, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x9C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, -0x25, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, -0x05, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, -0xEE, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, -0xCE, 0x49, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, -0xAE, 0x2B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, -0x8E, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x6E, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x54, -0x4B, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x0A, 0x08, 0x09, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0B, 0x09, 0x04, 0x04, 0x00, -0x00, 0x7F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, -0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, -0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, -0x00, 0x9A, 0xB0, 0x01, 0x10, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0xE8, 0xEF, 0x66, 0x01, 0xE1, 0x7F, 0x3C, 0x00, -0x00, 0x00, 0x1E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x36, 0x20, 0x2D, 0x20, 0x54, 0x6F, 0x6D, 0x70, -0x6F, 0x6E, 0x73, 0x6B, 0x79, 0x2C, 0x20, 0x55, 0x73, 0x74, 0x2D, 0x4D, 0x61, 0x79, 0x73, 0x6B, -0x79, +0x4E, 0x6E, 0x02, 0x50, 0x54, 0x4B, 0xC9, 0x00, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x0A, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, +0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0B, 0x09, 0x04, 0x00, 0x00, 0x7F, 0x15, 0x00, +0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, +0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, +0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x01, +0x10, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x9A, +0xB0, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, +0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, +0x00, 0x0D, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xDB, 0xE4, 0xEB, 0xFF, 0xFF, +0xFF, 0xFF, 0xB5, 0xA3, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x53, 0x70, 0x00, 0x00, +0x00, 0x00, 0x16, 0x18, 0x87, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x86, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x17, 0xF9, 0xBB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xBA, 0x70, 0x00, 0x00, +0x00, 0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x3F, 0x70, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xBC, 0x4C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x3D, 0x90, 0x00, 0x00, +0x00, 0x00, 0x1D, 0x9C, 0x2E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x1F, 0x90, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x7C, 0x10, 0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x01, 0x90, 0x00, 0x00, +0x00, 0x00, 0x21, 0x5B, 0xF2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xE3, 0x90, 0x00, 0x00, +0x00, 0x00, 0x23, 0x3B, 0xD4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xC5, 0x90, 0x00, 0x00, +0x00, 0x00, 0x25, 0x1B, 0xB6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xA7, 0x90, 0x00, 0x00, +0x00, 0x00, 0x27, 0x04, 0xD3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xC4, 0x10, 0x00, 0x00, +0x00, 0x00, 0x28, 0xE4, 0xC3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x6B, 0x20, 0x00, 0x00, +0x00, 0x00, 0x29, 0xD4, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x97, 0x10, 0x00, 0x00, +0x00, 0x00, 0x2B, 0xB4, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x79, 0x10, 0x00, 0x00, +0x00, 0x00, 0x2D, 0x94, 0x6A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x5B, 0x10, 0x00, 0x00, +0x00, 0x00, 0x2F, 0x74, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x3D, 0x10, 0x00, 0x00, +0x00, 0x00, 0x31, 0x5D, 0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x43, 0x90, 0x00, 0x00, +0x00, 0x00, 0x33, 0x3D, 0x4A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x25, 0x90, 0x00, 0x00, +0x00, 0x00, 0x35, 0x1D, 0x2C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x07, 0x90, 0x00, 0x00, +0x00, 0x00, 0x36, 0xFD, 0x0E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x24, 0x10, 0x00, 0x00, +0x00, 0x00, 0x38, 0xDC, 0xF0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x06, 0x10, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xBC, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xE8, 0x10, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xA5, 0xEF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xCA, 0x10, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x85, 0xD1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xAC, 0x10, 0x00, 0x00, +0x00, 0x00, 0x3F, 0xF2, 0xE4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xA5, 0x00, 0x00, 0x00, +0x00, 0x00, 0x41, 0x83, 0xBA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x87, 0x00, 0x00, 0x00, +0x00, 0x00, 0x43, 0x63, 0x9C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x69, 0x00, 0x00, 0x00, +0x00, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x4B, 0x00, 0x00, 0x00, +0x00, 0x00, 0x47, 0x23, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x67, 0x80, 0x00, 0x00, +0x00, 0x00, 0x49, 0x03, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x49, 0x80, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xE3, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x2B, 0x80, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xCC, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x00, 0x00, +0x00, 0x00, 0x4E, 0x6E, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xC9, 0x00, 0x01, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x0A, +0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x0B, 0x09, +0x04, 0x00, 0x00, 0x7F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, +0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, +0x04, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x10, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, +0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0xE8, 0xEF, 0x66, 0x01, 0xE1, 0x7F, +0x3C, 0x00, 0x00, 0x00, 0x1E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x36, 0x20, 0x2D, 0x20, 0x54, 0x6F, +0x6D, 0x70, 0x6F, 0x6E, 0x73, 0x6B, 0x79, 0x2C, 0x20, 0x55, 0x73, 0x74, 0x2D, 0x4D, 0x61, 0x79, +0x73, 0x6B, 0x79, /* Asia/Kolkata */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -44042,7 +44309,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Krasnoyarsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF9, 0x0D, 0xF2, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF9, 0x0D, 0xF2, 0xB5, 0xA3, 0xE1, 0x20, 0x15, 0x27, 0x6F, 0x90, 0x16, 0x18, 0xA4, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x17, 0xF9, 0xD7, 0x80, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x1B, 0xBC, 0x68, 0xB0, 0x1C, 0xAC, 0x59, 0xB0, 0x1D, 0x9C, 0x4A, 0xB0, 0x1E, 0x8C, 0x3B, 0xB0, @@ -44059,141 +44326,138 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x93, 0x30, 0x45, 0x43, 0xA8, 0xB0, 0x46, 0x05, 0x75, 0x30, 0x47, 0x23, 0x8A, 0xB0, 0x47, 0xEE, 0x91, 0xB0, 0x49, 0x03, 0x6C, 0xB0, 0x49, 0xCE, 0x73, 0xB0, 0x4A, 0xE3, 0x4E, 0xB0, 0x4B, 0xAE, 0x55, 0xB0, 0x4C, 0xCC, 0x6B, 0x30, 0x4D, 0x8E, 0x37, 0xB0, 0x54, 0x4B, 0xE5, 0x20, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x08, 0x04, 0x04, 0x00, 0x00, 0x57, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, -0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, -0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, -0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0xF9, 0x0D, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, -0x00, 0x00, 0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, -0x00, 0x00, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, -0x00, 0x00, 0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x86, 0x30, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x68, 0x30, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x84, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x48, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x2A, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x0C, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xEE, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x0B, 0x30, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xED, 0x30, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xCF, 0x30, 0x00, -0x00, 0x00, 0x00, 0x41, 0x83, 0xE4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xB1, 0x30, 0x00, -0x00, 0x00, 0x00, 0x43, 0x63, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x93, 0x30, 0x00, -0x00, 0x00, 0x00, 0x45, 0x43, 0xA8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x75, 0x30, 0x00, -0x00, 0x00, 0x00, 0x47, 0x23, 0x8A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x91, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x49, 0x03, 0x6C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x73, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE3, 0x4E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x55, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCC, 0x6B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x37, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x54, 0x4B, 0xE5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, 0x00, 0x00, 0x57, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, -0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDE, 0xCD, 0xC2, 0x01, 0xA0, 0x4F, 0x85, 0x00, -0x00, 0x00, 0x19, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x4B, 0x72, 0x61, 0x73, -0x6E, 0x6F, 0x79, 0x61, 0x72, 0x73, 0x6B, 0x20, 0x61, 0x72, 0x65, 0x61, +0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF9, +0x0D, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, +0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, +0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, +0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, +0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, +0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, +0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, +0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, +0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x84, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, +0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, +0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, +0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, +0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x0C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, +0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xEE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, +0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x0B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, +0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xED, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, +0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, +0xE4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xB1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, +0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, +0xA8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x75, 0x30, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, +0x8A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x91, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, +0x6C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x73, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, +0x4E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x55, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, +0x6B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x37, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, +0xE5, 0x20, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x08, 0x04, 0x00, 0x00, 0x57, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, +0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, +0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, +0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x00, 0x08, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, +0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, +0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDE, 0xCD, 0xC2, 0x01, 0xA0, 0x4F, +0x85, 0x00, 0x00, 0x00, 0x19, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x4B, 0x72, +0x61, 0x73, 0x6E, 0x6F, 0x79, 0x61, 0x72, 0x73, 0x6B, 0x20, 0x61, 0x72, 0x65, 0x61, /* Asia/Kuala_Lumpur */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x86, 0x83, 0x85, 0xA3, 0xBA, 0x67, 0x4E, 0x90, 0xC0, 0x0A, 0xE4, 0x60, 0xCA, 0xB3, 0xE5, 0x60, -0xCB, 0x91, 0x5F, 0x08, 0xD2, 0x48, 0x6D, 0xF0, 0x16, 0x91, 0xF5, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x07, 0x07, 0x00, 0x00, 0x5F, 0x56, 0x00, 0x00, 0x00, -0x00, 0x61, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, -0x0C, 0x00, 0x00, 0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, -0x90, 0x00, 0x18, 0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, -0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x55, 0xAA, 0xFF, 0xFF, 0xFF, -0xFF, 0x86, 0x83, 0x85, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x4E, 0x90, 0xFF, 0xFF, 0xFF, -0xFF, 0xC0, 0x0A, 0xE4, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xB3, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0x91, 0x5F, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x16, 0x91, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x04, 0x05, 0x06, 0x05, 0x07, 0x07, 0x00, 0x00, 0x5F, 0x56, 0x00, 0x00, 0x00, 0x00, 0x61, 0x5D, -0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, 0x00, 0x00, -0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x18, -0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, -0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, -0x8E, 0x29, 0x3A, 0x01, 0xAD, 0xD7, 0x10, 0x00, 0x00, 0x00, 0x14, 0x4D, 0x61, 0x6C, 0x61, 0x79, -0x73, 0x69, 0x61, 0x20, 0x28, 0x70, 0x65, 0x6E, 0x69, 0x6E, 0x73, 0x75, 0x6C, 0x61, 0x29, +0xCB, 0x91, 0x5F, 0x08, 0xD2, 0x48, 0x6D, 0xF0, 0x16, 0x91, 0xF5, 0x08, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x05, 0x07, 0x00, 0x00, 0x5F, 0x56, 0x00, 0x00, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x04, +0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, 0x00, 0x00, 0x67, 0x20, +0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x18, 0x00, 0x00, +0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x55, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x83, 0x85, 0xA3, +0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x4E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0A, 0xE4, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xB3, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x91, 0x5F, 0x08, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x91, 0xF5, 0x08, +0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x07, 0x00, 0x00, 0x5F, 0x56, 0x00, 0x00, 0x00, 0x00, +0x61, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, +0x00, 0x00, 0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x18, 0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, +0x0A, 0x00, 0x8E, 0x29, 0x3A, 0x01, 0xAD, 0xD7, 0x10, 0x00, 0x00, 0x00, 0x14, 0x4D, 0x61, 0x6C, +0x61, 0x79, 0x73, 0x69, 0x61, 0x20, 0x28, 0x70, 0x65, 0x6E, 0x69, 0x6E, 0x73, 0x75, 0x6C, 0x61, +0x29, /* Asia/Kuching */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xAD, 0x8A, 0x06, 0x90, +0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xAD, 0x8A, 0x06, 0x90, 0xBA, 0x67, 0x47, 0x88, 0xBF, 0x7B, 0x27, 0x80, 0xBF, 0xF3, 0x1B, 0x50, 0xC1, 0x5D, 0xAC, 0x80, 0xC1, 0xD5, 0xA0, 0x50, 0xC3, 0x3E, 0xE0, 0x00, 0xC3, 0xB6, 0xD3, 0xD0, 0xC5, 0x20, 0x13, 0x80, 0xC5, 0x98, 0x07, 0x50, 0xC7, 0x01, 0x47, 0x00, 0xC7, 0x79, 0x3A, 0xD0, 0xC8, 0xE3, 0xCC, 0x00, 0xC9, 0x5B, 0xBF, 0xD0, 0xCA, 0xC4, 0xFF, 0x80, 0xCB, 0x3C, 0xF3, 0x50, 0xCB, 0x91, 0x58, 0x00, -0xD2, 0x48, 0x6D, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x03, 0x00, 0x00, 0x67, 0x70, 0x00, -0x00, 0x00, 0x00, 0x69, 0x78, 0x00, 0x04, 0x00, 0x00, 0x75, 0x30, 0x01, 0x0A, 0x00, 0x00, 0x70, -0x80, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x14, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x4C, -0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x32, 0x30, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0x8A, 0x06, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, -0x67, 0x47, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x7B, 0x27, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, -0xF3, 0x1B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x5D, 0xAC, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, -0xD5, 0xA0, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x3E, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, -0xB6, 0xD3, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x20, 0x13, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, -0x98, 0x07, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x01, 0x47, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, -0x79, 0x3A, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xE3, 0xCC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, -0x5B, 0xBF, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xC4, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, -0x3C, 0xF3, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x91, 0x58, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, -0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x03, 0x00, 0x00, -0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x78, 0x00, 0x04, 0x00, 0x00, 0x75, 0x30, 0x01, 0x0A, -0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x14, 0x00, 0x00, 0x70, 0x80, -0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x32, -0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, -0x2D, 0x38, 0x0A, 0x00, 0x8B, 0xB1, 0xB8, 0x01, 0xBB, 0x03, 0x75, 0x00, 0x00, 0x00, 0x0E, 0x53, -0x61, 0x62, 0x61, 0x68, 0x2C, 0x20, 0x53, 0x61, 0x72, 0x61, 0x77, 0x61, 0x6B, +0xD2, 0x48, 0x6D, 0xF0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x00, 0x00, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x78, +0x00, 0x04, 0x00, 0x00, 0x75, 0x30, 0x01, 0x0A, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, +0x7E, 0x90, 0x00, 0x14, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, +0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, +0xFF, 0xFF, 0xAD, 0x8A, 0x06, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x47, 0x88, 0xFF, 0xFF, +0xFF, 0xFF, 0xBF, 0x7B, 0x27, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0xF3, 0x1B, 0x50, 0xFF, 0xFF, +0xFF, 0xFF, 0xC1, 0x5D, 0xAC, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xD5, 0xA0, 0x50, 0xFF, 0xFF, +0xFF, 0xFF, 0xC3, 0x3E, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xB6, 0xD3, 0xD0, 0xFF, 0xFF, +0xFF, 0xFF, 0xC5, 0x20, 0x13, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x98, 0x07, 0x50, 0xFF, 0xFF, +0xFF, 0xFF, 0xC7, 0x01, 0x47, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x79, 0x3A, 0xD0, 0xFF, 0xFF, +0xFF, 0xFF, 0xC8, 0xE3, 0xCC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x5B, 0xBF, 0xD0, 0xFF, 0xFF, +0xFF, 0xFF, 0xCA, 0xC4, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x3C, 0xF3, 0x50, 0xFF, 0xFF, +0xFF, 0xFF, 0xCB, 0x91, 0x58, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x01, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, +0x00, 0x00, 0x67, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0x78, 0x00, 0x04, 0x00, 0x00, 0x75, 0x30, +0x01, 0x0A, 0x00, 0x00, 0x70, 0x80, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x14, 0x00, 0x00, +0x70, 0x80, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, +0x38, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, +0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0x8B, 0xB1, 0xB8, 0x01, 0xBB, 0x03, 0x75, 0x00, 0x00, 0x00, +0x0E, 0x53, 0x61, 0x62, 0x61, 0x68, 0x2C, 0x20, 0x53, 0x61, 0x72, 0x61, 0x77, 0x61, 0x6B, /* Asia/Kuwait */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xDA, 0x61, 0x35, 0x84, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xDA, 0x61, 0x35, 0x84, +0x01, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x61, 0x35, 0x84, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xB6, 0x16, 0x95, 0x01, 0x5B, 0xDF, 0xFD, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x61, 0x35, 0x84, 0x01, 0x00, 0x00, 0x2C, 0xFC, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xB6, 0x16, 0x95, 0x01, 0x5B, 0xDF, 0xFD, 0x00, +0x00, 0x00, 0x00, /* Asia/Macao */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -44358,7 +44622,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Magadan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x36, 0xA0, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x36, 0xA0, 0xB5, 0xA3, 0xA8, 0xE0, 0x15, 0x27, 0x37, 0x50, 0x16, 0x18, 0x6B, 0xC0, 0x17, 0x08, 0x6A, 0xD0, 0x17, 0xF9, 0x9F, 0x40, 0x18, 0xE9, 0x9E, 0x50, 0x19, 0xDA, 0xD2, 0xC0, 0x1A, 0xCC, 0x23, 0x50, 0x1B, 0xBC, 0x30, 0x70, 0x1C, 0xAC, 0x21, 0x70, 0x1D, 0x9C, 0x12, 0x70, 0x1E, 0x8C, 0x03, 0x70, @@ -44375,66 +44639,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x5A, 0xF0, 0x45, 0x43, 0x70, 0x70, 0x46, 0x05, 0x3C, 0xF0, 0x47, 0x23, 0x52, 0x70, 0x47, 0xEE, 0x59, 0x70, 0x49, 0x03, 0x34, 0x70, 0x49, 0xCE, 0x3B, 0x70, 0x4A, 0xE3, 0x16, 0x70, 0x4B, 0xAE, 0x1D, 0x70, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x54, 0x4B, 0xAC, 0xE0, -0x57, 0x1B, 0x9C, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x57, 0x1B, 0x9C, 0x00, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x07, 0x04, 0x04, 0x00, 0x00, 0x8D, 0x60, 0x00, -0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, -0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, -0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, -0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0B, -0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x36, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB5, 0xA3, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x37, 0x50, 0x00, 0x00, 0x00, 0x00, -0x16, 0x18, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, -0x17, 0xF9, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, -0x19, 0xDA, 0xD2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, -0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, 0x00, -0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, -0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, -0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, -0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, -0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, -0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x28, 0xE4, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x29, 0xD4, 0x89, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x2B, 0xB4, 0x6B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x2D, 0x94, 0x4D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x2F, 0x74, 0x2F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, -0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, -0x35, 0x1D, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, -0x36, 0xFC, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x38, 0xDC, 0xD4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x3A, 0xBC, 0xB6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x3C, 0xA5, 0xD2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x3E, 0x85, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x40, 0x65, 0x96, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xAC, 0x70, 0x00, 0x00, 0x00, 0x00, -0x42, 0x45, 0x78, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, -0x44, 0x25, 0x5A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, -0x46, 0x05, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, -0x47, 0xEE, 0x59, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x34, 0x70, 0x00, 0x00, 0x00, 0x00, -0x49, 0xCE, 0x3B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x16, 0x70, 0x00, 0x00, 0x00, 0x00, -0x4B, 0xAE, 0x1D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x4D, 0x8D, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xAC, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x57, 0x1B, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x07, 0x04, 0x04, 0x00, -0x00, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, -0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, -0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, -0x00, 0xA8, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, -0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, -0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0xE4, 0x38, 0x7A, 0x01, 0xF8, 0xC2, 0xC0, 0x00, 0x00, -0x00, 0x10, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x38, 0x20, 0x2D, 0x20, 0x4D, 0x61, 0x67, 0x61, 0x64, -0x61, 0x6E, +0x04, 0x05, 0x04, 0x08, 0x07, 0x04, 0x00, 0x00, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, +0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, +0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, +0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, +0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x36, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xA8, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x15, 0x27, 0x37, 0x50, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x6B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x17, 0x08, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0x9F, 0x40, 0x00, +0x00, 0x00, 0x00, 0x18, 0xE9, 0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xD2, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0xCC, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, +0x00, 0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, +0x00, 0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, +0x00, 0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, +0x00, 0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, +0x00, 0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, +0x00, 0x00, 0x00, 0x29, 0x78, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, +0x00, 0x00, 0x00, 0x32, 0x72, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, +0x00, 0x00, 0x00, 0x36, 0x31, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xF2, 0x70, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xD4, 0x70, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFA, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xB6, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xDA, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xD2, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBA, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xB4, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9A, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x96, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x41, 0x83, 0xAC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x78, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x43, 0x63, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x5A, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x45, 0x43, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x3C, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x47, 0x23, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x59, 0x70, 0x00, +0x00, 0x00, 0x00, 0x49, 0x03, 0x34, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x3B, 0x70, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE3, 0x16, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x1D, 0x70, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4B, 0xAC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x1B, 0x9C, 0x00, 0x01, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x07, +0x04, 0x00, 0x00, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, +0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, +0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, +0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, +0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, +0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0xE4, 0x38, 0x7A, 0x01, 0xF8, 0xC2, 0xC0, +0x00, 0x00, 0x00, 0x10, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x38, 0x20, 0x2D, 0x20, 0x4D, 0x61, 0x67, +0x61, 0x64, 0x61, 0x6E, /* Asia/Makassar */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -44487,16 +44750,15 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Muscat */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4F, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xA1, 0xF2, 0x96, 0x90, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x36, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xA1, 0xF2, 0x96, 0x90, +0x01, 0x00, 0x00, 0x36, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x96, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x36, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xAD, 0x57, 0x00, 0x01, 0x6C, 0x0C, 0x9D, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x96, 0x90, 0x01, 0x00, 0x00, 0x36, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xAD, 0x57, 0x00, 0x01, 0x6C, 0x0C, 0x9D, 0x00, +0x00, 0x00, 0x00, /* Asia/Nicosia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -44631,7 +44893,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Novokuznetsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x18, 0x20, 0xC0, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x18, 0x20, 0xC0, 0xB5, 0xA3, 0xE1, 0x20, 0x15, 0x27, 0x6F, 0x90, 0x16, 0x18, 0xA4, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x17, 0xF9, 0xD7, 0x80, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x1B, 0xBC, 0x68, 0xB0, 0x1C, 0xAC, 0x59, 0xB0, 0x1D, 0x9C, 0x4A, 0xB0, 0x1E, 0x8C, 0x3B, 0xB0, @@ -44647,68 +44909,67 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x40, 0x65, 0xCF, 0x30, 0x41, 0x83, 0xE4, 0xB0, 0x42, 0x45, 0xB1, 0x30, 0x43, 0x63, 0xC6, 0xB0, 0x44, 0x25, 0x93, 0x30, 0x45, 0x43, 0xA8, 0xB0, 0x46, 0x05, 0x75, 0x30, 0x47, 0x23, 0x8A, 0xB0, 0x47, 0xEE, 0x91, 0xB0, 0x49, 0x03, 0x6C, 0xB0, 0x49, 0xCE, 0x73, 0xB0, 0x4A, 0xE3, 0x4E, 0xB0, -0x4B, 0xAE, 0x55, 0xB0, 0x4C, 0xCC, 0x79, 0x40, 0x4D, 0x8E, 0x45, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x4B, 0xAE, 0x55, 0xB0, 0x4C, 0xCC, 0x79, 0x40, 0x4D, 0x8E, 0x45, 0xC0, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x00, 0x00, 0x51, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, +0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, +0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, +0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, +0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x18, 0x20, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, +0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, +0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, +0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x87, 0x40, 0x00, +0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x95, 0x30, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x77, 0x30, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0x84, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x5F, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x35, 0x1D, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x36, 0xFD, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, +0x00, 0x00, 0x00, 0x38, 0xDD, 0x0C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xBC, 0xEE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, +0x00, 0x00, 0x00, 0x3C, 0xA6, 0x0B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, 0x30, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x85, 0xED, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, 0x30, 0x00, +0x00, 0x00, 0x00, 0x40, 0x65, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xE4, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x42, 0x45, 0xB1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xC6, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x44, 0x25, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xA8, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x46, 0x05, 0x75, 0x30, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x8A, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x47, 0xEE, 0x91, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x6C, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x49, 0xCE, 0x73, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x4E, 0xB0, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xAE, 0x55, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x79, 0x40, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, -0x04, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, -0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, -0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, -0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, -0xAA, 0x18, 0x20, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, -0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, -0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, 0x00, 0x00, 0x00, -0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, -0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, -0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, -0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2C, 0xA4, 0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x86, 0x30, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x84, 0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x68, 0x30, 0x00, 0x00, 0x00, 0x00, -0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x84, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x32, 0x72, 0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x0C, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xEE, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x0B, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3D, 0xBA, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xED, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x9A, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, -0x41, 0x83, 0xE4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xB1, 0x30, 0x00, 0x00, 0x00, 0x00, -0x43, 0x63, 0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x93, 0x30, 0x00, 0x00, 0x00, 0x00, -0x45, 0x43, 0xA8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x75, 0x30, 0x00, 0x00, 0x00, 0x00, -0x47, 0x23, 0x8A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x91, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x49, 0x03, 0x6C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x73, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xE3, 0x4E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x55, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x4C, 0xCC, 0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x06, 0x07, 0x04, 0x04, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, -0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, -0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, -0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDB, 0x58, -0x58, 0x01, 0x97, 0x96, 0x72, 0x00, 0x00, 0x00, 0x11, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, -0x2D, 0x20, 0x4B, 0x65, 0x6D, 0x65, 0x72, 0x6F, 0x76, 0x6F, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, +0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, +0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, +0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, +0xDB, 0x58, 0x58, 0x01, 0x97, 0x96, 0x72, 0x00, 0x00, 0x00, 0x11, 0x4D, 0x53, 0x4B, 0x2B, 0x30, +0x34, 0x20, 0x2D, 0x20, 0x4B, 0x65, 0x6D, 0x65, 0x72, 0x6F, 0x76, 0x6F, /* Asia/Novosibirsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xDB, 0x19, 0x24, +0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xDB, 0x19, 0x24, 0xB5, 0xA3, 0xE1, 0x20, 0x15, 0x27, 0x6F, 0x90, 0x16, 0x18, 0xA4, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x17, 0xF9, 0xD7, 0x80, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x1B, 0xBC, 0x68, 0xB0, 0x1C, 0xAC, 0x59, 0xB0, 0x1D, 0x9C, 0x4A, 0xB0, 0x1E, 0x8C, 0x3B, 0xB0, @@ -44725,71 +44986,70 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0xD4, 0xC0, 0x44, 0x25, 0xA1, 0x40, 0x45, 0x43, 0xB6, 0xC0, 0x46, 0x05, 0x83, 0x40, 0x47, 0x23, 0x98, 0xC0, 0x47, 0xEE, 0x9F, 0xC0, 0x49, 0x03, 0x7A, 0xC0, 0x49, 0xCE, 0x81, 0xC0, 0x4A, 0xE3, 0x5C, 0xC0, 0x4B, 0xAE, 0x63, 0xC0, 0x4C, 0xCC, 0x79, 0x40, 0x4D, 0x8E, 0x45, 0xC0, -0x54, 0x4B, 0xF3, 0x30, 0x57, 0x93, 0xCC, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, -0x00, 0x00, 0x4D, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, -0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xDB, 0x19, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, -0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, -0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, -0xD7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, -0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, -0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, -0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, -0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, -0x0E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, -0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, -0xD2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, -0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, -0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, -0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, -0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xFE, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, -0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, -0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, -0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, -0x6D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, -0x4F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, -0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, -0x4E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, -0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, -0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, -0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, -0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, -0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, -0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0xB6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0x98, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0x7A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0x5C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, -0xF3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0x93, 0xCC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x54, 0x4B, 0xF3, 0x30, 0x57, 0x93, 0xCC, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x4D, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, -0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x70, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0A, 0x3C, 0x2B, 0x30, -0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDD, 0x4D, 0xA5, 0x01, 0x91, 0x2D, 0xD2, 0x00, 0x00, 0x00, -0x14, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x4E, 0x6F, 0x76, 0x6F, 0x73, 0x69, -0x62, 0x69, 0x72, 0x73, 0x6B, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x4D, 0xBC, 0x00, +0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, +0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, +0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, +0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, +0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xA1, 0xDB, 0x19, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, 0x00, 0x00, +0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, 0x00, 0x00, +0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, 0x00, 0x00, +0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2B, 0xFE, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x94, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, +0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x6D, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x4F, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x31, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x4E, 0x40, 0x00, 0x00, 0x00, +0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x30, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x12, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xF4, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xD6, 0x40, 0x00, 0x00, 0x00, +0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xF2, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xD4, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xB6, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x98, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x7A, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x5C, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x79, 0x40, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xF3, 0x30, 0x00, 0x00, 0x00, +0x00, 0x57, 0x93, 0xCC, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, +0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x4D, 0xBC, 0x00, 0x00, 0x00, 0x00, +0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, +0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, +0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, +0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0A, 0x3C, +0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDD, 0x4D, 0xA5, 0x01, 0x91, 0x2D, 0xD2, 0x00, +0x00, 0x00, 0x14, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x4E, 0x6F, 0x76, 0x6F, +0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6B, /* Asia/Omsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xB3, 0x40, 0xB6, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xB3, 0x40, 0xB6, 0xB5, 0xA3, 0xEF, 0x30, 0x15, 0x27, 0x7D, 0xA0, 0x16, 0x18, 0xB2, 0x10, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xE5, 0x90, 0x18, 0xE9, 0xE4, 0xA0, 0x19, 0xDB, 0x19, 0x10, 0x1A, 0xCC, 0x69, 0xA0, 0x1B, 0xBC, 0x76, 0xC0, 0x1C, 0xAC, 0x67, 0xC0, 0x1D, 0x9C, 0x58, 0xC0, 0x1E, 0x8C, 0x49, 0xC0, @@ -44806,70 +45066,69 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0xA1, 0x40, 0x45, 0x43, 0xB6, 0xC0, 0x46, 0x05, 0x83, 0x40, 0x47, 0x23, 0x98, 0xC0, 0x47, 0xEE, 0x9F, 0xC0, 0x49, 0x03, 0x7A, 0xC0, 0x49, 0xCE, 0x81, 0xC0, 0x4A, 0xE3, 0x5C, 0xC0, 0x4B, 0xAE, 0x63, 0xC0, 0x4C, 0xCC, 0x79, 0x40, 0x4D, 0x8E, 0x45, 0xC0, 0x54, 0x4B, 0xF3, 0x30, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x08, 0x04, 0x04, 0x00, 0x00, 0x44, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, -0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, -0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, -0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x62, 0x70, -0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, -0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0xB3, 0x40, 0xB6, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, -0x00, 0x00, 0x00, 0x15, 0x27, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, -0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6C, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4C, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, -0x00, 0x00, 0x00, 0x29, 0x78, 0x95, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xD0, 0x40, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xB2, 0x40, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x94, 0x40, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x6D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0x4F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0x4E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDB, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBA, 0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9A, 0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, -0x00, 0x00, 0x00, 0x41, 0x83, 0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, -0x00, 0x00, 0x00, 0x43, 0x63, 0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, -0x00, 0x00, 0x00, 0x45, 0x43, 0xB6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x83, 0x40, 0x00, -0x00, 0x00, 0x00, 0x47, 0x23, 0x98, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x49, 0x03, 0x7A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE3, 0x5C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCC, 0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x54, 0x4B, 0xF3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, 0x00, 0x00, 0x44, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, -0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xDD, 0x40, 0xA0, 0x01, 0x82, 0xA8, 0x60, 0x00, -0x00, 0x00, 0x0D, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x33, 0x20, 0x2D, 0x20, 0x4F, 0x6D, 0x73, 0x6B, - +0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xB3, +0x40, 0xB6, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, +0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, +0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, +0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, +0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, +0x95, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, +0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, +0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, +0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, +0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, +0x6D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x74, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, +0x4F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, +0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, +0x4E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, +0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, +0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, +0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, +0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, +0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, +0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, +0xB6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, +0x98, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, +0x7A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, +0x5C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, +0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, +0xF3, 0x30, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x08, 0x04, 0x00, 0x00, 0x44, 0xCA, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, +0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, +0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, +0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, +0x00, 0x54, 0x60, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, +0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xDD, 0x40, 0xA0, 0x01, 0x82, 0xA8, +0x60, 0x00, 0x00, 0x00, 0x0D, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x33, 0x20, 0x2D, 0x20, 0x4F, 0x6D, +0x73, 0x6B, /* Asia/Oral */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xAA, 0x19, 0x93, 0xDC, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xAA, 0x19, 0x93, 0xDC, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, @@ -44882,78 +45141,76 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x35, 0x1D, 0x72, 0xE0, 0x36, 0x32, 0x4D, 0xE0, 0x36, 0xFD, 0x54, 0xE0, 0x38, 0x1B, 0x6A, 0x60, 0x38, 0xDD, 0x36, 0xE0, 0x39, 0xFB, 0x4C, 0x60, 0x3A, 0xBD, 0x18, 0xE0, 0x3B, 0xDB, 0x2E, 0x60, 0x3C, 0xA6, 0x35, 0x60, 0x3D, 0xBB, 0x10, 0x60, 0x3E, 0x86, 0x17, 0x60, 0x3F, 0x9A, 0xF2, 0x60, -0x40, 0x65, 0xF9, 0x60, 0x41, 0x84, 0x0E, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, -0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, -0x07, 0x08, 0x07, 0x08, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x05, -0x00, 0x00, 0x30, 0x24, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, -0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, -0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, -0x00, 0x00, 0x38, 0x40, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x93, 0xDC, 0xFF, 0xFF, -0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, -0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xDD, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xBF, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xA1, 0x60, 0x00, 0x00, -0x00, 0x00, 0x2F, 0x74, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x83, 0x60, 0x00, 0x00, -0x00, 0x00, 0x31, 0x5D, 0xAE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x89, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x33, 0x3D, 0x90, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x35, 0x1D, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x36, 0xFD, 0x54, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, -0x00, 0x00, 0x38, 0xDD, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, -0x00, 0x00, 0x3A, 0xBD, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, -0x00, 0x00, 0x3C, 0xA6, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, -0x00, 0x00, 0x3E, 0x86, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, -0x00, 0x00, 0x40, 0x65, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x05, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x05, 0x00, 0x00, 0x30, 0x24, 0x00, 0x00, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, -0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, -0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x10, -0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, -0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xD7, 0x7A, -0xC2, 0x01, 0x61, 0x03, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x57, 0x65, 0x73, 0x74, 0x20, 0x4B, 0x61, -0x7A, 0x61, 0x6B, 0x68, 0x73, 0x74, 0x61, 0x6E, +0x40, 0x65, 0xF9, 0x60, 0x41, 0x84, 0x0E, 0xE0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, +0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x00, 0x00, 0x30, 0x24, 0x00, +0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, +0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, +0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, +0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, +0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x93, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, +0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, +0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, +0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xFC, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x19, +0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, +0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, +0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, +0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, +0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xA1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x92, +0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xAE, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x89, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x90, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x72, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x54, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x36, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x18, +0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x35, +0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x17, +0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF9, +0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, +0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x05, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x05, 0x00, 0x00, 0x30, 0x24, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, +0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, +0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, +0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, +0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, +0xD7, 0x7A, 0xC2, 0x01, 0x61, 0x03, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x57, 0x65, 0x73, 0x74, 0x20, +0x4B, 0x61, 0x7A, 0x61, 0x6B, 0x68, 0x73, 0x74, 0x61, 0x6E, /* Asia/Phnom_Penh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x45, 0x24, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x45, 0x24, 0x91, 0xA3, 0x2B, 0x0A, 0xCD, 0x35, 0xE6, 0x80, 0xD1, 0x59, 0xCE, 0x70, 0xD2, 0x3B, 0x3E, 0xF0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x02, 0x00, 0x00, 0x62, 0x5C, 0x00, 0x00, -0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, -0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, -0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, -0xFF, 0xFF, 0xFF, 0x88, 0x8C, 0x45, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xA3, 0x2B, 0x0A, 0xFF, -0xFF, 0xFF, 0xFF, 0xCD, 0x35, 0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x59, 0xCE, 0x70, 0xFF, -0xFF, 0xFF, 0xFF, 0xD2, 0x3B, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x03, 0x04, 0x02, 0x02, 0x00, 0x00, 0x62, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, +0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x00, 0x62, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x9A, 0xF3, 0xF8, 0x01, 0xB2, 0xBF, 0x92, 0x00, -0x00, 0x00, 0x00, +0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x8C, +0x45, 0x24, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xA3, 0x2B, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x35, +0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x59, 0xCE, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x3B, +0x3E, 0xF0, 0x01, 0x02, 0x03, 0x04, 0x02, 0x00, 0x00, 0x62, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x63, +0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, +0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x9A, 0xF3, 0xF8, 0x01, 0xB2, 0xBF, +0x92, 0x00, 0x00, 0x00, 0x00, /* Asia/Pontianak */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -45003,23 +45260,22 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Qatar */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x51, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xA1, 0xF2, 0x9D, 0x30, -0x04, 0x8A, 0x92, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x30, 0x50, 0x00, -0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x9D, 0x30, 0x00, 0x00, 0x00, -0x00, 0x04, 0x8A, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0x00, 0x00, 0x30, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xAF, 0xE8, 0x8D, 0x01, 0x61, 0x4A, 0xB5, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xA1, 0xF2, 0x9D, 0x30, +0x04, 0x8A, 0x92, 0xC0, 0x01, 0x02, 0x00, 0x00, 0x30, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, +0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, +0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x9D, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x8A, 0x92, 0xC0, +0x01, 0x02, 0x00, 0x00, 0x30, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x33, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xAF, 0xE8, 0x8D, 0x01, 0x61, 0x4A, +0xB5, 0x00, 0x00, 0x00, 0x00, /* Asia/Qostanay */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x88, 0x5C, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x88, 0x5C, 0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, @@ -45032,20 +45288,87 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x35, 0x1D, 0x64, 0xD0, 0x36, 0x32, 0x3F, 0xD0, 0x36, 0xFD, 0x46, 0xD0, 0x38, 0x1B, 0x5C, 0x50, 0x38, 0xDD, 0x28, 0xD0, 0x39, 0xFB, 0x3E, 0x50, 0x3A, 0xBD, 0x0A, 0xD0, 0x3B, 0xDB, 0x20, 0x50, 0x3C, 0xA6, 0x27, 0x50, 0x3D, 0xBB, 0x02, 0x50, 0x3E, 0x86, 0x09, 0x50, 0x3F, 0x9A, 0xE4, 0x50, -0x40, 0x65, 0xEB, 0x50, 0x41, 0x84, 0x00, 0xD0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, +0x40, 0x65, 0xEB, 0x50, 0x41, 0x84, 0x00, 0xD0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, +0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x09, 0x00, 0x00, 0x3B, 0xA4, 0x00, +0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, +0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, +0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, +0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0B, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x88, 0x5C, 0xFF, 0xFF, 0xFF, 0xFF, +0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, +0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, +0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, 0x00, +0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, +0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, +0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x5C, 0x50, 0x00, 0x00, 0x00, 0x00, +0x38, 0xDD, 0x28, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3A, 0xBD, 0x0A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3C, 0xA6, 0x27, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3E, 0x86, 0x09, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, +0x40, 0x65, 0xEB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x00, 0xD0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x09, 0x09, -0x00, 0x00, 0x3B, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x09, 0x00, +0x00, 0x3B, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, +0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, +0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, +0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, +0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, +0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xDA, 0x81, 0x7F, 0x01, 0x73, 0xBA, 0xC2, 0x00, 0x00, 0x00, +0x1A, 0x51, 0x6F, 0x73, 0x74, 0x61, 0x6E, 0x61, 0x79, 0x2F, 0x4B, 0x6F, 0x73, 0x74, 0x61, 0x6E, +0x61, 0x79, 0x2F, 0x4B, 0x75, 0x73, 0x74, 0x61, 0x6E, 0x61, 0x79, + +/* Asia/Qyzylorda */ +0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x86, 0xA0, +0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xB1, 0x20, +0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, +0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, +0x1F, 0x7C, 0x48, 0xD0, 0x20, 0x6C, 0x39, 0xD0, 0x21, 0x5C, 0x2A, 0xD0, 0x22, 0x4C, 0x1B, 0xD0, +0x23, 0x3C, 0x0C, 0xD0, 0x24, 0x2B, 0xFD, 0xD0, 0x25, 0x1B, 0xEE, 0xD0, 0x26, 0x0B, 0xDF, 0xD0, +0x27, 0x05, 0x0B, 0x50, 0x27, 0xF4, 0xFC, 0x50, 0x28, 0xE4, 0xFB, 0x60, 0x29, 0x78, 0x95, 0x50, +0x29, 0xD4, 0xD0, 0x40, 0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xC0, 0x50, 0x2C, 0xA4, 0xB1, 0x50, +0x2D, 0x94, 0xA2, 0x50, 0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0x84, 0x50, 0x30, 0x64, 0x75, 0x50, +0x31, 0x5D, 0xA0, 0xD0, 0x32, 0x72, 0x7B, 0xD0, 0x33, 0x3D, 0x82, 0xD0, 0x34, 0x52, 0x5D, 0xD0, +0x35, 0x1D, 0x64, 0xD0, 0x36, 0x32, 0x3F, 0xD0, 0x36, 0xFD, 0x46, 0xD0, 0x38, 0x1B, 0x5C, 0x50, +0x38, 0xDD, 0x28, 0xD0, 0x39, 0xFB, 0x3E, 0x50, 0x3A, 0xBD, 0x0A, 0xD0, 0x3B, 0xDB, 0x20, 0x50, +0x3C, 0xA6, 0x27, 0x50, 0x3D, 0xBB, 0x02, 0x50, 0x3E, 0x86, 0x09, 0x50, 0x3F, 0x9A, 0xE4, 0x50, +0x40, 0x65, 0xEB, 0x50, 0x41, 0x84, 0x00, 0xD0, 0x5C, 0x1B, 0xD8, 0xA0, 0x01, 0x02, 0x03, 0x04, +0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x07, 0x05, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x02, +0x00, 0x00, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, -0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, -0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, -0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, +0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x88, -0x5C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, +0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x86, +0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, @@ -45056,8 +45379,8 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, -0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, -0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, +0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x95, +0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xD0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, @@ -45070,152 +45393,80 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x27, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x09, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xEB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x00, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x1B, 0xD8, 0xA0, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, -0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x09, 0x09, 0x00, 0x00, 0x3B, -0xA4, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, +0x05, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x02, 0x00, 0x00, 0x3D, +0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, -0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, -0x40, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, +0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x54, +0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, -0x2D, 0x36, 0x0A, 0x00, 0xDA, 0x81, 0x7F, 0x01, 0x73, 0xBA, 0xC2, 0x00, 0x00, 0x00, 0x1A, 0x51, -0x6F, 0x73, 0x74, 0x61, 0x6E, 0x61, 0x79, 0x2F, 0x4B, 0x6F, 0x73, 0x74, 0x61, 0x6E, 0x61, 0x79, -0x2F, 0x4B, 0x75, 0x73, 0x74, 0x61, 0x6E, 0x61, 0x79, - -/* Asia/Qyzylorda */ -0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x86, 0xA0, -0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xB1, 0x20, -0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, -0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, -0x1F, 0x7C, 0x48, 0xD0, 0x20, 0x6C, 0x39, 0xD0, 0x21, 0x5C, 0x2A, 0xD0, 0x22, 0x4C, 0x1B, 0xD0, -0x23, 0x3C, 0x0C, 0xD0, 0x24, 0x2B, 0xFD, 0xD0, 0x25, 0x1B, 0xEE, 0xD0, 0x26, 0x0B, 0xDF, 0xD0, -0x27, 0x05, 0x0B, 0x50, 0x27, 0xF4, 0xFC, 0x50, 0x28, 0xE4, 0xFB, 0x60, 0x29, 0x78, 0x95, 0x50, -0x29, 0xD4, 0xD0, 0x40, 0x2A, 0xC4, 0xCF, 0x50, 0x2B, 0xB4, 0xC0, 0x50, 0x2C, 0xA4, 0xB1, 0x50, -0x2D, 0x94, 0xA2, 0x50, 0x2E, 0x84, 0x93, 0x50, 0x2F, 0x74, 0x84, 0x50, 0x30, 0x64, 0x75, 0x50, -0x31, 0x5D, 0xA0, 0xD0, 0x32, 0x72, 0x7B, 0xD0, 0x33, 0x3D, 0x82, 0xD0, 0x34, 0x52, 0x5D, 0xD0, -0x35, 0x1D, 0x64, 0xD0, 0x36, 0x32, 0x3F, 0xD0, 0x36, 0xFD, 0x46, 0xD0, 0x38, 0x1B, 0x5C, 0x50, -0x38, 0xDD, 0x28, 0xD0, 0x39, 0xFB, 0x3E, 0x50, 0x3A, 0xBD, 0x0A, 0xD0, 0x3B, 0xDB, 0x20, 0x50, -0x3C, 0xA6, 0x27, 0x50, 0x3D, 0xBB, 0x02, 0x50, 0x3E, 0x86, 0x09, 0x50, 0x3F, 0x9A, 0xE4, 0x50, -0x40, 0x65, 0xEB, 0x50, 0x41, 0x84, 0x00, 0xD0, 0x5C, 0x1B, 0xD8, 0xA0, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x05, 0x08, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x08, 0x02, 0x02, 0x00, 0x00, 0x3D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, -0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, -0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, -0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, -0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xAA, 0x19, 0x86, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, -0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, -0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, -0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, -0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, -0x00, 0x00, 0x29, 0x78, 0x95, 0x50, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xD0, 0x40, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0x5D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0x3F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0x5C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x28, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x0A, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x27, 0x50, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x09, 0x50, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9A, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xEB, 0x50, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x1B, 0xD8, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x05, 0x08, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x02, 0x02, 0x00, 0x00, 0x3D, 0x60, 0x00, -0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, -0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, -0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, -0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, -0x0A, 0x00, 0xCD, 0xB0, 0x40, 0x01, 0x76, 0x8D, 0x6A, 0x00, 0x00, 0x00, 0x1D, 0x51, 0x79, 0x7A, -0x79, 0x6C, 0x6F, 0x72, 0x64, 0x61, 0x2F, 0x4B, 0x79, 0x7A, 0x79, 0x6C, 0x6F, 0x72, 0x64, 0x61, -0x2F, 0x4B, 0x7A, 0x79, 0x6C, 0x2D, 0x4F, 0x72, 0x64, 0x61, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, +0x2D, 0x35, 0x0A, 0x00, 0xCD, 0xB0, 0x40, 0x01, 0x76, 0x8D, 0x6A, 0x00, 0x00, 0x00, 0x1D, 0x51, +0x79, 0x7A, 0x79, 0x6C, 0x6F, 0x72, 0x64, 0x61, 0x2F, 0x4B, 0x79, 0x7A, 0x79, 0x6C, 0x6F, 0x72, +0x64, 0x61, 0x2F, 0x4B, 0x7A, 0x79, 0x6C, 0x2D, 0x4F, 0x72, 0x64, 0x61, /* Asia/Rangoon */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, -0xA1, 0xF2, 0x73, 0x51, 0xCB, 0xF2, 0xFC, 0x18, 0xD1, 0x9A, 0x67, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, -0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, -0x68, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, -0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, +0xA1, 0xF2, 0x73, 0x51, 0xCB, 0xF2, 0xFC, 0x18, 0xD1, 0x9A, 0x67, 0xF0, 0x01, 0x02, 0x03, 0x02, +0x00, 0x00, 0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x89, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x73, -0x51, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF2, 0xFC, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x9A, 0x67, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, -0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x36, 0x33, 0x30, 0x3E, 0x2D, 0x36, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, +0x56, 0xB6, 0x89, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x73, 0x51, 0xFF, 0xFF, 0xFF, 0xFF, +0xCB, 0xF2, 0xFC, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x9A, 0x67, 0xF0, 0x01, 0x02, 0x03, 0x02, +0x00, 0x00, 0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x3E, 0x2D, 0x36, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Riyadh */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xD5, 0x1B, 0x36, 0xB4, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xD5, 0x1B, 0x36, 0xB4, +0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x1B, 0x36, 0xB4, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xAE, 0xEA, 0xA5, 0x01, 0x59, 0xF1, 0x32, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x1B, 0x36, 0xB4, 0x01, 0x00, 0x00, 0x2B, 0xCC, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xAE, 0xEA, 0xA5, 0x01, 0x59, 0xF1, 0x32, 0x00, +0x00, 0x00, 0x00, /* Asia/Saigon */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x43, 0x8A, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x43, 0x8A, 0x91, 0xA3, 0x2B, 0x0A, 0xCD, 0x35, 0xE6, 0x80, 0xD1, 0x59, 0xCE, 0x70, 0xD2, 0x3B, 0x3E, 0xF0, 0xD5, 0x32, 0xBB, 0x10, 0xE4, 0xB6, 0xE4, 0x80, 0xED, 0x2F, 0x98, 0x00, 0x0A, 0x3D, 0xC7, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, -0x63, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, -0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, -0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, -0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x8C, 0x43, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, -0xA3, 0x2B, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x35, 0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, -0x59, 0xCE, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x3B, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, -0x32, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xB6, 0xE4, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, -0x2F, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3D, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x63, -0xF6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, -0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, -0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, -0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x00, 0x00, +0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, +0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, +0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, +0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, +0xFF, 0xFF, 0x88, 0x8C, 0x43, 0x8A, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xA3, 0x2B, 0x0A, 0xFF, 0xFF, +0xFF, 0xFF, 0xCD, 0x35, 0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x59, 0xCE, 0x70, 0xFF, 0xFF, +0xFF, 0xFF, 0xD2, 0x3B, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x32, 0xBB, 0x10, 0xFF, 0xFF, +0xFF, 0xFF, 0xE4, 0xB6, 0xE4, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x2F, 0x98, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x3D, 0xC7, 0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, +0x00, 0x63, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, +0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, +0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Sakhalin */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x14, 0x86, 0xF0, 0xCD, 0xB8, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x14, 0x86, 0xF0, 0xCD, 0xB8, 0xD2, 0x30, 0xB2, 0xF0, 0x15, 0x27, 0x37, 0x50, 0x16, 0x18, 0x6B, 0xC0, 0x17, 0x08, 0x6A, 0xD0, 0x17, 0xF9, 0x9F, 0x40, 0x18, 0xE9, 0x9E, 0x50, 0x19, 0xDA, 0xD2, 0xC0, 0x1A, 0xCC, 0x23, 0x50, 0x1B, 0xBC, 0x30, 0x70, 0x1C, 0xAC, 0x21, 0x70, 0x1D, 0x9C, 0x12, 0x70, 0x1E, 0x8C, 0x03, 0x70, @@ -45232,105 +45483,104 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x69, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x46, 0x05, 0x4B, 0x00, 0x47, 0x23, 0x60, 0x80, 0x47, 0xEE, 0x67, 0x80, 0x49, 0x03, 0x42, 0x80, 0x49, 0xCE, 0x49, 0x80, 0x4A, 0xE3, 0x24, 0x80, 0x4B, 0xAE, 0x2B, 0x80, 0x4C, 0xCC, 0x41, 0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x54, 0x4B, 0xBA, 0xF0, -0x56, 0xF6, 0xB2, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x85, 0xC8, 0x00, -0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, -0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, -0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, -0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x43, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xF0, -0xCD, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x30, 0xB2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, -0x37, 0x50, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, -0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, -0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xD2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, -0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, -0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, -0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, -0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, -0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, -0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, -0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, -0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, -0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, -0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, -0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, -0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, -0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, -0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, -0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, -0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, -0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xE2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, -0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xC4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, -0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, -0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, -0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, -0xBA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, -0x9C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0x7E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0x42, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x49, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x2B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, -0xBA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF6, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x56, 0xF6, 0xB2, 0x00, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x85, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, -0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, -0x00, 0x8C, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, -0x31, 0x0A, 0x00, 0xD0, 0xFE, 0x9A, 0x01, 0xEC, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x18, 0x4D, 0x53, -0x4B, 0x2B, 0x30, 0x38, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x6B, 0x68, 0x61, 0x6C, 0x69, 0x6E, 0x20, -0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, +0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x85, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, +0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, +0x00, 0x00, 0x8C, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, +0x09, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xF0, 0xCD, 0xB8, 0xFF, 0xFF, 0xFF, +0xFF, 0xD2, 0x30, 0xB2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x37, 0x50, 0x00, 0x00, 0x00, +0x00, 0x16, 0x18, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x6A, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x17, 0xF9, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0x9E, 0x50, 0x00, 0x00, 0x00, +0x00, 0x19, 0xDA, 0xD2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x23, 0x50, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, +0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, +0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, +0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, +0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x4F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x27, 0x70, 0x00, 0x00, 0x00, +0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x17, 0x80, 0x00, 0x00, 0x00, +0x00, 0x35, 0x1D, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xF9, 0x80, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFD, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x16, 0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0xDC, 0xE2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, 0xF8, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xBC, 0xC4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xDA, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xA5, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xBC, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x85, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x9E, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x65, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xBA, 0x80, 0x00, 0x00, 0x00, +0x00, 0x42, 0x45, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x9C, 0x80, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x60, 0x80, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x42, 0x80, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0x49, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x24, 0x80, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0x2B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x41, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xBA, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x56, 0xF6, 0xB2, 0x00, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x85, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x7E, +0x90, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, +0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, +0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, +0x2D, 0x31, 0x31, 0x0A, 0x00, 0xD0, 0xFE, 0x9A, 0x01, 0xEC, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x18, +0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x38, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x6B, 0x68, 0x61, 0x6C, 0x69, +0x6E, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, /* Asia/Samarkand */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x85, 0x37, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x85, 0x37, 0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, 0x1E, 0x8C, 0x57, 0xD0, 0x1F, 0x7C, 0x48, 0xD0, 0x20, 0x6C, 0x39, 0xD0, 0x21, 0x5C, 0x2A, 0xD0, 0x22, 0x4C, 0x1B, 0xD0, 0x23, 0x3C, 0x0C, 0xD0, 0x24, 0x2B, 0xFD, 0xD0, 0x25, 0x1B, 0xEE, 0xD0, 0x26, 0x0B, 0xDF, 0xD0, -0x27, 0x05, 0x0B, 0x50, 0x27, 0xF4, 0xFC, 0x50, 0x28, 0xE4, 0xED, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x00, 0x00, 0x3E, 0xC9, 0x00, 0x00, 0x00, +0x27, 0x05, 0x0B, 0x50, 0x27, 0xF4, 0xFC, 0x50, 0x28, 0xE4, 0xED, 0x50, 0x01, 0x02, 0x03, 0x04, +0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x3E, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, +0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, +0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x85, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, +0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, +0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, +0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, +0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, +0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, +0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, +0x50, 0x01, 0x02, 0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0x3E, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, -0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x85, 0x37, 0xFF, 0xFF, -0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, -0x03, 0x04, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x00, 0x00, 0x3E, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x38, -0x40, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, -0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, -0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, -0x0A, 0x00, 0xC5, 0xDB, 0x0A, 0x01, 0x78, 0x96, 0x40, 0x00, 0x00, 0x00, 0x11, 0x55, 0x7A, 0x62, -0x65, 0x6B, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x20, 0x28, 0x77, 0x65, 0x73, 0x74, 0x29, +0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, +0x2D, 0x35, 0x0A, 0x00, 0xC5, 0xDB, 0x0A, 0x01, 0x78, 0x96, 0x40, 0x00, 0x00, 0x00, 0x11, 0x55, +0x7A, 0x62, 0x65, 0x6B, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x20, 0x28, 0x77, 0x65, 0x73, 0x74, 0x29, + /* Asia/Seoul */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -45416,34 +45666,33 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Singapore */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x86, 0x83, 0x85, 0xA3, 0xBA, 0x67, 0x4E, 0x90, 0xC0, 0x0A, 0xE4, 0x60, 0xCA, 0xB3, 0xE5, 0x60, -0xCB, 0x91, 0x5F, 0x08, 0xD2, 0x48, 0x6D, 0xF0, 0x16, 0x91, 0xF5, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x07, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, -0x00, 0x61, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, -0x0C, 0x00, 0x00, 0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, -0x90, 0x00, 0x18, 0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, -0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x53, 0xA3, 0xFF, 0xFF, 0xFF, -0xFF, 0x86, 0x83, 0x85, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x4E, 0x90, 0xFF, 0xFF, 0xFF, -0xFF, 0xC0, 0x0A, 0xE4, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xB3, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0x91, 0x5F, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x16, 0x91, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x04, 0x05, 0x06, 0x05, 0x07, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x61, 0x5D, -0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, 0x00, 0x00, -0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x18, -0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, -0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, -0x8B, 0x49, 0x8D, 0x01, 0xB1, 0x1E, 0xE8, 0x00, 0x00, 0x00, 0x00, +0xCB, 0x91, 0x5F, 0x08, 0xD2, 0x48, 0x6D, 0xF0, 0x16, 0x91, 0xF5, 0x08, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x05, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x04, +0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, 0x00, 0x00, 0x67, 0x20, +0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x18, 0x00, 0x00, +0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x53, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x83, 0x85, 0xA3, +0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x4E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0A, 0xE4, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xB3, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x91, 0x5F, 0x08, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x91, 0xF5, 0x08, +0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, 0x00, +0x61, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, +0x00, 0x00, 0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x18, 0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, +0x0A, 0x00, 0x8B, 0x49, 0x8D, 0x01, 0xB1, 0x1E, 0xE8, 0x00, 0x00, 0x00, 0x00, /* Asia/Srednekolymsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x33, 0xE4, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x33, 0xE4, 0xB5, 0xA3, 0xA8, 0xE0, 0x15, 0x27, 0x37, 0x50, 0x16, 0x18, 0x6B, 0xC0, 0x17, 0x08, 0x6A, 0xD0, 0x17, 0xF9, 0x9F, 0x40, 0x18, 0xE9, 0x9E, 0x50, 0x19, 0xDA, 0xD2, 0xC0, 0x1A, 0xCC, 0x23, 0x50, 0x1B, 0xBC, 0x30, 0x70, 0x1C, 0xAC, 0x21, 0x70, 0x1D, 0x9C, 0x12, 0x70, 0x1E, 0x8C, 0x03, 0x70, @@ -45460,66 +45709,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x5A, 0xF0, 0x45, 0x43, 0x70, 0x70, 0x46, 0x05, 0x3C, 0xF0, 0x47, 0x23, 0x52, 0x70, 0x47, 0xEE, 0x59, 0x70, 0x49, 0x03, 0x34, 0x70, 0x49, 0xCE, 0x3B, 0x70, 0x4A, 0xE3, 0x16, 0x70, 0x4B, 0xAE, 0x1D, 0x70, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x54, 0x4B, 0xAC, 0xE0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x08, 0x04, 0x04, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, -0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, -0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, -0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, -0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x33, 0xE4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xA8, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x15, 0x27, 0x37, 0x50, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x6B, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x08, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0x9F, 0x40, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xD2, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, -0x00, 0x00, 0x00, 0x29, 0x78, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, -0x00, 0x00, 0x00, 0x36, 0x31, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xF2, 0x70, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xD4, 0x70, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFA, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xB6, 0x70, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDA, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xD2, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBA, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xB4, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9A, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x96, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x41, 0x83, 0xAC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x78, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x43, 0x63, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x5A, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x45, 0x43, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x3C, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x47, 0x23, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x59, 0x70, 0x00, -0x00, 0x00, 0x00, 0x49, 0x03, 0x34, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x3B, 0x70, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE3, 0x16, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x1D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x00, -0x00, 0x00, 0x00, 0x54, 0x4B, 0xAC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, -0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0xF0, 0x46, 0x6A, 0x01, 0xFD, 0x36, 0x12, -0x00, 0x00, 0x00, 0x22, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x38, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x6B, -0x68, 0x61, 0x20, 0x28, 0x45, 0x29, 0x3B, 0x20, 0x4E, 0x6F, 0x72, 0x74, 0x68, 0x20, 0x4B, 0x75, -0x72, 0x69, 0x6C, 0x20, 0x49, 0x73, +0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, +0x33, 0xE4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xA8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, +0x37, 0x50, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, +0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xD2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, +0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, +0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, +0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, +0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, +0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, +0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, +0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, +0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, +0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, +0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xD4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, +0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xB6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, +0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xD2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, +0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, +0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x96, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, +0xAC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x78, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, +0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x5A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, +0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, +0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x59, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, +0x34, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x3B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, +0x16, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x1D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, +0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, +0xAC, 0xE0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x08, 0x04, 0x00, 0x00, 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, +0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x08, 0x00, +0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, +0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0xF0, 0x46, 0x6A, 0x01, 0xFD, +0x36, 0x12, 0x00, 0x00, 0x00, 0x22, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x38, 0x20, 0x2D, 0x20, 0x53, +0x61, 0x6B, 0x68, 0x61, 0x20, 0x28, 0x45, 0x29, 0x3B, 0x20, 0x4E, 0x6F, 0x72, 0x74, 0x68, 0x20, +0x4B, 0x75, 0x72, 0x69, 0x6C, 0x20, 0x49, 0x73, /* Asia/Taipei */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -45575,48 +45823,47 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Tashkent */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x83, 0x09, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x83, 0x09, 0xB5, 0xA3, 0xEF, 0x30, 0x15, 0x27, 0x7D, 0xA0, 0x16, 0x18, 0xB2, 0x10, 0x17, 0x08, 0xB1, 0x20, 0x17, 0xF9, 0xE5, 0x90, 0x18, 0xE9, 0xE4, 0xA0, 0x19, 0xDB, 0x19, 0x10, 0x1A, 0xCC, 0x69, 0xA0, 0x1B, 0xBC, 0x76, 0xC0, 0x1C, 0xAC, 0x67, 0xC0, 0x1D, 0x9C, 0x58, 0xC0, 0x1E, 0x8C, 0x49, 0xC0, 0x1F, 0x7C, 0x3A, 0xC0, 0x20, 0x6C, 0x2B, 0xC0, 0x21, 0x5C, 0x1C, 0xC0, 0x22, 0x4C, 0x0D, 0xC0, 0x23, 0x3B, 0xFE, 0xC0, 0x24, 0x2B, 0xEF, 0xC0, 0x25, 0x1B, 0xE0, 0xC0, 0x26, 0x0B, 0xD1, 0xC0, -0x27, 0x04, 0xFD, 0x40, 0x27, 0xF4, 0xEE, 0x40, 0x28, 0xE4, 0xED, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x07, 0x00, 0x00, 0x40, 0xF7, 0x00, 0x00, 0x00, -0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, -0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, -0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, -0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0x19, 0x83, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, -0x00, 0x15, 0x27, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, -0x00, 0x17, 0x08, 0xB1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, -0x00, 0x18, 0xE9, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, -0x00, 0x1A, 0xCC, 0x69, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x1C, 0xAC, 0x67, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x1E, 0x8C, 0x49, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x20, 0x6C, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x22, 0x4C, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x24, 0x2B, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x26, 0x0B, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, -0x00, 0x27, 0xF4, 0xEE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x00, 0x00, 0x00, -0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x07, 0x00, 0x00, -0x40, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, -0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, -0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, -0xC8, 0x66, 0x15, 0x01, 0x7C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x11, 0x55, 0x7A, 0x62, 0x65, 0x6B, -0x69, 0x73, 0x74, 0x61, 0x6E, 0x20, 0x28, 0x65, 0x61, 0x73, 0x74, 0x29, +0x27, 0x04, 0xFD, 0x40, 0x27, 0xF4, 0xEE, 0x40, 0x28, 0xE4, 0xED, 0x50, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x06, 0x07, 0x00, 0x00, 0x40, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, +0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, +0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, +0x46, 0x50, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x83, 0x09, +0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x7D, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xB2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xB1, 0x20, +0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xE5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xE4, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x69, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x76, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x67, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x58, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x49, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x3A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x2B, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x0D, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xEF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xD1, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xEE, 0x40, +0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xED, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x00, 0x00, 0x40, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, +0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, +0x62, 0x70, 0x01, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x36, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, +0x0A, 0x00, 0xC8, 0x66, 0x15, 0x01, 0x7C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x11, 0x55, 0x7A, 0x62, +0x65, 0x6B, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x20, 0x28, 0x65, 0x61, 0x73, 0x74, 0x29, /* Asia/Tbilisi */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0x9A, 0x01, 0xE7, 0xDA, 0x0C, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, @@ -45629,62 +45876,61 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x36, 0x32, 0x23, 0xB0, 0x36, 0xFD, 0x38, 0xC0, 0x38, 0x1B, 0x40, 0x30, 0x38, 0xDD, 0x1A, 0xC0, 0x39, 0xFB, 0x22, 0x30, 0x3A, 0xBC, 0xFC, 0xC0, 0x3B, 0xDB, 0x04, 0x30, 0x3C, 0xA6, 0x19, 0x40, 0x3D, 0xBA, 0xE6, 0x30, 0x3E, 0x85, 0xFB, 0x40, 0x3F, 0x9A, 0xC8, 0x30, 0x40, 0x65, 0xDD, 0x40, -0x40, 0xDD, 0xC7, 0xB0, 0x41, 0x84, 0x1C, 0xF0, 0x42, 0x45, 0xE9, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, -0x04, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x09, 0x08, 0x04, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, -0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, -0x40, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, -0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x38, 0x40, 0x01, -0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0B, 0x00, -0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xBA, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, -0x19, 0x9A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, -0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, -0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, -0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, -0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, -0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, -0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, -0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, -0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, -0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, -0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, -0xF5, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, -0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, -0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, -0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, -0x74, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, -0x5D, 0x92, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, -0x52, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, -0x32, 0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, -0x1B, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, -0xFB, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xDB, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, -0xBA, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x9A, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, -0xDD, 0xC7, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, -0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, 0x04, 0x03, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x09, 0x08, 0x04, 0x04, +0x40, 0xDD, 0xC7, 0xB0, 0x41, 0x84, 0x1C, 0xF0, 0x42, 0x45, 0xE9, 0x70, 0x01, 0x02, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, 0x04, 0x03, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x09, 0x08, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC8, 0xFB, 0xD2, 0x01, -0x57, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, +0xFF, 0xFF, 0x56, 0xB6, 0xBA, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x9A, 0x01, 0xFF, 0xFF, +0xFF, 0xFF, 0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, +0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xC4, 0xC1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA4, 0xA3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x84, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x76, 0x40, 0x00, 0x00, +0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x92, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x35, 0x1D, 0x56, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x36, 0xFD, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, +0x00, 0x00, 0x38, 0xDD, 0x1A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xBC, 0xFC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xA6, 0x19, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xE6, 0x30, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xC8, 0x30, 0x00, 0x00, +0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0xDD, 0xC7, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x01, 0x02, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x09, 0x02, 0x09, 0x02, 0x09, 0x04, 0x03, 0x04, 0x03, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x09, +0x08, 0x04, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x04, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, 0x00, 0x11, +0x00, 0x00, 0x38, 0x40, 0x00, 0x11, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0D, 0x00, 0x00, 0x38, 0x40, +0x01, 0x11, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x09, 0x00, 0x00, 0x38, 0x40, 0x01, 0x11, 0x00, 0x00, +0x38, 0x40, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x42, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, +0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xC8, 0xFB, +0xD2, 0x01, 0x57, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, /* Asia/Tehran */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x9A, 0x6C, 0x7D, 0xC8, +0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x9A, 0x6C, 0x7D, 0xC8, 0xBF, 0x00, 0xCC, 0x48, 0x0D, 0x94, 0x44, 0x38, 0x0E, 0xAD, 0x13, 0xB8, 0x0F, 0x79, 0x73, 0x40, 0x10, 0x28, 0xCA, 0xC0, 0x10, 0xED, 0x3A, 0x40, 0x11, 0xAD, 0xBC, 0x48, 0x12, 0x45, 0x4A, 0xB8, 0x13, 0x37, 0xEC, 0xC8, 0x14, 0x2D, 0x15, 0xB8, 0x28, 0x20, 0x76, 0xC8, 0x28, 0xDB, 0x9D, 0xB8, @@ -45702,66 +45948,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0xEF, 0x08, 0x48, 0x57, 0xE1, 0x8E, 0x38, 0x58, 0xD1, 0x8D, 0x48, 0x59, 0xC4, 0x13, 0x38, 0x5A, 0xB2, 0xC0, 0xC8, 0x5B, 0xA5, 0x46, 0xB8, 0x5C, 0x93, 0xF4, 0x48, 0x5D, 0x86, 0x7A, 0x38, 0x5E, 0x75, 0x27, 0xC8, 0x5F, 0x67, 0xAD, 0xB8, 0x60, 0x57, 0xAC, 0xC8, 0x61, 0x4A, 0x32, 0xB8, -0x62, 0x38, 0xE0, 0x48, 0x63, 0x2B, 0x66, 0x38, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x05, -0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x62, 0x38, 0xE0, 0x48, 0x63, 0x2B, 0x66, 0x38, 0x01, 0x03, 0x02, 0x05, 0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x00, 0x04, -0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x46, 0x50, -0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, -0x31, 0x38, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x33, -0x30, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, -0x9A, 0x6C, 0x7D, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x00, -0x0D, 0x94, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xAD, 0x13, 0xB8, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x79, 0x73, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0xCA, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x10, 0xED, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11, 0xAD, 0xBC, 0x48, 0x00, 0x00, 0x00, 0x00, -0x12, 0x45, 0x4A, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x13, 0x37, 0xEC, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x14, 0x2D, 0x15, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x28, 0x20, 0x76, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x28, 0xDB, 0x9D, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x29, 0xCB, 0x9C, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xBE, 0x22, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xAC, 0xD0, 0x48, 0x00, 0x00, 0x00, 0x00, -0x2C, 0x9F, 0x56, 0x38, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8E, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x80, 0x89, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x6F, 0x37, 0x48, 0x00, 0x00, 0x00, 0x00, -0x30, 0x61, 0xBD, 0x38, 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x6A, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x32, 0x42, 0xF0, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x33, 0x32, 0xEF, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x34, 0x25, 0x75, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x35, 0x14, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, -0x36, 0x06, 0xA9, 0x38, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF5, 0x56, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x37, 0xE7, 0xDC, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD6, 0x8A, 0x48, 0x00, 0x00, 0x00, 0x00, -0x39, 0xC9, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xB9, 0x0F, 0x48, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xAB, 0x95, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x9A, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x3D, 0x8C, 0xC8, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7B, 0x76, 0x48, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x6D, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5C, 0xA9, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x41, 0x4F, 0x2F, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3F, 0x2E, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x43, 0x31, 0xB4, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x47, 0xE2, 0xC9, 0x48, 0x00, 0x00, 0x00, 0x00, -0x48, 0xD5, 0x4F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x49, 0xC5, 0x4E, 0x48, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xB7, 0xD4, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xA6, 0x81, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x4C, 0x99, 0x07, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x87, 0xB5, 0x48, 0x00, 0x00, 0x00, 0x00, -0x4E, 0x7A, 0x3B, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x68, 0xE8, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x50, 0x5B, 0x6E, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x51, 0x4B, 0x6D, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x52, 0x3D, 0xF3, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x53, 0x2C, 0xA1, 0x48, 0x00, 0x00, 0x00, 0x00, -0x54, 0x1F, 0x27, 0x38, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0D, 0xD4, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x56, 0x00, 0x5A, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x56, 0xEF, 0x08, 0x48, 0x00, 0x00, 0x00, 0x00, -0x57, 0xE1, 0x8E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD1, 0x8D, 0x48, 0x00, 0x00, 0x00, 0x00, -0x59, 0xC4, 0x13, 0x38, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB2, 0xC0, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x5B, 0xA5, 0x46, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x93, 0xF4, 0x48, 0x00, 0x00, 0x00, 0x00, -0x5D, 0x86, 0x7A, 0x38, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x75, 0x27, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x5F, 0x67, 0xAD, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x60, 0x57, 0xAC, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x61, 0x4A, 0x32, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x62, 0x38, 0xE0, 0x48, 0x00, 0x00, 0x00, 0x00, -0x63, 0x2B, 0x66, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x05, -0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x00, 0x04, -0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x46, 0x50, -0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, -0x31, 0x38, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x33, -0x30, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, -0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x3E, 0x2D, 0x33, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0xBF, -0xC0, 0x8A, 0x01, 0x61, 0x23, 0xA5, 0x00, 0x00, 0x00, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, +0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x48, 0x01, +0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x46, 0x50, 0x01, 0x14, 0x00, 0x00, 0x38, +0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x4C, +0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x33, +0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x6C, 0x7D, 0xC8, 0xFF, +0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x94, 0x44, 0x38, 0x00, +0x00, 0x00, 0x00, 0x0E, 0xAD, 0x13, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x79, 0x73, 0x40, 0x00, +0x00, 0x00, 0x00, 0x10, 0x28, 0xCA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xED, 0x3A, 0x40, 0x00, +0x00, 0x00, 0x00, 0x11, 0xAD, 0xBC, 0x48, 0x00, 0x00, 0x00, 0x00, 0x12, 0x45, 0x4A, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x13, 0x37, 0xEC, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x14, 0x2D, 0x15, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x28, 0x20, 0x76, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x28, 0xDB, 0x9D, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x29, 0xCB, 0x9C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xBE, 0x22, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xAC, 0xD0, 0x48, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x9F, 0x56, 0x38, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x8E, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x80, 0x89, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x6F, 0x37, 0x48, 0x00, 0x00, 0x00, 0x00, 0x30, 0x61, 0xBD, 0x38, 0x00, +0x00, 0x00, 0x00, 0x31, 0x50, 0x6A, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x32, 0x42, 0xF0, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x33, 0x32, 0xEF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x34, 0x25, 0x75, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x35, 0x14, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, 0x36, 0x06, 0xA9, 0x38, 0x00, +0x00, 0x00, 0x00, 0x36, 0xF5, 0x56, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x37, 0xE7, 0xDC, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x38, 0xD6, 0x8A, 0x48, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC9, 0x10, 0x38, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xB9, 0x0F, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xAB, 0x95, 0x38, 0x00, +0x00, 0x00, 0x00, 0x3C, 0x9A, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x8C, 0xC8, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x7B, 0x76, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x6D, 0xFC, 0x38, 0x00, +0x00, 0x00, 0x00, 0x40, 0x5C, 0xA9, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x41, 0x4F, 0x2F, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x42, 0x3F, 0x2E, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x43, 0x31, 0xB4, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x47, 0xE2, 0xC9, 0x48, 0x00, 0x00, 0x00, 0x00, 0x48, 0xD5, 0x4F, 0x38, 0x00, +0x00, 0x00, 0x00, 0x49, 0xC5, 0x4E, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xB7, 0xD4, 0x38, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xA6, 0x81, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x99, 0x07, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x87, 0xB5, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7A, 0x3B, 0x38, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x68, 0xE8, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x50, 0x5B, 0x6E, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x51, 0x4B, 0x6D, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x52, 0x3D, 0xF3, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x53, 0x2C, 0xA1, 0x48, 0x00, 0x00, 0x00, 0x00, 0x54, 0x1F, 0x27, 0x38, 0x00, +0x00, 0x00, 0x00, 0x55, 0x0D, 0xD4, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x5A, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x56, 0xEF, 0x08, 0x48, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE1, 0x8E, 0x38, 0x00, +0x00, 0x00, 0x00, 0x58, 0xD1, 0x8D, 0x48, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC4, 0x13, 0x38, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xB2, 0xC0, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xA5, 0x46, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x5C, 0x93, 0xF4, 0x48, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x86, 0x7A, 0x38, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x75, 0x27, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x67, 0xAD, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x60, 0x57, 0xAC, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x61, 0x4A, 0x32, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x62, 0x38, 0xE0, 0x48, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2B, 0x66, 0x38, 0x01, +0x03, 0x02, 0x05, 0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, +0x00, 0x04, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, +0x46, 0x50, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, +0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x34, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x3E, 0x2D, 0x33, 0x3A, 0x33, 0x30, 0x0A, +0x00, 0xBF, 0xC0, 0x8A, 0x01, 0x61, 0x23, 0xA5, 0x00, 0x00, 0x00, 0x00, /* Asia/Tel_Aviv */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -45919,34 +46164,32 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Thimbu */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xD5, 0xE6, 0x15, 0x74, -0x21, 0x61, 0x4D, 0xA8, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xE6, 0x15, 0x74, 0x00, -0x00, 0x00, 0x00, 0x21, 0x61, 0x4D, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, 0x00, 0x00, -0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, -0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xD5, 0xE6, 0x15, 0x74, +0x21, 0x61, 0x4D, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xE6, 0x15, 0x74, 0x00, 0x00, 0x00, 0x00, 0x21, 0x61, +0x4D, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, +0x00, 0x00, 0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Thimphu */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xD5, 0xE6, 0x15, 0x74, -0x21, 0x61, 0x4D, 0xA8, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xD5, 0xE6, 0x15, 0x74, +0x21, 0x61, 0x4D, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, +0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xE6, 0x15, 0x74, 0x00, -0x00, 0x00, 0x00, 0x21, 0x61, 0x4D, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, 0x00, 0x00, -0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, 0x2B, 0x30, -0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xB3, 0x3D, 0x6A, 0x01, -0x9B, 0x74, 0x07, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xE6, 0x15, 0x74, 0x00, 0x00, 0x00, 0x00, 0x21, 0x61, +0x4D, 0xA8, 0x01, 0x02, 0x00, 0x00, 0x54, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x58, 0x00, 0x04, +0x00, 0x00, 0x54, 0x60, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x33, 0x30, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xB3, 0x3D, +0x6A, 0x01, 0x9B, 0x74, 0x07, 0x00, 0x00, 0x00, 0x00, /* Asia/Tokyo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4A, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -45974,7 +46217,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Tomsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xE5, 0x4E, 0xD9, +0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xE5, 0x4E, 0xD9, 0xB5, 0xA3, 0xE1, 0x20, 0x15, 0x27, 0x6F, 0x90, 0x16, 0x18, 0xA4, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x17, 0xF9, 0xD7, 0x80, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x1B, 0xBC, 0x68, 0xB0, 0x1C, 0xAC, 0x59, 0xB0, 0x1D, 0x9C, 0x4A, 0xB0, 0x1E, 0x8C, 0x3B, 0xB0, @@ -45991,65 +46234,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0xD4, 0xC0, 0x44, 0x25, 0xA1, 0x40, 0x45, 0x43, 0xB6, 0xC0, 0x46, 0x05, 0x83, 0x40, 0x47, 0x23, 0x98, 0xC0, 0x47, 0xEE, 0x9F, 0xC0, 0x49, 0x03, 0x7A, 0xC0, 0x49, 0xCE, 0x81, 0xC0, 0x4A, 0xE3, 0x5C, 0xC0, 0x4B, 0xAE, 0x63, 0xC0, 0x4C, 0xCC, 0x79, 0x40, 0x4D, 0x8E, 0x45, 0xC0, -0x54, 0x4B, 0xF3, 0x30, 0x57, 0x49, 0xF8, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, -0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, -0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, -0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, -0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xE5, 0x4E, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, -0xE1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, -0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, -0xD7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, -0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, -0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, -0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, -0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, -0x0E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, -0xF0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, -0xD2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, -0xEF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, -0xDF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, -0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, -0xA4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, -0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, -0x68, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, -0x84, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, -0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, -0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, -0x2A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, -0x0C, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, -0xEE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, -0x0B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xCE, 0xE9, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, -0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, -0xD6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, -0xF2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, -0xD4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0xB6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0x98, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0x7A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0x5C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, -0xF3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0x49, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x54, 0x4B, 0xF3, 0x30, 0x57, 0x49, 0xF8, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, -0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, -0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x62, 0x70, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0A, 0x3C, 0x2B, 0x30, -0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDF, 0x8A, 0x90, 0x01, 0x94, 0x4E, 0x9A, 0x00, 0x00, 0x00, -0x0E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x54, 0x6F, 0x6D, 0x73, 0x6B, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x4F, 0xA7, 0x00, +0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, +0x70, 0x00, 0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, +0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, +0x0C, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, +0x30, 0x38, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xA1, 0xE5, 0x4E, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xE1, 0x20, 0x00, 0x00, 0x00, +0x00, 0x15, 0x27, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xA4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x17, 0x08, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xD7, 0x80, 0x00, 0x00, 0x00, +0x00, 0x18, 0xE9, 0xD6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x0B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1A, 0xCC, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x68, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xAC, 0x59, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x4A, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x8C, 0x3B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x2C, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x6C, 0x1D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x0E, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x22, 0x4B, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xF0, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x24, 0x2B, 0xE1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xD2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x26, 0x0B, 0xC3, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xEF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF4, 0xE0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xDF, 0x40, 0x00, 0x00, 0x00, +0x00, 0x29, 0x78, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xC2, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC4, 0xB3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xA4, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0x95, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x86, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0x77, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x68, 0x30, 0x00, 0x00, 0x00, +0x00, 0x30, 0x64, 0x59, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x84, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x32, 0x72, 0x5F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x66, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x34, 0x52, 0x41, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x48, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x36, 0x32, 0x23, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x2A, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x38, 0x1B, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x0C, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x39, 0xFB, 0x22, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xEE, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xDB, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x0B, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xCE, 0xE9, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xF4, 0x40, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x85, 0xFB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xD6, 0x40, 0x00, 0x00, 0x00, +0x00, 0x40, 0x65, 0xDD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xF2, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x42, 0x45, 0xBF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xD4, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xB6, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0x83, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x98, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0x9F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x7A, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0x81, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x5C, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x79, 0x40, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x45, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xF3, 0x30, 0x00, 0x00, 0x00, +0x00, 0x57, 0x49, 0xF8, 0xC0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x08, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x4F, 0xA7, 0x00, 0x00, 0x00, 0x00, +0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, +0x00, 0x00, 0x62, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x01, 0x08, 0x00, 0x00, 0x62, 0x70, +0x01, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0C, 0x00, 0x00, +0x62, 0x70, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x38, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x0A, 0x3C, +0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xDF, 0x8A, 0x90, 0x01, 0x94, 0x4E, 0x9A, 0x00, +0x00, 0x00, 0x0E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x34, 0x20, 0x2D, 0x20, 0x54, 0x6F, 0x6D, 0x73, +0x6B, /* Asia/Ujung_Pandang */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -46073,7 +46316,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Asia/Ulaanbaatar */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD3, 0xEE, 0x4C, +0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD3, 0xEE, 0x4C, 0x0F, 0x0B, 0xDC, 0x90, 0x18, 0xE9, 0xC8, 0x80, 0x19, 0xDA, 0xFC, 0xF0, 0x1A, 0xCC, 0x4D, 0x80, 0x1B, 0xBC, 0x30, 0x70, 0x1C, 0xAC, 0x2F, 0x80, 0x1D, 0x9C, 0x12, 0x70, 0x1E, 0x8C, 0x11, 0x80, 0x1F, 0x7B, 0xF4, 0x70, 0x20, 0x6B, 0xF3, 0x80, 0x21, 0x5B, 0xD6, 0x70, 0x22, 0x4B, 0xD5, 0x80, @@ -46086,54 +46329,53 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x3D, 0x94, 0x8E, 0x90, 0x3E, 0x84, 0x8D, 0xA0, 0x3F, 0x74, 0x70, 0x90, 0x40, 0x64, 0x6F, 0xA0, 0x41, 0x54, 0x52, 0x90, 0x42, 0x44, 0x51, 0xA0, 0x43, 0x34, 0x34, 0x90, 0x44, 0x24, 0x33, 0xA0, 0x45, 0x1D, 0x51, 0x10, 0x55, 0x15, 0x9A, 0xA0, 0x56, 0x05, 0x61, 0x70, 0x56, 0xF5, 0x7C, 0xA0, -0x57, 0xE5, 0x43, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x57, 0xE5, 0x43, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x64, 0x34, 0x00, -0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, 0x70, -0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x64, 0x34, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, +0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0x86, 0xD3, 0xEE, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xDC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xFC, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x4D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6B, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xD5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xB7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0x99, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0x5A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x3D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x3C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x1F, 0x70, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x01, 0x70, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xE9, 0xB3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0xAC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA4, 0xAB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x8E, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x84, 0x8D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x70, 0x90, 0x00, -0x00, 0x00, 0x00, 0x40, 0x64, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x52, 0x90, 0x00, -0x00, 0x00, 0x00, 0x42, 0x44, 0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x34, 0x90, 0x00, -0x00, 0x00, 0x00, 0x44, 0x24, 0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x51, 0x10, 0x00, -0x00, 0x00, 0x00, 0x55, 0x15, 0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x61, 0x70, 0x00, -0x00, 0x00, 0x00, 0x56, 0xF5, 0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x43, 0x70, 0x00, -0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x64, 0x34, 0x00, 0x00, -0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, 0x70, 0x80, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, -0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0xD2, 0x71, 0xB2, 0x01, -0xB5, 0xBF, 0xCD, 0x00, 0x00, 0x00, 0x15, 0x4D, 0x6F, 0x6E, 0x67, 0x6F, 0x6C, 0x69, 0x61, 0x20, -0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xD3, +0xEE, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x4D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, +0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xD5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xB7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0x99, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, +0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, +0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, +0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, +0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, +0x5A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x3D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0x3C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x1F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, +0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xE9, +0xB3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0xAC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA4, +0xAB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x8E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x84, +0x8D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x70, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x64, +0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x52, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, +0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x24, +0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x51, 0x10, 0x00, 0x00, 0x00, 0x00, 0x55, 0x15, +0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF5, +0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x43, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x64, 0x34, +0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, +0x70, 0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0xD2, 0x71, +0xB2, 0x01, 0xB5, 0xBF, 0xCD, 0x00, 0x00, 0x00, 0x15, 0x4D, 0x6F, 0x6E, 0x67, 0x6F, 0x6C, 0x69, +0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, /* Asia/Ulan_Bator */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD3, 0xEE, 0x4C, +0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD3, 0xEE, 0x4C, 0x0F, 0x0B, 0xDC, 0x90, 0x18, 0xE9, 0xC8, 0x80, 0x19, 0xDA, 0xFC, 0xF0, 0x1A, 0xCC, 0x4D, 0x80, 0x1B, 0xBC, 0x30, 0x70, 0x1C, 0xAC, 0x2F, 0x80, 0x1D, 0x9C, 0x12, 0x70, 0x1E, 0x8C, 0x11, 0x80, 0x1F, 0x7B, 0xF4, 0x70, 0x20, 0x6B, 0xF3, 0x80, 0x21, 0x5B, 0xD6, 0x70, 0x22, 0x4B, 0xD5, 0x80, @@ -46146,67 +46388,66 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x3D, 0x94, 0x8E, 0x90, 0x3E, 0x84, 0x8D, 0xA0, 0x3F, 0x74, 0x70, 0x90, 0x40, 0x64, 0x6F, 0xA0, 0x41, 0x54, 0x52, 0x90, 0x42, 0x44, 0x51, 0xA0, 0x43, 0x34, 0x34, 0x90, 0x44, 0x24, 0x33, 0xA0, 0x45, 0x1D, 0x51, 0x10, 0x55, 0x15, 0x9A, 0xA0, 0x56, 0x05, 0x61, 0x70, 0x56, 0xF5, 0x7C, 0xA0, -0x57, 0xE5, 0x43, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x57, 0xE5, 0x43, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x64, 0x34, 0x00, -0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, 0x70, -0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, -0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x64, 0x34, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, +0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0x86, 0xD3, 0xEE, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xDC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xFC, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x4D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6B, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xD5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xB7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0x99, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0x5A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x3D, 0x70, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x3C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x1F, 0x70, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x01, 0x70, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xE9, 0xB3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0xAC, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA4, 0xAB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x8E, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x84, 0x8D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x70, 0x90, 0x00, -0x00, 0x00, 0x00, 0x40, 0x64, 0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x52, 0x90, 0x00, -0x00, 0x00, 0x00, 0x42, 0x44, 0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x34, 0x90, 0x00, -0x00, 0x00, 0x00, 0x44, 0x24, 0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x51, 0x10, 0x00, -0x00, 0x00, 0x00, 0x55, 0x15, 0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x61, 0x70, 0x00, -0x00, 0x00, 0x00, 0x56, 0xF5, 0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x43, 0x70, 0x00, -0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x64, 0x34, 0x00, 0x00, -0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, 0x70, 0x80, -0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, -0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0xD3, +0xEE, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0B, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x4D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, +0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xD5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xB7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0x99, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x98, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, +0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, +0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, +0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, +0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, +0x5A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4D, 0x3D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0x3C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x34, 0x2D, 0x1F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, +0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xE9, +0xB3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB4, 0xAC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA4, +0xAB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x94, 0x8E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x84, +0x8D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x74, 0x70, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x64, +0x6F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x52, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, +0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x34, 0x34, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x24, +0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1D, 0x51, 0x10, 0x00, 0x00, 0x00, 0x00, 0x55, 0x15, +0x9A, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x05, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF5, +0x7C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE5, 0x43, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x64, 0x34, +0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x08, 0x00, 0x00, +0x70, 0x80, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Asia/Urumqi */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xB0, 0xFE, 0xBA, 0x64, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xB0, 0xFE, 0xBA, 0x64, +0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xFE, 0xBA, 0x64, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x54, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xCC, 0x29, 0xA0, 0x01, 0x98, 0x4C, 0xBD, 0x00, 0x00, 0x00, -0x0D, 0x58, 0x69, 0x6E, 0x6A, 0x69, 0x61, 0x6E, 0x67, 0x20, 0x54, 0x69, 0x6D, 0x65, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0xFE, 0xBA, 0x64, 0x01, 0x00, 0x00, 0x52, 0x1C, 0x00, 0x00, +0x00, 0x00, 0x54, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0xCC, 0x29, 0xA0, 0x01, 0x98, 0x4C, 0xBD, 0x00, +0x00, 0x00, 0x0D, 0x58, 0x69, 0x6E, 0x6A, 0x69, 0x61, 0x6E, 0x67, 0x20, 0x54, 0x69, 0x6D, 0x65, + /* Asia/Ust-Nera */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0xA1, 0xDB, 0xDD, 0xBA, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0xA1, 0xDB, 0xDD, 0xBA, 0xB5, 0xA3, 0xC5, 0x00, 0x15, 0x27, 0x53, 0x70, 0x16, 0x18, 0x6B, 0xC0, 0x17, 0x08, 0x6A, 0xD0, 0x17, 0xF9, 0x9F, 0x40, 0x18, 0xE9, 0x9E, 0x50, 0x19, 0xDA, 0xD2, 0xC0, 0x1A, 0xCC, 0x23, 0x50, 0x1B, 0xBC, 0x30, 0x70, 0x1C, 0xAC, 0x21, 0x70, 0x1D, 0x9C, 0x12, 0x70, 0x1E, 0x8C, 0x03, 0x70, @@ -46223,96 +46464,95 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x5A, 0xF0, 0x45, 0x43, 0x70, 0x70, 0x46, 0x05, 0x3C, 0xF0, 0x47, 0x23, 0x52, 0x70, 0x47, 0xEE, 0x59, 0x70, 0x49, 0x03, 0x34, 0x70, 0x49, 0xCE, 0x3B, 0x70, 0x4A, 0xE3, 0x16, 0x70, 0x4B, 0xAE, 0x1D, 0x70, 0x4C, 0xCC, 0x32, 0xF0, 0x4D, 0x8D, 0xFF, 0x70, 0x4E, 0x6D, 0xF4, 0x40, -0x54, 0x4B, 0xBA, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, +0x54, 0x4B, 0xBA, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x08, 0x08, 0x00, 0x00, 0x86, 0x46, 0x00, -0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x9A, -0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, -0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x14, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x8C, -0xA0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, -0x31, 0x31, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, -0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xDB, 0xDD, 0xBA, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, -0xA3, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x53, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, -0x18, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, -0xF9, 0x9F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, -0xDA, 0xD2, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1B, -0xBC, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, -0x9C, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x7B, 0xF4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, -0x5B, 0xD6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, -0x3B, 0xB8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, -0x1B, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, -0x04, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, -0xE4, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, -0xD4, 0x89, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, -0xB4, 0x6B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, -0x94, 0x4D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, -0x74, 0x2F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, -0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, -0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, -0x1D, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, -0xFC, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, -0xDC, 0xD4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, -0xBC, 0xB6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, -0xA5, 0xD2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, -0x85, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, -0x65, 0x96, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xAC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, -0x45, 0x78, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, -0x25, 0x5A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, -0x05, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, -0xEE, 0x59, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x34, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, -0xCE, 0x3B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x16, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, -0xAE, 0x1D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, -0x8D, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x6D, 0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, -0x4B, 0xBA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x08, 0x08, 0x00, 0x00, -0x86, 0x46, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, -0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x9A, 0xB0, -0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, -0x8C, 0xA0, 0x00, 0x14, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, -0x00, 0x00, 0x8C, 0xA0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, -0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, -0x2D, 0x31, 0x30, 0x0A, 0x00, 0xEB, 0xD7, 0x1B, 0x01, 0xED, 0x34, 0x6A, 0x00, 0x00, 0x00, 0x14, -0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x37, 0x20, 0x2D, 0x20, 0x4F, 0x79, 0x6D, 0x79, 0x61, 0x6B, 0x6F, -0x6E, 0x73, 0x6B, 0x79, +0x05, 0x06, 0x05, 0x09, 0x05, 0x08, 0x00, 0x00, 0x86, 0x46, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, +0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, +0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, +0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x14, 0x00, 0x00, 0xA8, 0xC0, +0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x14, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, +0x32, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, +0xFF, 0xFF, 0xA1, 0xDB, 0xDD, 0xBA, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xC5, 0x00, 0x00, 0x00, +0x00, 0x00, 0x15, 0x27, 0x53, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x6B, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x17, 0x08, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0x9F, 0x40, 0x00, 0x00, +0x00, 0x00, 0x18, 0xE9, 0x9E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xD2, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x1A, 0xCC, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x30, 0x70, 0x00, 0x00, +0x00, 0x00, 0x1C, 0xAC, 0x21, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x12, 0x70, 0x00, 0x00, +0x00, 0x00, 0x1E, 0x8C, 0x03, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xF4, 0x70, 0x00, 0x00, +0x00, 0x00, 0x20, 0x6B, 0xE5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xD6, 0x70, 0x00, 0x00, +0x00, 0x00, 0x22, 0x4B, 0xC7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xB8, 0x70, 0x00, 0x00, +0x00, 0x00, 0x24, 0x2B, 0xA9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x9A, 0x70, 0x00, 0x00, +0x00, 0x00, 0x26, 0x0B, 0x8B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xB6, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x27, 0xF4, 0xA7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xA7, 0x00, 0x00, 0x00, +0x00, 0x00, 0x29, 0x78, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x89, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xC4, 0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x6B, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xA4, 0x5C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x4D, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x2E, 0x84, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x2F, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x30, 0x64, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, +0x00, 0x00, 0x32, 0x72, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x34, 0x52, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, 0x00, +0x00, 0x00, 0x36, 0x31, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xF2, 0x70, 0x00, 0x00, +0x00, 0x00, 0x38, 0x1B, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xD4, 0x70, 0x00, 0x00, +0x00, 0x00, 0x39, 0xFA, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xB6, 0x70, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xDA, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xD2, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x3D, 0xBA, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xB4, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x9A, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x96, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x41, 0x83, 0xAC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x78, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x43, 0x63, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x5A, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x45, 0x43, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x3C, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x47, 0x23, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x59, 0x70, 0x00, 0x00, +0x00, 0x00, 0x49, 0x03, 0x34, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x3B, 0x70, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xE3, 0x16, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x1D, 0x70, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xCC, 0x32, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8D, 0xFF, 0x70, 0x00, 0x00, +0x00, 0x00, 0x4E, 0x6D, 0xF4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, 0xBA, 0xF0, 0x01, 0x02, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x08, +0x00, 0x00, 0x86, 0x46, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, +0x9A, 0xB0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x0C, +0x00, 0x00, 0x8C, 0xA0, 0x00, 0x14, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, +0x01, 0x10, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, +0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0xEB, 0xD7, 0x1B, 0x01, 0xED, 0x34, 0x6A, 0x00, 0x00, +0x00, 0x14, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x37, 0x20, 0x2D, 0x20, 0x4F, 0x79, 0x6D, 0x79, 0x61, +0x6B, 0x6F, 0x6E, 0x73, 0x6B, 0x79, /* Asia/Vientiane */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4C, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x47, 0x50, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0x88, 0x8C, 0x47, 0x50, 0x91, 0xA3, 0x2B, 0x0A, 0xCD, 0x35, 0xE6, 0x80, 0xD1, 0x59, 0xCE, 0x70, 0xD2, 0x3B, 0x3E, 0xF0, -0xD5, 0x32, 0xBB, 0x10, 0xE4, 0x51, 0x61, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, -0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, -0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, -0x00, 0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x8C, 0x47, -0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xA3, 0x2B, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x35, 0xE6, -0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x59, 0xCE, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x3B, 0x3E, -0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x32, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x51, 0x61, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, -0x02, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, -0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, -0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x37, 0x3E, -0x2D, 0x37, 0x0A, 0x00, 0xA4, 0xBE, 0x7A, 0x01, 0xAF, 0x36, 0xA0, 0x00, 0x00, 0x00, 0x00, +0xD5, 0x32, 0xBB, 0x10, 0xE4, 0x51, 0x61, 0x00, 0x01, 0x02, 0x03, 0x04, 0x02, 0x03, 0x02, 0x00, +0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, +0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x11, 0x00, 0x00, 0x62, +0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x8C, 0x47, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, +0x91, 0xA3, 0x2B, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x35, 0xE6, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, +0xD1, 0x59, 0xCE, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x3B, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, +0xD5, 0x32, 0xBB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x51, 0x61, 0x00, 0x01, 0x02, 0x03, 0x04, +0x02, 0x03, 0x02, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x63, 0xF6, 0x00, 0x04, 0x00, +0x00, 0x62, 0x70, 0x00, 0x09, 0x00, 0x00, 0x70, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x7E, 0x90, 0x00, +0x11, 0x00, 0x00, 0x62, 0x70, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4C, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, +0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0xA4, 0xBE, 0x7A, 0x01, 0xAF, 0x36, 0xA0, 0x00, 0x00, 0x00, +0x00, /* Asia/Vladivostok */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA7, 0x59, 0x47, 0x5D, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA7, 0x59, 0x47, 0x5D, 0xB5, 0xA3, 0xB6, 0xF0, 0x15, 0x27, 0x45, 0x60, 0x16, 0x18, 0x79, 0xD0, 0x17, 0x08, 0x78, 0xE0, 0x17, 0xF9, 0xAD, 0x50, 0x18, 0xE9, 0xAC, 0x60, 0x19, 0xDA, 0xE0, 0xD0, 0x1A, 0xCC, 0x31, 0x60, 0x1B, 0xBC, 0x3E, 0x80, 0x1C, 0xAC, 0x2F, 0x80, 0x1D, 0x9C, 0x20, 0x80, 0x1E, 0x8C, 0x11, 0x80, @@ -46329,70 +46569,69 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x69, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x46, 0x05, 0x4B, 0x00, 0x47, 0x23, 0x60, 0x80, 0x47, 0xEE, 0x67, 0x80, 0x49, 0x03, 0x42, 0x80, 0x49, 0xCE, 0x49, 0x80, 0x4A, 0xE3, 0x24, 0x80, 0x4B, 0xAE, 0x2B, 0x80, 0x4C, 0xCC, 0x41, 0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x54, 0x4B, 0xBA, 0xF0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x08, 0x04, 0x04, 0x00, 0x00, 0x7B, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, -0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, -0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x0C, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, -0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, -0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xA7, 0x59, 0x47, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xB6, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x15, 0x27, 0x45, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x79, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x08, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xAD, 0x50, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xAC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xE0, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x31, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x3E, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x20, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x02, 0x80, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6B, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xE4, 0x80, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xD5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xC6, 0x80, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xB7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xA8, 0x80, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0x99, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xC5, 0x00, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xB5, 0x10, 0x00, -0x00, 0x00, 0x00, 0x29, 0x78, 0x5D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x98, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x7A, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x5C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x3E, 0x00, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x5A, 0x80, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x35, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x3C, 0x80, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x1E, 0x80, 0x00, -0x00, 0x00, 0x00, 0x36, 0x31, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x00, 0x80, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xE2, 0x80, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFA, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xC4, 0x80, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDA, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xE1, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBA, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xC3, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9A, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xA5, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x83, 0xBA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x87, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x63, 0x9C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x69, 0x00, 0x00, -0x00, 0x00, 0x00, 0x45, 0x43, 0x7E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x4B, 0x00, 0x00, -0x00, 0x00, 0x00, 0x47, 0x23, 0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x67, 0x80, 0x00, -0x00, 0x00, 0x00, 0x49, 0x03, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x49, 0x80, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE3, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x2B, 0x80, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCC, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x00, -0x00, 0x00, 0x00, 0x54, 0x4B, 0xBA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, 0x00, 0x00, 0x7B, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, -0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0xCB, 0x32, 0x3A, 0x01, 0xDB, 0xF8, 0xF5, -0x00, 0x00, 0x00, 0x13, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x37, 0x20, 0x2D, 0x20, 0x41, 0x6D, 0x75, -0x72, 0x20, 0x52, 0x69, 0x76, 0x65, 0x72, +0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x59, +0x47, 0x5D, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xB6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, +0x45, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x79, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, +0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xAD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xAC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xE0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x31, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, +0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xE4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xD5, 0x80, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xC6, 0x80, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xB7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0x99, 0x80, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xB5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, +0x5D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, +0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, +0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, +0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, +0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x5A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, +0x35, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x3C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, +0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, +0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, +0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xE2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFA, +0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xC4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, +0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, +0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, +0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, +0xBA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, +0x9C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, +0x7E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, +0x60, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, +0x42, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x49, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, +0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x2B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, +0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, +0xBA, 0xF0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x08, 0x04, 0x00, 0x00, 0x7B, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x00, +0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x00, +0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x0C, 0x00, 0x00, 0x7E, +0x90, 0x00, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x08, 0x00, +0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, +0x00, 0x2B, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0xCB, 0x32, 0x3A, 0x01, 0xDB, +0xF8, 0xF5, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x37, 0x20, 0x2D, 0x20, 0x41, +0x6D, 0x75, 0x72, 0x20, 0x52, 0x69, 0x76, 0x65, 0x72, /* Asia/Yakutsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xDB, 0xEA, 0x5E, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xDB, 0xEA, 0x5E, 0xB5, 0xA3, 0xC5, 0x00, 0x15, 0x27, 0x53, 0x70, 0x16, 0x18, 0x87, 0xE0, 0x17, 0x08, 0x86, 0xF0, 0x17, 0xF9, 0xBB, 0x60, 0x18, 0xE9, 0xBA, 0x70, 0x19, 0xDA, 0xEE, 0xE0, 0x1A, 0xCC, 0x3F, 0x70, 0x1B, 0xBC, 0x4C, 0x90, 0x1C, 0xAC, 0x3D, 0x90, 0x1D, 0x9C, 0x2E, 0x90, 0x1E, 0x8C, 0x1F, 0x90, @@ -46409,90 +46648,88 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0x77, 0x10, 0x45, 0x43, 0x8C, 0x90, 0x46, 0x05, 0x59, 0x10, 0x47, 0x23, 0x6E, 0x90, 0x47, 0xEE, 0x75, 0x90, 0x49, 0x03, 0x50, 0x90, 0x49, 0xCE, 0x57, 0x90, 0x4A, 0xE3, 0x32, 0x90, 0x4B, 0xAE, 0x39, 0x90, 0x4C, 0xCC, 0x4F, 0x10, 0x4D, 0x8E, 0x1B, 0x90, 0x54, 0x4B, 0xC9, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x08, 0x04, 0x04, 0x00, 0x00, 0x79, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, -0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, -0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, -0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, -0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, -0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, -0xFF, 0xFF, 0xFF, 0xA1, 0xDB, 0xEA, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xC5, 0x00, 0x00, -0x00, 0x00, 0x00, 0x15, 0x27, 0x53, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x87, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x17, 0x08, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xBB, 0x60, 0x00, -0x00, 0x00, 0x00, 0x18, 0xE9, 0xBA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x1A, 0xCC, 0x3F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x4C, 0x90, 0x00, -0x00, 0x00, 0x00, 0x1C, 0xAC, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x2E, 0x90, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x8C, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x10, 0x90, 0x00, -0x00, 0x00, 0x00, 0x20, 0x6C, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xF2, 0x90, 0x00, -0x00, 0x00, 0x00, 0x22, 0x4B, 0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xD4, 0x90, 0x00, -0x00, 0x00, 0x00, 0x24, 0x2B, 0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xB6, 0x90, 0x00, -0x00, 0x00, 0x00, 0x26, 0x0B, 0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xD3, 0x10, 0x00, -0x00, 0x00, 0x00, 0x27, 0xF4, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xC3, 0x20, 0x00, -0x00, 0x00, 0x00, 0x29, 0x78, 0x6B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xA6, 0x10, 0x00, -0x00, 0x00, 0x00, 0x2A, 0xC4, 0x97, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x88, 0x10, 0x00, -0x00, 0x00, 0x00, 0x2C, 0xA4, 0x79, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x6A, 0x10, 0x00, -0x00, 0x00, 0x00, 0x2E, 0x84, 0x5B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x4C, 0x10, 0x00, -0x00, 0x00, 0x00, 0x30, 0x64, 0x3D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x68, 0x90, 0x00, -0x00, 0x00, 0x00, 0x32, 0x72, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x4A, 0x90, 0x00, -0x00, 0x00, 0x00, 0x34, 0x52, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x2C, 0x90, 0x00, -0x00, 0x00, 0x00, 0x36, 0x32, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x0E, 0x90, 0x00, -0x00, 0x00, 0x00, 0x38, 0x1B, 0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xF0, 0x90, 0x00, -0x00, 0x00, 0x00, 0x39, 0xFB, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xD2, 0x90, 0x00, -0x00, 0x00, 0x00, 0x3B, 0xDA, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xEF, 0x10, 0x00, -0x00, 0x00, 0x00, 0x3D, 0xBA, 0xCA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xD1, 0x10, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x9A, 0xAC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xB3, 0x10, 0x00, -0x00, 0x00, 0x00, 0x41, 0x83, 0xC8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x95, 0x10, 0x00, -0x00, 0x00, 0x00, 0x43, 0x63, 0xAA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x77, 0x10, 0x00, -0x00, 0x00, 0x00, 0x45, 0x43, 0x8C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x59, 0x10, 0x00, -0x00, 0x00, 0x00, 0x47, 0x23, 0x6E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x75, 0x90, 0x00, -0x00, 0x00, 0x00, 0x49, 0x03, 0x50, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x57, 0x90, 0x00, -0x00, 0x00, 0x00, 0x4A, 0xE3, 0x32, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x39, 0x90, 0x00, -0x00, 0x00, 0x00, 0x4C, 0xCC, 0x4F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x1B, 0x90, 0x00, -0x00, 0x00, 0x00, 0x54, 0x4B, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x08, 0x04, 0x00, 0x00, 0x79, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, -0x2B, 0x30, 0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0xE7, 0xEF, 0x00, 0x01, 0xD8, 0x83, 0x8A, 0x00, -0x00, 0x00, 0x13, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x36, 0x20, 0x2D, 0x20, 0x4C, 0x65, 0x6E, 0x61, -0x20, 0x52, 0x69, 0x76, 0x65, 0x72, +0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xDB, +0xEA, 0x5E, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, +0x53, 0x70, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x87, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, +0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xBB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, +0xBA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDA, 0xEE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, +0x3F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x4C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, +0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x2E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, +0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x10, 0x90, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, +0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xF2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, +0xE3, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0xD4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, +0xC5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xB6, 0x90, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, +0xA7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0x04, 0xD3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, +0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0xC3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, +0x6B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, +0x97, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0x88, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, +0x79, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0x6A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, +0x5B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, +0x3D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, +0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x4A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, +0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x2C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, +0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x0E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, +0x24, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xF0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, +0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, +0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xEF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, +0xCA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xD1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, +0xAC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xB3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, +0xC8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x95, 0x10, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, +0xAA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0x77, 0x10, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, +0x8C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x59, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, +0x6E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x75, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, +0x50, 0x90, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x57, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, +0x32, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x39, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, +0x4F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x1B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4B, +0xC9, 0x00, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x08, 0x04, 0x00, 0x00, 0x79, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x04, 0x00, +0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0x00, 0x00, 0x7E, 0x90, 0x00, +0x0C, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x01, 0x0C, 0x00, 0x00, 0x70, +0x80, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x01, 0x08, 0x00, +0x00, 0x7E, 0x90, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x2B, 0x31, 0x30, +0x00, 0x2B, 0x30, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x0A, 0x3C, 0x2B, 0x30, 0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0xE7, 0xEF, 0x00, 0x01, 0xD8, 0x83, +0x8A, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x36, 0x20, 0x2D, 0x20, 0x4C, 0x65, +0x6E, 0x61, 0x20, 0x52, 0x69, 0x76, 0x65, 0x72, /* Asia/Yangon */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, -0xA1, 0xF2, 0x73, 0x51, 0xCB, 0xF2, 0xFC, 0x18, 0xD1, 0x9A, 0x67, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, -0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, -0x68, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, -0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, +0xA1, 0xF2, 0x73, 0x51, 0xCB, 0xF2, 0xFC, 0x18, 0xD1, 0x9A, 0x67, 0xF0, 0x01, 0x02, 0x03, 0x02, +0x00, 0x00, 0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x89, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x73, -0x51, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xF2, 0xFC, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x9A, 0x67, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, -0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x36, 0x33, 0x30, 0x3E, 0x2D, 0x36, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0xA2, 0xF0, 0x3D, -0x01, 0xA5, 0x65, 0x9A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, +0x56, 0xB6, 0x89, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF2, 0x73, 0x51, 0xFF, 0xFF, 0xFF, 0xFF, +0xCB, 0xF2, 0xFC, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x9A, 0x67, 0xF0, 0x01, 0x02, 0x03, 0x02, +0x00, 0x00, 0x5A, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x2F, 0x00, 0x04, 0x00, 0x00, 0x5B, 0x68, +0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0E, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x52, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x3E, 0x2D, 0x36, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0xA2, +0xF0, 0x3D, 0x01, 0xA5, 0x65, 0x9A, 0x00, 0x00, 0x00, 0x00, /* Asia/Yekaterinburg */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x9B, 0x5F, 0x09, 0x27, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0x9B, 0x5F, 0x09, 0x27, 0xA1, 0x12, 0xB1, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x15, 0x27, 0x8B, 0xB0, 0x16, 0x18, 0xC0, 0x20, 0x17, 0x08, 0xBF, 0x30, 0x17, 0xF9, 0xF3, 0xA0, 0x18, 0xE9, 0xF2, 0xB0, 0x19, 0xDB, 0x27, 0x20, 0x1A, 0xCC, 0x77, 0xB0, 0x1B, 0xBC, 0x84, 0xD0, 0x1C, 0xAC, 0x75, 0xD0, 0x1D, 0x9C, 0x66, 0xD0, @@ -46509,72 +46746,71 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0xE2, 0xD0, 0x44, 0x25, 0xAF, 0x50, 0x45, 0x43, 0xC4, 0xD0, 0x46, 0x05, 0x91, 0x50, 0x47, 0x23, 0xA6, 0xD0, 0x47, 0xEE, 0xAD, 0xD0, 0x49, 0x03, 0x88, 0xD0, 0x49, 0xCE, 0x8F, 0xD0, 0x4A, 0xE3, 0x6A, 0xD0, 0x4B, 0xAE, 0x71, 0xD0, 0x4C, 0xCC, 0x87, 0x50, 0x4D, 0x8E, 0x53, 0xD0, -0x54, 0x4C, 0x01, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, -0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x54, 0x4C, 0x01, 0x40, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x05, 0x00, 0x00, 0x38, 0xD9, 0x00, -0x00, 0x00, 0x00, 0x34, 0xC1, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x54, -0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x00, -0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x10, 0x00, 0x00, 0x38, 0x40, 0x00, -0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, -0x50, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, -0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xFF, -0xFF, 0xFF, 0xFF, 0x9B, 0x5F, 0x09, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x12, 0xB1, 0xFF, 0xFF, -0xFF, 0xFF, 0xFF, 0xB5, 0xA3, 0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x16, 0x18, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xBF, 0x30, 0x00, -0x00, 0x00, 0x00, 0x17, 0xF9, 0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x19, 0xDB, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, -0x00, 0x00, 0x00, 0x1B, 0xBC, 0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x1D, 0x9C, 0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x7C, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x21, 0x5C, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x23, 0x3C, 0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x25, 0x1B, 0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x27, 0x05, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, -0x00, 0x00, 0x00, 0x28, 0xE4, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, -0x00, 0x00, 0x00, 0x29, 0xD4, 0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2B, 0xB4, 0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2D, 0x94, 0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2F, 0x74, 0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, -0x00, 0x00, 0x00, 0x31, 0x5D, 0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x33, 0x3D, 0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x35, 0x1D, 0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x36, 0xFD, 0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x5C, 0x50, 0x00, -0x00, 0x00, 0x00, 0x38, 0xDD, 0x28, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x3E, 0x50, 0x00, -0x00, 0x00, 0x00, 0x3A, 0xBD, 0x0A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x20, 0x50, 0x00, -0x00, 0x00, 0x00, 0x3C, 0xA6, 0x27, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x02, 0x50, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x86, 0x09, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xE4, 0x50, 0x00, -0x00, 0x00, 0x00, 0x40, 0x65, 0xEB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x00, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x42, 0x45, 0xCD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xE2, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x44, 0x25, 0xAF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xC4, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x46, 0x05, 0x91, 0x50, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xA6, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x47, 0xEE, 0xAD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x88, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x49, 0xCE, 0x8F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x6A, 0xD0, 0x00, -0x00, 0x00, 0x00, 0x4B, 0xAE, 0x71, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x87, 0x50, 0x00, -0x00, 0x00, 0x00, 0x4D, 0x8E, 0x53, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x01, 0x40, 0x00, -0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x08, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x05, 0x00, 0x00, 0x38, 0xD9, 0x00, 0x00, -0x00, 0x00, 0x34, 0xC1, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, -0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x00, 0x00, -0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x10, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, -0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, -0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, -0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xE0, 0x13, 0x48, 0x01, -0x6F, 0x20, 0x60, 0x00, 0x00, 0x00, 0x0E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x32, 0x20, 0x2D, 0x20, -0x55, 0x72, 0x61, 0x6C, 0x73, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x00, 0x00, 0x38, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x34, 0xC1, +0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, +0x46, 0x50, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, +0x00, 0x00, 0x46, 0x50, 0x01, 0x10, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x54, 0x60, +0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x4C, 0x4D, +0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, +0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5F, +0x09, 0x27, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x12, 0xB1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA3, +0xFD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, +0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, +0xF3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE9, 0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, +0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x77, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, +0x84, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x75, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, +0x66, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x57, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, +0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x39, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, +0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x1B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, +0x0C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0xFD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, +0xEE, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xDF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, +0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF4, 0xFC, 0x50, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, +0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xA3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, +0xDE, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, +0xC0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, +0xA2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0x93, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, +0x84, 0x50, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x75, 0x50, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, +0xA0, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x7B, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, +0x82, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x5D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, +0x64, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x3F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, +0x46, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x5C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, +0x28, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x3E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, +0x0A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, +0x27, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x02, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, +0x09, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xE4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, +0xEB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, +0xCD, 0x50, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xE2, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, +0xAF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xC4, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, +0x91, 0x50, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xA6, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, +0xAD, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x88, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, +0x8F, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x6A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, +0x71, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x87, 0x50, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, +0x53, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x01, 0x40, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x07, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x09, 0x05, 0x00, 0x00, 0x38, 0xD9, +0x00, 0x00, 0x00, 0x00, 0x34, 0xC1, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, +0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, 0x00, 0x00, 0x46, 0x50, 0x00, 0x10, +0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x10, 0x00, 0x00, 0x38, 0x40, +0x00, 0x08, 0x00, 0x00, 0x54, 0x60, 0x00, 0x0C, 0x00, 0x00, 0x54, 0x60, 0x01, 0x0C, 0x00, 0x00, +0x46, 0x50, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0xE0, 0x13, +0x48, 0x01, 0x6F, 0x20, 0x60, 0x00, 0x00, 0x00, 0x0E, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x32, 0x20, +0x2D, 0x20, 0x55, 0x72, 0x61, 0x6C, 0x73, /* Asia/Yerevan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x9A, 0x48, +0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x19, 0x9A, 0x48, 0xE7, 0xDA, 0x0C, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -46590,66 +46826,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x43, 0x63, 0xF0, 0xE0, 0x44, 0x25, 0xBD, 0x60, 0x45, 0x43, 0xD2, 0xE0, 0x46, 0x05, 0x9F, 0x60, 0x47, 0x23, 0xB4, 0xE0, 0x47, 0xEE, 0xBB, 0xE0, 0x49, 0x03, 0x96, 0xE0, 0x49, 0xCE, 0x9D, 0xE0, 0x4A, 0xE3, 0x78, 0xE0, 0x4B, 0xAE, 0x7F, 0xE0, 0x4C, 0xCC, 0x95, 0x60, 0x4D, 0x8E, 0x61, 0xE0, -0x4E, 0xAC, 0x77, 0x60, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x4E, 0xAC, 0x77, 0x60, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x04, 0x00, 0x00, 0x29, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2A, -0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, -0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, -0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, -0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, -0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x9A, -0x48, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, -0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, -0x60, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, -0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, -0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, -0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, -0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x90, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x72, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x54, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x36, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x18, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x35, -0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x17, -0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF9, -0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xDB, -0x60, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xBD, -0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xD2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x9F, -0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xB4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xBB, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x96, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x9D, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x7F, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x95, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x61, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0x77, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x04, -0x00, 0x00, 0x29, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, -0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, -0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, -0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, -0xC6, 0xA4, 0xDD, 0x01, 0x56, 0x8F, 0x50, 0x00, 0x00, 0x00, 0x00, +0x05, 0x04, 0x00, 0x00, 0x29, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, +0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, +0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x0A, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0x9A, 0x48, 0xFF, 0xFF, 0xFF, 0xFF, +0xE7, 0xDA, 0x0C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, +0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x1B, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x27, 0x05, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x0A, 0x60, 0x00, 0x00, 0x00, 0x00, +0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, +0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, +0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, +0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, +0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x90, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x54, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, +0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, +0x41, 0x84, 0x0E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xDB, 0x60, 0x00, 0x00, 0x00, 0x00, +0x43, 0x63, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xBD, 0x60, 0x00, 0x00, 0x00, 0x00, +0x45, 0x43, 0xD2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x9F, 0x60, 0x00, 0x00, 0x00, 0x00, +0x47, 0x23, 0xB4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xBB, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x49, 0x03, 0x96, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x9D, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x4A, 0xE3, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x4C, 0xCC, 0x95, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x4E, 0xAC, 0x77, 0x60, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x00, 0x00, 0x29, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, +0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, +0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, +0x0A, 0x00, 0xC6, 0xA4, 0xDD, 0x01, 0x56, 0x8F, 0x50, 0x00, 0x00, 0x00, 0x00, /* Atlantic/Azores */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xDF, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x92, 0xE6, 0xAA, 0xA0, 0x9B, 0x4B, 0x89, 0x90, 0x9B, 0xFE, 0xE3, 0xA0, 0x9C, 0x9D, 0x09, 0x90, 0x9D, 0xC9, 0x9F, 0x90, 0x9E, 0x7F, 0x8E, 0x90, 0x9F, 0xAA, 0xD3, 0x10, 0xA0, 0x5F, 0x70, 0x90, 0xA1, 0x8C, 0x06, 0x90, 0xA2, 0x41, 0xF5, 0x90, 0xA3, 0x6E, 0x8B, 0x90, 0xA4, 0x23, 0x29, 0x10, @@ -46705,144 +46940,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, -0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x06, 0x02, 0x03, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, -0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, -0x09, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, -0x0A, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0C, 0xFF, 0xFF, 0xE7, 0xF0, -0x00, 0x00, 0xFF, 0xFF, 0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, -0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, -0x00, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, -0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x1B, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0xAA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x89, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xFE, 0xE3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9D, 0x09, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xC9, 0x9F, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x8E, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xAA, 0xD3, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x70, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x8C, 0x06, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xF5, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x6E, 0x8B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x29, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x4F, 0xBF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x06, 0x0B, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xF4, 0xAB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xC4, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0xA7, 0x40, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x6B, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x87, 0x22, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x88, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x70, 0x3E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0xA4, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x50, 0x20, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x68, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0xE4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xD5, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xEF, 0xC6, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xD4, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xBD, 0xB8, 0xC5, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x7B, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x98, 0xA7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9B, 0x0D, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0x78, 0x89, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x7A, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x58, 0x6B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x21, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x38, 0x4D, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0xB3, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x58, 0xC8, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xFB, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x3C, 0x90, -0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xE2, 0x7F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x6F, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEC, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x68, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xBF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x51, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xC3, 0x67, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xBF, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xC5, 0xDB, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x33, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xAC, 0x84, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0xA1, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xA5, 0xBD, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x55, 0x15, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x8C, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x83, 0x00, -0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0x9F, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xE1, 0x10, -0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x49, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xED, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0xDE, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xCF, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0xC0, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0xB1, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0xA2, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x93, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xC9, 0x84, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0xA0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x91, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x92, 0x82, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x73, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x72, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x55, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x52, 0x46, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x37, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x32, 0x28, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x22, 0x19, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x1B, 0x45, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x36, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xFB, 0x27, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEB, 0x18, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xDB, 0x09, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xFA, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xBA, 0xEB, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xDC, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x9A, 0xCD, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xBE, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7A, 0xAF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0xA0, 0x40, -0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x63, 0xCB, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xBC, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x43, 0xAD, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x9E, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x23, 0x8F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x80, 0xC0, -0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x62, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x29, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x8B, 0x1A, 0x10, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x45, 0x90, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x36, 0x90, -0x00, 0x00, 0x00, 0x00, 0x11, 0x64, 0x27, 0x90, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x26, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x13, 0x44, 0x09, 0x90, 0x00, 0x00, 0x00, 0x00, 0x14, 0x34, 0x08, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xF9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xEA, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xDB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xCC, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xCB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xAE, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x9F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xCB, 0x20, -0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xBC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0xAD, 0x20, -0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x9E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x8F, 0x20, -0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x71, 0x20, -0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x62, 0x20, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x53, 0x20, -0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x35, 0x20, -0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x26, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x51, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x42, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x33, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x24, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x15, 0xA0, -0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, -0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, -0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, -0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, -0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, -0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, -0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, -0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, -0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, -0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, -0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, -0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, -0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, -0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, -0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, -0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, -0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, -0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, -0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, -0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, -0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, -0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, -0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, -0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, -0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, -0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, -0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, -0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, -0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, -0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, -0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, -0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, -0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, -0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, -0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, -0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, -0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, -0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, -0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, -0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, -0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, -0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, +0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x06, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, @@ -46856,18 +46954,154 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, -0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0C, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0xFF, -0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, -0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, -0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0xFF, 0xFF, -0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, -0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x31, 0x3E, 0x31, 0x3C, -0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x30, 0x2C, 0x4D, 0x31, -0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xC2, 0xE7, 0xD5, 0x00, 0xEB, 0x7E, 0x75, -0x00, 0x00, 0x00, 0x06, 0x41, 0x7A, 0x6F, 0x72, 0x65, 0x73, +0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xE5, +0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, +0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0xFF, 0xFF, 0xF1, +0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, +0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, +0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x00, 0x00, 0x0D, 0x00, +0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x5E, 0x3D, 0x1B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, +0xE6, 0xAA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x4B, 0x89, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, +0xFE, 0xE3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x9D, 0x09, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, +0xC9, 0x9F, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0x7F, 0x8E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, +0xAA, 0xD3, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x5F, 0x70, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, +0x8C, 0x06, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x41, 0xF5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, +0x6E, 0x8B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x23, 0x29, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, +0x4F, 0xBF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x06, 0x0B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, +0xF4, 0xAB, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xC9, 0xC4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, +0xA7, 0x40, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xA0, 0x6B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, +0x87, 0x22, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x89, 0x88, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, +0x70, 0x3E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x72, 0xA4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, +0x50, 0x20, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x32, 0x68, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, +0x0F, 0xE4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFF, 0xD5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, +0xEF, 0xC6, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xC8, 0xD4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xBD, +0xB8, 0xC5, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x9F, 0x7B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, +0x98, 0xA7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x9B, 0x0D, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, +0x78, 0x89, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC2, 0x68, 0x7A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, +0x58, 0x6B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x3F, 0x21, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, +0x38, 0x4D, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x3A, 0xB3, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, +0x58, 0xC8, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD9, 0xFB, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, +0x01, 0x4B, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xF1, 0x3C, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, +0xE2, 0x7F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xB5, 0x6F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, +0xEC, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x80, 0x68, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, +0xDC, 0xBF, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x95, 0x51, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, +0xC3, 0x67, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0x72, 0xBF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, +0xC5, 0xDB, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x75, 0x33, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, +0xAC, 0x84, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x52, 0xA1, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, +0xA5, 0xBD, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x55, 0x15, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, +0x8C, 0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x32, 0x83, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, +0x85, 0x9F, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x59, 0xE1, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, +0x49, 0xD2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xED, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, +0x29, 0xDE, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x19, 0xCF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, +0x09, 0xC0, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0xF9, 0xB1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, +0xE9, 0xA2, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xD9, 0x93, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, +0xC9, 0x84, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, +0xB2, 0xA0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0xA2, 0x91, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, +0x92, 0x82, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x82, 0x73, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, +0x72, 0x64, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0x62, 0x55, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, +0x52, 0x46, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0x42, 0x37, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, +0x32, 0x28, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0x22, 0x19, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, +0x1B, 0x45, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x0B, 0x36, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, +0xFB, 0x27, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEB, 0x18, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, +0xDB, 0x09, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xCA, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, +0xBA, 0xEB, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0xAA, 0xDC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, +0x9A, 0xCD, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x8A, 0xBE, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, +0x7A, 0xAF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x6A, 0xA0, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, +0x63, 0xCB, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x53, 0xBC, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, +0x43, 0xAD, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x33, 0x9E, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, +0x23, 0x8F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x13, 0x80, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0x03, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF3, 0x62, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0D, +0x9B, 0x29, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x8B, 0x1A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, +0x84, 0x45, 0x90, 0x00, 0x00, 0x00, 0x00, 0x10, 0x74, 0x36, 0x90, 0x00, 0x00, 0x00, 0x00, 0x11, +0x64, 0x27, 0x90, 0x00, 0x00, 0x00, 0x00, 0x12, 0x54, 0x26, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x13, +0x44, 0x09, 0x90, 0x00, 0x00, 0x00, 0x00, 0x14, 0x34, 0x08, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x15, +0x23, 0xF9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x13, 0xEA, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, +0x03, 0xDB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF3, 0xCC, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, +0xE3, 0xCB, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xAE, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1A, +0xC3, 0x9F, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xCB, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1C, +0xAC, 0xBC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0xAD, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1E, +0x8C, 0x9E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x8F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, +0x6C, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x71, 0x20, 0x00, 0x00, 0x00, 0x00, 0x22, +0x4C, 0x62, 0x20, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x53, 0x20, 0x00, 0x00, 0x00, 0x00, 0x24, +0x2C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x35, 0x20, 0x00, 0x00, 0x00, 0x00, 0x26, +0x0C, 0x26, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x51, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x27, +0xF5, 0x42, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x33, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, +0xD5, 0x24, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC5, 0x15, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2B, +0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, +0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, +0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, +0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, +0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, +0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, +0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, +0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, +0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, +0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, +0x86, 0x41, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, +0x66, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, +0x46, 0x05, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, +0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, +0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, +0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, +0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, +0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, +0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, +0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, +0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, +0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, +0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, +0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, +0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, +0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, +0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, +0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, +0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, +0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, +0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, +0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, +0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, +0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, +0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, +0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, +0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, +0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, +0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, +0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, +0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, +0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, +0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, +0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x01, 0x06, 0x02, 0x03, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, +0x07, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x09, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x0A, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, +0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0x0B, 0x0C, 0xFF, 0xFF, 0xE7, 0xF0, 0x00, 0x00, +0xFF, 0xFF, 0xE5, 0x28, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, +0x00, 0x0C, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x0C, 0xFF, 0xFF, +0xE3, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, +0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, +0x01, 0x10, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x48, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x57, 0x45, 0x54, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x31, 0x3E, +0x31, 0x3C, 0x2B, 0x30, 0x30, 0x3E, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x30, 0x2C, +0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x31, 0x0A, 0x00, 0xC2, 0xE7, 0xD5, 0x00, 0xEB, +0x7E, 0x75, 0x00, 0x00, 0x00, 0x06, 0x41, 0x7A, 0x6F, 0x72, 0x65, 0x73, /* Atlantic/Bermuda */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -47148,22 +47382,21 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Atlantic/Cape_Verde */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xE6, 0xAA, 0xA0, -0xCC, 0x95, 0x9C, 0x20, 0xD2, 0x74, 0x7C, 0x10, 0x0B, 0x17, 0xF7, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x04, 0xFF, 0xFF, 0xE9, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, -0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, -0xF0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0xAA, 0xA0, 0xFF, 0xFF, 0xFF, -0xFF, 0xCC, 0x95, 0x9C, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x74, 0x7C, 0x10, 0x00, 0x00, 0x00, -0x00, 0x0B, 0x17, 0xF7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x04, 0x04, 0xFF, 0xFF, 0xE9, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, -0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x31, 0x3E, 0x31, 0x0A, 0x00, 0xA0, -0x17, 0x12, 0x00, 0xEE, 0xC6, 0x4D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xE6, 0xAA, 0xA0, +0xCC, 0x95, 0x9C, 0x20, 0xD2, 0x74, 0x7C, 0x10, 0x0B, 0x17, 0xF7, 0x40, 0x01, 0x02, 0x03, 0x04, +0xFF, 0xFF, 0xE9, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, +0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0xAA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x95, 0x9C, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x74, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x17, 0xF7, 0x40, +0x01, 0x02, 0x03, 0x04, 0xFF, 0xFF, 0xE9, 0xF4, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, +0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x08, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x31, 0x3E, 0x31, 0x0A, +0x00, 0xA0, 0x17, 0x12, 0x00, 0xEE, 0xC6, 0x4D, 0x00, 0x00, 0x00, 0x00, /* Atlantic/Faeroe */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -47401,146 +47634,150 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Atlantic/Jan_Mayen */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, -0x9B, 0x27, 0xE3, 0x00, 0x9B, 0xD4, 0x7B, 0x60, 0xC8, 0xB7, 0x4D, 0x60, 0xCC, 0xE7, 0x4B, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, +0x9B, 0x0C, 0x17, 0x60, 0x9B, 0xD5, 0xDA, 0xF0, 0x9C, 0xD9, 0xAE, 0x90, 0x9D, 0xA4, 0xB5, 0x90, +0x9E, 0xB9, 0x90, 0x90, 0x9F, 0x84, 0x97, 0x90, 0xC8, 0x09, 0x71, 0x90, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xD0, 0x82, 0x25, 0x10, -0xD1, 0x72, 0x16, 0x10, 0xD2, 0x62, 0x07, 0x10, 0xEB, 0xAF, 0x20, 0x90, 0xEC, 0xA8, 0x4C, 0x10, -0xED, 0x98, 0x3D, 0x10, 0xEE, 0x88, 0x2E, 0x10, 0xEF, 0x78, 0x1F, 0x10, 0xF0, 0x68, 0x10, 0x10, -0xF1, 0x58, 0x01, 0x10, 0xF2, 0x47, 0xF2, 0x10, 0xF3, 0x37, 0xE3, 0x10, 0xF4, 0x27, 0xD4, 0x10, -0xF5, 0x17, 0xC5, 0x10, 0xF6, 0x10, 0xF0, 0x90, 0xF7, 0x2F, 0x06, 0x10, 0xF7, 0xF0, 0xD2, 0x90, -0x13, 0x4D, 0x44, 0x10, 0x14, 0x33, 0xFA, 0x90, 0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, -0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, 0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, -0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, 0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, -0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, 0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, -0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, 0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, -0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, 0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, -0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, 0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, -0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, 0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, -0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, 0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, -0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, 0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, -0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, 0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, -0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, 0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, -0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, 0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, -0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, 0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, -0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, 0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, -0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, -0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, -0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, 0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, -0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, 0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, -0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, 0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, -0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, 0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, -0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, 0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, -0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, 0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, -0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, 0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, -0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, 0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, -0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, 0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, -0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, 0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, -0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, 0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, -0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x00, 0x00, 0x0A, -0x14, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, -0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, -0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, -0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, -0xFF, 0xFF, 0x72, 0xEE, 0x24, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x27, 0xE3, 0x00, 0xFF, 0xFF, -0xFF, 0xFF, 0x9B, 0xD4, 0x7B, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xB7, 0x4D, 0x60, 0xFF, 0xFF, -0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD0, 0x82, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x72, 0x16, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xD2, 0x62, 0x07, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xAF, 0x20, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xEC, 0xA8, 0x4C, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x98, 0x3D, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xEE, 0x88, 0x2E, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x78, 0x1F, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF0, 0x68, 0x10, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x58, 0x01, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF2, 0x47, 0xF2, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0x37, 0xE3, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x27, 0xD4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x17, 0xC5, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0x10, 0xF0, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x2F, 0x06, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0xF0, 0xD2, 0x90, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, 0x00, -0x00, 0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, -0x00, 0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, -0x00, 0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, -0x00, 0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, -0x00, 0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, -0x00, 0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, -0x00, 0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, -0x00, 0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, -0x00, 0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, -0x00, 0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, -0x00, 0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, -0x00, 0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, -0x00, 0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, -0x00, 0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, -0x00, 0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, -0x00, 0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, -0x00, 0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, -0x00, 0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, -0x00, 0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, -0x00, 0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, -0x00, 0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, -0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, -0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, -0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, -0x00, 0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, -0x00, 0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, -0x00, 0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, -0x00, 0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, -0x00, 0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, -0x00, 0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, -0x00, 0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, -0x00, 0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, -0x00, 0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, -0x00, 0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, -0x00, 0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, -0x00, 0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, -0x00, 0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, -0x00, 0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, -0x00, 0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, -0x00, 0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x00, 0x00, 0x0A, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, -0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, -0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x43, 0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, -0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, -0x30, 0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0xD1, 0x72, 0x16, 0x10, 0xD1, 0xB6, 0x96, 0x00, 0xD2, 0x58, 0xBE, 0x80, 0xD2, 0xA1, 0x4F, 0x10, +0xD3, 0x63, 0x1B, 0x90, 0xD4, 0x4B, 0x23, 0x90, 0xD5, 0x39, 0xD1, 0x20, 0xD5, 0x67, 0xE7, 0x90, +0xD5, 0xA8, 0x73, 0x00, 0xD6, 0x29, 0xB4, 0x10, 0xD7, 0x2C, 0x1A, 0x10, 0xD8, 0x09, 0x96, 0x10, +0xD9, 0x02, 0xC1, 0x90, 0xD9, 0xE9, 0x78, 0x10, 0x13, 0x4D, 0x44, 0x10, 0x14, 0x33, 0xFA, 0x90, +0x15, 0x23, 0xEB, 0x90, 0x16, 0x13, 0xDC, 0x90, 0x17, 0x03, 0xCD, 0x90, 0x17, 0xF3, 0xBE, 0x90, +0x18, 0xE3, 0xAF, 0x90, 0x19, 0xD3, 0xA0, 0x90, 0x1A, 0xC3, 0x91, 0x90, 0x1B, 0xBC, 0xBD, 0x10, +0x1C, 0xAC, 0xAE, 0x10, 0x1D, 0x9C, 0x9F, 0x10, 0x1E, 0x8C, 0x90, 0x10, 0x1F, 0x7C, 0x81, 0x10, +0x20, 0x6C, 0x72, 0x10, 0x21, 0x5C, 0x63, 0x10, 0x22, 0x4C, 0x54, 0x10, 0x23, 0x3C, 0x45, 0x10, +0x24, 0x2C, 0x36, 0x10, 0x25, 0x1C, 0x27, 0x10, 0x26, 0x0C, 0x18, 0x10, 0x27, 0x05, 0x43, 0x90, +0x27, 0xF5, 0x34, 0x90, 0x28, 0xE5, 0x25, 0x90, 0x29, 0xD5, 0x16, 0x90, 0x2A, 0xC5, 0x07, 0x90, +0x2B, 0xB4, 0xF8, 0x90, 0x2C, 0xA4, 0xE9, 0x90, 0x2D, 0x94, 0xDA, 0x90, 0x2E, 0x84, 0xCB, 0x90, +0x2F, 0x74, 0xBC, 0x90, 0x30, 0x64, 0xAD, 0x90, 0x31, 0x5D, 0xD9, 0x10, 0x32, 0x72, 0xB4, 0x10, +0x33, 0x3D, 0xBB, 0x10, 0x34, 0x52, 0x96, 0x10, 0x35, 0x1D, 0x9D, 0x10, 0x36, 0x32, 0x78, 0x10, +0x36, 0xFD, 0x7F, 0x10, 0x38, 0x1B, 0x94, 0x90, 0x38, 0xDD, 0x61, 0x10, 0x39, 0xFB, 0x76, 0x90, +0x3A, 0xBD, 0x43, 0x10, 0x3B, 0xDB, 0x58, 0x90, 0x3C, 0xA6, 0x5F, 0x90, 0x3D, 0xBB, 0x3A, 0x90, +0x3E, 0x86, 0x41, 0x90, 0x3F, 0x9B, 0x1C, 0x90, 0x40, 0x66, 0x23, 0x90, 0x41, 0x84, 0x39, 0x10, +0x42, 0x46, 0x05, 0x90, 0x43, 0x64, 0x1B, 0x10, 0x44, 0x25, 0xE7, 0x90, 0x45, 0x43, 0xFD, 0x10, +0x46, 0x05, 0xC9, 0x90, 0x47, 0x23, 0xDF, 0x10, 0x47, 0xEE, 0xE6, 0x10, 0x49, 0x03, 0xC1, 0x10, +0x49, 0xCE, 0xC8, 0x10, 0x4A, 0xE3, 0xA3, 0x10, 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, +0x4D, 0x8E, 0x8C, 0x10, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, +0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x37, 0x6C, 0x90, 0x54, 0x4C, 0x47, 0x90, +0x55, 0x17, 0x4E, 0x90, 0x56, 0x2C, 0x29, 0x90, 0x56, 0xF7, 0x30, 0x90, 0x58, 0x15, 0x46, 0x10, +0x58, 0xD7, 0x12, 0x90, 0x59, 0xF5, 0x28, 0x10, 0x5A, 0xB6, 0xF4, 0x90, 0x5B, 0xD5, 0x0A, 0x10, +0x5C, 0xA0, 0x11, 0x10, 0x5D, 0xB4, 0xEC, 0x10, 0x5E, 0x7F, 0xF3, 0x10, 0x5F, 0x94, 0xCE, 0x10, +0x60, 0x5F, 0xD5, 0x10, 0x61, 0x7D, 0xEA, 0x90, 0x62, 0x3F, 0xB7, 0x10, 0x63, 0x5D, 0xCC, 0x90, +0x64, 0x1F, 0x99, 0x10, 0x65, 0x3D, 0xAE, 0x90, 0x66, 0x08, 0xB5, 0x90, 0x67, 0x1D, 0x90, 0x90, +0x67, 0xE8, 0x97, 0x90, 0x68, 0xFD, 0x72, 0x90, 0x69, 0xC8, 0x79, 0x90, 0x6A, 0xDD, 0x54, 0x90, +0x6B, 0xA8, 0x5B, 0x90, 0x6C, 0xC6, 0x71, 0x10, 0x6D, 0x88, 0x3D, 0x90, 0x6E, 0xA6, 0x53, 0x10, +0x6F, 0x68, 0x1F, 0x90, 0x70, 0x86, 0x35, 0x10, 0x71, 0x51, 0x3C, 0x10, 0x72, 0x66, 0x17, 0x10, +0x73, 0x31, 0x1E, 0x10, 0x74, 0x45, 0xF9, 0x10, 0x75, 0x11, 0x00, 0x10, 0x76, 0x2F, 0x15, 0x90, +0x76, 0xF0, 0xE2, 0x10, 0x78, 0x0E, 0xF7, 0x90, 0x78, 0xD0, 0xC4, 0x10, 0x79, 0xEE, 0xD9, 0x90, +0x7A, 0xB0, 0xA6, 0x10, 0x7B, 0xCE, 0xBB, 0x90, 0x7C, 0x99, 0xC2, 0x90, 0x7D, 0xAE, 0x9D, 0x90, +0x7E, 0x79, 0xA4, 0x90, 0x7F, 0x8E, 0x7F, 0x90, 0x02, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0x01, 0x04, 0x03, 0x04, 0x03, 0x06, 0x01, 0x04, 0x03, +0x04, 0x03, 0x04, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, +0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x00, 0x00, 0x0C, 0x88, 0x00, 0x00, 0x00, 0x00, 0x1C, +0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, +0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x0D, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, +0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x4D, 0x54, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, +0xFF, 0x6F, 0xA2, 0x61, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, 0xFF, 0xFF, +0xFF, 0x9B, 0xD5, 0xDA, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xD9, 0xAE, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0x9D, 0xA4, 0xB5, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0x9E, 0xB9, 0x90, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0x9F, 0x84, 0x97, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x09, 0x71, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD0, 0x82, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0x72, 0x16, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD1, 0xB6, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x58, 0xBE, 0x80, 0xFF, 0xFF, 0xFF, +0xFF, 0xD2, 0xA1, 0x4F, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x63, 0x1B, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xD4, 0x4B, 0x23, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, +0xFF, 0xD5, 0x67, 0xE7, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0xA8, 0x73, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xD6, 0x29, 0xB4, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2C, 0x1A, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD8, 0x09, 0x96, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0xC1, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xD9, 0xE9, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4D, 0x44, 0x10, 0x00, 0x00, 0x00, +0x00, 0x14, 0x33, 0xFA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x15, 0x23, 0xEB, 0x90, 0x00, 0x00, 0x00, +0x00, 0x16, 0x13, 0xDC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x17, 0x03, 0xCD, 0x90, 0x00, 0x00, 0x00, +0x00, 0x17, 0xF3, 0xBE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE3, 0xAF, 0x90, 0x00, 0x00, 0x00, +0x00, 0x19, 0xD3, 0xA0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC3, 0x91, 0x90, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xBC, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0xAE, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x9C, 0x9F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x90, 0x10, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x7C, 0x81, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x72, 0x10, 0x00, 0x00, 0x00, +0x00, 0x21, 0x5C, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x54, 0x10, 0x00, 0x00, 0x00, +0x00, 0x23, 0x3C, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x36, 0x10, 0x00, 0x00, 0x00, +0x00, 0x25, 0x1C, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0C, 0x18, 0x10, 0x00, 0x00, 0x00, +0x00, 0x27, 0x05, 0x43, 0x90, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x34, 0x90, 0x00, 0x00, 0x00, +0x00, 0x28, 0xE5, 0x25, 0x90, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x16, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC5, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xF8, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0xE9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xDA, 0x90, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0xCB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xBC, 0x90, 0x00, 0x00, 0x00, +0x00, 0x30, 0x64, 0xAD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xD9, 0x10, 0x00, 0x00, 0x00, +0x00, 0x32, 0x72, 0xB4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xBB, 0x10, 0x00, 0x00, 0x00, +0x00, 0x34, 0x52, 0x96, 0x10, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x9D, 0x10, 0x00, 0x00, 0x00, +0x00, 0x36, 0x32, 0x78, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x7F, 0x10, 0x00, 0x00, 0x00, +0x00, 0x38, 0x1B, 0x94, 0x90, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x61, 0x10, 0x00, 0x00, 0x00, +0x00, 0x39, 0xFB, 0x76, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x43, 0x10, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xDB, 0x58, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x5F, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xBB, 0x3A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x41, 0x90, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x9B, 0x1C, 0x90, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x23, 0x90, 0x00, 0x00, 0x00, +0x00, 0x41, 0x84, 0x39, 0x10, 0x00, 0x00, 0x00, 0x00, 0x42, 0x46, 0x05, 0x90, 0x00, 0x00, 0x00, +0x00, 0x43, 0x64, 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xE7, 0x90, 0x00, 0x00, 0x00, +0x00, 0x45, 0x43, 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, +0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, +0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x8C, 0x10, 0x00, 0x00, 0x00, +0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, +0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, +0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x37, 0x6C, 0x90, 0x00, 0x00, 0x00, +0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, +0x00, 0x56, 0x2C, 0x29, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, +0x00, 0x58, 0x15, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD7, 0x12, 0x90, 0x00, 0x00, 0x00, +0x00, 0x59, 0xF5, 0x28, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB6, 0xF4, 0x90, 0x00, 0x00, 0x00, +0x00, 0x5B, 0xD5, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA0, 0x11, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5D, 0xB4, 0xEC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x7F, 0xF3, 0x10, 0x00, 0x00, 0x00, +0x00, 0x5F, 0x94, 0xCE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5F, 0xD5, 0x10, 0x00, 0x00, 0x00, +0x00, 0x61, 0x7D, 0xEA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x62, 0x3F, 0xB7, 0x10, 0x00, 0x00, 0x00, +0x00, 0x63, 0x5D, 0xCC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x64, 0x1F, 0x99, 0x10, 0x00, 0x00, 0x00, +0x00, 0x65, 0x3D, 0xAE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x66, 0x08, 0xB5, 0x90, 0x00, 0x00, 0x00, +0x00, 0x67, 0x1D, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0xE8, 0x97, 0x90, 0x00, 0x00, 0x00, +0x00, 0x68, 0xFD, 0x72, 0x90, 0x00, 0x00, 0x00, 0x00, 0x69, 0xC8, 0x79, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6A, 0xDD, 0x54, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xA8, 0x5B, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6C, 0xC6, 0x71, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x88, 0x3D, 0x90, 0x00, 0x00, 0x00, +0x00, 0x6E, 0xA6, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x68, 0x1F, 0x90, 0x00, 0x00, 0x00, +0x00, 0x70, 0x86, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x71, 0x51, 0x3C, 0x10, 0x00, 0x00, 0x00, +0x00, 0x72, 0x66, 0x17, 0x10, 0x00, 0x00, 0x00, 0x00, 0x73, 0x31, 0x1E, 0x10, 0x00, 0x00, 0x00, +0x00, 0x74, 0x45, 0xF9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, +0x00, 0x76, 0x2F, 0x15, 0x90, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF0, 0xE2, 0x10, 0x00, 0x00, 0x00, +0x00, 0x78, 0x0E, 0xF7, 0x90, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD0, 0xC4, 0x10, 0x00, 0x00, 0x00, +0x00, 0x79, 0xEE, 0xD9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB0, 0xA6, 0x10, 0x00, 0x00, 0x00, +0x00, 0x7B, 0xCE, 0xBB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x99, 0xC2, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7D, 0xAE, 0x9D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x79, 0xA4, 0x90, 0x00, 0x00, 0x00, +0x00, 0x7F, 0x8E, 0x7F, 0x90, 0x02, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x05, 0x01, 0x04, 0x03, 0x04, 0x03, 0x06, 0x01, 0x04, 0x03, 0x04, 0x03, 0x04, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, 0x07, 0x08, +0x07, 0x08, 0x07, 0x08, 0x00, 0x00, 0x0C, 0x88, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, +0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, +0x00, 0x09, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x0D, 0x00, 0x00, +0x1C, 0x20, 0x01, 0x04, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x43, 0x45, +0x53, 0x54, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x43, +0x45, 0x54, 0x2D, 0x31, 0x43, 0x45, 0x53, 0x54, 0x2C, 0x4D, 0x33, 0x2E, 0x35, 0x2E, 0x30, 0x2C, +0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Atlantic/Madeira */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -47844,16 +48081,15 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Atlantic/South_Georgia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0xDD, 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0xFF, 0xFF, 0xDD, 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0xFD, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0xDD, 0xC0, 0x00, 0x00, 0xFF, 0xFF, -0xE3, 0xE0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x32, 0x3E, 0x32, 0x0A, 0x00, 0x36, 0x86, 0x55, 0x00, 0xDA, 0xE9, 0xAA, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x86, 0xFD, 0xC0, 0x01, 0xFF, 0xFF, 0xDD, 0xC0, 0x00, 0x00, +0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x32, 0x3E, 0x32, 0x0A, 0x00, 0x36, 0x86, 0x55, 0x00, 0xDA, 0xE9, 0xAA, 0x00, 0x00, +0x00, 0x00, /* Atlantic/St_Helena */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -47873,7 +48109,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Atlantic/Stanley */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x93, 0x44, 0x5F, 0x3C, 0xC3, 0x4F, 0x5A, 0xC0, 0xC4, 0x36, 0x03, 0x30, 0xC5, 0x2F, 0x3C, 0xC0, 0xC6, 0x15, 0xE5, 0x30, 0xC7, 0x18, 0x59, 0x40, 0xC7, 0xFF, 0x01, 0xB0, 0xC8, 0xF8, 0x3B, 0x40, 0xC9, 0xDE, 0xE3, 0xB0, 0xCA, 0xD8, 0x1D, 0x40, 0xCB, 0xBE, 0xC5, 0xB0, 0xCC, 0xB7, 0xFF, 0x40, @@ -47891,63 +48127,62 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x41, 0x3A, 0xAB, 0x60, 0x42, 0x61, 0xED, 0x50, 0x43, 0x1A, 0x8D, 0x60, 0x44, 0x41, 0xCF, 0x50, 0x44, 0xFA, 0x6F, 0x60, 0x46, 0x21, 0xB1, 0x50, 0x46, 0xDA, 0x51, 0x60, 0x48, 0x0A, 0xCD, 0xD0, 0x48, 0xC3, 0x6D, 0xE0, 0x49, 0xEA, 0xAF, 0xD0, 0x4A, 0xA3, 0x4F, 0xE0, 0x4B, 0xCA, 0x91, 0xD0, -0x4C, 0x83, 0x31, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, +0x4C, 0x83, 0x31, 0xE0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x05, 0xFF, -0xFF, 0xC9, 0xC4, 0x00, 0x00, 0xFF, 0xFF, 0xC9, 0xC4, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, -0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, -0xD0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, -0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x47, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x11, -0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x44, 0x5F, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x5A, -0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC4, 0x36, 0x03, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x3C, -0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x15, 0xE5, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x18, 0x59, -0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x3B, -0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xDE, 0xE3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xD8, 0x1D, -0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xBE, 0xC5, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xB7, 0xFF, -0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0x36, 0x81, 0x30, 0x00, 0x00, 0x00, 0x00, 0x19, 0x11, 0xFE, -0x40, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD3, 0xBC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF1, 0xC4, -0x20, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xAA, 0x64, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xA6, -0x20, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x8A, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xA8, 0x5B, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x6A, 0x36, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x88, 0x3D, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x4A, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x68, 0x1F, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x29, 0xFA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x48, 0x01, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x09, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x26, 0x31, 0x1E, -0x30, 0x00, 0x00, 0x00, 0x00, 0x26, 0xE9, 0xBE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x11, 0x00, -0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xD2, 0xDA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xF0, 0xE2, -0x30, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xB2, 0xBC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xD0, 0xC4, -0x30, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x92, 0x9E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xB0, 0xA6, -0x30, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x72, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x90, 0x88, -0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x52, 0x62, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x79, 0xA4, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x3B, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x59, 0x86, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x1B, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x39, 0x68, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x35, 0xFB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x19, 0x4A, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xDB, 0x25, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xF9, 0x2C, -0xB0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xBB, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xD9, 0x2A, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x91, 0xCA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xC2, 0x47, -0x50, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x71, 0xAC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xA2, 0x29, -0x50, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x5A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x82, 0x0B, -0x50, 0x00, 0x00, 0x00, 0x00, 0x41, 0x3A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x61, 0xED, -0x50, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0xCF, -0x50, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFA, 0x6F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0x21, 0xB1, -0x50, 0x00, 0x00, 0x00, 0x00, 0x46, 0xDA, 0x51, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0A, 0xCD, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xC3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xEA, 0xAF, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xA3, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xCA, 0x91, -0xD0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x83, 0x31, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, -0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, -0x04, 0x05, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0x05, 0xFF, 0xFF, 0xC9, 0xC4, 0x00, 0x00, 0xFF, 0xFF, -0xC9, 0xC4, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, -0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, 0xD5, 0xD0, -0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x3A, -0x70, 0xEF, 0x00, 0xBA, 0x62, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0xFF, 0xFF, 0xC9, 0xC4, 0x00, 0x00, +0xFF, 0xFF, 0xC9, 0xC4, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, +0xD5, 0xD0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x11, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, +0x93, 0x44, 0x5F, 0x3C, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4F, 0x5A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xC4, 0x36, 0x03, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x2F, 0x3C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, +0xC6, 0x15, 0xE5, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x18, 0x59, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, +0xC7, 0xFF, 0x01, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0xF8, 0x3B, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, +0xC9, 0xDE, 0xE3, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xD8, 0x1D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, +0xCB, 0xBE, 0xC5, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xB7, 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, +0xCD, 0x36, 0x81, 0x30, 0x00, 0x00, 0x00, 0x00, 0x19, 0x11, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, +0x19, 0xD3, 0xBC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF1, 0xC4, 0x20, 0x00, 0x00, 0x00, 0x00, +0x1B, 0xAA, 0x64, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xD1, 0xA6, 0x20, 0x00, 0x00, 0x00, 0x00, +0x1D, 0x8A, 0x46, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xA8, 0x5B, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x1F, 0x6A, 0x36, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x88, 0x3D, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x21, 0x4A, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x68, 0x1F, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x23, 0x29, 0xFA, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x48, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x25, 0x09, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x26, 0x31, 0x1E, 0x30, 0x00, 0x00, 0x00, 0x00, +0x26, 0xE9, 0xBE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0x11, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, +0x28, 0xD2, 0xDA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xF0, 0xE2, 0x30, 0x00, 0x00, 0x00, 0x00, +0x2A, 0xB2, 0xBC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xD0, 0xC4, 0x30, 0x00, 0x00, 0x00, 0x00, +0x2C, 0x92, 0x9E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xB0, 0xA6, 0x30, 0x00, 0x00, 0x00, 0x00, +0x2E, 0x72, 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x90, 0x88, 0x30, 0x00, 0x00, 0x00, 0x00, +0x30, 0x52, 0x62, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x79, 0xA4, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x32, 0x3B, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x59, 0x86, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x34, 0x1B, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x39, 0x68, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x35, 0xFB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x19, 0x4A, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x37, 0xDB, 0x25, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xF9, 0x2C, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x39, 0xBB, 0x07, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xD9, 0x2A, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x3B, 0x91, 0xCA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xC2, 0x47, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3D, 0x71, 0xAC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xA2, 0x29, 0x50, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x5A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x82, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, +0x41, 0x3A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x61, 0xED, 0x50, 0x00, 0x00, 0x00, 0x00, +0x43, 0x1A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x41, 0xCF, 0x50, 0x00, 0x00, 0x00, 0x00, +0x44, 0xFA, 0x6F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0x21, 0xB1, 0x50, 0x00, 0x00, 0x00, 0x00, +0x46, 0xDA, 0x51, 0x60, 0x00, 0x00, 0x00, 0x00, 0x48, 0x0A, 0xCD, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x48, 0xC3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xEA, 0xAF, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x4A, 0xA3, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xCA, 0x91, 0xD0, 0x00, 0x00, 0x00, 0x00, +0x4C, 0x83, 0x31, 0xE0, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x05, 0x04, 0x05, 0x04, 0x05, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x05, 0xFF, 0xFF, 0xC9, 0xC4, 0x00, 0x00, +0xFF, 0xFF, 0xC9, 0xC4, 0x00, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, +0x00, 0x0C, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0xFF, 0xFF, +0xD5, 0xD0, 0x01, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, +0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, +0x00, 0x3A, 0x70, 0xEF, 0x00, 0xBA, 0x62, 0xD8, 0x00, 0x00, 0x00, 0x00, /* Australia/ACT */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -48725,36 +48960,35 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Australia/Eucla */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x9C, 0x4E, 0xD4, 0x14, 0x9C, 0xBC, 0x40, 0x94, 0xCB, 0x54, 0xC4, 0x94, 0xCB, 0xC7, 0x77, 0x14, 0xCC, 0xB7, 0x68, 0x14, 0xCD, 0xA7, 0x59, 0x14, 0x09, 0x0F, 0xF1, 0x14, 0x09, 0xB6, 0x0E, 0x14, 0x1A, 0x01, 0x58, 0x14, 0x1A, 0xA7, 0x75, 0x14, 0x29, 0x25, 0x52, 0x14, 0x29, 0xAF, 0xBF, 0x94, 0x45, 0x71, 0xB4, 0x94, 0x46, 0x05, 0x5C, 0x94, 0x47, 0x23, 0x72, 0x14, 0x47, 0xEE, 0x79, 0x14, -0x49, 0x03, 0x54, 0x14, 0x49, 0xCE, 0x5B, 0x14, 0x7F, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, -0x00, 0x00, 0x78, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x89, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x7B, 0x0C, -0x00, 0x0A, 0x00, 0x00, 0x7B, 0x0C, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x34, -0x35, 0x00, 0x2B, 0x30, 0x38, 0x34, 0x35, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0xA6, 0x0A, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0x4E, 0xD4, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xBC, 0x40, 0x94, -0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x54, 0xC4, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xC7, 0x77, 0x14, -0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xB7, 0x68, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA7, 0x59, 0x14, -0x00, 0x00, 0x00, 0x00, 0x09, 0x0F, 0xF1, 0x14, 0x00, 0x00, 0x00, 0x00, 0x09, 0xB6, 0x0E, 0x14, -0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x58, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x75, 0x14, -0x00, 0x00, 0x00, 0x00, 0x29, 0x25, 0x52, 0x14, 0x00, 0x00, 0x00, 0x00, 0x29, 0xAF, 0xBF, 0x94, -0x00, 0x00, 0x00, 0x00, 0x45, 0x71, 0xB4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x5C, 0x94, -0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x72, 0x14, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x79, 0x14, -0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x54, 0x14, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x5B, 0x14, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x78, 0xD0, -0x00, 0x00, 0x00, 0x00, 0x89, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x7B, 0x0C, 0x00, 0x0A, 0x00, 0x00, -0x7B, 0x0C, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x34, 0x35, 0x00, 0x2B, 0x30, -0x38, 0x34, 0x35, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x34, 0x35, 0x3E, -0x2D, 0x38, 0x3A, 0x34, 0x35, 0x0A, 0x00, 0x58, 0xEE, 0xED, 0x01, 0xD7, 0x4B, 0x0A, 0x00, 0x00, -0x00, 0x19, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, -0x6C, 0x69, 0x61, 0x20, 0x28, 0x45, 0x75, 0x63, 0x6C, 0x61, 0x29, +0x49, 0x03, 0x54, 0x14, 0x49, 0xCE, 0x5B, 0x14, 0x03, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x78, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x89, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x7B, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x7B, +0x0C, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x34, 0x35, 0x00, 0x2B, 0x30, 0x38, +0x34, 0x35, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x74, 0xA6, 0x0A, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, +0x4E, 0xD4, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xBC, 0x40, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, +0x54, 0xC4, 0x94, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xC7, 0x77, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, +0xB7, 0x68, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA7, 0x59, 0x14, 0x00, 0x00, 0x00, 0x00, 0x09, +0x0F, 0xF1, 0x14, 0x00, 0x00, 0x00, 0x00, 0x09, 0xB6, 0x0E, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1A, +0x01, 0x58, 0x14, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x75, 0x14, 0x00, 0x00, 0x00, 0x00, 0x29, +0x25, 0x52, 0x14, 0x00, 0x00, 0x00, 0x00, 0x29, 0xAF, 0xBF, 0x94, 0x00, 0x00, 0x00, 0x00, 0x45, +0x71, 0xB4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x5C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x47, +0x23, 0x72, 0x14, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0x79, 0x14, 0x00, 0x00, 0x00, 0x00, 0x49, +0x03, 0x54, 0x14, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x5B, 0x14, 0x03, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, +0x78, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x89, 0x1C, 0x01, 0x04, 0x00, 0x00, 0x7B, 0x0C, 0x00, 0x0A, +0x00, 0x00, 0x7B, 0x0C, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x34, 0x35, 0x00, +0x2B, 0x30, 0x38, 0x34, 0x35, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x34, +0x35, 0x3E, 0x2D, 0x38, 0x3A, 0x34, 0x35, 0x0A, 0x00, 0x58, 0xEE, 0xED, 0x01, 0xD7, 0x4B, 0x0A, +0x00, 0x00, 0x00, 0x19, 0x57, 0x65, 0x73, 0x74, 0x65, 0x72, 0x6E, 0x20, 0x41, 0x75, 0x73, 0x74, +0x72, 0x61, 0x6C, 0x69, 0x61, 0x20, 0x28, 0x45, 0x75, 0x63, 0x6C, 0x61, 0x29, /* Australia/Hobart */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -48910,7 +49144,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Australia/LHI */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x40, 0xF8, 0x16, 0xE7, 0x8A, 0x68, 0x18, 0x21, 0x5D, 0x78, 0x18, 0xC7, 0x6C, 0x68, 0x1A, 0x01, 0x3F, 0x78, 0x1A, 0xA7, 0x4E, 0x68, 0x1B, 0xE1, 0x21, 0x78, 0x1C, 0x87, 0x30, 0x68, 0x1D, 0xC1, 0x03, 0x78, 0x1E, 0x79, 0x8E, 0x70, 0x1F, 0x97, 0xAA, 0xF8, @@ -48939,93 +49173,92 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x39, 0xCB, 0xF0, 0x74, 0x29, 0xC3, 0xF8, 0x75, 0x19, 0xAD, 0xF0, 0x76, 0x09, 0xA5, 0xF8, 0x76, 0xF9, 0x8F, 0xF0, 0x77, 0xE9, 0x87, 0xF8, 0x78, 0xD9, 0x71, 0xF0, 0x79, 0xC9, 0x69, 0xF8, 0x7A, 0xB9, 0x53, 0xF0, 0x7B, 0xB2, 0x86, 0x78, 0x7C, 0xA2, 0x70, 0x70, 0x7D, 0x92, 0x68, 0x78, -0x7E, 0x82, 0x52, 0x70, 0x7F, 0x72, 0x4A, 0x78, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x7E, 0x82, 0x52, 0x70, 0x7F, 0x72, 0x4A, 0x78, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, -0x00, 0x00, 0x95, 0x24, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, -0x01, 0x09, 0x00, 0x00, 0x93, 0xA8, 0x00, 0x0F, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, -0x54, 0x00, 0x41, 0x45, 0x53, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, -0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, -0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x73, 0x16, 0x77, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x14, -0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x38, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x16, -0xE7, 0x8A, 0x68, 0x00, 0x00, 0x00, 0x00, 0x18, 0x21, 0x5D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x18, -0xC7, 0x6C, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x3F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1A, -0xA7, 0x4E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0x21, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1C, -0x87, 0x30, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0x03, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, -0x79, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x97, 0xAA, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, -0x59, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0xC7, 0x78, 0x00, 0x00, 0x00, 0x00, 0x22, -0x42, 0x8C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x69, 0xE3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x24, -0x22, 0x6E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x49, 0xC5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x25, -0xEF, 0xDB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x29, 0xA7, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x27, -0xCF, 0xBD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x09, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x29, -0xAF, 0x9F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE9, 0x6B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x2B, -0x98, 0xBC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD2, 0x88, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2D, -0x78, 0x9E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB2, 0x6A, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2F, -0x58, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x92, 0x4C, 0x78, 0x00, 0x00, 0x00, 0x00, 0x31, -0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x2E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x33, -0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x10, 0x78, 0x00, 0x00, 0x00, 0x00, 0x35, -0x1D, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xF2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x36, -0xFC, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x0E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x38, -0xDC, 0xD4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xA7, 0xE2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x3A, -0xBC, 0xB6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xD2, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3C, -0xA5, 0xD2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xB4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3E, -0x85, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x96, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x40, -0x65, 0x96, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xB3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x42, -0x45, 0x78, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x95, 0x78, 0x00, 0x00, 0x00, 0x00, 0x44, -0x2E, 0x95, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x77, 0x78, 0x00, 0x00, 0x00, 0x00, 0x46, -0x05, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x59, 0x78, 0x00, 0x00, 0x00, 0x00, 0x47, -0xF7, 0x93, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xE7, 0x8B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x49, -0xD7, 0x75, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xC7, 0x6D, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4B, -0xB7, 0x57, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xA7, 0x4F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4D, -0x97, 0x39, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x87, 0x31, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4F, -0x77, 0x1B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x70, 0x4E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x51, -0x60, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x50, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, -0x40, 0x1A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x30, 0x12, 0x78, 0x00, 0x00, 0x00, 0x00, 0x55, -0x1F, 0xFC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x0F, 0xF4, 0x78, 0x00, 0x00, 0x00, 0x00, 0x56, -0xFF, 0xDE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x57, 0xEF, 0xD6, 0x78, 0x00, 0x00, 0x00, 0x00, 0x58, -0xDF, 0xC0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x59, 0xCF, 0xB8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x5A, -0xBF, 0xA2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xB8, 0xD4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5C, -0xA8, 0xBE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x98, 0xB6, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5E, -0x88, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x78, 0x98, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x60, -0x68, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x58, 0x7A, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x62, -0x48, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x38, 0x5C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x64, -0x28, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x18, 0x3E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x66, -0x11, 0x63, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x01, 0x5B, 0x78, 0x00, 0x00, 0x00, 0x00, 0x67, -0xF1, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x68, 0xE1, 0x3D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x69, -0xD1, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xC1, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6B, -0xB1, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xA1, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6D, -0x90, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x80, 0xE3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6F, -0x70, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x71, -0x59, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x49, 0xE1, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x73, -0x39, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x29, 0xC3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x75, -0x19, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x09, 0xA5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x76, -0xF9, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE9, 0x87, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, -0xD9, 0x71, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC9, 0x69, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7A, -0xB9, 0x53, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xB2, 0x86, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7C, -0xA2, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x92, 0x68, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x82, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x72, 0x4A, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x95, 0x24, 0x00, 0x00, 0x00, 0x00, 0x8C, -0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x01, 0x09, 0x00, 0x00, 0x93, 0xA8, 0x00, 0x0F, 0x00, -0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x45, 0x53, 0x54, 0x00, 0x2B, 0x31, -0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, -0x2B, 0x31, 0x30, 0x33, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x3A, 0x33, 0x30, 0x3C, 0x2B, 0x31, 0x31, -0x3E, 0x2D, 0x31, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, -0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x00, 0x95, 0x24, 0x00, +0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x01, 0x09, 0x00, 0x00, 0x93, +0xA8, 0x00, 0x0F, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x45, 0x53, +0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2B, 0x31, +0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, +0xFF, 0xFF, 0x73, 0x16, 0x77, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x16, 0x38, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE7, 0x8A, 0x68, 0x00, 0x00, +0x00, 0x00, 0x18, 0x21, 0x5D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC7, 0x6C, 0x68, 0x00, 0x00, +0x00, 0x00, 0x1A, 0x01, 0x3F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x4E, 0x68, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xE1, 0x21, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x87, 0x30, 0x68, 0x00, 0x00, +0x00, 0x00, 0x1D, 0xC1, 0x03, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x79, 0x8E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x97, 0xAA, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x59, 0x70, 0x70, 0x00, 0x00, +0x00, 0x00, 0x21, 0x80, 0xC7, 0x78, 0x00, 0x00, 0x00, 0x00, 0x22, 0x42, 0x8C, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x23, 0x69, 0xE3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x24, 0x22, 0x6E, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x25, 0x49, 0xC5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x25, 0xEF, 0xDB, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x27, 0x29, 0xA7, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCF, 0xBD, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x29, 0x09, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x29, 0xAF, 0x9F, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xE9, 0x6B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x98, 0xBC, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xD2, 0x88, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x78, 0x9E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2E, 0xB2, 0x6A, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x58, 0x80, 0x70, 0x00, 0x00, +0x00, 0x00, 0x30, 0x92, 0x4C, 0x78, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, +0x00, 0x00, 0x32, 0x72, 0x2E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x34, 0x52, 0x10, 0x78, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, 0x00, +0x00, 0x00, 0x36, 0x31, 0xF2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xF2, 0x70, 0x00, 0x00, +0x00, 0x00, 0x38, 0x1B, 0x0E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xD4, 0x70, 0x00, 0x00, +0x00, 0x00, 0x39, 0xA7, 0xE2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xB6, 0x70, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xDA, 0xD2, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xD2, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x3D, 0xBA, 0xB4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xB4, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x9A, 0x96, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x96, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x41, 0x83, 0xB3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x78, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x43, 0x63, 0x95, 0x78, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2E, 0x95, 0x70, 0x00, 0x00, +0x00, 0x00, 0x45, 0x43, 0x77, 0x78, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x3C, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x47, 0x23, 0x59, 0x78, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF7, 0x93, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x48, 0xE7, 0x8B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD7, 0x75, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xC7, 0x6D, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB7, 0x57, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xA7, 0x4F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x39, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4E, 0x87, 0x31, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x1B, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x50, 0x70, 0x4E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x38, 0x70, 0x00, 0x00, +0x00, 0x00, 0x52, 0x50, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x1A, 0x70, 0x00, 0x00, +0x00, 0x00, 0x54, 0x30, 0x12, 0x78, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xFC, 0x70, 0x00, 0x00, +0x00, 0x00, 0x56, 0x0F, 0xF4, 0x78, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xDE, 0x70, 0x00, 0x00, +0x00, 0x00, 0x57, 0xEF, 0xD6, 0x78, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xC0, 0x70, 0x00, 0x00, +0x00, 0x00, 0x59, 0xCF, 0xB8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0xA2, 0x70, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xB8, 0xD4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xBE, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x5D, 0x98, 0xB6, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0xA0, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x78, 0x98, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x82, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x61, 0x58, 0x7A, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x64, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x63, 0x38, 0x5C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x46, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x65, 0x18, 0x3E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x63, 0x70, 0x00, 0x00, +0x00, 0x00, 0x67, 0x01, 0x5B, 0x78, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x45, 0x70, 0x00, 0x00, +0x00, 0x00, 0x68, 0xE1, 0x3D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x27, 0x70, 0x00, 0x00, +0x00, 0x00, 0x6A, 0xC1, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0x09, 0x70, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xA1, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xEB, 0x70, 0x00, 0x00, +0x00, 0x00, 0x6E, 0x80, 0xE3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xCD, 0x70, 0x00, 0x00, +0x00, 0x00, 0x70, 0x69, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xE9, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x72, 0x49, 0xE1, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xCB, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x74, 0x29, 0xC3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0xAD, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x76, 0x09, 0xA5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x8F, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x77, 0xE9, 0x87, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x71, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x79, 0xC9, 0x69, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x53, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x7B, 0xB2, 0x86, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x70, 0x70, 0x00, 0x00, +0x00, 0x00, 0x7D, 0x92, 0x68, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x52, 0x70, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x72, 0x4A, 0x78, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x00, 0x95, 0x24, 0x00, 0x00, 0x00, +0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x01, 0x09, 0x00, 0x00, 0x93, 0xA8, 0x00, +0x0F, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x45, 0x53, 0x54, 0x00, +0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x3A, 0x33, 0x30, 0x3C, 0x2B, +0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, +0x34, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* Australia/Lindeman */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -49065,7 +49298,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Australia/Lord_Howe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x16, 0x38, 0x40, 0xF8, 0x16, 0xE7, 0x8A, 0x68, 0x18, 0x21, 0x5D, 0x78, 0x18, 0xC7, 0x6C, 0x68, 0x1A, 0x01, 0x3F, 0x78, 0x1A, 0xA7, 0x4E, 0x68, 0x1B, 0xE1, 0x21, 0x78, 0x1C, 0x87, 0x30, 0x68, 0x1D, 0xC1, 0x03, 0x78, 0x1E, 0x79, 0x8E, 0x70, 0x1F, 0x97, 0xAA, 0xF8, @@ -49094,94 +49327,93 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x39, 0xCB, 0xF0, 0x74, 0x29, 0xC3, 0xF8, 0x75, 0x19, 0xAD, 0xF0, 0x76, 0x09, 0xA5, 0xF8, 0x76, 0xF9, 0x8F, 0xF0, 0x77, 0xE9, 0x87, 0xF8, 0x78, 0xD9, 0x71, 0xF0, 0x79, 0xC9, 0x69, 0xF8, 0x7A, 0xB9, 0x53, 0xF0, 0x7B, 0xB2, 0x86, 0x78, 0x7C, 0xA2, 0x70, 0x70, 0x7D, 0x92, 0x68, 0x78, -0x7E, 0x82, 0x52, 0x70, 0x7F, 0x72, 0x4A, 0x78, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x7E, 0x82, 0x52, 0x70, 0x7F, 0x72, 0x4A, 0x78, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, -0x00, 0x00, 0x95, 0x24, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, -0x01, 0x09, 0x00, 0x00, 0x93, 0xA8, 0x00, 0x0F, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, -0x54, 0x00, 0x41, 0x45, 0x53, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, -0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x05, 0x00, -0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x73, 0x16, 0x77, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x14, -0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x38, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x16, -0xE7, 0x8A, 0x68, 0x00, 0x00, 0x00, 0x00, 0x18, 0x21, 0x5D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x18, -0xC7, 0x6C, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x3F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1A, -0xA7, 0x4E, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0x21, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1C, -0x87, 0x30, 0x68, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC1, 0x03, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, -0x79, 0x8E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x97, 0xAA, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, -0x59, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0xC7, 0x78, 0x00, 0x00, 0x00, 0x00, 0x22, -0x42, 0x8C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x69, 0xE3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x24, -0x22, 0x6E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x49, 0xC5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x25, -0xEF, 0xDB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x29, 0xA7, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x27, -0xCF, 0xBD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x09, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x29, -0xAF, 0x9F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE9, 0x6B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x2B, -0x98, 0xBC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xD2, 0x88, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2D, -0x78, 0x9E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xB2, 0x6A, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2F, -0x58, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x92, 0x4C, 0x78, 0x00, 0x00, 0x00, 0x00, 0x31, -0x5D, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x2E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x33, -0x3D, 0x2E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x10, 0x78, 0x00, 0x00, 0x00, 0x00, 0x35, -0x1D, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x36, 0x31, 0xF2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x36, -0xFC, 0xF2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x0E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x38, -0xDC, 0xD4, 0x70, 0x00, 0x00, 0x00, 0x00, 0x39, 0xA7, 0xE2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x3A, -0xBC, 0xB6, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDA, 0xD2, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3C, -0xA5, 0xD2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBA, 0xB4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3E, -0x85, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0x96, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x40, -0x65, 0x96, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x83, 0xB3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x42, -0x45, 0x78, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0x95, 0x78, 0x00, 0x00, 0x00, 0x00, 0x44, -0x2E, 0x95, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0x77, 0x78, 0x00, 0x00, 0x00, 0x00, 0x46, -0x05, 0x3C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0x59, 0x78, 0x00, 0x00, 0x00, 0x00, 0x47, -0xF7, 0x93, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xE7, 0x8B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x49, -0xD7, 0x75, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xC7, 0x6D, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4B, -0xB7, 0x57, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xA7, 0x4F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4D, -0x97, 0x39, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x87, 0x31, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4F, -0x77, 0x1B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x70, 0x4E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x51, -0x60, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x52, 0x50, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, -0x40, 0x1A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x54, 0x30, 0x12, 0x78, 0x00, 0x00, 0x00, 0x00, 0x55, -0x1F, 0xFC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x56, 0x0F, 0xF4, 0x78, 0x00, 0x00, 0x00, 0x00, 0x56, -0xFF, 0xDE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x57, 0xEF, 0xD6, 0x78, 0x00, 0x00, 0x00, 0x00, 0x58, -0xDF, 0xC0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x59, 0xCF, 0xB8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x5A, -0xBF, 0xA2, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xB8, 0xD4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5C, -0xA8, 0xBE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x98, 0xB6, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5E, -0x88, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x78, 0x98, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x60, -0x68, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x58, 0x7A, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x62, -0x48, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x38, 0x5C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x64, -0x28, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x18, 0x3E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x66, -0x11, 0x63, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x01, 0x5B, 0x78, 0x00, 0x00, 0x00, 0x00, 0x67, -0xF1, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x68, 0xE1, 0x3D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x69, -0xD1, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xC1, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6B, -0xB1, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xA1, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6D, -0x90, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x80, 0xE3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6F, -0x70, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x71, -0x59, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x49, 0xE1, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x73, -0x39, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x29, 0xC3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x75, -0x19, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x09, 0xA5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x76, -0xF9, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE9, 0x87, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, -0xD9, 0x71, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC9, 0x69, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7A, -0xB9, 0x53, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xB2, 0x86, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7C, -0xA2, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x92, 0x68, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x82, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x72, 0x4A, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x95, 0x24, 0x00, 0x00, 0x00, 0x00, 0x8C, -0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x01, 0x09, 0x00, 0x00, 0x93, 0xA8, 0x00, 0x0F, 0x00, -0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x45, 0x53, 0x54, 0x00, 0x2B, 0x31, -0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, -0x2B, 0x31, 0x30, 0x33, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x3A, 0x33, 0x30, 0x3C, 0x2B, 0x31, 0x31, -0x3E, 0x2D, 0x31, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, -0x31, 0x2E, 0x30, 0x0A, 0x00, 0x59, 0x30, 0x08, 0x02, 0x05, 0x66, 0x6D, 0x00, 0x00, 0x00, 0x10, -0x4C, 0x6F, 0x72, 0x64, 0x20, 0x48, 0x6F, 0x77, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, - +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x00, 0x95, 0x24, 0x00, +0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x01, 0x09, 0x00, 0x00, 0x93, +0xA8, 0x00, 0x0F, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x45, 0x53, +0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2B, 0x31, +0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, +0xFF, 0xFF, 0x73, 0x16, 0x77, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x16, 0x38, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE7, 0x8A, 0x68, 0x00, 0x00, +0x00, 0x00, 0x18, 0x21, 0x5D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC7, 0x6C, 0x68, 0x00, 0x00, +0x00, 0x00, 0x1A, 0x01, 0x3F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x4E, 0x68, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xE1, 0x21, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x87, 0x30, 0x68, 0x00, 0x00, +0x00, 0x00, 0x1D, 0xC1, 0x03, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x79, 0x8E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x97, 0xAA, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x59, 0x70, 0x70, 0x00, 0x00, +0x00, 0x00, 0x21, 0x80, 0xC7, 0x78, 0x00, 0x00, 0x00, 0x00, 0x22, 0x42, 0x8C, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x23, 0x69, 0xE3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x24, 0x22, 0x6E, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x25, 0x49, 0xC5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x25, 0xEF, 0xDB, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x27, 0x29, 0xA7, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x27, 0xCF, 0xBD, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x29, 0x09, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x29, 0xAF, 0x9F, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x2A, 0xE9, 0x6B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x98, 0xBC, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2C, 0xD2, 0x88, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x78, 0x9E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2E, 0xB2, 0x6A, 0x78, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x58, 0x80, 0x70, 0x00, 0x00, +0x00, 0x00, 0x30, 0x92, 0x4C, 0x78, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0x4C, 0x70, 0x00, 0x00, +0x00, 0x00, 0x32, 0x72, 0x2E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x2E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x34, 0x52, 0x10, 0x78, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x10, 0x70, 0x00, 0x00, +0x00, 0x00, 0x36, 0x31, 0xF2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFC, 0xF2, 0x70, 0x00, 0x00, +0x00, 0x00, 0x38, 0x1B, 0x0E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDC, 0xD4, 0x70, 0x00, 0x00, +0x00, 0x00, 0x39, 0xA7, 0xE2, 0x78, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBC, 0xB6, 0x70, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xDA, 0xD2, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA5, 0xD2, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x3D, 0xBA, 0xB4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x85, 0xB4, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x3F, 0x9A, 0x96, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0x96, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x41, 0x83, 0xB3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0x78, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x43, 0x63, 0x95, 0x78, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2E, 0x95, 0x70, 0x00, 0x00, +0x00, 0x00, 0x45, 0x43, 0x77, 0x78, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x3C, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x47, 0x23, 0x59, 0x78, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF7, 0x93, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x48, 0xE7, 0x8B, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD7, 0x75, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xC7, 0x6D, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB7, 0x57, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4C, 0xA7, 0x4F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x39, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4E, 0x87, 0x31, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x1B, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x50, 0x70, 0x4E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x38, 0x70, 0x00, 0x00, +0x00, 0x00, 0x52, 0x50, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x1A, 0x70, 0x00, 0x00, +0x00, 0x00, 0x54, 0x30, 0x12, 0x78, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xFC, 0x70, 0x00, 0x00, +0x00, 0x00, 0x56, 0x0F, 0xF4, 0x78, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xDE, 0x70, 0x00, 0x00, +0x00, 0x00, 0x57, 0xEF, 0xD6, 0x78, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xC0, 0x70, 0x00, 0x00, +0x00, 0x00, 0x59, 0xCF, 0xB8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0xA2, 0x70, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xB8, 0xD4, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xBE, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x5D, 0x98, 0xB6, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0xA0, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x78, 0x98, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x82, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x61, 0x58, 0x7A, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x64, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x63, 0x38, 0x5C, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x46, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x65, 0x18, 0x3E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x63, 0x70, 0x00, 0x00, +0x00, 0x00, 0x67, 0x01, 0x5B, 0x78, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x45, 0x70, 0x00, 0x00, +0x00, 0x00, 0x68, 0xE1, 0x3D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x27, 0x70, 0x00, 0x00, +0x00, 0x00, 0x6A, 0xC1, 0x1F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0x09, 0x70, 0x00, 0x00, +0x00, 0x00, 0x6C, 0xA1, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xEB, 0x70, 0x00, 0x00, +0x00, 0x00, 0x6E, 0x80, 0xE3, 0x78, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xCD, 0x70, 0x00, 0x00, +0x00, 0x00, 0x70, 0x69, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xE9, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x72, 0x49, 0xE1, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xCB, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x74, 0x29, 0xC3, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0xAD, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x76, 0x09, 0xA5, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x8F, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x77, 0xE9, 0x87, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x71, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x79, 0xC9, 0x69, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x53, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x7B, 0xB2, 0x86, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x70, 0x70, 0x00, 0x00, +0x00, 0x00, 0x7D, 0x92, 0x68, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x52, 0x70, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x72, 0x4A, 0x78, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x00, 0x95, 0x24, 0x00, 0x00, 0x00, +0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x01, 0x09, 0x00, 0x00, 0x93, 0xA8, 0x00, +0x0F, 0x00, 0x00, 0x9A, 0xB0, 0x01, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x41, 0x45, 0x53, 0x54, 0x00, +0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x33, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x3A, 0x33, 0x30, 0x3C, 0x2B, +0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, +0x34, 0x2E, 0x31, 0x2E, 0x30, 0x0A, 0x00, 0x59, 0x30, 0x08, 0x02, 0x05, 0x66, 0x6D, 0x00, 0x00, +0x00, 0x10, 0x4C, 0x6F, 0x72, 0x64, 0x20, 0x48, 0x6F, 0x77, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x61, +0x6E, 0x64, /* Australia/Melbourne */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -50301,7 +50533,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Brazil/Acre */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x86, 0x90, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x86, 0x90, 0xB8, 0x0F, 0x66, 0x00, 0xB8, 0xFD, 0x5C, 0xC0, 0xB9, 0xF1, 0x50, 0x50, 0xBA, 0xDE, 0x90, 0x40, 0xDA, 0x38, 0xCA, 0x50, 0xDA, 0xEC, 0x16, 0x50, 0xDC, 0x19, 0xFD, 0xD0, 0xDC, 0xB9, 0x75, 0x40, 0xDD, 0xFB, 0x31, 0x50, 0xDE, 0x9B, 0xFA, 0x40, 0xDF, 0xDD, 0xB6, 0x50, 0xE0, 0x54, 0x4F, 0x40, @@ -50309,42 +50541,41 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x48, 0x50, 0xF8, 0xC7, 0xE1, 0x40, 0xFA, 0x0A, 0xEE, 0xD0, 0xFA, 0xA9, 0x14, 0xC0, 0xFB, 0xEC, 0x22, 0x50, 0xFC, 0x8B, 0x99, 0xC0, 0x1D, 0xC9, 0xAA, 0x50, 0x1E, 0x78, 0xF3, 0xC0, 0x1F, 0xA0, 0x51, 0xD0, 0x20, 0x33, 0xEB, 0xC0, 0x21, 0x81, 0x85, 0x50, 0x22, 0x0B, 0xE4, 0xC0, -0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0xC0, 0x70, -0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x86, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, -0x66, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, -0x50, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, -0xCA, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, -0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, -0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, -0xB6, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, -0x1B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, -0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, -0x48, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, -0xEE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, -0x22, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, -0xAA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0x51, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, -0x85, 0x50, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, -0x7F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x52, 0x7F, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, -0x02, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x35, 0x3E, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x48, 0x60, 0x7F, 0x50, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, +0xC0, 0x01, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, +0xFF, 0xB9, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, +0xFF, 0x96, 0xAA, 0x86, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x66, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x50, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xBA, 0xDE, 0x90, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xCA, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0xEC, 0x16, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0xB9, 0x75, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x31, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xDE, 0x9B, 0xFA, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xB6, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xE0, 0x54, 0x4F, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x1B, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x05, 0x7A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x80, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xF7, 0x0E, 0x3A, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x48, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0xC7, 0xE1, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xEE, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0xA9, 0x14, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x22, 0x50, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x8B, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0xAA, 0x50, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x78, 0xF3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x51, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x33, 0xEB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x85, 0x50, 0x00, 0x00, 0x00, +0x00, 0x22, 0x0B, 0xE4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x48, 0x60, 0x7F, 0x50, 0x00, 0x00, 0x00, +0x00, 0x52, 0x7F, 0x04, 0xC0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x00, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x04, +0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x35, 0x3E, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* Brazil/DeNoronha */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x65, 0x64, +0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x65, 0x64, 0xB8, 0x0F, 0x3B, 0xD0, 0xB8, 0xFD, 0x32, 0x90, 0xB9, 0xF1, 0x26, 0x20, 0xBA, 0xDE, 0x66, 0x10, 0xDA, 0x38, 0xA0, 0x20, 0xDA, 0xEB, 0xEC, 0x20, 0xDC, 0x19, 0xD3, 0xA0, 0xDC, 0xB9, 0x4B, 0x10, 0xDD, 0xFB, 0x07, 0x20, 0xDE, 0x9B, 0xD0, 0x10, 0xDF, 0xDD, 0x8C, 0x20, 0xE0, 0x54, 0x25, 0x10, @@ -50354,45 +50585,44 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x1F, 0xA0, 0x27, 0xA0, 0x20, 0x33, 0xC1, 0x90, 0x21, 0x81, 0x5B, 0x20, 0x22, 0x0B, 0xBA, 0x90, 0x23, 0x58, 0x02, 0xA0, 0x23, 0xE2, 0x62, 0x10, 0x25, 0x37, 0xE4, 0xA0, 0x25, 0xD4, 0xB9, 0x10, 0x37, 0xF6, 0xB8, 0xA0, 0x38, 0xB8, 0x77, 0x10, 0x39, 0xDF, 0xD5, 0x20, 0x39, 0xE9, 0x01, 0x90, -0x3B, 0xC8, 0xF1, 0xA0, 0x3C, 0x6F, 0x00, 0x90, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x04, -0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, -0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, -0xFF, 0xFF, 0x96, 0xAA, 0x65, 0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x3B, 0xD0, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0xFD, 0x32, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x26, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xBA, 0xDE, 0x66, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xA0, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0xEB, 0xEC, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xD3, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x07, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0x9B, 0xD0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x8C, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x54, 0x25, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xF1, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x05, 0x50, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x56, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x0E, 0x10, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x1E, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xC7, 0xB7, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xC4, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xA8, 0xEA, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEB, 0xF8, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0x8B, 0x6F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x80, 0x20, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x78, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x27, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x20, 0x33, 0xC1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x5B, 0x20, 0x00, 0x00, -0x00, 0x00, 0x22, 0x0B, 0xBA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x02, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x23, 0xE2, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xE4, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x25, 0xD4, 0xB9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xB8, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x38, 0xB8, 0x77, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xD5, 0x20, 0x00, 0x00, -0x00, 0x00, 0x39, 0xE9, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xF1, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x3C, 0x6F, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, -0x01, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, -0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x32, 0x3E, 0x32, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3B, 0xC8, 0xF1, 0xA0, 0x3C, 0x6F, 0x00, 0x90, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, +0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, 0xF1, 0xF0, 0x01, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, +0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x27, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x65, +0x64, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x3B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x32, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x26, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x66, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xA0, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xEC, +0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xD3, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x4B, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x07, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xD0, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x8C, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x25, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x97, 0xF1, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x50, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x56, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x10, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x1E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xB7, +0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xC4, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xEA, +0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEB, 0xF8, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x6F, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xC9, +0x90, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x27, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xC1, +0x90, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x5B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xBA, +0x90, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x02, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x62, +0x10, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xE4, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xB9, +0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xB8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x77, +0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xD5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x01, +0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xF1, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x00, +0x90, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xE1, 0x9C, 0x00, 0x00, 0xFF, 0xFF, +0xF1, 0xF0, 0x01, 0x04, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x31, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x32, 0x3E, 0x32, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Brazil/East */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x72, 0xB4, +0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x72, 0xB4, 0xB8, 0x0F, 0x49, 0xE0, 0xB8, 0xFD, 0x40, 0xA0, 0xB9, 0xF1, 0x34, 0x30, 0xBA, 0xDE, 0x74, 0x20, 0xDA, 0x38, 0xAE, 0x30, 0xDA, 0xEB, 0xFA, 0x30, 0xDC, 0x19, 0xE1, 0xB0, 0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xFB, 0x15, 0x30, 0xDE, 0x9B, 0xDE, 0x20, 0xDF, 0xDD, 0x9A, 0x30, 0xE0, 0x54, 0x33, 0x20, @@ -50415,78 +50645,77 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x50, 0x83, 0x65, 0x30, 0x51, 0x20, 0x39, 0xA0, 0x52, 0x63, 0x47, 0x30, 0x53, 0x00, 0x1B, 0xA0, 0x54, 0x43, 0x29, 0x30, 0x54, 0xE9, 0x38, 0x20, 0x56, 0x23, 0x0B, 0x30, 0x56, 0xC9, 0x1A, 0x20, 0x58, 0x02, 0xED, 0x30, 0x58, 0xA8, 0xFC, 0x20, 0x59, 0xE2, 0xCF, 0x30, 0x5A, 0x88, 0xDE, 0x20, -0x5B, 0xDE, 0x60, 0xB0, 0x5C, 0x68, 0xC0, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, +0x5B, 0xDE, 0x60, 0xB0, 0x5C, 0x68, 0xC0, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, -0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x72, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, -0x49, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, -0x34, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, -0xAE, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, -0xE1, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, -0x15, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, -0x9A, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5A, -0x09, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, -0x64, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, -0x2C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, -0xD2, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, -0x06, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, -0x8E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, -0x35, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, -0x69, 0x30, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, -0x10, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, -0xF2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, -0x0F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x27, 0xBD, 0xE3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, -0xF1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x29, 0x94, 0x8B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, -0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x6B, 0x32, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, -0xB5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xC4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, -0x97, 0x30, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x46, 0xA6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, -0x79, 0x30, 0x00, 0x00, 0x00, 0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, -0x20, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x06, 0x6A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, -0x54, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0xF8, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, -0x1F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0xCF, 0x68, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, -0xC6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, -0xE3, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x8F, 0x2C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, -0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, -0x91, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x4E, 0xF0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x91, -0xFE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x40, 0x2E, 0xD2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x86, -0xF8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x42, 0x17, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, -0xC2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x43, 0xF7, 0xD1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, -0x53, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0xE0, 0xED, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, -0x86, 0x30, 0x00, 0x00, 0x00, 0x00, 0x47, 0xB7, 0x95, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, -0xA2, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x97, 0x77, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, -0x84, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x80, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, -0x66, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x60, 0x75, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, -0x48, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x49, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, -0x65, 0x30, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x39, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, -0x47, 0x30, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x1B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x43, -0x29, 0x30, 0x00, 0x00, 0x00, 0x00, 0x54, 0xE9, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x56, 0x23, -0x0B, 0x30, 0x00, 0x00, 0x00, 0x00, 0x56, 0xC9, 0x1A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, -0xED, 0x30, 0x00, 0x00, 0x00, 0x00, 0x58, 0xA8, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, -0xCF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x88, 0xDE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, -0x60, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x68, 0xC0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, -0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x02, 0x01, 0x02, 0xFF, 0xFF, 0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, +0xFF, 0xD5, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, +0xFF, 0x96, 0xAA, 0x72, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x49, 0xE0, 0xFF, 0xFF, 0xFF, +0xFF, 0xB8, 0xFD, 0x40, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x34, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xBA, 0xDE, 0x74, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xAE, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xDA, 0xEB, 0xFA, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xE1, 0xB0, 0xFF, 0xFF, 0xFF, +0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x15, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xDE, 0x9B, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0x9A, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xE0, 0x54, 0x33, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5A, 0x09, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x05, 0x5E, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x64, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xF7, 0x0E, 0x1E, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x2C, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xF8, 0xC7, 0xC5, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xD2, 0xB0, 0xFF, 0xFF, 0xFF, +0xFF, 0xFA, 0xA8, 0xF8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x06, 0x30, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x8B, 0x7D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x8E, 0x30, 0x00, 0x00, 0x00, +0x00, 0x1E, 0x78, 0xD7, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x35, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x20, 0x33, 0xCF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x69, 0x30, 0x00, 0x00, 0x00, +0x00, 0x22, 0x0B, 0xC8, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x58, 0x10, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x23, 0xE2, 0x70, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0x37, 0xF2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x25, 0xD4, 0xC7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x0F, 0x30, 0x00, 0x00, 0x00, +0x00, 0x27, 0xBD, 0xE3, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xF1, 0x30, 0x00, 0x00, 0x00, +0x00, 0x29, 0x94, 0x8B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xEA, 0x0D, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x2B, 0x6B, 0x32, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xB5, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x66, 0xC4, 0x20, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xA0, 0x97, 0x30, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x46, 0xA6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x79, 0x30, 0x00, 0x00, 0x00, +0x00, 0x31, 0x1D, 0x4D, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x57, 0x20, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x33, 0x06, 0x6A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x34, 0x38, 0x54, 0x30, 0x00, 0x00, 0x00, +0x00, 0x34, 0xF8, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x36, 0x20, 0x1F, 0x30, 0x00, 0x00, 0x00, +0x00, 0x36, 0xCF, 0x68, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0xC6, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x38, 0xB8, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x39, 0xDF, 0xE3, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3A, 0x8F, 0x2C, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC8, 0xFF, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x3C, 0x6F, 0x0E, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xC4, 0x91, 0x30, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x4E, 0xF0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x91, 0xFE, 0x30, 0x00, 0x00, 0x00, +0x00, 0x40, 0x2E, 0xD2, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x86, 0xF8, 0x30, 0x00, 0x00, 0x00, +0x00, 0x42, 0x17, 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x43, 0x51, 0xC2, 0x30, 0x00, 0x00, 0x00, +0x00, 0x43, 0xF7, 0xD1, 0x20, 0x00, 0x00, 0x00, 0x00, 0x45, 0x4D, 0x53, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x45, 0xE0, 0xED, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x86, 0x30, 0x00, 0x00, 0x00, +0x00, 0x47, 0xB7, 0x95, 0x20, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFA, 0xA2, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x49, 0x97, 0x77, 0x20, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xDA, 0x84, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0x80, 0x93, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xBA, 0x66, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x60, 0x75, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x9A, 0x48, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x4F, 0x49, 0x92, 0x20, 0x00, 0x00, 0x00, 0x00, 0x50, 0x83, 0x65, 0x30, 0x00, 0x00, 0x00, +0x00, 0x51, 0x20, 0x39, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x47, 0x30, 0x00, 0x00, 0x00, +0x00, 0x53, 0x00, 0x1B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x43, 0x29, 0x30, 0x00, 0x00, 0x00, +0x00, 0x54, 0xE9, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x56, 0x23, 0x0B, 0x30, 0x00, 0x00, 0x00, +0x00, 0x56, 0xC9, 0x1A, 0x20, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0xED, 0x30, 0x00, 0x00, 0x00, +0x00, 0x58, 0xA8, 0xFC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x59, 0xE2, 0xCF, 0x30, 0x00, 0x00, 0x00, +0x00, 0x5A, 0x88, 0xDE, 0x20, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDE, 0x60, 0xB0, 0x00, 0x00, 0x00, +0x00, 0x5C, 0x68, 0xC0, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0xFF, 0xFF, 0xD4, 0x4C, 0x00, 0x00, 0xFF, 0xFF, 0xE3, 0xE0, 0x01, 0x04, 0xFF, 0xFF, 0xD5, 0xD0, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x32, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x33, 0x3E, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* Brazil/West */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7F, 0x44, +0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x96, 0xAA, 0x7F, 0x44, 0xB8, 0x0F, 0x57, 0xF0, 0xB8, 0xFD, 0x4E, 0xB0, 0xB9, 0xF1, 0x42, 0x40, 0xBA, 0xDE, 0x82, 0x30, 0xDA, 0x38, 0xBC, 0x40, 0xDA, 0xEC, 0x08, 0x40, 0xDC, 0x19, 0xEF, 0xC0, 0xDC, 0xB9, 0x67, 0x30, 0xDD, 0xFB, 0x23, 0x40, 0xDE, 0x9B, 0xEC, 0x30, 0xDF, 0xDD, 0xA8, 0x40, 0xE0, 0x54, 0x41, 0x30, @@ -50494,35 +50723,34 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0xF8, 0x51, 0x3A, 0x40, 0xF8, 0xC7, 0xD3, 0x30, 0xFA, 0x0A, 0xE0, 0xC0, 0xFA, 0xA9, 0x06, 0xB0, 0xFB, 0xEC, 0x14, 0x40, 0xFC, 0x8B, 0x8B, 0xB0, 0x1D, 0xC9, 0x9C, 0x40, 0x1E, 0x78, 0xE5, 0xB0, 0x1F, 0xA0, 0x43, 0xC0, 0x20, 0x33, 0xDD, 0xB0, 0x21, 0x81, 0x77, 0x40, 0x22, 0x0B, 0xD6, 0xB0, -0x2C, 0xC0, 0xC3, 0x40, 0x2D, 0x66, 0xD2, 0x30, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, -0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, -0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7F, 0x44, 0xFF, 0xFF, -0xFF, 0xFF, 0xB8, 0x0F, 0x57, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xB9, 0xF1, 0x42, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0x38, 0xBC, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0x19, 0xEF, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDD, 0xFB, 0x23, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xDF, 0xDD, 0xA8, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF4, 0x98, 0x0D, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xF6, 0xC0, 0x72, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0x51, 0x3A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0x0A, 0xE0, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFB, 0xEC, 0x14, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x1D, 0xC9, 0x9C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x1F, 0xA0, 0x43, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x21, 0x81, 0x77, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, -0x00, 0x00, 0x2C, 0xC0, 0xC3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, 0xD0, -0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2C, 0xC0, 0xC3, 0x40, 0x2D, 0x66, 0xD2, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, 0x00, 0x00, 0xFF, 0xFF, 0xD5, +0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x33, +0x00, 0x2D, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0xAA, 0x7F, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0F, 0x57, +0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x4E, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xF1, 0x42, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0xDE, 0x82, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x38, 0xBC, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEC, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x19, 0xEF, +0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xB9, 0x67, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xFB, 0x23, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xDE, 0x9B, 0xEC, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xDD, 0xA8, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x54, 0x41, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x98, 0x0D, +0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x05, 0x6C, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xC0, 0x72, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x0E, 0x2C, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x51, 0x3A, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xC7, 0xD3, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0x0A, 0xE0, +0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xA9, 0x06, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEC, 0x14, +0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x8B, 0x8B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC9, 0x9C, +0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0xE5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0x43, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x33, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0x77, +0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x0B, 0xD6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xC0, 0xC3, +0x40, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x66, 0xD2, 0x30, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xC7, 0xBC, 0x00, 0x00, 0xFF, 0xFF, +0xD5, 0xD0, 0x01, 0x04, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Canada/Atlantic */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -52017,7 +52245,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Chile/Continental */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x8F, 0x30, 0x47, 0x45, 0x9B, 0x5C, 0xE5, 0x50, 0x9F, 0x7C, 0xE2, 0xC5, 0xA1, 0x00, 0x71, 0xC0, 0xB0, 0x5E, 0x77, 0xC5, 0xB1, 0x77, 0x3D, 0x40, 0xB2, 0x41, 0x00, 0xD0, 0xB3, 0x58, 0x70, 0xC0, 0xB4, 0x22, 0x34, 0x50, 0xB5, 0x39, 0xA4, 0x40, 0xB6, 0x03, 0x67, 0xD0, 0xB7, 0x1A, 0xD7, 0xC0, @@ -52057,9 +52285,8 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x3A, 0x74, 0xB0, 0x74, 0x05, 0x89, 0xC0, 0x75, 0x1A, 0x56, 0xB0, 0x75, 0xE5, 0x6B, 0xC0, 0x76, 0xFA, 0x38, 0xB0, 0x77, 0xC5, 0x4D, 0xC0, 0x78, 0xDA, 0x1A, 0xB0, 0x79, 0xA5, 0x2F, 0xC0, 0x7A, 0xC3, 0x37, 0x30, 0x7B, 0x85, 0x11, 0xC0, 0x7C, 0xA3, 0x19, 0x30, 0x7D, 0x6E, 0x2E, 0x40, -0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, -0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, -0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x02, 0x04, +0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, 0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, @@ -52067,118 +52294,118 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, -0x69, 0x87, 0x1D, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, -0x9B, 0x5C, 0xE5, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, -0xA1, 0x00, 0x71, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, -0xB1, 0x77, 0x3D, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB3, 0x58, 0x70, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xB5, 0x39, 0xA4, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xB7, 0x1A, 0xD7, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x9B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xB8, 0xFD, 0x5C, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, -0xCC, 0x1C, 0x6E, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, -0xD3, 0xDC, 0x8F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x17, 0xD5, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, -0xD5, 0x33, 0x55, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x76, 0x92, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, -0xFD, 0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, -0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x01, 0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x03, 0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x05, 0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x07, 0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x08, 0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x0A, 0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x0C, 0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, -0x0E, 0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, -0x10, 0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, -0x12, 0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, -0x14, 0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x16, 0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, -0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, -0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, -0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, -0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, -0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, -0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, -0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, -0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, -0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, -0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, -0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, -0x59, 0x8F, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, -0x5B, 0x6F, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x5D, 0x74, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x5F, 0x54, 0x5E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x61, 0x34, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x63, 0x1D, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x64, 0xF4, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, -0x66, 0xDD, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x68, 0xBD, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, -0x6A, 0x9C, 0xE5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, -0x6C, 0x7C, 0xC7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, -0x6E, 0x5C, 0xA9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x70, 0x3C, 0x8B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x72, 0x25, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x74, 0x05, 0x89, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x75, 0xE5, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x77, 0xC5, 0x4D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x79, 0xA5, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, -0x7B, 0x85, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, -0x7D, 0x6E, 0x2E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, -0x7F, 0x4E, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, -0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, 0x03, 0x05, 0x04, -0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, -0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, -0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, -0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, -0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, -0x31, 0x2E, 0x36, 0x2F, 0x32, 0x34, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x34, -0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x00, 0xFF, 0xFF, 0xBD, +0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, +0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, +0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, +0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x33, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x1D, 0xC5, 0xFF, +0xFF, 0xFF, 0xFF, 0x8F, 0x30, 0x47, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x5C, 0xE5, 0x50, 0xFF, +0xFF, 0xFF, 0xFF, 0x9F, 0x7C, 0xE2, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x71, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB0, 0x5E, 0x77, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x77, 0x3D, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB2, 0x41, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x58, 0x70, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB4, 0x22, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x39, 0xA4, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x03, 0x67, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x1A, 0xD7, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB7, 0xE4, 0x9B, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x5C, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x1C, 0x6E, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xCC, 0x6C, 0xE7, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xDC, 0x8F, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x17, 0xD5, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x33, 0x55, 0xC0, 0xFF, +0xFF, 0xFF, 0xFF, 0xD5, 0x76, 0x92, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xD1, 0x3C, 0x40, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x75, 0x50, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x32, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3E, 0x4F, 0x40, 0x00, +0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0B, 0xBC, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x13, 0x40, 0x00, +0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xF5, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xBD, 0xD7, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x9D, 0xB9, 0x40, 0x00, +0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD5, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x12, 0x66, 0xB7, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, 0x46, 0x99, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x26, 0x7B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, +0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, +0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, +0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, +0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, +0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, +0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, +0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, +0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, +0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, +0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, +0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, +0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, +0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, +0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, +0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, 0x8F, 0xCE, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x6F, 0xB0, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x74, 0x7C, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x54, 0x5E, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x34, 0x40, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x1D, 0x5D, 0x40, 0x00, +0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x64, 0xF4, 0x04, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x66, 0xDD, 0x21, 0x40, 0x00, +0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x68, 0xBD, 0x03, 0x40, 0x00, +0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x9C, 0xE5, 0x40, 0x00, +0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x7C, 0xC7, 0x40, 0x00, +0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x5C, 0xA9, 0x40, 0x00, +0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x3C, 0x8B, 0x40, 0x00, +0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x25, 0xA7, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x05, 0x89, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x75, 0xE5, 0x6B, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xC5, 0x4D, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xA5, 0x2F, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x85, 0x11, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x6E, 0x2E, 0x40, 0x00, +0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x4E, 0x10, 0x40, 0x01, +0x02, 0x01, 0x03, 0x01, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x04, 0x02, 0x03, 0x02, +0x03, 0x05, 0x04, 0x02, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0xFF, 0xFF, +0xBD, 0xBB, 0x00, 0x00, 0xFF, 0xFF, 0xBD, 0xBB, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x08, +0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0xFF, 0xFF, 0xC7, 0xC0, 0x01, 0x0C, 0xFF, 0xFF, 0xD5, 0xD0, +0x01, 0x10, 0xFF, 0xFF, 0xD5, 0xD0, 0x01, 0x10, 0xFF, 0xFF, 0xC7, 0xC0, 0x00, 0x0C, 0x4C, 0x4D, +0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x34, 0x00, 0x2D, 0x30, +0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x34, 0x3E, 0x34, 0x3C, 0x2D, 0x30, 0x33, 0x3E, 0x2C, 0x4D, +0x39, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x34, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, +0x32, 0x34, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Chile/EasterIsland */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xB9, 0xC7, 0x40, 0x88, 0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0, 0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0, 0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, @@ -52213,110 +52440,109 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x3A, 0x74, 0xB0, 0x74, 0x05, 0x89, 0xC0, 0x75, 0x1A, 0x56, 0xB0, 0x75, 0xE5, 0x6B, 0xC0, 0x76, 0xFA, 0x38, 0xB0, 0x77, 0xC5, 0x4D, 0xC0, 0x78, 0xDA, 0x1A, 0xB0, 0x79, 0xA5, 0x2F, 0xC0, 0x7A, 0xC3, 0x37, 0x30, 0x7B, 0x85, 0x11, 0xC0, 0x7C, 0xA3, 0x19, 0x30, 0x7D, 0x6E, 0x2E, 0x40, -0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, +0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, -0x99, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, -0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x2D, 0x30, -0x37, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, -0x01, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, -0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x42, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x40, 0x88, -0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x01, 0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x05, 0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x07, 0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x0C, 0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, -0x00, 0x00, 0x00, 0x00, 0x0E, 0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, -0x00, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, -0x00, 0x00, 0x00, 0x00, 0x12, 0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, -0x00, 0x00, 0x00, 0x00, 0x14, 0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x16, 0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, -0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, -0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, -0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, -0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, -0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, -0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, -0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, -0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, -0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, -0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, -0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, -0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, -0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, -0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, -0x00, 0x00, 0x00, 0x00, 0x59, 0x8F, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, -0x00, 0x00, 0x00, 0x00, 0x5B, 0x6F, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x5D, 0x74, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x5F, 0x54, 0x5E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x61, 0x34, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x63, 0x1D, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x64, 0xF4, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, -0x00, 0x00, 0x00, 0x00, 0x66, 0xDD, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x68, 0xBD, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, -0x00, 0x00, 0x00, 0x00, 0x6A, 0x9C, 0xE5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, -0x00, 0x00, 0x00, 0x00, 0x6C, 0x7C, 0xC7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, -0x00, 0x00, 0x00, 0x00, 0x6E, 0x5C, 0xA9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x70, 0x3C, 0x8B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x72, 0x25, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x74, 0x05, 0x89, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x75, 0xE5, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x77, 0xC5, 0x4D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x79, 0xA5, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7B, 0x85, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7D, 0x6E, 0x2E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7F, 0x4E, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0xFF, 0xFF, 0x99, 0x78, -0x00, 0x00, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x36, 0x00, 0x2D, 0x30, 0x37, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, -0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x36, 0x3E, 0x36, 0x3C, -0x2D, 0x30, 0x35, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, 0x2C, 0x4D, -0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, +0x06, 0x05, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x04, 0xFF, +0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, +0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, +0x00, 0x45, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x2D, 0x30, 0x37, 0x00, 0x2D, 0x30, 0x35, +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x54, +0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, +0x87, 0x42, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x40, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, +0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x01, +0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x03, +0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x05, +0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x07, +0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, +0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, +0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, +0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, +0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x10, +0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x12, +0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, +0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, +0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, +0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, +0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, +0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, +0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, +0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, +0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, +0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, +0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, +0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, +0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, +0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, +0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, +0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, +0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, +0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, +0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, +0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, +0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, +0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, +0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, +0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, +0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, +0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, +0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, +0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, +0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, +0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, +0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, +0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, +0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, +0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, +0x8F, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, +0x6F, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5D, +0x74, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5F, +0x54, 0x5E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x61, +0x34, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x63, +0x1D, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x64, +0xF4, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x66, +0xDD, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x68, +0xBD, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6A, +0x9C, 0xE5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6C, +0x7C, 0xC7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6E, +0x5C, 0xA9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x70, +0x3C, 0x8B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x72, +0x25, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x74, +0x05, 0x89, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x75, +0xE5, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x77, +0xC5, 0x4D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x79, +0xA5, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7B, +0x85, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7D, +0x6E, 0x2E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, +0x4E, 0x10, 0x40, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0xFF, 0xFF, +0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, +0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, +0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x36, 0x00, 0x2D, 0x30, 0x37, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, +0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x36, 0x3E, +0x36, 0x3C, 0x2D, 0x30, 0x35, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, +0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* CST6CDT */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -53924,7 +54150,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Astrakhan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x18, 0x45, 0x74, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xAA, 0x18, 0x45, 0x74, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -53940,63 +54166,62 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x42, 0x45, 0xE9, 0x70, 0x43, 0x63, 0xFE, 0xF0, 0x44, 0x25, 0xCB, 0x70, 0x45, 0x43, 0xE0, 0xF0, 0x46, 0x05, 0xAD, 0x70, 0x47, 0x23, 0xC2, 0xF0, 0x47, 0xEE, 0xC9, 0xF0, 0x49, 0x03, 0xA4, 0xF0, 0x49, 0xCE, 0xAB, 0xF0, 0x4A, 0xE3, 0x86, 0xF0, 0x4B, 0xAE, 0x8D, 0xF0, 0x4C, 0xCC, 0xA3, 0x70, -0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x56, 0xF7, 0x14, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, -0x04, 0x00, 0x00, 0x2D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, -0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, -0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, -0xAA, 0x18, 0x45, 0x74, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, -0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, -0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, -0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, -0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, -0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, -0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, -0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, -0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, -0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, -0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, -0x47, 0x23, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x49, 0x03, 0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xE3, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x54, 0x4C, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x14, 0x70, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x56, 0xF7, 0x14, 0x70, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x2D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, -0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, -0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xD0, 0x0D, -0xB8, 0x01, 0x5B, 0xFA, 0x08, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x31, 0x20, -0x2D, 0x20, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6B, 0x68, 0x61, 0x6E, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x2D, 0x0C, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, +0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, +0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, +0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x18, 0x45, 0x74, 0xFF, +0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, +0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, +0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, +0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, +0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, +0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x00, +0x00, 0x00, 0x00, 0x56, 0xF7, 0x14, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x2D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, +0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, +0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, +0xD0, 0x0D, 0xB8, 0x01, 0x5B, 0xFA, 0x08, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x4B, 0x2B, 0x30, +0x31, 0x20, 0x2D, 0x20, 0x41, 0x73, 0x74, 0x72, 0x61, 0x6B, 0x68, 0x61, 0x6E, /* Europe/Athens */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -56694,7 +56919,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Istanbul */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x90, 0x8B, 0xF5, 0x98, 0x9B, 0x0C, 0x17, 0x60, 0x9B, 0xD5, 0xBE, 0xD0, 0xA2, 0x65, 0x63, 0xE0, 0xA3, 0x7B, 0x82, 0x50, 0xA4, 0x4E, 0x80, 0x60, 0xA5, 0x3F, 0xB4, 0xD0, 0xA6, 0x25, 0x27, 0xE0, 0xA7, 0x27, 0x7F, 0xD0, 0xAA, 0x28, 0x28, 0x60, 0xAA, 0xE1, 0xFD, 0xD0, 0xAB, 0xF9, 0x89, 0xE0, @@ -56723,98 +56948,97 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8F, 0xDD, 0x90, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x38, 0xBE, 0x10, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x3E, 0x9E, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x57, 0xCF, 0x2E, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, +0x56, 0xF7, 0x30, 0x90, 0x57, 0xCF, 0x2E, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, 0x06, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, 0x04, -0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, -0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, -0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, -0xFF, 0x56, 0xB6, 0xC8, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x8B, 0xF5, 0x98, 0xFF, 0xFF, 0xFF, -0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xBE, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xA2, 0x65, 0x63, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x7B, 0x82, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xA4, 0x4E, 0x80, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3F, 0xB4, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xA6, 0x25, 0x27, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x27, 0x7F, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0x28, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE1, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAB, 0xF9, 0x89, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x31, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xC8, 0x81, 0x3F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x13, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xC9, 0x4A, 0xF5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCE, 0x80, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0xCB, 0xAE, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x6B, 0x09, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xD3, 0xA2, 0x39, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x02, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xD5, 0x4C, 0x0D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0x7B, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD7, 0x2B, 0xEF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x5D, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD9, 0x02, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x3F, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xDA, 0xEB, 0xB3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xD2, 0x5C, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xDC, 0xD4, 0xD0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x3E, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xF1, 0xF4, 0xB9, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x62, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xF5, 0x68, 0x06, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x38, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x06, 0x6E, 0x93, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x39, 0x9A, 0x70, 0x00, 0x00, 0x00, -0x00, 0x07, 0xFB, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x7C, 0x70, 0x00, 0x00, 0x00, -0x00, 0x09, 0xD0, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF9, 0x5E, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0B, 0xB1, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0x40, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0D, 0xA4, 0x55, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xA6, 0xAD, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x11, 0x50, 0x00, 0x00, 0x00, -0x00, 0x19, 0x89, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDC, 0xB0, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xE6, 0xD0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xC6, 0xEF, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9B, 0x31, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, -0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x83, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, -0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, -0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, -0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, -0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, -0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, -0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, -0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, -0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8F, 0xDD, 0x90, 0x00, 0x00, 0x00, -0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, -0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, -0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x38, 0xBE, 0x10, 0x00, 0x00, 0x00, -0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, -0x00, 0x56, 0x3E, 0x9E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, -0x00, 0x57, 0xCF, 0x2E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, -0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, -0x00, 0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, -0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, -0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xC7, 0xEA, 0x62, 0x01, -0x3E, 0xDB, 0x9A, 0x00, 0x00, 0x00, 0x00, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, +0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x15, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, +0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, +0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xD8, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x8B, 0xF5, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xBE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x65, 0x63, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x7B, 0x82, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x4E, 0x80, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3F, 0xB4, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x25, 0x27, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x27, 0x7F, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x28, 0x28, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE1, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xF9, 0x89, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x3F, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x13, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x4A, 0xF5, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCE, 0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xCB, 0xAE, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x6B, 0x09, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xA2, 0x39, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x02, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x4C, 0x0D, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0x7B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2B, 0xEF, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x5D, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0x97, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x3F, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xB3, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xD2, 0x5C, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xD4, 0xD0, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x3E, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF4, 0xB9, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x62, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x68, 0x06, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x38, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x6E, 0x93, 0x70, +0x00, 0x00, 0x00, 0x00, 0x07, 0x39, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFB, 0x75, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0xD0, 0xCB, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0A, 0xF9, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xB1, 0xFE, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xA4, 0x55, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0E, 0xA6, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0x89, 0xB0, 0x70, +0x00, 0x00, 0x00, 0x00, 0x19, 0xDC, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE6, 0xD0, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xC6, 0xEF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9B, 0x31, 0x70, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, +0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x83, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, +0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, +0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, +0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, +0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4D, 0x8F, 0xDD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, +0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, +0x00, 0x00, 0x00, 0x00, 0x53, 0x38, 0xBE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, +0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x3E, 0x9E, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x57, 0xCF, 0x2E, 0x50, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, +0x05, 0x04, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, +0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, +0x00, 0x2A, 0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xC7, 0xEA, +0x62, 0x01, 0x3E, 0xDB, 0x9A, 0x00, 0x00, 0x00, 0x00, /* Europe/Jersey */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4A, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -57290,7 +57514,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Kirov */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xA1, 0x00, 0x39, 0x80, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xA1, 0x00, 0x39, 0x80, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -57306,62 +57530,61 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x42, 0x45, 0xE9, 0x70, 0x43, 0x63, 0xFE, 0xF0, 0x44, 0x25, 0xCB, 0x70, 0x45, 0x43, 0xE0, 0xF0, 0x46, 0x05, 0xAD, 0x70, 0x47, 0x23, 0xC2, 0xF0, 0x47, 0xEE, 0xC9, 0xF0, 0x49, 0x03, 0xA4, 0xF0, 0x49, 0xCE, 0xAB, 0xF0, 0x4A, 0xE3, 0x86, 0xF0, 0x4B, 0xAE, 0x8D, 0xF0, 0x4C, 0xCC, 0xA3, 0x70, -0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, -0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x07, 0x00, 0x00, 0x2E, 0x98, -0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, -0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, -0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, -0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, -0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, -0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, -0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, -0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, -0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, -0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, -0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, -0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, -0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, -0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, -0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, -0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x07, 0x00, 0x00, 0x2E, 0x98, 0x00, 0x00, 0x00, 0x00, -0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, -0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, -0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, -0x0A, 0x00, 0xE2, 0xBE, 0xE0, 0x01, 0x5E, 0x6B, 0x08, 0x00, 0x00, 0x00, 0x0E, 0x4D, 0x53, 0x4B, -0x2B, 0x30, 0x30, 0x20, 0x2D, 0x20, 0x4B, 0x69, 0x72, 0x6F, 0x76, +0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x00, 0x00, 0x2E, 0x98, 0x00, 0x00, 0x00, 0x00, 0x2A, +0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, +0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, +0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, +0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, +0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, +0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, +0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, +0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, +0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, +0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, +0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, +0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, +0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, +0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, +0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, +0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, +0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, +0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, +0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, +0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, +0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, +0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, +0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, +0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, +0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, +0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, +0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, +0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, +0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, +0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, +0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, +0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4B, +0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, +0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x01, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, +0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x00, 0x00, 0x2E, 0x98, 0x00, 0x00, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, +0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, +0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, +0x2D, 0x33, 0x0A, 0x00, 0xE2, 0xBE, 0xE0, 0x01, 0x5E, 0x6B, 0x08, 0x00, 0x00, 0x00, 0x0E, 0x4D, +0x53, 0x4B, 0x2B, 0x30, 0x30, 0x20, 0x2D, 0x20, 0x4B, 0x69, 0x72, 0x6F, 0x76, /* Europe/Kyiv */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -58725,7 +58948,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Minsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x42, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x26, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x26, 0x80, 0x00, 0x00, 0x00, 0xAA, 0x19, 0xAA, 0x38, 0xB5, 0xA4, 0x19, 0x60, 0xCA, 0x5E, 0x70, 0xD0, 0xCC, 0xE7, 0x4B, 0x10, 0xCD, 0xA9, 0x17, 0x90, 0xCE, 0xA2, 0x43, 0x10, 0xCF, 0x92, 0x34, 0x10, 0xD0, 0x0A, 0x02, 0x60, 0x15, 0x27, 0xA7, 0xD0, 0x16, 0x18, 0xDC, 0x40, 0x17, 0x08, 0xDB, 0x50, 0x17, 0xFA, 0x0F, 0xC0, @@ -58742,71 +58965,70 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x40, 0x66, 0x15, 0x80, 0x41, 0x84, 0x2B, 0x00, 0x42, 0x45, 0xF7, 0x80, 0x43, 0x64, 0x0D, 0x00, 0x44, 0x25, 0xD9, 0x80, 0x45, 0x43, 0xEF, 0x00, 0x46, 0x05, 0xBB, 0x80, 0x47, 0x23, 0xD1, 0x00, 0x47, 0xEE, 0xD8, 0x00, 0x49, 0x03, 0xB3, 0x00, 0x49, 0xCE, 0xBA, 0x00, 0x4A, 0xE3, 0x95, 0x00, -0x4B, 0xAE, 0x9C, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x4D, 0x8E, 0x7E, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x06, 0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, -0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, -0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, -0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, -0x0B, 0x0A, 0x0B, 0x0C, 0x0C, 0x00, 0x00, 0x19, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x19, 0xC8, 0x00, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, -0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, -0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, -0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, -0x30, 0x00, 0x22, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, -0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, -0x45, 0x45, 0x53, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, -0x00, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xCA, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, -0xAA, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x5E, -0x70, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, -0x17, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, -0x34, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x0A, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, -0xA7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, -0xDB, 0x50, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, -0x0E, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, -0x93, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, -0x91, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, -0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, -0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, -0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, -0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, -0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, -0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, -0xEA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, -0xCC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, -0xAE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, -0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, -0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, -0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, -0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, -0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, -0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, -0x51, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, -0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x0E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, -0x15, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, -0xF7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, -0xD9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, -0xBB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, -0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, -0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, -0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, -0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x06, 0x04, 0x05, -0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, +0x4B, 0xAE, 0x9C, 0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x4D, 0x8E, 0x7E, 0x00, 0x01, 0x02, 0x03, 0x06, +0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, 0x09, +0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, -0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0C, 0x0C, 0x00, -0x00, 0x19, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x19, 0xC8, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, -0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1C, -0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, -0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, 0x01, -0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x22, 0x4C, 0x4D, 0x54, -0x00, 0x4D, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, 0x54, -0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x2B, -0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xDB, 0x92, 0xF0, 0x01, 0x3C, 0xB8, -0xBA, 0x00, 0x00, 0x00, 0x00, +0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0C, +0x00, 0x00, 0x19, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x19, 0xC8, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20, +0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, 0x00, +0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, +0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, 0x30, +0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x22, 0x4C, 0x4D, +0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, 0x45, +0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, +0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x26, 0xFF, 0xFF, 0xFF, +0xFF, 0x56, 0xB6, 0xCA, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x19, 0xAA, 0x38, 0xFF, 0xFF, 0xFF, +0xFF, 0xB5, 0xA4, 0x19, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x5E, 0x70, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xCC, 0xE7, 0x4B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCD, 0xA9, 0x17, 0x90, 0xFF, 0xFF, 0xFF, +0xFF, 0xCE, 0xA2, 0x43, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x92, 0x34, 0x10, 0xFF, 0xFF, 0xFF, +0xFF, 0xD0, 0x0A, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0xA7, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x16, 0x18, 0xDC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xDB, 0x50, 0x00, 0x00, 0x00, +0x00, 0x17, 0xFA, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x0E, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x19, 0xDB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x93, 0xD0, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xBC, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x91, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x9C, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, +0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD5, 0x08, 0x80, 0x00, 0x00, 0x00, +0x00, 0x2A, 0xC4, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xEA, 0x80, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xA4, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xCC, 0x80, 0x00, 0x00, 0x00, +0x00, 0x2E, 0x84, 0xBD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xAE, 0x80, 0x00, 0x00, 0x00, +0x00, 0x30, 0x64, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xCB, 0x00, 0x00, 0x00, 0x00, +0x00, 0x32, 0x72, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xAD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x34, 0x52, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x8F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x36, 0x32, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x71, 0x00, 0x00, 0x00, 0x00, +0x00, 0x38, 0x1B, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x53, 0x00, 0x00, 0x00, 0x00, +0x00, 0x39, 0xFB, 0x68, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x35, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3B, 0xDB, 0x4A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x51, 0x80, 0x00, 0x00, 0x00, +0x00, 0x3D, 0xBB, 0x2C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x33, 0x80, 0x00, 0x00, 0x00, +0x00, 0x3F, 0x9B, 0x0E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x15, 0x80, 0x00, 0x00, 0x00, +0x00, 0x41, 0x84, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xF7, 0x80, 0x00, 0x00, 0x00, +0x00, 0x43, 0x64, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xD9, 0x80, 0x00, 0x00, 0x00, +0x00, 0x45, 0x43, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xBB, 0x80, 0x00, 0x00, 0x00, +0x00, 0x47, 0x23, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xD8, 0x00, 0x00, 0x00, 0x00, +0x00, 0x49, 0x03, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xBA, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4A, 0xE3, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x9C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4C, 0xCC, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x7E, 0x00, 0x01, 0x02, 0x03, +0x06, 0x04, 0x05, 0x04, 0x05, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x03, 0x07, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, +0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, +0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, 0x0A, 0x0B, +0x0C, 0x00, 0x00, 0x19, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x19, 0xC8, 0x00, 0x04, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x00, +0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x1C, 0x20, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x01, +0x19, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x19, 0x00, 0x00, 0x2A, +0x30, 0x01, 0x1D, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x22, 0x4C, +0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x4D, 0x53, 0x4B, 0x00, 0x43, +0x45, 0x54, 0x00, 0x43, 0x45, 0x53, 0x54, 0x00, 0x4D, 0x53, 0x44, 0x00, 0x45, 0x45, 0x53, 0x54, +0x00, 0x2B, 0x30, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, +0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xDB, 0x92, 0xF0, 0x01, +0x3C, 0xB8, 0xBA, 0x00, 0x00, 0x00, 0x00, /* Europe/Monaco */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -60136,7 +60358,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Samara */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0x00, 0x39, 0x80, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, 0xA1, 0x00, 0x39, 0x80, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -60152,67 +60374,66 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x40, 0x65, 0xF9, 0x60, 0x41, 0x84, 0x0E, 0xE0, 0x42, 0x45, 0xDB, 0x60, 0x43, 0x63, 0xF0, 0xE0, 0x44, 0x25, 0xBD, 0x60, 0x45, 0x43, 0xD2, 0xE0, 0x46, 0x05, 0x9F, 0x60, 0x47, 0x23, 0xB4, 0xE0, 0x47, 0xEE, 0xBB, 0xE0, 0x49, 0x03, 0x96, 0xE0, 0x49, 0xCE, 0x9D, 0xE0, 0x4A, 0xE3, 0x78, 0xE0, -0x4B, 0xAE, 0x7F, 0xE0, 0x4C, 0xCC, 0xA3, 0x70, 0x4D, 0x8E, 0x6F, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, +0x4B, 0xAE, 0x7F, 0xE0, 0x4C, 0xCC, 0xA3, 0x70, 0x4D, 0x8E, 0x6F, 0xF0, 0x01, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, +0x06, 0x07, 0x08, 0x07, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, +0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x00, 0x00, 0x2E, 0xF4, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, +0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, +0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, +0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, +0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, +0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, +0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, +0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, +0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xCE, 0x60, +0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xB0, 0x60, +0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xA1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0x92, 0x60, +0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xAE, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x89, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x90, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x72, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x54, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x36, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x18, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x35, 0x60, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x17, 0x60, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x65, 0xF9, 0x60, +0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xDB, 0x60, +0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xBD, 0x60, +0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xD2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0x9F, 0x60, +0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xB4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xBB, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x96, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x9D, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x78, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x7F, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x08, 0x07, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, -0x04, 0x00, 0x00, 0x2E, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, -0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, -0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x38, -0x40, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, -0x0B, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, 0xFF, 0xFF, 0xFF, -0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, -0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, -0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xDD, 0x60, 0x00, 0x00, 0x00, -0x00, 0x2B, 0xB4, 0xCE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xBF, 0x60, 0x00, 0x00, 0x00, -0x00, 0x2D, 0x94, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xA1, 0x60, 0x00, 0x00, 0x00, -0x00, 0x2F, 0x74, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x83, 0x60, 0x00, 0x00, 0x00, -0x00, 0x31, 0x5D, 0xAE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x89, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x33, 0x3D, 0x90, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x6B, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x35, 0x1D, 0x72, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x4D, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x36, 0xFD, 0x54, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x6A, 0x60, 0x00, 0x00, 0x00, -0x00, 0x38, 0xDD, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x4C, 0x60, 0x00, 0x00, 0x00, -0x00, 0x3A, 0xBD, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x2E, 0x60, 0x00, 0x00, 0x00, -0x00, 0x3C, 0xA6, 0x35, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x10, 0x60, 0x00, 0x00, 0x00, -0x00, 0x3E, 0x86, 0x17, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9A, 0xF2, 0x60, 0x00, 0x00, 0x00, -0x00, 0x40, 0x65, 0xF9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x0E, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x42, 0x45, 0xDB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xF0, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x44, 0x25, 0xBD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xD2, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x46, 0x05, 0x9F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xB4, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x47, 0xEE, 0xBB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x96, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x49, 0xCE, 0x9D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x78, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x4B, 0xAE, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, -0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, -0x07, 0x06, 0x07, 0x08, 0x07, 0x02, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x04, 0x04, 0x00, 0x00, -0x2E, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, -0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, -0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, -0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, -0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, -0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, -0xDA, 0x81, 0x7F, 0x01, 0x5F, 0x2E, 0x58, 0x00, 0x00, 0x00, 0x19, 0x4D, 0x53, 0x4B, 0x2B, 0x30, -0x31, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x6D, 0x61, 0x72, 0x61, 0x2C, 0x20, 0x55, 0x64, 0x6D, 0x75, -0x72, 0x74, 0x69, 0x61, +0x00, 0x00, 0x2E, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, +0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, +0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, +0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, +0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, +0x35, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, +0x0A, 0x00, 0xDA, 0x81, 0x7F, 0x01, 0x5F, 0x2E, 0x58, 0x00, 0x00, 0x00, 0x19, 0x4D, 0x53, 0x4B, +0x2B, 0x30, 0x31, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x6D, 0x61, 0x72, 0x61, 0x2C, 0x20, 0x55, 0x64, +0x6D, 0x75, 0x72, 0x74, 0x69, 0x61, /* Europe/San_Marino */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -60508,7 +60729,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Saratov */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xA1, 0x00, 0x39, 0x80, +0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, 0xA1, 0x00, 0x39, 0x80, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -60524,64 +60745,63 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x42, 0x45, 0xE9, 0x70, 0x43, 0x63, 0xFE, 0xF0, 0x44, 0x25, 0xCB, 0x70, 0x45, 0x43, 0xE0, 0xF0, 0x46, 0x05, 0xAD, 0x70, 0x47, 0x23, 0xC2, 0xF0, 0x47, 0xEE, 0xC9, 0xF0, 0x49, 0x03, 0xA4, 0xF0, 0x49, 0xCE, 0xAB, 0xF0, 0x4A, 0xE3, 0x86, 0xF0, 0x4B, 0xAE, 0x8D, 0xF0, 0x4C, 0xCC, 0xA3, 0x70, -0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x58, 0x43, 0x4E, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, +0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x58, 0x43, 0x4E, 0x70, 0x01, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x2B, 0x32, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, +0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, +0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, +0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x10, +0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, +0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, +0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, +0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, +0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, +0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, +0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, +0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, +0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, +0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x58, 0x43, 0x4E, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, -0x04, 0x00, 0x00, 0x2B, 0x32, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, -0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, -0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, -0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, -0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, -0x09, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, 0xFF, 0xFF, 0xFF, -0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, -0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, -0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, -0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, -0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, -0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, -0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x00, 0x00, 0x00, -0x00, 0x58, 0x43, 0x4E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, -0x2B, 0x32, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, -0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, -0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, -0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, -0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, -0xD8, 0x03, 0x7A, 0x01, 0x58, 0xE6, 0x45, 0x00, 0x00, 0x00, 0x10, 0x4D, 0x53, 0x4B, 0x2B, 0x30, -0x31, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6F, 0x76, +0x00, 0x00, 0x2B, 0x32, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, +0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, +0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, +0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, +0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, +0x0A, 0x00, 0xD8, 0x03, 0x7A, 0x01, 0x58, 0xE6, 0x45, 0x00, 0x00, 0x00, 0x10, 0x4D, 0x53, 0x4B, +0x2B, 0x30, 0x31, 0x20, 0x2D, 0x20, 0x53, 0x61, 0x72, 0x61, 0x74, 0x6F, 0x76, /* Europe/Simferopol */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -61485,7 +61705,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Ulyanovsk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xA1, 0x00, 0x39, 0x80, +0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xA1, 0x00, 0x39, 0x80, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -61502,69 +61722,68 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x44, 0x25, 0xCB, 0x70, 0x45, 0x43, 0xE0, 0xF0, 0x46, 0x05, 0xAD, 0x70, 0x47, 0x23, 0xC2, 0xF0, 0x47, 0xEE, 0xC9, 0xF0, 0x49, 0x03, 0xA4, 0xF0, 0x49, 0xCE, 0xAB, 0xF0, 0x4A, 0xE3, 0x86, 0xF0, 0x4B, 0xAE, 0x8D, 0xF0, 0x4C, 0xCC, 0xA3, 0x70, 0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, -0x56, 0xF7, 0x14, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, +0x56, 0xF7, 0x14, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x2D, 0x60, 0x00, -0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, -0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, -0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, -0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x10, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x38, -0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, -0x30, 0x34, 0x00, 0x2B, 0x30, 0x32, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, -0x00, 0x39, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, -0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, -0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, -0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, -0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, -0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, -0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, -0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, -0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, -0x2C, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, -0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, -0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, -0x78, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, -0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, -0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, -0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, -0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, -0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, -0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, -0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, -0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, -0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, -0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, -0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, -0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, -0x23, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, -0x03, 0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, -0xE3, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, -0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, -0x4C, 0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x14, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x05, -0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x00, 0x00, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, +0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x10, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x32, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, -0x2D, 0x34, 0x0A, 0x00, 0xDC, 0x3C, 0x35, 0x01, 0x5C, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x12, 0x4D, -0x53, 0x4B, 0x2B, 0x30, 0x31, 0x20, 0x2D, 0x20, 0x55, 0x6C, 0x79, 0x61, 0x6E, 0x6F, 0x76, 0x73, -0x6B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, +0x00, 0x0C, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0x00, 0x39, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, +0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x23, 0x3C, 0x1A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x0B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, +0x00, 0x00, 0x28, 0xE5, 0x17, 0x80, 0x00, 0x00, 0x00, 0x00, 0x29, 0x78, 0xBF, 0x80, 0x00, 0x00, +0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, +0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, +0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, +0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, +0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, +0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x00, 0x00, +0x00, 0x00, 0x56, 0xF7, 0x14, 0x70, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, +0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x00, 0x00, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, +0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, +0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x46, 0x50, 0x01, 0x08, 0x00, 0x00, 0x38, 0x40, +0x01, 0x0C, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x00, 0x00, +0x1C, 0x20, 0x00, 0x10, 0x00, 0x00, 0x38, 0x40, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x0C, +0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, +0x2B, 0x30, 0x32, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x30, +0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0xDC, 0x3C, 0x35, 0x01, 0x5C, 0x82, 0xC0, 0x00, 0x00, 0x00, +0x12, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x31, 0x20, 0x2D, 0x20, 0x55, 0x6C, 0x79, 0x61, 0x6E, 0x6F, +0x76, 0x73, 0x6B, /* Europe/Uzhgorod */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -62273,7 +62492,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Europe/Volgograd */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF5, 0x46, 0xDC, +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xA1, 0xF5, 0x46, 0xDC, 0xB5, 0xA4, 0x0B, 0x50, 0x15, 0x27, 0x99, 0xC0, 0x16, 0x18, 0xCE, 0x30, 0x17, 0x08, 0xCD, 0x40, 0x17, 0xFA, 0x01, 0xB0, 0x18, 0xEA, 0x00, 0xC0, 0x19, 0xDB, 0x35, 0x30, 0x1A, 0xCC, 0x85, 0xC0, 0x1B, 0xBC, 0x92, 0xE0, 0x1C, 0xAC, 0x83, 0xE0, 0x1D, 0x9C, 0x74, 0xE0, 0x1E, 0x8C, 0x65, 0xE0, @@ -62290,62 +62509,61 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x46, 0x05, 0xAD, 0x70, 0x47, 0x23, 0xC2, 0xF0, 0x47, 0xEE, 0xC9, 0xF0, 0x49, 0x03, 0xA4, 0xF0, 0x49, 0xCE, 0xAB, 0xF0, 0x4A, 0xE3, 0x86, 0xF0, 0x4B, 0xAE, 0x8D, 0xF0, 0x4C, 0xCC, 0xA3, 0x70, 0x4D, 0x8E, 0x6F, 0xF0, 0x54, 0x4C, 0x1D, 0x60, 0x5B, 0xD4, 0xED, 0xF0, 0x5F, 0xE7, 0xB2, 0x60, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, -0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x04, 0x07, 0x04, 0x07, 0x07, 0x00, 0x00, 0x29, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, -0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, -0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, -0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x42, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF5, -0x46, 0xDC, 0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, -0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, -0xCD, 0x40, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, -0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, -0x85, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, -0x83, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, -0x65, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, -0x47, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, -0x29, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, -0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, -0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, -0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, -0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, -0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, -0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, -0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, -0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, -0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, -0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, -0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, -0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, -0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, -0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, -0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, -0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, -0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, -0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, -0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, -0xA4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, -0x86, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, -0xA3, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, -0x1D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD4, 0xED, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xE7, -0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x07, 0x00, 0x00, 0x29, 0xA4, -0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, -0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, -0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0xD3, 0xB0, -0xB5, 0x01, 0x56, 0x6E, 0xC2, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x4B, 0x2B, 0x30, 0x30, 0x20, -0x2D, 0x20, 0x56, 0x6F, 0x6C, 0x67, 0x6F, 0x67, 0x72, 0x61, 0x64, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, +0x07, 0x00, 0x00, 0x29, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, +0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, +0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, +0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, +0x08, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xF5, 0x46, 0xDC, 0xFF, 0xFF, 0xFF, +0xFF, 0xB5, 0xA4, 0x0B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x15, 0x27, 0x99, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x16, 0x18, 0xCE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x17, 0x08, 0xCD, 0x40, 0x00, 0x00, 0x00, +0x00, 0x17, 0xFA, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xEA, 0x00, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x19, 0xDB, 0x35, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xCC, 0x85, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xBC, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xAC, 0x83, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x9C, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x65, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x1F, 0x7C, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x47, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x21, 0x5C, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x29, 0xE0, 0x00, 0x00, 0x00, +0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, +0x00, 0x29, 0xD4, 0xEC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, +0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, +0x00, 0x2D, 0x94, 0xBE, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, +0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, +0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, +0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, +0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, +0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x46, 0x05, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xC2, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x47, 0xEE, 0xC9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xA4, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x49, 0xCE, 0xAB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0x86, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xAE, 0x8D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xA3, 0x70, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x8E, 0x6F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x1D, 0x60, 0x00, 0x00, 0x00, +0x00, 0x5B, 0xD4, 0xED, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xE7, 0xB2, 0x60, 0x01, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, +0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x00, 0x00, +0x29, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, +0x00, 0x00, 0x46, 0x50, 0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x00, 0x00, 0x46, 0x50, +0x01, 0x0C, 0x00, 0x00, 0x38, 0x40, 0x01, 0x08, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x04, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, +0xD3, 0xB0, 0xB5, 0x01, 0x56, 0x6E, 0xC2, 0x00, 0x00, 0x00, 0x12, 0x4D, 0x53, 0x4B, 0x2B, 0x30, +0x30, 0x20, 0x2D, 0x20, 0x56, 0x6F, 0x6C, 0x67, 0x6F, 0x67, 0x72, 0x61, 0x64, /* Europe/Warsaw */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -63515,79 +63733,16 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Iceland */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x8B, 0x60, 0x83, 0xA0, -0x9C, 0x91, 0x1E, 0x00, 0x9D, 0xD1, 0x88, 0x90, 0x9E, 0x72, 0x51, 0x80, 0x9F, 0xD5, 0x03, 0x10, -0xA0, 0x53, 0x85, 0x00, 0xA1, 0xB6, 0x36, 0x90, 0xA4, 0x3C, 0x27, 0x80, 0xA4, 0xB9, 0x74, 0x10, -0xC6, 0x4D, 0x1A, 0x00, 0xC7, 0x3D, 0x27, 0x20, 0xC7, 0xDA, 0x17, 0xB0, 0xC9, 0x26, 0x43, 0xA0, -0xC9, 0xC3, 0x26, 0x20, 0xCB, 0x06, 0x25, 0xA0, 0xCB, 0xAC, 0x42, 0xA0, 0xCC, 0xDC, 0xCD, 0x20, -0xCD, 0x8C, 0x24, 0xA0, 0xCE, 0xBC, 0xAF, 0x20, 0xCF, 0x6C, 0x06, 0xA0, 0xD0, 0x9C, 0x91, 0x20, -0xD1, 0x4B, 0xE8, 0xA0, 0xD2, 0x85, 0xAD, 0xA0, 0xD3, 0x2B, 0xCA, 0xA0, 0xD4, 0x65, 0x8F, 0xA0, -0xD5, 0x39, 0xD1, 0x20, 0xD6, 0x45, 0x71, 0xA0, 0xD7, 0x19, 0xB3, 0x20, 0xD8, 0x25, 0x53, 0xA0, -0xD8, 0xF9, 0x95, 0x20, 0xDA, 0x0E, 0x70, 0x20, 0xDA, 0xD9, 0x77, 0x20, 0xDB, 0xE5, 0x17, 0xA0, -0xDC, 0xB9, 0x59, 0x20, 0xDD, 0xCE, 0x34, 0x20, 0xDE, 0xA2, 0x75, 0xA0, 0xDF, 0xAE, 0x16, 0x20, -0xE0, 0x82, 0x57, 0xA0, 0xE1, 0x8D, 0xF8, 0x20, 0xE2, 0x62, 0x39, 0xA0, 0xE3, 0x6D, 0xDA, 0x20, -0xE4, 0x42, 0x1B, 0xA0, 0xE5, 0x4D, 0xBC, 0x20, 0xE6, 0x21, 0xFD, 0xA0, 0xE7, 0x36, 0xD8, 0xA0, -0xE8, 0x0B, 0x1A, 0x20, 0xE9, 0x16, 0xBA, 0xA0, 0xE9, 0xEA, 0xFC, 0x20, 0xEA, 0xF6, 0x9C, 0xA0, -0xEB, 0xCA, 0xDE, 0x20, 0xEC, 0xD6, 0x7E, 0xA0, 0xED, 0xAA, 0xC0, 0x20, 0xEE, 0xB6, 0x60, 0xA0, -0xEF, 0x8A, 0xA2, 0x20, 0xF0, 0x96, 0x42, 0xA0, 0xF1, 0x6A, 0x84, 0x20, 0xF2, 0x7F, 0x5F, 0x20, -0xF3, 0x53, 0xA0, 0xA0, 0xF4, 0x5F, 0x41, 0x20, 0xF5, 0x33, 0x82, 0xA0, 0xF6, 0x3F, 0x23, 0x20, -0xF7, 0x13, 0x64, 0xA0, 0xF8, 0x1F, 0x05, 0x20, 0xF8, 0xF3, 0x46, 0xA0, 0xF9, 0xFE, 0xE7, 0x20, -0xFA, 0xD3, 0x28, 0xA0, 0xFB, 0xE8, 0x03, 0xA0, 0xFC, 0xBC, 0x45, 0x20, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, -0xFF, 0xFF, 0xEB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, -0x00, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x31, 0x00, -0x47, 0x4D, 0x54, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, -0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x8B, 0x60, 0x83, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0x9C, 0x91, 0x1E, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x9D, 0xD1, 0x88, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0x9E, 0x72, 0x51, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0xD5, 0x03, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xA0, 0x53, 0x85, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xA1, 0xB6, 0x36, 0x90, 0xFF, 0xFF, -0xFF, 0xFF, 0xA4, 0x3C, 0x27, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0xB9, 0x74, 0x10, 0xFF, 0xFF, -0xFF, 0xFF, 0xC6, 0x4D, 0x1A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x3D, 0x27, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xC7, 0xDA, 0x17, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x26, 0x43, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xC9, 0xC3, 0x26, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x06, 0x25, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xCB, 0xAC, 0x42, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xDC, 0xCD, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xCD, 0x8C, 0x24, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xBC, 0xAF, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xCF, 0x6C, 0x06, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0x9C, 0x91, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xD1, 0x4B, 0xE8, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x85, 0xAD, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD3, 0x2B, 0xCA, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x65, 0x8F, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD5, 0x39, 0xD1, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x45, 0x71, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD7, 0x19, 0xB3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x25, 0x53, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xD8, 0xF9, 0x95, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x0E, 0x70, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xDA, 0xD9, 0x77, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xE5, 0x17, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xDC, 0xB9, 0x59, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xCE, 0x34, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xDE, 0xA2, 0x75, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xAE, 0x16, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xE0, 0x82, 0x57, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x8D, 0xF8, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xE2, 0x62, 0x39, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0x6D, 0xDA, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xE4, 0x42, 0x1B, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE5, 0x4D, 0xBC, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xE6, 0x21, 0xFD, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x36, 0xD8, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE8, 0x0B, 0x1A, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x16, 0xBA, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xE9, 0xEA, 0xFC, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xF6, 0x9C, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xEB, 0xCA, 0xDE, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xD6, 0x7E, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xED, 0xAA, 0xC0, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0xB6, 0x60, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xEF, 0x8A, 0xA2, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x96, 0x42, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xF1, 0x6A, 0x84, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x7F, 0x5F, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF3, 0x53, 0xA0, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x5F, 0x41, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF5, 0x33, 0x82, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x3F, 0x23, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF7, 0x13, 0x64, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x1F, 0x05, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xF8, 0xF3, 0x46, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFE, 0xE7, 0x20, 0xFF, 0xFF, -0xFF, 0xFF, 0xFA, 0xD3, 0x28, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE8, 0x03, 0xA0, 0xFF, 0xFF, -0xFF, 0xFF, 0xFC, 0xBC, 0x45, 0x20, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x05, 0xFF, 0xFF, 0xEB, 0x60, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xFF, 0xFF, 0xF1, 0xF0, 0x00, 0x08, 0xFF, 0xFF, 0xF1, 0xF0, -0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x4C, 0x4D, -0x54, 0x00, 0x2B, 0x30, 0x30, 0x00, 0x2D, 0x30, 0x31, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x0A, 0x47, 0x4D, 0x54, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x92, 0xE6, 0x92, 0x48, +0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x47, 0x4D, 0x54, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xE6, 0x92, 0x48, 0x01, 0xFF, 0xFF, 0xFC, 0x38, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x47, 0x4D, 0x54, 0x00, 0x0A, 0x47, +0x4D, 0x54, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* Indian/Antananarivo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -63609,46 +63764,43 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Indian/Chagos */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x49, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x89, 0x7E, 0xF7, 0x9C, -0x30, 0xE6, 0xDD, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x43, 0xE4, 0x00, -0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x7E, 0xF7, 0x9C, 0x00, 0x00, 0x00, -0x00, 0x30, 0xE6, 0xDD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0x00, 0x00, 0x43, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, 0x54, 0x60, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x7E, 0x23, 0xAA, 0x01, 0x81, 0x28, 0x42, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x89, 0x7E, 0xF7, 0x9C, +0x30, 0xE6, 0xDD, 0xB0, 0x01, 0x02, 0x00, 0x00, 0x43, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, +0x00, 0x04, 0x00, 0x00, 0x54, 0x60, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, +0x2B, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x7E, 0xF7, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x30, 0xE6, 0xDD, 0xB0, +0x01, 0x02, 0x00, 0x00, 0x43, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x00, 0x00, +0x54, 0x60, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x36, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x3E, 0x2D, 0x36, 0x0A, 0x00, 0x7E, 0x23, 0xAA, 0x01, 0x81, 0x28, +0x42, 0x00, 0x00, 0x00, 0x00, /* Indian/Christmas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x63, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x63, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x37, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x73, 0x16, 0xA9, 0xE4, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x63, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x62, 0x70, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x79, 0x6F, 0x3D, 0x01, 0xB3, 0xF8, 0x12, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x73, 0x16, 0xA9, 0xE4, 0x01, 0x00, 0x00, 0x63, 0x1C, 0x00, 0x00, +0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x37, 0x3E, 0x2D, 0x37, 0x0A, 0x00, 0x79, 0x6F, 0x3D, 0x01, 0xB3, 0xF8, 0x12, 0x00, +0x00, 0x00, 0x00, /* Indian/Cocos */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x5A, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x68, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x55, 0x26, 0xA4, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x5A, 0xDC, 0x00, 0x00, -0x00, 0x00, 0x5B, 0x68, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, -0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x3E, 0x2D, 0x36, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0x76, -0xC3, 0xA5, 0x01, 0xA6, 0x8A, 0x92, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x5A, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x55, 0x26, 0xA4, 0x01, 0x00, 0x00, 0x5A, 0xDC, +0x00, 0x00, 0x00, 0x00, 0x5B, 0x68, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x36, 0x33, +0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x36, 0x33, 0x30, 0x3E, 0x2D, 0x36, 0x3A, 0x33, 0x30, 0x0A, +0x00, 0x76, 0xC3, 0xA5, 0x01, 0xA6, 0x8A, 0x92, 0x00, 0x00, 0x00, 0x00, /* Indian/Comoro */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -63666,64 +63818,60 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Indian/Kerguelen */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xDA, 0x61, 0x62, 0x80, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, -0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xDA, 0x61, 0x62, 0x80, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x2D, 0x30, 0x30, +0x00, 0x2B, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x61, 0x62, 0x80, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x46, 0x50, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x3E, 0x05, 0xD2, 0x01, 0x7D, 0xCD, 0x36, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x61, 0x62, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x46, 0x50, 0x00, 0x04, 0x2D, 0x30, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x3E, 0x05, 0xD2, 0x01, 0x7D, 0xCD, 0x36, 0x00, +0x00, 0x00, 0x00, /* Indian/Mahe */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x89, 0x7F, 0x07, 0x84, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x89, 0x7F, 0x07, 0x84, +0x01, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x7F, 0x07, 0x84, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00, 0x00, 0x00, -0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0x82, 0x35, 0x55, 0x01, 0x67, 0x4B, 0x2A, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x7F, 0x07, 0x84, 0x01, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x00, +0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0x82, 0x35, 0x55, 0x01, 0x67, 0x4B, 0x2A, 0x00, +0x00, 0x00, 0x00, /* Indian/Maldives */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, -0xED, 0x2F, 0xC3, 0x98, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0x00, 0x00, 0x44, 0xE8, 0x00, -0x00, 0x00, 0x00, 0x44, 0xE8, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x9F, 0x18, 0xFF, 0xFF, 0xFF, -0xFF, 0xED, 0x2F, 0xC3, 0x98, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0x00, 0x00, 0x44, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x44, 0xE8, 0x00, 0x04, 0x00, 0x00, 0x46, 0x50, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x0A, 0x3C, -0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x8F, 0xAF, 0xDA, 0x01, 0x82, 0xCF, 0x70, 0x00, -0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0xED, 0x2F, 0xC3, 0x98, 0x01, 0x02, 0x00, 0x00, 0x44, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x44, 0xE8, +0x00, 0x04, 0x00, 0x00, 0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x35, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x9F, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xED, 0x2F, 0xC3, 0x98, +0x01, 0x02, 0x00, 0x00, 0x44, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x44, 0xE8, 0x00, 0x04, 0x00, 0x00, +0x46, 0x50, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, +0x0A, 0x3C, 0x2B, 0x30, 0x35, 0x3E, 0x2D, 0x35, 0x0A, 0x00, 0x8F, 0xAF, 0xDA, 0x01, 0x82, 0xCF, +0x70, 0x00, 0x00, 0x00, 0x00, /* Indian/Mauritius */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x89, 0x7F, 0x05, 0x98, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x89, 0x7F, 0x05, 0x98, 0x18, 0x05, 0xED, 0x40, 0x18, 0xDB, 0x72, 0x30, 0x49, 0x03, 0x96, 0xE0, 0x49, 0xCE, 0x8F, 0xD0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x35, 0xE8, 0x00, 0x00, -0x00, 0x00, 0x46, 0x50, 0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, -0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x7F, 0x05, 0x98, 0x00, 0x00, 0x00, 0x00, -0x18, 0x05, 0xED, 0x40, 0x00, 0x00, 0x00, 0x00, 0x18, 0xDB, 0x72, 0x30, 0x00, 0x00, 0x00, 0x00, -0x49, 0x03, 0x96, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0x8F, 0xD0, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0x35, 0xE8, 0x00, 0x00, -0x00, 0x00, 0x46, 0x50, 0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, -0x0A, 0x00, 0x6A, 0x8E, 0xA5, 0x01, 0x6A, 0x65, 0x70, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x35, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x01, +0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, +0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0xFF, 0xFF, 0xFF, 0x89, 0x7F, 0x05, 0x98, 0x00, 0x00, 0x00, 0x00, 0x18, 0x05, 0xED, 0x40, 0x00, +0x00, 0x00, 0x00, 0x18, 0xDB, 0x72, 0x30, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0x96, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x49, 0xCE, 0x8F, 0xD0, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x35, 0xE8, +0x00, 0x00, 0x00, 0x00, 0x46, 0x50, 0x01, 0x04, 0x00, 0x00, 0x38, 0x40, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x34, 0x3E, +0x2D, 0x34, 0x0A, 0x00, 0x6A, 0x8E, 0xA5, 0x01, 0x6A, 0x65, 0x70, 0x00, 0x00, 0x00, 0x00, /* Indian/Mayotte */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x59, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -63741,21 +63889,20 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Indian/Reunion */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x52, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xCC, 0x39, 0x80, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x91, 0xCC, 0x39, 0x80, +0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xCC, 0x39, 0x80, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, -0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0x69, 0x7D, 0x35, 0x01, 0x67, 0x4B, 0x2A, 0x00, 0x00, 0x00, -0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0xCC, 0x39, 0x80, 0x01, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x38, 0x40, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x0A, 0x3C, +0x2B, 0x30, 0x34, 0x3E, 0x2D, 0x34, 0x0A, 0x00, 0x69, 0x7D, 0x35, 0x01, 0x67, 0x4B, 0x2A, 0x00, +0x00, 0x00, 0x00, /* Iran */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x9A, 0x6C, 0x7D, 0xC8, +0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x9A, 0x6C, 0x7D, 0xC8, 0xBF, 0x00, 0xCC, 0x48, 0x0D, 0x94, 0x44, 0x38, 0x0E, 0xAD, 0x13, 0xB8, 0x0F, 0x79, 0x73, 0x40, 0x10, 0x28, 0xCA, 0xC0, 0x10, 0xED, 0x3A, 0x40, 0x11, 0xAD, 0xBC, 0x48, 0x12, 0x45, 0x4A, 0xB8, 0x13, 0x37, 0xEC, 0xC8, 0x14, 0x2D, 0x15, 0xB8, 0x28, 0x20, 0x76, 0xC8, 0x28, 0xDB, 0x9D, 0xB8, @@ -63773,66 +63920,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0xEF, 0x08, 0x48, 0x57, 0xE1, 0x8E, 0x38, 0x58, 0xD1, 0x8D, 0x48, 0x59, 0xC4, 0x13, 0x38, 0x5A, 0xB2, 0xC0, 0xC8, 0x5B, 0xA5, 0x46, 0xB8, 0x5C, 0x93, 0xF4, 0x48, 0x5D, 0x86, 0x7A, 0x38, 0x5E, 0x75, 0x27, 0xC8, 0x5F, 0x67, 0xAD, 0xB8, 0x60, 0x57, 0xAC, 0xC8, 0x61, 0x4A, 0x32, 0xB8, -0x62, 0x38, 0xE0, 0x48, 0x63, 0x2B, 0x66, 0x38, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x05, -0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x00, 0x04, -0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x46, 0x50, -0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, -0x31, 0x38, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x33, -0x30, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, -0x9A, 0x6C, 0x7D, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x00, -0x0D, 0x94, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xAD, 0x13, 0xB8, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x79, 0x73, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x28, 0xCA, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x10, 0xED, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11, 0xAD, 0xBC, 0x48, 0x00, 0x00, 0x00, 0x00, -0x12, 0x45, 0x4A, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x13, 0x37, 0xEC, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x14, 0x2D, 0x15, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x28, 0x20, 0x76, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x28, 0xDB, 0x9D, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x29, 0xCB, 0x9C, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xBE, 0x22, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xAC, 0xD0, 0x48, 0x00, 0x00, 0x00, 0x00, -0x2C, 0x9F, 0x56, 0x38, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8E, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x2E, 0x80, 0x89, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x6F, 0x37, 0x48, 0x00, 0x00, 0x00, 0x00, -0x30, 0x61, 0xBD, 0x38, 0x00, 0x00, 0x00, 0x00, 0x31, 0x50, 0x6A, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x32, 0x42, 0xF0, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x33, 0x32, 0xEF, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x34, 0x25, 0x75, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x35, 0x14, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, -0x36, 0x06, 0xA9, 0x38, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF5, 0x56, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x37, 0xE7, 0xDC, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD6, 0x8A, 0x48, 0x00, 0x00, 0x00, 0x00, -0x39, 0xC9, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xB9, 0x0F, 0x48, 0x00, 0x00, 0x00, 0x00, -0x3B, 0xAB, 0x95, 0x38, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x9A, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x3D, 0x8C, 0xC8, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7B, 0x76, 0x48, 0x00, 0x00, 0x00, 0x00, -0x3F, 0x6D, 0xFC, 0x38, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5C, 0xA9, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x41, 0x4F, 0x2F, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3F, 0x2E, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x43, 0x31, 0xB4, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x47, 0xE2, 0xC9, 0x48, 0x00, 0x00, 0x00, 0x00, -0x48, 0xD5, 0x4F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x49, 0xC5, 0x4E, 0x48, 0x00, 0x00, 0x00, 0x00, -0x4A, 0xB7, 0xD4, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xA6, 0x81, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x4C, 0x99, 0x07, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x87, 0xB5, 0x48, 0x00, 0x00, 0x00, 0x00, -0x4E, 0x7A, 0x3B, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x68, 0xE8, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x50, 0x5B, 0x6E, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x51, 0x4B, 0x6D, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x52, 0x3D, 0xF3, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x53, 0x2C, 0xA1, 0x48, 0x00, 0x00, 0x00, 0x00, -0x54, 0x1F, 0x27, 0x38, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0D, 0xD4, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x56, 0x00, 0x5A, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x56, 0xEF, 0x08, 0x48, 0x00, 0x00, 0x00, 0x00, -0x57, 0xE1, 0x8E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x58, 0xD1, 0x8D, 0x48, 0x00, 0x00, 0x00, 0x00, -0x59, 0xC4, 0x13, 0x38, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xB2, 0xC0, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x5B, 0xA5, 0x46, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x93, 0xF4, 0x48, 0x00, 0x00, 0x00, 0x00, -0x5D, 0x86, 0x7A, 0x38, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x75, 0x27, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x5F, 0x67, 0xAD, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x60, 0x57, 0xAC, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x61, 0x4A, 0x32, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x62, 0x38, 0xE0, 0x48, 0x00, 0x00, 0x00, 0x00, -0x63, 0x2B, 0x66, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x05, -0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x62, 0x38, 0xE0, 0x48, 0x63, 0x2B, 0x66, 0x38, 0x01, 0x03, 0x02, 0x05, 0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x03, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x00, 0x04, -0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x46, 0x50, -0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, -0x31, 0x38, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x33, -0x30, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, -0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x3E, 0x2D, 0x33, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, +0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x48, 0x01, +0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, 0x46, 0x50, 0x01, 0x14, 0x00, 0x00, 0x38, +0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x4C, +0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x34, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x33, +0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, +0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x6C, 0x7D, 0xC8, 0xFF, +0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x94, 0x44, 0x38, 0x00, +0x00, 0x00, 0x00, 0x0E, 0xAD, 0x13, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x79, 0x73, 0x40, 0x00, +0x00, 0x00, 0x00, 0x10, 0x28, 0xCA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xED, 0x3A, 0x40, 0x00, +0x00, 0x00, 0x00, 0x11, 0xAD, 0xBC, 0x48, 0x00, 0x00, 0x00, 0x00, 0x12, 0x45, 0x4A, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x13, 0x37, 0xEC, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x14, 0x2D, 0x15, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x28, 0x20, 0x76, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x28, 0xDB, 0x9D, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x29, 0xCB, 0x9C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xBE, 0x22, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x2B, 0xAC, 0xD0, 0x48, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x9F, 0x56, 0x38, 0x00, +0x00, 0x00, 0x00, 0x2D, 0x8E, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x80, 0x89, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x6F, 0x37, 0x48, 0x00, 0x00, 0x00, 0x00, 0x30, 0x61, 0xBD, 0x38, 0x00, +0x00, 0x00, 0x00, 0x31, 0x50, 0x6A, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x32, 0x42, 0xF0, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x33, 0x32, 0xEF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x34, 0x25, 0x75, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x35, 0x14, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, 0x36, 0x06, 0xA9, 0x38, 0x00, +0x00, 0x00, 0x00, 0x36, 0xF5, 0x56, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x37, 0xE7, 0xDC, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x38, 0xD6, 0x8A, 0x48, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC9, 0x10, 0x38, 0x00, +0x00, 0x00, 0x00, 0x3A, 0xB9, 0x0F, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xAB, 0x95, 0x38, 0x00, +0x00, 0x00, 0x00, 0x3C, 0x9A, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x8C, 0xC8, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x3E, 0x7B, 0x76, 0x48, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x6D, 0xFC, 0x38, 0x00, +0x00, 0x00, 0x00, 0x40, 0x5C, 0xA9, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x41, 0x4F, 0x2F, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x42, 0x3F, 0x2E, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x43, 0x31, 0xB4, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x47, 0xE2, 0xC9, 0x48, 0x00, 0x00, 0x00, 0x00, 0x48, 0xD5, 0x4F, 0x38, 0x00, +0x00, 0x00, 0x00, 0x49, 0xC5, 0x4E, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xB7, 0xD4, 0x38, 0x00, +0x00, 0x00, 0x00, 0x4B, 0xA6, 0x81, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x99, 0x07, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x4D, 0x87, 0xB5, 0x48, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7A, 0x3B, 0x38, 0x00, +0x00, 0x00, 0x00, 0x4F, 0x68, 0xE8, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x50, 0x5B, 0x6E, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x51, 0x4B, 0x6D, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x52, 0x3D, 0xF3, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x53, 0x2C, 0xA1, 0x48, 0x00, 0x00, 0x00, 0x00, 0x54, 0x1F, 0x27, 0x38, 0x00, +0x00, 0x00, 0x00, 0x55, 0x0D, 0xD4, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x5A, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x56, 0xEF, 0x08, 0x48, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE1, 0x8E, 0x38, 0x00, +0x00, 0x00, 0x00, 0x58, 0xD1, 0x8D, 0x48, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC4, 0x13, 0x38, 0x00, +0x00, 0x00, 0x00, 0x5A, 0xB2, 0xC0, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xA5, 0x46, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x5C, 0x93, 0xF4, 0x48, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x86, 0x7A, 0x38, 0x00, +0x00, 0x00, 0x00, 0x5E, 0x75, 0x27, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x67, 0xAD, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x60, 0x57, 0xAC, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x61, 0x4A, 0x32, 0xB8, 0x00, +0x00, 0x00, 0x00, 0x62, 0x38, 0xE0, 0x48, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2B, 0x66, 0x38, 0x01, +0x03, 0x02, 0x05, 0x04, 0x05, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x00, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x30, 0x38, +0x00, 0x04, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, 0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x00, 0x00, +0x46, 0x50, 0x01, 0x14, 0x00, 0x00, 0x38, 0x40, 0x00, 0x18, 0x00, 0x00, 0x3F, 0x48, 0x01, 0x08, +0x00, 0x00, 0x31, 0x38, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x54, 0x4D, 0x54, 0x00, 0x2B, 0x30, +0x34, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x35, 0x00, 0x2B, 0x30, +0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x33, 0x30, 0x3E, 0x2D, 0x33, 0x3A, 0x33, 0x30, 0x0A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Israel */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -64046,25 +64192,24 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Kwajalein */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0xC1, 0xED, 0x35, 0xD0, 0xC9, 0xEA, 0x0A, 0x60, 0xCF, 0x46, 0x81, 0xF0, 0xFF, 0x86, 0x1B, 0x50, -0x2C, 0x76, 0x0E, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x05, 0x00, -0x00, 0x9C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, -0xC0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x2C, 0x76, 0x0E, 0x40, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x00, 0x00, 0x9C, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x0C, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x14, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2D, 0x31, +0x32, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x18, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xCF, 0x46, 0x81, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2C, 0x76, 0x0E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x03, 0x01, 0x04, 0x05, 0x05, 0x00, 0x00, 0x9C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, -0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0xFF, 0xFF, -0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, -0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2B, 0x31, -0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x18, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, +0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x46, +0x81, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x76, +0x0E, 0x40, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x00, 0x00, 0x9C, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, +0xFF, 0xFF, 0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, +0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2D, 0x31, 0x32, 0x00, +0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Libya */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -64397,7 +64542,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Mexico/BajaSur */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0xCB, 0xEA, 0x71, 0x60, 0xD8, 0x91, 0xB4, 0xF0, 0x00, 0x00, 0x70, 0x80, 0x31, 0x67, 0x84, 0x10, 0x32, 0x73, 0x16, 0x80, 0x33, 0x47, 0x66, 0x10, 0x34, 0x52, 0xF8, 0x80, @@ -64413,92 +64558,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x57, 0x00, 0xDB, 0x90, 0x58, 0x15, 0xA8, 0x80, 0x58, 0xE0, 0xBD, 0x90, 0x59, 0xF5, 0x8A, 0x80, 0x5A, 0xC0, 0x9F, 0x90, 0x5B, 0xD5, 0x6C, 0x80, 0x5C, 0xA9, 0xBC, 0x10, 0x5D, 0xB5, 0x4E, 0x80, 0x5E, 0x89, 0x9E, 0x10, 0x5F, 0x95, 0x30, 0x80, 0x60, 0x69, 0x80, 0x10, 0x61, 0x7E, 0x4D, 0x00, -0x62, 0x49, 0x62, 0x10, 0x63, 0x5E, 0x2F, 0x00, 0x64, 0x29, 0x44, 0x10, 0x65, 0x3E, 0x11, 0x00, -0x66, 0x12, 0x60, 0x90, 0x67, 0x1D, 0xF3, 0x00, 0x67, 0xF2, 0x42, 0x90, 0x68, 0xFD, 0xD5, 0x00, -0x69, 0xD2, 0x24, 0x90, 0x6A, 0xDD, 0xB7, 0x00, 0x6B, 0xB2, 0x06, 0x90, 0x6C, 0xC6, 0xD3, 0x80, -0x6D, 0x91, 0xE8, 0x90, 0x6E, 0xA6, 0xB5, 0x80, 0x6F, 0x71, 0xCA, 0x90, 0x70, 0x86, 0x97, 0x80, -0x71, 0x5A, 0xE7, 0x10, 0x72, 0x66, 0x79, 0x80, 0x73, 0x3A, 0xC9, 0x10, 0x74, 0x46, 0x5B, 0x80, -0x75, 0x1A, 0xAB, 0x10, 0x76, 0x2F, 0x78, 0x00, 0x76, 0xFA, 0x8D, 0x10, 0x78, 0x0F, 0x5A, 0x00, -0x78, 0xDA, 0x6F, 0x10, 0x79, 0xEF, 0x3C, 0x00, 0x7A, 0xBA, 0x51, 0x10, 0x7B, 0xCF, 0x1E, 0x00, -0x7C, 0xA3, 0x6D, 0x90, 0x7D, 0xAF, 0x00, 0x00, 0x7E, 0x83, 0x4F, 0x90, 0x7F, 0x8E, 0xE2, 0x00, -0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x62, 0x49, 0x62, 0x10, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, -0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, -0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, -0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, -0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x00, 0x00, -0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, -0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x71, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, -0x00, 0x31, 0x67, 0x84, 0x10, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, 0x00, 0x00, -0x00, 0x33, 0x47, 0x66, 0x10, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, -0x00, 0x35, 0x27, 0x48, 0x10, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, -0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, -0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, -0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, -0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, -0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, -0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, -0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, -0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, -0x00, 0x51, 0x61, 0x35, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, -0x00, 0x53, 0x41, 0x17, 0x90, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, -0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, -0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, -0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, -0x00, 0x60, 0x69, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, -0x00, 0x62, 0x49, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x64, 0x29, 0x44, 0x10, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x11, 0x00, 0x00, 0x00, 0x00, -0x00, 0x66, 0x12, 0x60, 0x90, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xF3, 0x00, 0x00, 0x00, 0x00, -0x00, 0x67, 0xF2, 0x42, 0x90, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xD5, 0x00, 0x00, 0x00, 0x00, -0x00, 0x69, 0xD2, 0x24, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xB7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x6B, 0xB2, 0x06, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xD3, 0x80, 0x00, 0x00, 0x00, -0x00, 0x6D, 0x91, 0xE8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xB5, 0x80, 0x00, 0x00, 0x00, -0x00, 0x6F, 0x71, 0xCA, 0x90, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x97, 0x80, 0x00, 0x00, 0x00, -0x00, 0x71, 0x5A, 0xE7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x79, 0x80, 0x00, 0x00, 0x00, -0x00, 0x73, 0x3A, 0xC9, 0x10, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x5B, 0x80, 0x00, 0x00, 0x00, -0x00, 0x75, 0x1A, 0xAB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x78, 0x00, 0x00, 0x00, 0x00, -0x00, 0x76, 0xFA, 0x8D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x5A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x78, 0xDA, 0x6F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x3C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7A, 0xBA, 0x51, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x1E, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7C, 0xA3, 0x6D, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x7E, 0x83, 0x4F, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xE2, 0x00, 0x01, 0x02, 0x04, -0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, +0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, +0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x00, +0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, +0x00, 0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, +0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, +0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, +0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, +0xFF, 0xFF, 0xFF, 0xCB, 0xEA, 0x71, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x91, 0xB4, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x84, 0x10, 0x00, +0x00, 0x00, 0x00, 0x32, 0x73, 0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x66, 0x10, 0x00, +0x00, 0x00, 0x00, 0x34, 0x52, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x48, 0x10, 0x00, +0x00, 0x00, 0x00, 0x36, 0x32, 0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x2A, 0x10, 0x00, +0x00, 0x00, 0x00, 0x38, 0x1B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE7, 0x0C, 0x10, 0x00, +0x00, 0x00, 0x00, 0x39, 0xFB, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x12, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3B, 0xB6, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xB0, 0x0A, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3D, 0xBB, 0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xEC, 0x90, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x9B, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xCE, 0x90, 0x00, +0x00, 0x00, 0x00, 0x41, 0x84, 0x9B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xB0, 0x90, 0x00, +0x00, 0x00, 0x00, 0x43, 0x64, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x92, 0x90, 0x00, +0x00, 0x00, 0x00, 0x45, 0x44, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x74, 0x90, 0x00, +0x00, 0x00, 0x00, 0x47, 0x24, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x91, 0x10, 0x00, +0x00, 0x00, 0x00, 0x49, 0x04, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x73, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xE4, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x55, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xCD, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x37, 0x10, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x19, 0x10, 0x00, +0x00, 0x00, 0x00, 0x50, 0x8C, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x35, 0x90, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6C, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x17, 0x90, 0x00, +0x00, 0x00, 0x00, 0x54, 0x4C, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xF9, 0x90, 0x00, +0x00, 0x00, 0x00, 0x56, 0x2C, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xDB, 0x90, 0x00, +0x00, 0x00, 0x00, 0x58, 0x15, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xBD, 0x90, 0x00, +0x00, 0x00, 0x00, 0x59, 0xF5, 0x8A, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x9F, 0x90, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xD5, 0x6C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xBC, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xB5, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x9E, 0x10, 0x00, +0x00, 0x00, 0x00, 0x5F, 0x95, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x80, 0x10, 0x00, +0x00, 0x00, 0x00, 0x61, 0x7E, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x62, 0x10, 0x00, +0x00, 0x00, 0x00, 0x63, 0x5E, 0x2F, 0x00, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x04, 0x05, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, -0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, -0x4D, 0x44, 0x54, 0x00, 0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x4D, 0x44, 0x54, 0x2C, 0x4D, -0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0xFF, 0x9C, 0x3C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, +0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x10, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, +0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, +0x50, 0x53, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0x4D, 0x53, 0x54, 0x37, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, /* Mexico/General */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xA5, 0xB6, 0xE8, 0x70, 0xAF, 0xF2, 0x6E, 0xE0, 0xB6, 0x66, 0x56, 0x60, 0xB7, 0x43, 0xD2, 0x60, 0xB8, 0x0C, 0x36, 0x60, 0xB8, 0xFD, 0x86, 0xF0, 0xC5, 0xDE, 0xB0, 0x60, 0xC6, 0x97, 0x34, 0x50, 0xC9, 0x55, 0xF1, 0xE0, 0xC9, 0xEA, 0xDD, 0x50, 0xCF, 0x02, 0xC6, 0xE0, 0xCF, 0xB7, 0x56, 0x50, 0xDA, 0x99, 0x15, 0xE0, @@ -64515,92 +64633,65 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0x2C, 0x7D, 0xF0, 0x57, 0x00, 0xCD, 0x80, 0x58, 0x15, 0x9A, 0x70, 0x58, 0xE0, 0xAF, 0x80, 0x59, 0xF5, 0x7C, 0x70, 0x5A, 0xC0, 0x91, 0x80, 0x5B, 0xD5, 0x5E, 0x70, 0x5C, 0xA9, 0xAE, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x5E, 0x89, 0x90, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x60, 0x69, 0x72, 0x00, -0x61, 0x7E, 0x3E, 0xF0, 0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x64, 0x29, 0x36, 0x00, -0x65, 0x3E, 0x02, 0xF0, 0x66, 0x12, 0x52, 0x80, 0x67, 0x1D, 0xE4, 0xF0, 0x67, 0xF2, 0x34, 0x80, -0x68, 0xFD, 0xC6, 0xF0, 0x69, 0xD2, 0x16, 0x80, 0x6A, 0xDD, 0xA8, 0xF0, 0x6B, 0xB1, 0xF8, 0x80, -0x6C, 0xC6, 0xC5, 0x70, 0x6D, 0x91, 0xDA, 0x80, 0x6E, 0xA6, 0xA7, 0x70, 0x6F, 0x71, 0xBC, 0x80, -0x70, 0x86, 0x89, 0x70, 0x71, 0x5A, 0xD9, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x73, 0x3A, 0xBB, 0x00, -0x74, 0x46, 0x4D, 0x70, 0x75, 0x1A, 0x9D, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x76, 0xFA, 0x7F, 0x00, -0x78, 0x0F, 0x4B, 0xF0, 0x78, 0xDA, 0x61, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x7A, 0xBA, 0x43, 0x00, -0x7B, 0xCF, 0x0F, 0xF0, 0x7C, 0xA3, 0x5F, 0x80, 0x7D, 0xAE, 0xF1, 0xF0, 0x7E, 0x83, 0x41, 0x80, -0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x06, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, +0x61, 0x7E, 0x3E, 0xF0, 0x62, 0x49, 0x54, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, +0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x06, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, -0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, -0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, -0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x00, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x62, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, -0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, -0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, -0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xDE, -0xB0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x97, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x55, -0xF1, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0xDD, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x02, -0xC6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xB7, 0x56, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x99, -0x15, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0x76, 0x83, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, -0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, -0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, -0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, -0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, -0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, -0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, -0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, -0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, -0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, -0x84, 0x80, 0x00, 0x00, 0x00, 0x00, 0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, -0x66, 0x80, 0x00, 0x00, 0x00, 0x00, 0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, -0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, -0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, -0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, -0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, -0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, -0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, -0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, -0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, -0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, -0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, -0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, -0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, -0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, -0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, -0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x5E, 0x20, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x29, -0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x3E, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, -0x52, 0x80, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1D, 0xE4, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF2, -0x34, 0x80, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFD, 0xC6, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD2, -0x16, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xDD, 0xA8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, -0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xC6, 0xC5, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, -0xDA, 0x80, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xA6, 0xA7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x71, -0xBC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x86, 0x89, 0x70, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, -0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x66, 0x6B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, -0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x46, 0x4D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, -0x9D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x2F, 0x69, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, -0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x4B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, -0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xEF, 0x2D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xBA, -0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xCF, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, -0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xAE, 0xF1, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x83, -0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8E, 0xD3, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, -0x05, 0x02, 0x05, 0x02, 0x06, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, +0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, +0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, +0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, +0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, +0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0xB6, 0xE8, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, +0xAF, 0xF2, 0x6E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0x66, 0x56, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xB7, 0x43, 0xD2, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x0C, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xB8, 0xFD, 0x86, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0xDE, 0xB0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xC6, 0x97, 0x34, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x55, 0xF1, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, +0xC9, 0xEA, 0xDD, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x02, 0xC6, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, +0xCF, 0xB7, 0x56, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x99, 0x15, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, +0xDB, 0x76, 0x83, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x31, 0x67, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, +0x32, 0x73, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x33, 0x47, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, +0x34, 0x52, 0xEA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x35, 0x27, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x36, 0x32, 0xCC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x37, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x38, 0x1B, 0xE8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, +0x39, 0xFB, 0xCA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF5, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, +0x3B, 0xB6, 0xC2, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xAF, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, +0x3D, 0xBB, 0x8E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x8F, 0xDE, 0x80, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x9B, 0x70, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, +0x41, 0x84, 0x8D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, +0x43, 0x64, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x44, 0x2F, 0x84, 0x80, 0x00, 0x00, 0x00, 0x00, +0x45, 0x44, 0x51, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0F, 0x66, 0x80, 0x00, 0x00, 0x00, 0x00, +0x47, 0x24, 0x33, 0x70, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF8, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, +0x49, 0x04, 0x15, 0x70, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD8, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4A, 0xE3, 0xF7, 0x70, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4C, 0xCD, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x98, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, +0x4E, 0xAC, 0xF5, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x78, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, +0x50, 0x8C, 0xD7, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x61, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, +0x52, 0x6C, 0xB9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x41, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, +0x54, 0x4C, 0x9B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x20, 0xEB, 0x80, 0x00, 0x00, 0x00, 0x00, +0x56, 0x2C, 0x7D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0xCD, 0x80, 0x00, 0x00, 0x00, 0x00, +0x58, 0x15, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x58, 0xE0, 0xAF, 0x80, 0x00, 0x00, 0x00, 0x00, +0x59, 0xF5, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xC0, 0x91, 0x80, 0x00, 0x00, 0x00, 0x00, +0x5B, 0xD5, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, +0x5D, 0xB5, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, +0x5F, 0x95, 0x22, 0x70, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, +0x61, 0x7E, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, +0x63, 0x5E, 0x20, 0xF0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x02, 0x05, 0x02, 0x05, 0x02, 0x06, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, -0x00, 0x00, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, -0xAB, 0xA0, 0x01, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x4D, 0x53, 0x54, 0x00, 0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, -0x43, 0x57, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0A, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x2C, 0x4D, 0x34, 0x2E, -0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x35, 0x2E, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0xA3, 0x0C, 0x00, 0x00, 0xFF, 0xFF, +0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x0C, +0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0xFF, 0xFF, 0xB9, 0xB0, +0x01, 0x14, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x4D, 0x53, 0x54, 0x00, +0x43, 0x53, 0x54, 0x00, 0x4D, 0x44, 0x54, 0x00, 0x43, 0x44, 0x54, 0x00, 0x43, 0x57, 0x54, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x43, 0x53, 0x54, 0x36, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* MST */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -65076,7 +65167,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* NZ-CHAT */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x00, 0xD2, 0xDA, 0x96, 0xBC, 0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, @@ -65109,7 +65200,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, @@ -65117,136 +65208,134 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0xAB, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, -0x00, 0x04, 0x00, 0x00, 0xC1, 0x5C, 0x01, 0x0A, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, -0xB3, 0x4C, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, -0x33, 0x34, 0x35, 0x00, 0x2B, 0x31, 0x32, 0x34, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, -0xB7, 0x44, 0x84, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xDA, 0x96, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x09, -0x18, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, -0xEF, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, -0xD8, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, -0xB8, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x5E, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, -0x98, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3E, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, -0x78, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1E, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, -0x58, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, -0x38, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE7, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, -0x21, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC7, 0x65, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, -0x01, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x47, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, -0xE1, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x87, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, -0xC0, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x67, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, -0xA0, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, -0x80, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x30, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, -0x69, 0xCE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0F, 0xEB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, -0x2E, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x02, 0x42, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, -0x0D, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xE2, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, -0xED, 0xC5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xCD, 0xA7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xAB, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, -0xAD, 0x89, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, -0x8D, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x6A, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, -0x6D, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x4A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, -0x56, 0x69, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x2A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, -0x36, 0x4B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, -0x16, 0x2D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF3, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x37, -0xF6, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x8B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, -0xD5, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xB3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xBF, 0x0E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x93, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, -0x9E, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x73, 0x31, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x7E, 0xD2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5C, 0x4E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, -0x5E, 0xB4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, -0x3E, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, -0x1E, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, -0xFE, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF7, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x48, -0xDE, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD7, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, -0xBE, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB7, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, -0x9E, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, -0x7D, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, -0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, -0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, -0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, -0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, -0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, -0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, -0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, -0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, -0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, -0x4F, 0x2B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, -0x2F, 0x0D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, -0x0E, 0xEF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x55, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, -0xF8, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, -0xD7, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, -0xB7, 0xCF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, -0x97, 0xB1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, -0x77, 0x93, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, -0x60, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, -0x40, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, -0x20, 0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, -0x00, 0x56, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x77, -0xE0, 0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, -0xC0, 0x1A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, -0xA9, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, -0x89, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, -0x68, 0xFA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0xAB, -0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, 0x00, 0x04, 0x00, 0x00, 0xC1, 0x5C, 0x01, 0x0A, 0x00, -0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x00, 0x2B, 0x31, 0x32, 0x34, 0x35, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x34, 0x35, 0x3E, 0x2D, 0x31, -0x32, 0x3A, 0x34, 0x35, 0x3C, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x32, 0x3A, 0x34, 0x35, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x33, -0x3A, 0x34, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x02, 0x00, 0x00, 0xAB, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, 0x00, 0x04, 0x00, 0x00, 0xC1, +0x5C, 0x01, 0x0A, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x00, 0x2B, +0x31, 0x32, 0x34, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, +0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xB7, 0x44, 0x84, 0xFF, 0xFF, +0xFF, 0xFF, 0xD2, 0xDA, 0x96, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x09, 0x18, 0xFD, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xEF, 0xA5, 0x60, 0x00, 0x00, +0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8, 0xC1, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB8, 0xA3, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x0F, 0x5E, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x98, 0x85, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x11, 0x3E, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x78, 0x67, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x13, 0x1E, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x58, 0x49, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x38, 0x2B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x16, 0xE7, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0x21, 0x48, 0x60, 0x00, 0x00, +0x00, 0x00, 0x18, 0xC7, 0x65, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x2A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x1A, 0xA7, 0x47, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0x0C, 0x60, 0x00, 0x00, +0x00, 0x00, 0x1C, 0x87, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC0, 0xEE, 0x60, 0x00, 0x00, +0x00, 0x00, 0x1E, 0x67, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0xD0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x20, 0x46, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0xB2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x22, 0x30, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x69, 0xCE, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x24, 0x0F, 0xEB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x2E, 0x01, 0x60, 0x00, 0x00, +0x00, 0x00, 0x26, 0x02, 0x42, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x0D, 0xE3, 0x60, 0x00, 0x00, +0x00, 0x00, 0x27, 0xE2, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xED, 0xC5, 0x60, 0x00, 0x00, +0x00, 0x00, 0x29, 0xC2, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCD, 0xA7, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2B, 0xAB, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAD, 0x89, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2D, 0x8B, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8D, 0x6B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2F, 0x6A, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6D, 0x4D, 0x60, 0x00, 0x00, +0x00, 0x00, 0x31, 0x4A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x56, 0x69, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x33, 0x2A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x36, 0x4B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x35, 0x0A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x16, 0x2D, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x36, 0xF3, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0x0F, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x38, 0xD3, 0x8B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD5, 0xF1, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xB3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0x0E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3C, 0x93, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x9E, 0xF0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x73, 0x31, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7E, 0xD2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x40, 0x5C, 0x4E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x5E, 0xB4, 0x60, 0x00, 0x00, +0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3E, 0x96, 0x60, 0x00, 0x00, +0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1E, 0x78, 0x60, 0x00, 0x00, +0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFE, 0x5A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x47, 0xF7, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xDE, 0x3C, 0x60, 0x00, 0x00, +0x00, 0x00, 0x49, 0xD7, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xBE, 0x1E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4B, 0xB7, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x9E, 0x00, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, 0xE2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, +0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, +0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, +0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x4F, 0x2B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, 0x0D, 0x60, 0x00, 0x00, +0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0E, 0xEF, 0x60, 0x00, 0x00, +0x00, 0x00, 0x66, 0x11, 0x55, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0xF8, 0x0B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, 0xD7, 0xED, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xB7, 0xCF, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x97, 0xB1, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x77, 0x93, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0xB0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x40, 0x92, 0x60, 0x00, 0x00, +0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x20, 0x74, 0x60, 0x00, 0x00, +0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x56, 0x60, 0x00, 0x00, +0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE0, 0x38, 0x60, 0x00, 0x00, +0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC0, 0x1A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xA9, 0x36, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x89, 0x18, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x68, 0xFA, 0xE0, 0x01, 0x04, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, +0x00, 0xAB, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, 0x00, 0x04, 0x00, 0x00, 0xC1, 0x5C, 0x01, +0x0A, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x00, 0x2B, 0x31, 0x32, +0x34, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x34, 0x35, 0x3E, +0x2D, 0x31, 0x32, 0x3A, 0x34, 0x35, 0x3C, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x3E, 0x2C, 0x4D, 0x39, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x32, 0x3A, 0x34, 0x35, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, +0x2F, 0x33, 0x3A, 0x34, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, /* Pacific/Apia */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x57, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0x80, 0x00, 0x00, 0x00, 0x91, 0x05, 0xFC, 0x00, 0xDA, 0x62, 0x04, 0x38, 0x4C, 0x9F, 0x27, 0xB0, 0x4D, 0x97, 0x2B, 0xE0, 0x4E, 0x7D, 0xE2, 0x60, 0x4E, 0xFD, 0x8B, 0xA0, 0x4F, 0x77, 0x0D, 0xE0, 0x50, 0x66, 0xFE, 0xE0, 0x51, 0x60, 0x2A, 0x60, 0x52, 0x46, 0xE0, 0xE0, 0x53, 0x40, 0x0C, 0x60, 0x54, 0x26, 0xC2, 0xE0, 0x55, 0x1F, 0xEE, 0x60, 0x56, 0x06, 0xA4, 0xE0, 0x56, 0xFF, 0xD0, 0x60, 0x57, 0xE6, 0x86, 0xE0, 0x58, 0xDF, 0xB2, 0x60, 0x59, 0xC6, 0x68, 0xE0, 0x5A, 0xBF, 0x94, 0x60, 0x5B, 0xAF, 0x85, 0x60, 0x5C, 0xA8, 0xB0, 0xE0, 0x5D, 0x8F, 0x67, 0x60, 0x5E, 0x88, 0x92, 0xE0, 0x5F, 0x6F, 0x49, 0x60, -0x60, 0x68, 0x74, 0xE0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, 0xFF, 0x65, 0x50, 0x00, -0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x16, 0x4C, 0x4D, 0x54, -0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, -0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x07, 0x00, -0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xFF, 0xFF, 0x6E, 0x3D, 0xC9, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, -0x05, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x62, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4C, -0x9F, 0x27, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, -0x7D, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFD, 0x8B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4F, -0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, -0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, -0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, -0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, -0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, -0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, -0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, -0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, -0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, -0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, -0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x00, -0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, 0xFF, -0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x16, -0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x31, -0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, -0x2D, 0x31, 0x33, 0x0A, 0x00, 0x74, 0x38, 0x9A, 0x00, 0x0C, 0x9D, 0x2A, 0x00, 0x00, 0x00, 0x00, - +0x60, 0x68, 0x74, 0xE0, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, +0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, +0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, +0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, +0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, +0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, +0xFF, 0xFF, 0x6E, 0x3D, 0xC9, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x05, 0xFC, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xDA, 0x62, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x9F, 0x27, 0xB0, 0x00, 0x00, +0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, 0xE2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4E, 0xFD, 0x8B, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, +0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, +0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, +0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x01, 0x02, +0x04, 0x03, 0x04, 0x03, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x00, 0x00, 0xB0, 0x80, 0x00, 0x00, 0xFF, 0xFF, +0x5F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x5E, 0x48, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x01, 0x0A, +0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x12, 0x00, 0x00, 0xC4, 0xE0, +0x01, 0x16, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, +0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, +0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x74, 0x38, 0x9A, 0x00, 0x0C, 0x9D, 0x2A, 0x00, 0x00, +0x00, 0x00, /* Pacific/Auckland */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -65408,28 +65497,27 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Pacific/Bougainville */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, -0xCC, 0x43, 0x36, 0x60, 0xD2, 0x2B, 0x6C, 0xF0, 0x54, 0x9E, 0xD7, 0x80, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x91, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0xCC, 0x43, 0x36, 0x60, 0xD2, 0x2B, 0x6C, 0xF0, 0x54, 0x9E, 0xD7, 0x80, 0x01, 0x02, 0x01, 0x03, +0x00, 0x00, 0x91, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x08, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x0C, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x52, -0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x43, 0x36, -0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x2B, 0x6C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x9E, 0xD7, -0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x04, 0x04, 0x00, -0x00, 0x91, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x09, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x11, 0x4C, 0x4D, 0x54, -0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, -0x31, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x7F, 0xD7, 0xDD, -0x02, 0x00, 0x08, 0xBA, 0x00, 0x00, 0x00, 0x0C, 0x42, 0x6F, 0x75, 0x67, 0x61, 0x69, 0x6E, 0x76, -0x69, 0x6C, 0x6C, 0x65, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x52, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, +0x72, 0xED, 0xA4, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x43, 0x36, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, +0xD2, 0x2B, 0x6C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x9E, 0xD7, 0x80, 0x01, 0x02, 0x03, 0x02, +0x04, 0x00, 0x00, 0x91, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, +0xA0, 0x00, 0x09, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0D, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x11, 0x4C, +0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x7F, +0xD7, 0xDD, 0x02, 0x00, 0x08, 0xBA, 0x00, 0x00, 0x00, 0x0C, 0x42, 0x6F, 0x75, 0x67, 0x61, 0x69, +0x6E, 0x76, 0x69, 0x6C, 0x6C, 0x65, /* Pacific/Chatham */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x80, 0x00, 0x00, 0x00, 0xD2, 0xDA, 0x96, 0xBC, 0x09, 0x18, 0xFD, 0xE0, 0x09, 0xAC, 0xA5, 0xE0, 0x0A, 0xEF, 0xA5, 0x60, 0x0B, 0x9E, 0xFC, 0xE0, 0x0C, 0xD8, 0xC1, 0xE0, 0x0D, 0x7E, 0xDE, 0xE0, 0x0E, 0xB8, 0xA3, 0xE0, 0x0F, 0x5E, 0xC0, 0xE0, 0x10, 0x98, 0x85, 0xE0, 0x11, 0x3E, 0xA2, 0xE0, 0x12, 0x78, 0x67, 0xE0, @@ -65462,7 +65550,7 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x75, 0x19, 0x9F, 0xE0, 0x76, 0x00, 0x56, 0x60, 0x76, 0xF9, 0x81, 0xE0, 0x77, 0xE0, 0x38, 0x60, 0x78, 0xD9, 0x63, 0xE0, 0x79, 0xC0, 0x1A, 0x60, 0x7A, 0xB9, 0x45, 0xE0, 0x7B, 0xA9, 0x36, 0xE0, 0x7C, 0xA2, 0x62, 0x60, 0x7D, 0x89, 0x18, 0xE0, 0x7E, 0x82, 0x44, 0x60, 0x7F, 0x68, 0xFA, 0xE0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, @@ -65470,120 +65558,119 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0xAB, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, -0x00, 0x04, 0x00, 0x00, 0xC1, 0x5C, 0x01, 0x0A, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, -0xB3, 0x4C, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, -0x33, 0x34, 0x35, 0x00, 0x2B, 0x31, 0x32, 0x34, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, -0xB7, 0x44, 0x84, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xDA, 0x96, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x09, -0x18, 0xFD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, -0xEF, 0xA5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, -0xD8, 0xC1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, -0xB8, 0xA3, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x5E, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, -0x98, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3E, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, -0x78, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1E, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, -0x58, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, -0x38, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE7, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, -0x21, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC7, 0x65, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, -0x01, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA7, 0x47, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, -0xE1, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x87, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, -0xC0, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x67, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, -0xA0, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x46, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, -0x80, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x22, 0x30, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, -0x69, 0xCE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x0F, 0xEB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, -0x2E, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x26, 0x02, 0x42, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, -0x0D, 0xE3, 0x60, 0x00, 0x00, 0x00, 0x00, 0x27, 0xE2, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, -0xED, 0xC5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, -0xCD, 0xA7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xAB, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, -0xAD, 0x89, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, -0x8D, 0x6B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x6A, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, -0x6D, 0x4D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x31, 0x4A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, -0x56, 0x69, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x2A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, -0x36, 0x4B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, -0x16, 0x2D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xF3, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x37, -0xF6, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x8B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, -0xD5, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xB3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xBF, 0x0E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x93, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, -0x9E, 0xF0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x73, 0x31, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x7E, 0xD2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5C, 0x4E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, -0x5E, 0xB4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, -0x3E, 0x96, 0x60, 0x00, 0x00, 0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, -0x1E, 0x78, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, -0xFE, 0x5A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF7, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x48, -0xDE, 0x3C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD7, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, -0xBE, 0x1E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB7, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, -0x9E, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, -0x7D, 0xE2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, -0x66, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, -0x46, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, -0x26, 0xC2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, -0x06, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, -0xE6, 0x86, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, -0xC6, 0x68, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, -0xAF, 0x85, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, -0x8F, 0x67, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, -0x6F, 0x49, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, -0x4F, 0x2B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, -0x2F, 0x0D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, -0x0E, 0xEF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x55, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, -0xF8, 0x0B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, -0xD7, 0xED, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, -0xB7, 0xCF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, -0x97, 0xB1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, -0x77, 0x93, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, -0x60, 0xB0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, -0x40, 0x92, 0x60, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, -0x20, 0x74, 0x60, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, -0x00, 0x56, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x77, -0xE0, 0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, -0xC0, 0x1A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, -0xA9, 0x36, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, -0x89, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, -0x68, 0xFA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0x00, 0x00, 0xAB, -0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, 0x00, 0x04, 0x00, 0x00, 0xC1, 0x5C, 0x01, 0x0A, 0x00, -0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x00, 0x2B, 0x31, 0x32, 0x34, 0x35, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x34, 0x35, 0x3E, 0x2D, 0x31, -0x32, 0x3A, 0x34, 0x35, 0x3C, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x35, -0x2E, 0x30, 0x2F, 0x32, 0x3A, 0x34, 0x35, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x33, -0x3A, 0x34, 0x35, 0x0A, 0x00, 0x46, 0x44, 0x48, 0x00, 0x05, 0x43, 0xA7, 0x00, 0x00, 0x00, 0x0F, -0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6D, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x02, 0x00, 0x00, 0xAB, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, 0x00, 0x04, 0x00, 0x00, 0xC1, +0x5C, 0x01, 0x0A, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x00, 0x2B, +0x31, 0x32, 0x34, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, +0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xB7, 0x44, 0x84, 0xFF, 0xFF, +0xFF, 0xFF, 0xD2, 0xDA, 0x96, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x09, 0x18, 0xFD, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x09, 0xAC, 0xA5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xEF, 0xA5, 0x60, 0x00, 0x00, +0x00, 0x00, 0x0B, 0x9E, 0xFC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD8, 0xC1, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x0D, 0x7E, 0xDE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xB8, 0xA3, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x0F, 0x5E, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x98, 0x85, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x11, 0x3E, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x12, 0x78, 0x67, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x13, 0x1E, 0x84, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x14, 0x58, 0x49, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x14, 0xFE, 0x66, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x38, 0x2B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x16, 0xE7, 0x83, 0x60, 0x00, 0x00, 0x00, 0x00, 0x18, 0x21, 0x48, 0x60, 0x00, 0x00, +0x00, 0x00, 0x18, 0xC7, 0x65, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x01, 0x2A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x1A, 0xA7, 0x47, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE1, 0x0C, 0x60, 0x00, 0x00, +0x00, 0x00, 0x1C, 0x87, 0x29, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC0, 0xEE, 0x60, 0x00, 0x00, +0x00, 0x00, 0x1E, 0x67, 0x0B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA0, 0xD0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x20, 0x46, 0xED, 0x60, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0xB2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x22, 0x30, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x69, 0xCE, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x24, 0x0F, 0xEB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x2E, 0x01, 0x60, 0x00, 0x00, +0x00, 0x00, 0x26, 0x02, 0x42, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x0D, 0xE3, 0x60, 0x00, 0x00, +0x00, 0x00, 0x27, 0xE2, 0x24, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x28, 0xED, 0xC5, 0x60, 0x00, 0x00, +0x00, 0x00, 0x29, 0xC2, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xCD, 0xA7, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2B, 0xAB, 0x23, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xAD, 0x89, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2D, 0x8B, 0x05, 0x60, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x8D, 0x6B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x2F, 0x6A, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x30, 0x6D, 0x4D, 0x60, 0x00, 0x00, +0x00, 0x00, 0x31, 0x4A, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x32, 0x56, 0x69, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x33, 0x2A, 0xAB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x34, 0x36, 0x4B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x35, 0x0A, 0x8D, 0x60, 0x00, 0x00, 0x00, 0x00, 0x36, 0x16, 0x2D, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x36, 0xF3, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x37, 0xF6, 0x0F, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x38, 0xD3, 0x8B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xD5, 0xF1, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xB3, 0x6D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0x0E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3C, 0x93, 0x4F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x9E, 0xF0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x3E, 0x73, 0x31, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7E, 0xD2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x40, 0x5C, 0x4E, 0x60, 0x00, 0x00, 0x00, 0x00, 0x41, 0x5E, 0xB4, 0x60, 0x00, 0x00, +0x00, 0x00, 0x42, 0x3C, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3E, 0x96, 0x60, 0x00, 0x00, +0x00, 0x00, 0x44, 0x1C, 0x12, 0x60, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1E, 0x78, 0x60, 0x00, 0x00, +0x00, 0x00, 0x45, 0xFB, 0xF4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFE, 0x5A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x47, 0xF7, 0x85, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x48, 0xDE, 0x3C, 0x60, 0x00, 0x00, +0x00, 0x00, 0x49, 0xD7, 0x67, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xBE, 0x1E, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4B, 0xB7, 0x49, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x9E, 0x00, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4D, 0x97, 0x2B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x7D, 0xE2, 0x60, 0x00, 0x00, +0x00, 0x00, 0x4F, 0x77, 0x0D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x66, 0xFE, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x51, 0x60, 0x2A, 0x60, 0x00, 0x00, 0x00, 0x00, 0x52, 0x46, 0xE0, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x53, 0x40, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0x26, 0xC2, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x55, 0x1F, 0xEE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x06, 0xA4, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x56, 0xFF, 0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x57, 0xE6, 0x86, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x58, 0xDF, 0xB2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x59, 0xC6, 0x68, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x5A, 0xBF, 0x94, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xAF, 0x85, 0x60, 0x00, 0x00, +0x00, 0x00, 0x5C, 0xA8, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x8F, 0x67, 0x60, 0x00, 0x00, +0x00, 0x00, 0x5E, 0x88, 0x92, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x6F, 0x49, 0x60, 0x00, 0x00, +0x00, 0x00, 0x60, 0x68, 0x74, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x4F, 0x2B, 0x60, 0x00, 0x00, +0x00, 0x00, 0x62, 0x48, 0x56, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x2F, 0x0D, 0x60, 0x00, 0x00, +0x00, 0x00, 0x64, 0x28, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0E, 0xEF, 0x60, 0x00, 0x00, +0x00, 0x00, 0x66, 0x11, 0x55, 0x60, 0x00, 0x00, 0x00, 0x00, 0x66, 0xF8, 0x0B, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x67, 0xF1, 0x37, 0x60, 0x00, 0x00, 0x00, 0x00, 0x68, 0xD7, 0xED, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x69, 0xD1, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xB7, 0xCF, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x6B, 0xB0, 0xFB, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x97, 0xB1, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x6D, 0x90, 0xDD, 0x60, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x77, 0x93, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x6F, 0x70, 0xBF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0x60, 0xB0, 0x60, 0x00, 0x00, +0x00, 0x00, 0x71, 0x59, 0xDB, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x40, 0x92, 0x60, 0x00, 0x00, +0x00, 0x00, 0x73, 0x39, 0xBD, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x20, 0x74, 0x60, 0x00, 0x00, +0x00, 0x00, 0x75, 0x19, 0x9F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x56, 0x60, 0x00, 0x00, +0x00, 0x00, 0x76, 0xF9, 0x81, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE0, 0x38, 0x60, 0x00, 0x00, +0x00, 0x00, 0x78, 0xD9, 0x63, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC0, 0x1A, 0x60, 0x00, 0x00, +0x00, 0x00, 0x7A, 0xB9, 0x45, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xA9, 0x36, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x7C, 0xA2, 0x62, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x89, 0x18, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x7E, 0x82, 0x44, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x68, 0xFA, 0xE0, 0x01, 0x04, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x00, +0x00, 0xAB, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xAC, 0x44, 0x00, 0x04, 0x00, 0x00, 0xC1, 0x5C, 0x01, +0x0A, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x00, 0x00, 0xB3, 0x4C, 0x00, 0x10, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x31, 0x35, 0x00, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x00, 0x2B, 0x31, 0x32, +0x34, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x34, 0x35, 0x3E, +0x2D, 0x31, 0x32, 0x3A, 0x34, 0x35, 0x3C, 0x2B, 0x31, 0x33, 0x34, 0x35, 0x3E, 0x2C, 0x4D, 0x39, +0x2E, 0x35, 0x2E, 0x30, 0x2F, 0x32, 0x3A, 0x34, 0x35, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, +0x2F, 0x33, 0x3A, 0x34, 0x35, 0x0A, 0x00, 0x46, 0x44, 0x48, 0x00, 0x05, 0x43, 0xA7, 0x00, 0x00, +0x00, 0x0F, 0x43, 0x68, 0x61, 0x74, 0x68, 0x61, 0x6D, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, +0x73, /* Pacific/Chuuk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, 0x98, 0x11, 0xA3, 0xE0, 0xA0, 0x39, 0xF9, 0xF0, 0xC9, 0xEA, 0x0A, 0x60, 0xD2, 0x11, 0x0E, 0xF0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, -0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x01, 0x02, 0x01, 0x02, 0x01, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, +0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, -0xBF, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x26, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, -0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, -0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, 0x00, -0x00, 0x8E, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x94, 0xA5, -0x62, 0x01, 0xFA, 0x42, 0xDD, 0x00, 0x00, 0x00, 0x0F, 0x43, 0x68, 0x75, 0x75, 0x6B, 0x2F, 0x54, -0x72, 0x75, 0x6B, 0x2C, 0x20, 0x59, 0x61, 0x70, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, +0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xBF, 0x34, 0xFF, 0xFF, 0xFF, +0xFF, 0x7E, 0x36, 0x26, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, 0xA3, 0xE0, 0xFF, 0xFF, 0xFF, +0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, +0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, +0x00, 0x00, 0x00, 0x8E, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, +0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, +0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, +0x94, 0xA5, 0x62, 0x01, 0xFA, 0x42, 0xDD, 0x00, 0x00, 0x00, 0x0F, 0x43, 0x68, 0x75, 0x75, 0x6B, +0x2F, 0x54, 0x72, 0x75, 0x6B, 0x2C, 0x20, 0x59, 0x61, 0x70, /* Pacific/Easter */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xB9, 0xC7, 0x40, 0x88, 0xFD, 0xD1, 0x3C, 0x40, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x72, 0xDC, 0xB0, 0x01, 0x75, 0x50, 0xC0, 0x02, 0x40, 0x49, 0xB0, 0x03, 0x55, 0x32, 0xC0, 0x04, 0x20, 0x2B, 0xB0, 0x05, 0x3E, 0x4F, 0x40, 0x06, 0x00, 0x0D, 0xB0, 0x07, 0x0B, 0xBC, 0x40, @@ -65618,187 +65705,183 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x73, 0x3A, 0x74, 0xB0, 0x74, 0x05, 0x89, 0xC0, 0x75, 0x1A, 0x56, 0xB0, 0x75, 0xE5, 0x6B, 0xC0, 0x76, 0xFA, 0x38, 0xB0, 0x77, 0xC5, 0x4D, 0xC0, 0x78, 0xDA, 0x1A, 0xB0, 0x79, 0xA5, 0x2F, 0xC0, 0x7A, 0xC3, 0x37, 0x30, 0x7B, 0x85, 0x11, 0xC0, 0x7C, 0xA3, 0x19, 0x30, 0x7D, 0x6E, 0x2E, 0x40, -0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x04, 0x02, 0x03, +0x7E, 0x82, 0xFB, 0x30, 0x7F, 0x4E, 0x10, 0x40, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, -0x99, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, -0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, -0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x2D, 0x30, -0x37, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, -0x01, 0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, -0xFF, 0xFF, 0xFF, 0xFF, 0x69, 0x87, 0x42, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x40, 0x88, -0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, -0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x01, 0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x05, 0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x07, 0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x0A, 0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x0C, 0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, -0x00, 0x00, 0x00, 0x00, 0x0E, 0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, -0x00, 0x00, 0x00, 0x00, 0x10, 0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, -0x00, 0x00, 0x00, 0x00, 0x12, 0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, -0x00, 0x00, 0x00, 0x00, 0x14, 0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x16, 0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x19, 0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1B, 0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1D, 0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x1F, 0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, -0x00, 0x00, 0x00, 0x00, 0x21, 0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, -0x00, 0x00, 0x00, 0x00, 0x23, 0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, -0x00, 0x00, 0x00, 0x00, 0x25, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, -0x00, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, -0x00, 0x00, 0x00, 0x00, 0x28, 0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2C, 0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x2E, 0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x32, 0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, -0x00, 0x00, 0x00, 0x00, 0x34, 0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, -0x00, 0x00, 0x00, 0x00, 0x36, 0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, -0x00, 0x00, 0x00, 0x00, 0x39, 0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, -0x00, 0x00, 0x00, 0x00, 0x3B, 0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, -0x00, 0x00, 0x00, 0x00, 0x3D, 0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x3F, 0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x41, 0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x43, 0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x45, 0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x47, 0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, -0x00, 0x00, 0x00, 0x00, 0x48, 0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, -0x00, 0x00, 0x00, 0x00, 0x4A, 0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x4C, 0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, -0x00, 0x00, 0x00, 0x00, 0x4E, 0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x50, 0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x52, 0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x54, 0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, -0x00, 0x00, 0x00, 0x00, 0x57, 0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, -0x00, 0x00, 0x00, 0x00, 0x59, 0x8F, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, -0x00, 0x00, 0x00, 0x00, 0x5B, 0x6F, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x5D, 0x74, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x5F, 0x54, 0x5E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x61, 0x34, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x63, 0x1D, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x64, 0xF4, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, -0x00, 0x00, 0x00, 0x00, 0x66, 0xDD, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, -0x00, 0x00, 0x00, 0x00, 0x68, 0xBD, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, -0x00, 0x00, 0x00, 0x00, 0x6A, 0x9C, 0xE5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, -0x00, 0x00, 0x00, 0x00, 0x6C, 0x7C, 0xC7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, -0x00, 0x00, 0x00, 0x00, 0x6E, 0x5C, 0xA9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x70, 0x3C, 0x8B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x72, 0x25, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x74, 0x05, 0x89, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x75, 0xE5, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x77, 0xC5, 0x4D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, -0x00, 0x00, 0x00, 0x00, 0x79, 0xA5, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7B, 0x85, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7D, 0x6E, 0x2E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, -0x00, 0x00, 0x00, 0x00, 0x7F, 0x4E, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, -0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x06, 0xFF, 0xFF, 0x99, 0x78, -0x00, 0x00, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, -0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, -0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x36, 0x00, 0x2D, 0x30, 0x37, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, -0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x36, 0x3E, 0x36, 0x3C, -0x2D, 0x30, 0x35, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, 0x2C, 0x4D, -0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, 0x0A, 0x00, 0x5F, 0xE6, 0xC8, 0x00, 0x6B, 0xAD, -0x1A, 0x00, 0x00, 0x00, 0x0D, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x61, -0x6E, 0x64, +0x06, 0x05, 0x06, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x04, 0xFF, +0xFF, 0xAB, 0xA0, 0x01, 0x08, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, +0x0C, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, +0x00, 0x45, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x2D, 0x30, 0x37, 0x00, 0x2D, 0x30, 0x35, +0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x54, +0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x69, +0x87, 0x42, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0xC7, 0x40, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, +0xD1, 0x3C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x92, 0xFA, 0xB0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xCC, 0xCD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xDC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x01, +0x75, 0x50, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x03, +0x55, 0x32, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x05, +0x3E, 0x4F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x07, +0x0B, 0xBC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x08, +0xFE, 0x13, 0x40, 0x00, 0x00, 0x00, 0x00, 0x09, 0xBF, 0xD1, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x0A, +0xDD, 0xF5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xA8, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, +0xBD, 0xD7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x88, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, +0x9D, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x68, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x10, +0x86, 0xD5, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x48, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x12, +0x66, 0xB7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x13, 0x28, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x14, +0x46, 0x99, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x16, +0x26, 0x7B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x16, 0xF1, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x18, +0x06, 0x5D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xD1, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x19, +0xE6, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xB1, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1B, +0xCF, 0x5C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x91, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1D, +0xAF, 0x3E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x70, 0xFC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x8F, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x21, +0x6F, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x22, 0x39, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, +0x4E, 0xE4, 0x40, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0xDD, 0x30, 0x00, 0x00, 0x00, 0x00, 0x25, +0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xBF, 0x30, 0x00, 0x00, 0x00, 0x00, 0x26, +0xF2, 0xF8, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD9, 0xA1, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, +0xF7, 0xC4, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x29, 0xC2, 0xBD, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2A, +0xD7, 0xA6, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xA2, 0x9F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2C, +0xB7, 0x88, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x82, 0x81, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x2E, +0x97, 0x6A, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x62, 0x63, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x30, +0x80, 0x87, 0x40, 0x00, 0x00, 0x00, 0x00, 0x31, 0x42, 0x45, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x32, +0x60, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0xD7, 0x30, 0x00, 0x00, 0x00, 0x00, 0x34, +0x40, 0x4B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x44, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, +0x0D, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x37, 0x06, 0xD5, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x38, +0x00, 0x0F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCB, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x39, +0xE9, 0x2B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xAA, 0xEA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xC9, 0x0D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x8A, 0xCC, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xA8, 0xEF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x6A, 0xAE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3F, +0x88, 0xD1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x53, 0xCA, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x41, +0x68, 0xB3, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x33, 0xAC, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x43, +0x48, 0x95, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x13, 0x8E, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x45, +0x31, 0xB2, 0x40, 0x00, 0x00, 0x00, 0x00, 0x45, 0xF3, 0x70, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x47, +0x11, 0x94, 0x40, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEF, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, +0xF1, 0x76, 0x40, 0x00, 0x00, 0x00, 0x00, 0x49, 0xBC, 0x6F, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4A, +0xD1, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xB8, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x4C, +0xB1, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xC6, 0x07, 0x30, 0x00, 0x00, 0x00, 0x00, 0x4E, +0x50, 0x82, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x9C, 0xAE, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x50, +0x42, 0xD9, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x51, 0x7C, 0x90, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x52, +0x2B, 0xF6, 0x40, 0x00, 0x00, 0x00, 0x00, 0x53, 0x5C, 0x72, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x54, +0x0B, 0xD8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x57, 0x37, 0xE6, 0x30, 0x00, 0x00, 0x00, 0x00, 0x57, +0xAF, 0xEC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x59, 0x17, 0xC8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x59, +0x8F, 0xCE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xF7, 0xAA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x5B, +0x6F, 0xB0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xA9, 0x67, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5D, +0x74, 0x7C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x89, 0x49, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x5F, +0x54, 0x5E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x69, 0x2B, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x61, +0x34, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x49, 0x0D, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x63, +0x1D, 0x5D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0xEF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x64, +0xF4, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x12, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x66, +0xDD, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0xEE, 0x30, 0x00, 0x00, 0x00, 0x00, 0x68, +0xBD, 0x03, 0x40, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0xD0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6A, +0x9C, 0xE5, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0xB2, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6C, +0x7C, 0xC7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x91, 0x94, 0x30, 0x00, 0x00, 0x00, 0x00, 0x6E, +0x5C, 0xA9, 0x40, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x7A, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x70, +0x3C, 0x8B, 0x40, 0x00, 0x00, 0x00, 0x00, 0x71, 0x5A, 0x92, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x72, +0x25, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3A, 0x74, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x74, +0x05, 0x89, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x56, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x75, +0xE5, 0x6B, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFA, 0x38, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x77, +0xC5, 0x4D, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xDA, 0x1A, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x79, +0xA5, 0x2F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xC3, 0x37, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7B, +0x85, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA3, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7D, +0x6E, 0x2E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0xFB, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7F, +0x4E, 0x10, 0x40, 0x01, 0x04, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0xFF, 0xFF, +0x99, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x99, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x01, 0x08, +0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x9D, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0xAB, 0xA0, +0x00, 0x08, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x45, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x36, 0x00, 0x2D, 0x30, 0x37, 0x00, 0x2D, 0x30, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, +0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2D, 0x30, 0x36, 0x3E, +0x36, 0x3C, 0x2D, 0x30, 0x35, 0x3E, 0x2C, 0x4D, 0x39, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, +0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x36, 0x2F, 0x32, 0x32, 0x0A, 0x00, 0x5F, 0xE6, 0xC8, 0x00, +0x6B, 0xAD, 0x1A, 0x00, 0x00, 0x00, 0x0D, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x49, 0x73, +0x6C, 0x61, 0x6E, 0x64, /* Pacific/Efate */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x56, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xF5, 0xC2, 0xB4, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xF5, 0xC2, 0xB4, 0x07, 0x79, 0x99, 0x40, 0x07, 0xFA, 0xCC, 0x40, 0x19, 0xD2, 0xF7, 0xD0, 0x1A, 0xC2, 0xDA, 0xC0, 0x1B, 0xB2, 0xD9, 0xD0, 0x1C, 0xA2, 0xBC, 0xC0, 0x1D, 0x9B, 0xF6, 0x50, 0x1E, 0x82, 0x9E, 0xC0, 0x1F, 0x7B, 0xD8, 0x50, 0x20, 0x6B, 0xBB, 0x40, 0x21, 0x5B, 0xBA, 0x50, 0x22, 0x4B, 0x9D, 0x40, 0x23, 0x3B, 0x9C, 0x50, 0x24, 0x2B, 0x7F, 0x40, 0x25, 0x1B, 0x7E, 0x50, 0x26, 0x0B, 0x61, 0x40, 0x26, 0xFB, 0x60, 0x50, 0x27, 0xEB, 0x43, 0x40, 0x28, 0xE4, 0x7C, 0xD0, 0x29, 0x81, 0x51, 0x40, -0x2A, 0xE9, 0x48, 0xD0, 0x2B, 0x61, 0x33, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x04, 0x01, 0x02, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x9D, 0xCC, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, -0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x01, -0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x05, -0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xF5, 0xC2, 0xB4, 0x00, 0x00, 0x00, 0x00, -0x07, 0x79, 0x99, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFA, 0xCC, 0x40, 0x00, 0x00, 0x00, 0x00, -0x19, 0xD2, 0xF7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC2, 0xDA, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x1B, 0xB2, 0xD9, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xA2, 0xBC, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x1D, 0x9B, 0xF6, 0x50, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x82, 0x9E, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x1F, 0x7B, 0xD8, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6B, 0xBB, 0x40, 0x00, 0x00, 0x00, 0x00, -0x21, 0x5B, 0xBA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4B, 0x9D, 0x40, 0x00, 0x00, 0x00, 0x00, -0x23, 0x3B, 0x9C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2B, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, -0x25, 0x1B, 0x7E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, -0x26, 0xFB, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x27, 0xEB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, -0x28, 0xE4, 0x7C, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x29, 0x81, 0x51, 0x40, 0x00, 0x00, 0x00, 0x00, -0x2A, 0xE9, 0x48, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x61, 0x33, 0x40, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x04, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x04, 0x00, 0x00, 0x9D, 0xCC, -0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, -0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, -0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x6E, 0x5F, 0x35, 0x02, 0x13, -0xA4, 0x42, 0x00, 0x00, 0x00, 0x00, +0x2A, 0xE9, 0x48, 0xD0, 0x2B, 0x61, 0x33, 0x40, 0x04, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, +0x00, 0x9D, 0xCC, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, +0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, +0x01, 0x00, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, +0xFF, 0xFF, 0xFF, 0x92, 0xF5, 0xC2, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x07, 0x79, 0x99, 0x40, 0x00, +0x00, 0x00, 0x00, 0x07, 0xFA, 0xCC, 0x40, 0x00, 0x00, 0x00, 0x00, 0x19, 0xD2, 0xF7, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x1A, 0xC2, 0xDA, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xB2, 0xD9, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x1C, 0xA2, 0xBC, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9B, 0xF6, 0x50, 0x00, +0x00, 0x00, 0x00, 0x1E, 0x82, 0x9E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7B, 0xD8, 0x50, 0x00, +0x00, 0x00, 0x00, 0x20, 0x6B, 0xBB, 0x40, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5B, 0xBA, 0x50, 0x00, +0x00, 0x00, 0x00, 0x22, 0x4B, 0x9D, 0x40, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3B, 0x9C, 0x50, 0x00, +0x00, 0x00, 0x00, 0x24, 0x2B, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1B, 0x7E, 0x50, 0x00, +0x00, 0x00, 0x00, 0x26, 0x0B, 0x61, 0x40, 0x00, 0x00, 0x00, 0x00, 0x26, 0xFB, 0x60, 0x50, 0x00, +0x00, 0x00, 0x00, 0x27, 0xEB, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE4, 0x7C, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x29, 0x81, 0x51, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xE9, 0x48, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x2B, 0x61, 0x33, 0x40, 0x04, 0x01, 0x02, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, +0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x00, +0x9D, 0xCC, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, +0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, +0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, +0x00, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x6E, 0x5F, 0x35, +0x02, 0x13, 0xA4, 0x42, 0x00, 0x00, 0x00, 0x00, /* Pacific/Enderbury */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xC3, 0x2C, 0xDB, 0x80, -0x12, 0x56, 0x04, 0xC0, 0x2F, 0x05, 0x39, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, -0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, -0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xC3, 0x2C, 0xDB, 0x80, +0x12, 0x56, 0x04, 0xC0, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, +0xD0, 0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, +0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, -0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, -0x12, 0x56, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, -0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, -0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, -0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x04, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, +0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, +0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Fakaofo */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, -0x4E, 0xFD, 0x99, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0x5F, 0x78, 0x00, -0x00, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, -0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x55, 0x88, 0x00, 0x00, 0x00, -0x00, 0x4E, 0xFD, 0x99, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, -0xFF, 0xFF, 0x5F, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x0A, 0x3C, -0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x7B, 0x09, 0x65, 0x00, 0x0D, 0x60, 0x7A, -0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, +0x4E, 0xFD, 0x99, 0xB0, 0x01, 0x02, 0xFF, 0xFF, 0x5F, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x65, 0x50, +0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x00, +0x2B, 0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x55, 0x88, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFD, 0x99, 0xB0, +0x01, 0x02, 0xFF, 0xFF, 0x5F, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x04, 0x00, 0x00, +0xB6, 0xD0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, +0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x7B, 0x09, 0x65, 0x00, 0x0D, +0x60, 0x7A, 0x00, 0x00, 0x00, 0x00, /* Pacific/Fiji */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x9A, 0x13, 0xB1, 0xC0, +0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x9A, 0x13, 0xB1, 0xC0, 0x36, 0x3B, 0x17, 0xE0, 0x36, 0xD7, 0xFA, 0x60, 0x38, 0x24, 0x34, 0x60, 0x38, 0xB7, 0xDC, 0x60, 0x4B, 0x11, 0x2C, 0xE0, 0x4B, 0xAE, 0x0F, 0x60, 0x4C, 0xC2, 0xEA, 0x60, 0x4D, 0x72, 0x41, 0xE0, 0x4E, 0xA2, 0xCC, 0x60, 0x4F, 0x1A, 0xC4, 0xE0, 0x50, 0x82, 0xAE, 0x60, 0x50, 0xFA, 0xA6, 0xE0, @@ -65806,124 +65889,91 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x56, 0x34, 0xC9, 0x60, 0x56, 0x9A, 0x4C, 0xE0, 0x58, 0x1D, 0xE5, 0xE0, 0x58, 0x7A, 0x2E, 0xE0, 0x59, 0xFD, 0xC7, 0xE0, 0x5A, 0x5A, 0x10, 0xE0, 0x5B, 0xDD, 0xA9, 0xE0, 0x5C, 0x39, 0xF2, 0xE0, 0x5D, 0xC6, 0xC6, 0x60, 0x5E, 0x19, 0xD4, 0xE0, 0x5F, 0xDE, 0x07, 0x60, 0x60, 0x02, 0xF1, 0x60, -0x63, 0x6F, 0xA6, 0xE0, 0x63, 0xC2, 0xB5, 0x60, 0x65, 0x4F, 0x88, 0xE0, 0x65, 0xA2, 0x97, 0x60, -0x67, 0x2F, 0x6A, 0xE0, 0x67, 0x82, 0x79, 0x60, 0x69, 0x0F, 0x4C, 0xE0, 0x69, 0x6B, 0x95, 0xE0, -0x6A, 0xEF, 0x2E, 0xE0, 0x6B, 0x4B, 0x77, 0xE0, 0x6C, 0xD8, 0x4B, 0x60, 0x6D, 0x2B, 0x59, 0xE0, -0x6E, 0xB8, 0x2D, 0x60, 0x6F, 0x0B, 0x3B, 0xE0, 0x70, 0x98, 0x0F, 0x60, 0x70, 0xEB, 0x1D, 0xE0, -0x72, 0x77, 0xF1, 0x60, 0x72, 0xCA, 0xFF, 0xE0, 0x74, 0x57, 0xD3, 0x60, 0x74, 0xB4, 0x1C, 0x60, -0x76, 0x40, 0xEF, 0xE0, 0x76, 0x93, 0xFE, 0x60, 0x78, 0x20, 0xD1, 0xE0, 0x78, 0x73, 0xE0, 0x60, -0x7A, 0x00, 0xB3, 0xE0, 0x7A, 0x53, 0xC2, 0x60, 0x7B, 0xE0, 0x95, 0xE0, 0x7C, 0x33, 0xA4, 0x60, -0x7D, 0xC0, 0x77, 0xE0, 0x7E, 0x1C, 0xC0, 0xE0, 0x7F, 0xA0, 0x59, 0xE0, 0x7F, 0xFC, 0xA2, 0xE0, -0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, -0x54, 0x5A, 0x69, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, -0x9A, 0x13, 0xB1, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x3B, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x36, 0xD7, 0xFA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0x24, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, -0x38, 0xB7, 0xDC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x11, 0x2C, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x4B, 0xAE, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xC2, 0xEA, 0x60, 0x00, 0x00, 0x00, 0x00, -0x4D, 0x72, 0x41, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA2, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x00, -0x4F, 0x1A, 0xC4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x50, 0x82, 0xAE, 0x60, 0x00, 0x00, 0x00, 0x00, -0x50, 0xFA, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6B, 0xCA, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x52, 0xDA, 0x7A, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x54, 0x54, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, -0x54, 0xBA, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x56, 0x34, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, -0x56, 0x9A, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1D, 0xE5, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x58, 0x7A, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFD, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x5A, 0x5A, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xDD, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x5C, 0x39, 0xF2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xC6, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, -0x5E, 0x19, 0xD4, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xDE, 0x07, 0x60, 0x00, 0x00, 0x00, 0x00, -0x60, 0x02, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6F, 0xA6, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x63, 0xC2, 0xB5, 0x60, 0x00, 0x00, 0x00, 0x00, 0x65, 0x4F, 0x88, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x65, 0xA2, 0x97, 0x60, 0x00, 0x00, 0x00, 0x00, 0x67, 0x2F, 0x6A, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x67, 0x82, 0x79, 0x60, 0x00, 0x00, 0x00, 0x00, 0x69, 0x0F, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x69, 0x6B, 0x95, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xEF, 0x2E, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x6B, 0x4B, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xD8, 0x4B, 0x60, 0x00, 0x00, 0x00, 0x00, -0x6D, 0x2B, 0x59, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xB8, 0x2D, 0x60, 0x00, 0x00, 0x00, 0x00, -0x6F, 0x0B, 0x3B, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x98, 0x0F, 0x60, 0x00, 0x00, 0x00, 0x00, -0x70, 0xEB, 0x1D, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x77, 0xF1, 0x60, 0x00, 0x00, 0x00, 0x00, -0x72, 0xCA, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x57, 0xD3, 0x60, 0x00, 0x00, 0x00, 0x00, -0x74, 0xB4, 0x1C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x76, 0x40, 0xEF, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x76, 0x93, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x78, 0x20, 0xD1, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x78, 0x73, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0xB3, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x7A, 0x53, 0xC2, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x95, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x7C, 0x33, 0xA4, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xC0, 0x77, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x7E, 0x1C, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xA0, 0x59, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFC, 0xA2, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, -0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x00, 0x00, 0xA7, 0xC0, 0x00, 0x00, -0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, -0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, -0x32, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2C, 0x4D, 0x31, 0x31, 0x2E, 0x32, 0x2E, 0x30, 0x2C, 0x4D, -0x31, 0x2E, 0x32, 0x2E, 0x33, 0x2F, 0x39, 0x39, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, -0x82, 0x00, 0x00, 0x00, 0x00, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, +0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0xA7, +0xC0, 0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, +0x4D, 0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, +0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x13, 0xB1, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x36, 0x3B, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xD7, 0xFA, 0x60, 0x00, +0x00, 0x00, 0x00, 0x38, 0x24, 0x34, 0x60, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB7, 0xDC, 0x60, 0x00, +0x00, 0x00, 0x00, 0x4B, 0x11, 0x2C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0x0F, 0x60, 0x00, +0x00, 0x00, 0x00, 0x4C, 0xC2, 0xEA, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x72, 0x41, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x4E, 0xA2, 0xCC, 0x60, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x1A, 0xC4, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x50, 0x82, 0xAE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFA, 0xA6, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x52, 0x6B, 0xCA, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x52, 0xDA, 0x7A, 0xD0, 0x00, +0x00, 0x00, 0x00, 0x54, 0x54, 0xE7, 0x60, 0x00, 0x00, 0x00, 0x00, 0x54, 0xBA, 0x6A, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x56, 0x34, 0xC9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x56, 0x9A, 0x4C, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x58, 0x1D, 0xE5, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7A, 0x2E, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x59, 0xFD, 0xC7, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x5A, 0x10, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5B, 0xDD, 0xA9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x39, 0xF2, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5D, 0xC6, 0xC6, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x19, 0xD4, 0xE0, 0x00, +0x00, 0x00, 0x00, 0x5F, 0xDE, 0x07, 0x60, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0xF1, 0x60, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, +0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0xA7, 0xC0, +0x00, 0x00, 0x00, 0x00, 0xB6, 0xD0, 0x01, 0x04, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x08, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, +0x2D, 0x31, 0x32, 0x0A, 0x00, 0x6D, 0xA8, 0xEA, 0x02, 0x22, 0xE6, 0x82, 0x00, 0x00, 0x00, 0x00, + /* Pacific/Funafuti */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x0C, 0xFC, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, -0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x7C, 0x55, 0x6D, 0x02, 0x24, 0x1F, 0x02, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x0C, 0xFC, 0x01, 0x00, 0x00, 0xA8, 0x04, 0x00, 0x00, +0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x7C, 0x55, 0x6D, 0x02, 0x24, 0x1F, 0x02, +0x00, 0x00, 0x00, 0x00, /* Pacific/Galapagos */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x45, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xB6, 0xA4, 0x4C, 0x80, -0x1E, 0x18, 0xC4, 0x50, 0x2B, 0x17, 0x0A, 0xE0, 0x2B, 0x71, 0xF4, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x03, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, -0x04, 0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, -0x00, 0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0xB6, 0xA4, 0x4C, 0x80, +0x1E, 0x18, 0xC4, 0x50, 0x2B, 0x17, 0x0A, 0xE0, 0x2B, 0x71, 0xF4, 0x50, 0x01, 0x03, 0x02, 0x03, +0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, 0xB9, 0xB0, +0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x35, 0x00, +0x2D, 0x30, 0x36, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, -0x04, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0xA4, 0x4C, 0x80, 0x00, 0x00, 0x00, -0x00, 0x1E, 0x18, 0xC4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x17, 0x0A, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x2B, 0x71, 0xF4, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, -0x03, 0x03, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, 0xFF, 0xFF, -0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, -0x35, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x36, 0x3E, 0x36, 0x0A, 0x00, 0x87, -0xF4, 0xB0, 0x00, 0x89, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x11, 0x47, 0x61, 0x6C, 0x61, 0x70, 0x61, -0x67, 0x6F, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, +0xFF, 0xFF, 0xFF, 0xFF, 0xB6, 0xA4, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x18, 0xC4, 0x50, +0x00, 0x00, 0x00, 0x00, 0x2B, 0x17, 0x0A, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x71, 0xF4, 0x50, +0x01, 0x03, 0x02, 0x03, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xB9, 0xB0, 0x00, 0x04, +0xFF, 0xFF, 0xB9, 0xB0, 0x01, 0x04, 0xFF, 0xFF, 0xAB, 0xA0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, +0x2D, 0x30, 0x35, 0x00, 0x2D, 0x30, 0x36, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x36, 0x3E, 0x36, 0x0A, +0x00, 0x87, 0xF4, 0xB0, 0x00, 0x89, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x11, 0x47, 0x61, 0x6C, 0x61, +0x70, 0x61, 0x67, 0x6F, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* Pacific/Gambier */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x50, 0x48, 0x04, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x81, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0x81, 0x70, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x50, 0x48, 0x04, +0x01, 0xFF, 0xFF, 0x81, 0x7C, 0x00, 0x00, 0xFF, 0xFF, 0x81, 0x70, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x50, 0x48, 0x04, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x81, 0x7C, 0x00, 0x00, 0xFF, 0xFF, -0x81, 0x70, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2D, 0x30, -0x39, 0x3E, 0x39, 0x0A, 0x00, 0x66, 0x07, 0xCA, 0x00, 0x44, 0xBD, 0xA8, 0x00, 0x00, 0x00, 0x0F, -0x47, 0x61, 0x6D, 0x62, 0x69, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x50, 0x48, 0x04, 0x01, 0xFF, 0xFF, 0x81, 0x7C, 0x00, 0x00, +0xFF, 0xFF, 0x81, 0x70, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x39, 0x00, 0x0A, 0x3C, +0x2D, 0x30, 0x39, 0x3E, 0x39, 0x0A, 0x00, 0x66, 0x07, 0xCA, 0x00, 0x44, 0xBD, 0xA8, 0x00, 0x00, +0x00, 0x0F, 0x47, 0x61, 0x6D, 0x62, 0x69, 0x65, 0x72, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, +0x73, /* Pacific/Guadalcanal */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x53, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x4F, 0x33, 0x8C, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x4F, 0x33, 0x8C, +0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x4F, 0x33, 0x8C, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, 0x00, 0x00, -0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, 0x2B, 0x31, -0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x7A, 0xC8, 0x4A, 0x02, 0x07, 0x1A, 0xA0, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x4F, 0x33, 0x8C, 0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x7A, 0xC8, 0x4A, 0x02, 0x07, 0x1A, 0xA0, +0x00, 0x00, 0x00, 0x00, /* Pacific/Guam */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x47, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66010,129 +66060,124 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Pacific/Kanton */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xC3, 0x2C, 0xDB, 0x80, -0x12, 0x56, 0x04, 0xC0, 0x2F, 0x05, 0x39, 0xB0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, -0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, -0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xC3, 0x2C, 0xDB, 0x80, +0x12, 0x56, 0x04, 0xC0, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, +0xD0, 0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, +0x31, 0x33, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, -0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, -0x12, 0x56, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x00, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, -0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0C, -0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x33, 0x00, -0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x85, 0x15, 0x02, 0x00, 0x0C, -0xA3, 0xAD, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x68, 0x6F, 0x65, 0x6E, 0x69, 0x78, 0x20, 0x49, 0x73, -0x6C, 0x61, 0x6E, 0x64, 0x73, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xFF, +0xFF, 0xFF, 0xFF, 0xC3, 0x2C, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x56, 0x04, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x05, 0x39, 0xB0, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0x57, 0x40, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x08, 0x00, 0x00, 0xB6, 0xD0, +0x00, 0x0C, 0x2D, 0x30, 0x30, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x2B, 0x31, +0x33, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x85, 0x15, 0x02, +0x00, 0x0C, 0xA3, 0xAD, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x68, 0x6F, 0x65, 0x6E, 0x69, 0x78, 0x20, +0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* Pacific/Kiritimati */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, -0x12, 0x55, 0xF2, 0x00, 0x2F, 0x05, 0x2B, 0xA0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, -0xFF, 0xFF, 0x6C, 0x80, 0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, -0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x34, -0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x80, 0x00, 0x00, 0x00, +0x12, 0x55, 0xF2, 0x00, 0x2F, 0x05, 0x2B, 0xA0, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0x6C, 0x80, 0x00, +0x00, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0x00, 0x00, 0xC4, +0xE0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x34, 0x30, 0x00, 0x2D, 0x31, 0x30, +0x00, 0x2B, 0x31, 0x34, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, -0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x48, 0x80, 0x00, 0x00, -0x00, 0x00, 0x12, 0x55, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x05, 0x2B, 0xA0, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x03, 0xFF, 0xFF, 0x6C, 0x80, 0x00, 0x00, -0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, -0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x34, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, -0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x34, 0x3E, 0x2D, 0x31, 0x34, 0x0A, 0x00, 0x8C, -0x2D, 0x6A, 0x00, 0x22, 0x96, 0x2A, 0x00, 0x00, 0x00, 0x0C, 0x4C, 0x69, 0x6E, 0x65, 0x20, 0x49, -0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, +0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x48, 0x80, 0x00, 0x00, 0x00, 0x00, 0x12, 0x55, 0xF2, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x05, 0x2B, 0xA0, 0x01, 0x02, 0x03, 0xFF, 0xFF, 0x6C, 0x80, +0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0x00, 0x00, +0xC4, 0xE0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x34, 0x30, 0x00, 0x2D, 0x31, +0x30, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x34, 0x3E, 0x2D, 0x31, 0x34, 0x0A, +0x00, 0x8C, 0x2D, 0x6A, 0x00, 0x22, 0x96, 0x2A, 0x00, 0x00, 0x00, 0x0C, 0x4C, 0x69, 0x6E, 0x65, +0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* Pacific/Kosrae */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x98, 0x11, 0x95, 0xD0, 0xA0, 0x39, 0xF9, 0xF0, 0xC1, 0xED, 0x35, 0xD0, 0xC9, 0xEA, 0x0A, 0x60, -0xD2, 0x11, 0x0E, 0xF0, 0xFF, 0x86, 0x1B, 0x50, 0x36, 0x8B, 0x67, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0x04, 0x01, 0x01, 0xFF, 0xFF, 0x47, 0x4C, 0x00, 0x00, 0x00, -0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, -0xFF, 0x14, 0xE1, 0xB4, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x1C, 0x34, 0xFF, 0xFF, 0xFF, -0xFF, 0x98, 0x11, 0x95, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, -0xFF, 0xC1, 0xED, 0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, 0x00, 0x00, -0x00, 0x36, 0x8B, 0x67, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x02, 0x04, 0x03, 0x02, 0x05, 0x02, 0x02, 0xFF, 0xFF, 0x47, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x98, -0xCC, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, -0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, -0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, -0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, -0x91, 0x71, 0x12, 0x02, 0x0B, 0x59, 0xDD, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x6F, 0x73, 0x72, 0x61, -0x65, +0xD2, 0x11, 0x0E, 0xF0, 0xFF, 0x86, 0x1B, 0x50, 0x36, 0x8B, 0x67, 0x40, 0x01, 0x02, 0x01, 0x03, +0x02, 0x01, 0x04, 0x01, 0xFF, 0xFF, 0x47, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, +0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, +0x00, 0x10, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xB4, 0xB4, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x1C, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, 0x95, 0xD0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, 0xD0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x36, 0x8B, 0x67, 0x40, +0x01, 0x02, 0x03, 0x02, 0x04, 0x03, 0x02, 0x05, 0x02, 0xFF, 0xFF, 0x47, 0x4C, 0x00, 0x00, 0x00, +0x00, 0x98, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, +0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x9A, +0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, +0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, +0x0A, 0x00, 0x91, 0x71, 0x12, 0x02, 0x0B, 0x59, 0xDD, 0x00, 0x00, 0x00, 0x06, 0x4B, 0x6F, 0x73, +0x72, 0x61, 0x65, /* Pacific/Kwajalein */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0xC1, 0xED, 0x35, 0xD0, 0xC9, 0xEA, 0x0A, 0x60, 0xCF, 0x46, 0x81, 0xF0, 0xFF, 0x86, 0x1B, 0x50, -0x2C, 0x76, 0x0E, 0x40, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x05, 0x00, -0x00, 0x9C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, -0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, -0xC0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x2C, 0x76, 0x0E, 0x40, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x00, 0x00, 0x9C, 0xE0, 0x00, 0x00, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x0C, 0xFF, 0xFF, 0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x14, 0x4C, 0x4D, +0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2D, 0x31, +0x32, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, -0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x18, 0x20, 0xFF, -0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, -0xFF, 0xFF, 0xFF, 0xCF, 0x46, 0x81, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, -0x00, 0x00, 0x00, 0x2C, 0x76, 0x0E, 0x40, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x03, 0x01, 0x04, 0x05, 0x05, 0x00, 0x00, 0x9C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, -0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, 0xFF, 0xFF, -0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, -0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2D, 0x31, 0x32, 0x00, 0x2B, 0x31, -0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x97, 0x30, 0x6D, -0x02, 0x11, 0xFD, 0x15, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x77, 0x61, 0x6A, 0x61, 0x6C, 0x65, 0x69, -0x6E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, +0x00, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x18, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, +0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x46, +0x81, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x76, +0x0E, 0x40, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x00, 0x00, 0x9C, 0xE0, 0x00, 0x00, 0x00, 0x00, +0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0C, +0xFF, 0xFF, 0x57, 0x40, 0x00, 0x10, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x14, 0x4C, 0x4D, 0x54, 0x00, +0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2D, 0x31, 0x32, 0x00, +0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x97, +0x30, 0x6D, 0x02, 0x11, 0xFD, 0x15, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x77, 0x61, 0x6A, 0x61, 0x6C, +0x65, 0x69, 0x6E, /* Pacific/Majuro */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0x98, 0x11, 0x95, 0xD0, 0xA0, 0x39, 0xF9, 0xF0, 0xC1, 0xED, 0x35, 0xD0, 0xC9, 0xEA, 0x0A, 0x60, -0xCF, 0x3D, 0x47, 0x70, 0xFF, 0x86, 0x1B, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, -0x02, 0x01, 0x04, 0x04, 0x00, 0x00, 0xA0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, -0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, -0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, -0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, -0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x14, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, -0x95, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, -0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x3D, -0x47, 0x70, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0x04, 0x04, 0x00, 0x00, 0xA0, 0x80, 0x00, 0x00, -0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, -0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, -0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x94, 0x3D, 0x38, 0x02, 0x17, 0xE3, 0x80, 0x00, 0x00, -0x00, 0x1D, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x6C, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, -0x64, 0x73, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x29, +0xCF, 0x3D, 0x47, 0x70, 0xFF, 0x86, 0x1B, 0x50, 0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0x04, 0x00, +0x00, 0xA0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, +0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, +0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, +0xFF, 0x7E, 0x36, 0x14, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, 0x95, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, 0xD0, 0xFF, 0xFF, 0xFF, +0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x3D, 0x47, 0x70, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x86, 0x1B, 0x50, 0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0x04, 0x00, 0x00, 0xA0, 0x80, +0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, +0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x10, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, +0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x94, 0x3D, 0x38, 0x02, 0x17, 0xE3, 0x80, +0x00, 0x00, 0x00, 0x1D, 0x4D, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6C, 0x6C, 0x20, 0x49, 0x73, 0x6C, +0x61, 0x6E, 0x64, 0x73, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, +0x29, /* Pacific/Marquesas */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x94, 0x50, 0x4C, 0x48, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x7D, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x68, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, -0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x50, 0x4C, 0x48, -0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x7D, 0x38, 0x00, 0x00, -0xFF, 0xFF, 0x7A, 0x68, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, -0x0A, 0x3C, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x3E, 0x39, 0x3A, 0x33, 0x30, 0x0A, 0x00, 0x7B, 0x98, -0xA0, 0x00, 0x3D, 0xCC, 0x50, 0x00, 0x00, 0x00, 0x11, 0x4D, 0x61, 0x72, 0x71, 0x75, 0x65, 0x73, -0x61, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x94, 0x50, 0x4C, 0x48, +0x01, 0xFF, 0xFF, 0x7D, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x68, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x50, 0x4C, 0x48, 0x01, 0xFF, 0xFF, 0x7D, 0x38, +0x00, 0x00, 0xFF, 0xFF, 0x7A, 0x68, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x39, 0x33, +0x30, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x3E, 0x39, 0x3A, 0x33, 0x30, 0x0A, 0x00, +0x7B, 0x98, 0xA0, 0x00, 0x3D, 0xCC, 0x50, 0x00, 0x00, 0x00, 0x11, 0x4D, 0x61, 0x72, 0x71, 0x75, +0x65, 0x73, 0x61, 0x73, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, /* Pacific/Midway */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66155,42 +66200,40 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Pacific/Nauru */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xA3, 0xE7, 0x2B, 0x04, -0xCC, 0x90, 0xE9, 0xC8, 0xD2, 0x43, 0x27, 0xF0, 0x11, 0x21, 0xA8, 0xE8, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x9C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xB8, 0x00, -0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xA3, 0xE7, 0x2B, 0x04, +0xCC, 0x90, 0xE9, 0xC8, 0xD2, 0x43, 0x27, 0xF0, 0x11, 0x21, 0xA8, 0xE8, 0x01, 0x02, 0x01, 0x03, +0x00, 0x00, 0x9C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, +0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, -0xE7, 0x2B, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xCC, 0x90, 0xE9, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, -0x43, 0x27, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x21, 0xA8, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, 0x03, 0x00, 0x00, 0x9C, 0x7C, 0x00, 0x00, 0x00, 0x00, -0xA1, 0xB8, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0A, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x0E, -0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, -0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x88, 0x8A, 0x6D, -0x02, 0x11, 0x5A, 0x52, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0xE7, 0x2B, 0x04, 0xFF, 0xFF, +0xFF, 0xFF, 0xCC, 0x90, 0xE9, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x43, 0x27, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x11, 0x21, 0xA8, 0xE8, 0x01, 0x02, 0x01, 0x03, 0x00, 0x00, 0x9C, 0x7C, 0x00, 0x00, +0x00, 0x00, 0xA1, 0xB8, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x0A, 0x00, 0x00, 0xA8, 0xC0, +0x00, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x88, +0x8A, 0x6D, 0x02, 0x11, 0x5A, 0x52, 0x00, 0x00, 0x00, 0x00, /* Pacific/Niue */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xDF, 0xA1, 0x6A, 0x4C, -0xF5, 0xA6, 0xB8, 0x60, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, -0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xDF, 0xA1, 0x6A, 0x4C, +0xF5, 0xA6, 0xB8, 0x60, 0x01, 0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, +0x00, 0x04, 0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, +0x30, 0x00, 0x2D, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x6A, 0x4C, 0xFF, -0xFF, 0xFF, 0xFF, 0xF5, 0xA6, 0xB8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, 0xFF, 0xFF, -0x65, 0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, 0x2D, 0x31, -0x31, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x31, 0x3E, 0x31, 0x31, 0x0A, 0x00, 0x6C, 0x4F, 0xDD, 0x00, -0x0F, 0x62, 0xCD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x6A, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xA6, +0xB8, 0x60, 0x01, 0x02, 0xFF, 0xFF, 0x60, 0xB4, 0x00, 0x00, 0xFF, 0xFF, 0x60, 0xA0, 0x00, 0x04, +0xFF, 0xFF, 0x65, 0x50, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x31, 0x32, 0x30, 0x00, +0x2D, 0x31, 0x31, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x31, 0x3E, 0x31, 0x31, 0x0A, 0x00, 0x6C, 0x4F, +0xDD, 0x00, 0x0F, 0x62, 0xCD, 0x00, 0x00, 0x00, 0x00, /* Pacific/Norfolk */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x00, 0xDC, 0x41, 0xF8, 0x80, 0x09, 0x0F, 0xCA, 0x68, 0x09, 0xB5, 0xE7, 0x68, 0x56, 0x0F, 0xE6, 0x68, 0x5D, 0x98, 0xAF, 0xF0, 0x5E, 0x88, 0xA0, 0xF0, 0x5F, 0x78, 0x91, 0xF0, 0x60, 0x68, 0x82, 0xF0, 0x61, 0x58, 0x73, 0xF0, 0x62, 0x48, 0x64, 0xF0, 0x63, 0x38, 0x55, 0xF0, 0x64, 0x28, 0x46, 0xF0, @@ -66201,71 +66244,69 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x74, 0x29, 0xBC, 0xF0, 0x75, 0x19, 0xAD, 0xF0, 0x76, 0x09, 0x9E, 0xF0, 0x76, 0xF9, 0x8F, 0xF0, 0x77, 0xE9, 0x80, 0xF0, 0x78, 0xD9, 0x71, 0xF0, 0x79, 0xC9, 0x62, 0xF0, 0x7A, 0xB9, 0x53, 0xF0, 0x7B, 0xB2, 0x7F, 0x70, 0x7C, 0xA2, 0x70, 0x70, 0x7D, 0x92, 0x61, 0x70, 0x7E, 0x82, 0x52, 0x70, -0x7F, 0x72, 0x43, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, +0x7F, 0x72, 0x43, 0x70, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x06, 0x00, 0x00, 0x9D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x04, 0x00, +0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x00, 0x00, +0x9D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x0A, +0x00, 0x00, 0xAF, 0xC8, 0x01, 0x10, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x0A, 0x00, 0x00, 0x9A, 0xB0, +0x00, 0x16, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x1A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x31, +0x32, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x33, 0x30, 0x00, 0x2B, 0x31, +0x31, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x54, 0x5A, 0x69, +0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x17, +0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x41, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0F, 0xCA, +0x68, 0x00, 0x00, 0x00, 0x00, 0x09, 0xB5, 0xE7, 0x68, 0x00, 0x00, 0x00, 0x00, 0x56, 0x0F, 0xE6, +0x68, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x98, 0xAF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x88, 0xA0, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x78, 0x91, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x60, 0x68, 0x82, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x58, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x62, 0x48, 0x64, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x38, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x64, 0x28, 0x46, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x18, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x63, +0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x01, 0x54, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0xF1, 0x45, +0x70, 0x00, 0x00, 0x00, 0x00, 0x68, 0xE1, 0x36, 0x70, 0x00, 0x00, 0x00, 0x00, 0x69, 0xD1, 0x27, +0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xC1, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xB1, 0x09, +0x70, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xA0, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x90, 0xEB, +0x70, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x80, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x70, 0xCD, +0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x71, 0x59, 0xE9, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x49, 0xDA, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x73, 0x39, 0xCB, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x29, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x75, 0x19, 0xAD, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x09, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0xF9, 0x8F, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE9, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x78, 0xD9, 0x71, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC9, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xB9, 0x53, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xB2, 0x7F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xA2, 0x70, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x92, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x82, 0x52, +0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x72, 0x43, 0x70, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, +0x06, 0x05, 0x06, 0x00, 0x00, 0x9D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x04, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x0A, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x10, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x0A, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x16, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x1A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0xFF, -0xFF, 0xFF, 0x7E, 0x36, 0x17, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x41, 0xF8, 0x80, 0x00, 0x00, -0x00, 0x00, 0x09, 0x0F, 0xCA, 0x68, 0x00, 0x00, 0x00, 0x00, 0x09, 0xB5, 0xE7, 0x68, 0x00, 0x00, -0x00, 0x00, 0x56, 0x0F, 0xE6, 0x68, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x98, 0xAF, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x5E, 0x88, 0xA0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x78, 0x91, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x60, 0x68, 0x82, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x61, 0x58, 0x73, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x62, 0x48, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x63, 0x38, 0x55, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x64, 0x28, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x65, 0x18, 0x37, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x66, 0x11, 0x63, 0x70, 0x00, 0x00, 0x00, 0x00, 0x67, 0x01, 0x54, 0x70, 0x00, 0x00, -0x00, 0x00, 0x67, 0xF1, 0x45, 0x70, 0x00, 0x00, 0x00, 0x00, 0x68, 0xE1, 0x36, 0x70, 0x00, 0x00, -0x00, 0x00, 0x69, 0xD1, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xC1, 0x18, 0x70, 0x00, 0x00, -0x00, 0x00, 0x6B, 0xB1, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xA0, 0xFA, 0x70, 0x00, 0x00, -0x00, 0x00, 0x6D, 0x90, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x80, 0xDC, 0x70, 0x00, 0x00, -0x00, 0x00, 0x6F, 0x70, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0x69, 0xF8, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x71, 0x59, 0xE9, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x72, 0x49, 0xDA, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x73, 0x39, 0xCB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x74, 0x29, 0xBC, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x75, 0x19, 0xAD, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x76, 0x09, 0x9E, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x76, 0xF9, 0x8F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x77, 0xE9, 0x80, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x78, 0xD9, 0x71, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x79, 0xC9, 0x62, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x7A, 0xB9, 0x53, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xB2, 0x7F, 0x70, 0x00, 0x00, -0x00, 0x00, 0x7C, 0xA2, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x92, 0x61, 0x70, 0x00, 0x00, -0x00, 0x00, 0x7E, 0x82, 0x52, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x72, 0x43, 0x70, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, -0x06, 0x00, 0x00, 0x9D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x80, 0x00, 0x04, 0x00, 0x00, 0xA1, -0xB8, 0x00, 0x0A, 0x00, 0x00, 0xAF, 0xC8, 0x01, 0x10, 0x00, 0x00, 0xA1, 0xB8, 0x00, 0x0A, 0x00, -0x00, 0x9A, 0xB0, 0x00, 0x16, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x1A, 0x4C, 0x4D, 0x54, 0x00, 0x2B, -0x31, 0x31, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x33, 0x30, 0x00, 0x2B, 0x31, 0x32, 0x33, 0x30, -0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, -0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x3C, 0x2B, 0x31, 0x32, 0x3E, 0x2C, 0x4D, -0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, 0x33, 0x0A, -0x00, 0x5D, 0x00, 0x98, 0x02, 0x12, 0xF4, 0x7A, 0x00, 0x00, 0x00, 0x00, +0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x3C, 0x2B, 0x31, 0x32, 0x3E, +0x2C, 0x4D, 0x31, 0x30, 0x2E, 0x31, 0x2E, 0x30, 0x2C, 0x4D, 0x34, 0x2E, 0x31, 0x2E, 0x30, 0x2F, +0x33, 0x0A, 0x00, 0x5D, 0x00, 0x98, 0x02, 0x12, 0xF4, 0x7A, 0x00, 0x00, 0x00, 0x00, /* Pacific/Noumea */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4E, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xF5, 0xC4, 0x74, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x92, 0xF5, 0xC4, 0x74, 0x0E, 0xE6, 0xBA, 0x50, 0x0F, 0x56, 0xBB, 0xC0, 0x10, 0xC6, 0x9C, 0x50, 0x11, 0x37, 0xEF, 0x40, -0x32, 0xA0, 0x4B, 0xF0, 0x33, 0x18, 0x44, 0x70, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x01, -0x02, 0x03, 0x04, 0x04, 0x00, 0x00, 0x9C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, -0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, -0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, -0xFF, 0xFF, 0xFF, 0x92, 0xF5, 0xC4, 0x74, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xE6, 0xBA, 0x50, 0x00, -0x00, 0x00, 0x00, 0x0F, 0x56, 0xBB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC6, 0x9C, 0x50, 0x00, -0x00, 0x00, 0x00, 0x11, 0x37, 0xEF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x32, 0xA0, 0x4B, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x33, 0x18, 0x44, 0x70, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x02, -0x01, 0x02, 0x01, 0x02, 0x03, 0x04, 0x04, 0x00, 0x00, 0x9C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xA8, -0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, -0x00, 0x9A, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, -0x00, 0x67, 0x5A, 0x55, 0x02, 0x10, 0xA4, 0x08, 0x00, 0x00, 0x00, 0x00, +0x32, 0xA0, 0x4B, 0xF0, 0x33, 0x18, 0x44, 0x70, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x04, 0x00, +0x00, 0x9C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, +0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x54, 0x5A, +0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0xF5, +0xC4, 0x74, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xE6, 0xBA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x56, +0xBB, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC6, 0x9C, 0x50, 0x00, 0x00, 0x00, 0x00, 0x11, 0x37, +0xEF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x32, 0xA0, 0x4B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x18, +0x44, 0x70, 0x02, 0x01, 0x02, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x9C, 0x0C, 0x00, 0x00, 0x00, +0x00, 0xA8, 0xC0, 0x01, 0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x00, 0x00, 0xA8, 0xC0, 0x01, +0x04, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x08, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x2B, +0x31, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, +0x31, 0x0A, 0x00, 0x67, 0x5A, 0x55, 0x02, 0x10, 0xA4, 0x08, 0x00, 0x00, 0x00, 0x00, /* Pacific/Pago_Pago */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x41, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66284,136 +66325,122 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Pacific/Palau */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x2C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0xFF, 0xFF, 0x2C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xCF, 0x6C, 0xFF, 0xFF, -0xFF, 0xFF, 0x7E, 0x36, 0x36, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, -0x02, 0xFF, 0xFF, 0x2C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x14, 0x00, 0x00, 0x00, 0x00, 0x7E, -0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x39, -0x3E, 0x2D, 0x39, 0x0A, 0x00, 0x94, 0x84, 0xD5, 0x01, 0xDF, 0xDD, 0x0D, 0x00, 0x00, 0x00, 0x00, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xCF, 0x6C, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x36, +0xEC, 0x01, 0x02, 0xFF, 0xFF, 0x2C, 0x94, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x14, 0x00, 0x00, 0x00, +0x00, 0x7E, 0x90, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, +0x30, 0x39, 0x3E, 0x2D, 0x39, 0x0A, 0x00, 0x94, 0x84, 0xD5, 0x01, 0xDF, 0xDD, 0x0D, 0x00, 0x00, +0x00, 0x00, /* Pacific/Pitcairn */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x80, 0x00, 0x00, 0x00, -0x35, 0x44, 0x42, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0x86, 0x0C, 0x00, -0x00, 0xFF, 0xFF, 0x88, 0x78, 0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, -0x00, 0x2D, 0x30, 0x38, 0x33, 0x30, 0x00, 0x2D, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x80, 0x00, 0x00, 0x00, +0x35, 0x44, 0x42, 0x08, 0x01, 0x02, 0xFF, 0xFF, 0x86, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x88, 0x78, +0x00, 0x04, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x38, 0x33, +0x30, 0x00, 0x2D, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, -0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x2E, 0xF4, 0x00, -0x00, 0x00, 0x00, 0x35, 0x44, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, -0x02, 0x02, 0xFF, 0xFF, 0x86, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x88, 0x78, 0x00, 0x04, 0xFF, 0xFF, -0x8F, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x38, 0x33, 0x30, 0x00, 0x2D, 0x30, -0x38, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x38, 0x3E, 0x38, 0x0A, 0x00, 0x63, 0x14, 0x95, 0x00, 0x4C, -0x2A, 0xB2, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, +0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x37, 0x2E, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x35, 0x44, +0x42, 0x08, 0x01, 0x02, 0xFF, 0xFF, 0x86, 0x0C, 0x00, 0x00, 0xFF, 0xFF, 0x88, 0x78, 0x00, 0x04, +0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x0A, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x30, 0x38, 0x33, 0x30, 0x00, +0x2D, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2D, 0x30, 0x38, 0x3E, 0x38, 0x0A, 0x00, 0x63, 0x14, 0x95, +0x00, 0x4C, 0x2A, 0xB2, 0x00, 0x00, 0x00, 0x00, /* Pacific/Pohnpei */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x46, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x98, 0x11, 0x95, 0xD0, 0xA0, 0x39, 0xF9, 0xF0, 0xC1, 0xED, 0x35, 0xD0, 0xC9, 0xEA, 0x0A, 0x60, -0xD2, 0x11, 0x0E, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0x01, 0xFF, -0xFF, 0x42, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xB9, -0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x20, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, 0x95, -0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, -0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x04, 0x03, 0x02, -0x02, 0xFF, 0xFF, 0x42, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x94, 0x54, 0x00, 0x00, 0x00, 0x00, 0x9A, -0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, -0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, -0x93, 0xF5, 0x9A, 0x02, 0x04, 0x13, 0xE2, 0x00, 0x00, 0x00, 0x0E, 0x50, 0x6F, 0x68, 0x6E, 0x70, -0x65, 0x69, 0x2F, 0x50, 0x6F, 0x6E, 0x61, 0x70, 0x65, +0xD2, 0x11, 0x0E, 0xF0, 0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0xFF, 0xFF, 0x42, 0xD4, 0x00, 0x00, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, +0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, +0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xB9, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, +0x7E, 0x36, 0x20, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, 0x95, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, +0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x01, 0x02, 0x03, 0x02, +0x04, 0x03, 0x02, 0xFF, 0xFF, 0x42, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x94, 0x54, 0x00, 0x00, 0x00, +0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, +0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, +0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, +0x0A, 0x00, 0x93, 0xF5, 0x9A, 0x02, 0x04, 0x13, 0xE2, 0x00, 0x00, 0x00, 0x0E, 0x50, 0x6F, 0x68, +0x6E, 0x70, 0x65, 0x69, 0x2F, 0x50, 0x6F, 0x6E, 0x61, 0x70, 0x65, /* Pacific/Ponape */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, -0x98, 0x11, 0x95, 0xD0, 0xA0, 0x39, 0xF9, 0xF0, 0xC1, 0xED, 0x35, 0xD0, 0xC9, 0xEA, 0x0A, 0x60, -0xD2, 0x11, 0x0E, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x03, 0x02, 0x01, 0x01, 0xFF, -0xFF, 0x42, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, -0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, -0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x4F, 0x33, 0x8C, +0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x31, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, 0xB9, -0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x20, 0xAC, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, 0x95, -0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC1, 0xED, 0x35, -0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, 0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x04, 0x03, 0x02, -0x02, 0xFF, 0xFF, 0x42, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x94, 0x54, 0x00, 0x00, 0x00, 0x00, 0x9A, -0xB0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x0C, 0x00, -0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x2B, 0x30, 0x39, -0x00, 0x2B, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x4F, 0x33, 0x8C, 0x01, 0x00, 0x00, 0x95, 0xF4, 0x00, 0x00, +0x00, 0x00, 0x9A, 0xB0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x31, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x31, 0x3E, 0x2D, 0x31, 0x31, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, /* Pacific/Port_Moresby */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x03, 0x00, 0x00, 0x00, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, -0xFF, 0xFF, 0x72, 0xED, 0xA4, 0x90, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, -0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x8C, -0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, -0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x7A, 0xD5, 0x50, 0x01, 0xF3, -0x37, 0x7A, 0x00, 0x00, 0x00, 0x1D, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4E, 0x65, 0x77, 0x20, -0x47, 0x75, 0x69, 0x6E, 0x65, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, 0x72, 0x65, -0x61, 0x73, 0x29, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, +0x90, 0x01, 0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, +0x00, 0x8C, 0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, +0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x7A, 0xD5, 0x50, +0x01, 0xF3, 0x37, 0x7A, 0x00, 0x00, 0x00, 0x1D, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4E, 0x65, +0x77, 0x20, 0x47, 0x75, 0x69, 0x6E, 0x65, 0x61, 0x20, 0x28, 0x6D, 0x6F, 0x73, 0x74, 0x20, 0x61, +0x72, 0x65, 0x61, 0x73, 0x29, /* Pacific/Rarotonga */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x43, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0x80, 0x00, 0x00, 0x00, 0xDF, 0xA1, 0x60, 0xC8, 0x10, 0xAC, 0x1B, 0x28, 0x11, 0x3F, 0xB5, 0x18, 0x12, 0x79, 0x81, 0x20, 0x13, 0x1F, 0x97, 0x18, 0x14, 0x59, 0x63, 0x20, 0x14, 0xFF, 0x79, 0x18, 0x16, 0x39, 0x45, 0x20, 0x16, 0xE8, 0x95, 0x98, 0x18, 0x22, 0x61, 0xA0, 0x18, 0xC8, 0x77, 0x98, 0x1A, 0x02, 0x43, 0xA0, 0x1A, 0xA8, 0x59, 0x98, 0x1B, 0xE2, 0x25, 0xA0, 0x1C, 0x88, 0x3B, 0x98, 0x1D, 0xC2, 0x07, 0xA0, 0x1E, 0x68, 0x1D, 0x98, 0x1F, 0xA1, 0xE9, 0xA0, 0x20, 0x47, 0xFF, 0x98, 0x21, 0x81, 0xCB, 0xA0, 0x22, 0x31, 0x1C, 0x18, 0x23, 0x6A, 0xE8, 0x20, 0x24, 0x10, 0xFE, 0x18, 0x25, 0x4A, 0xCA, 0x20, -0x25, 0xF0, 0xE0, 0x18, 0x27, 0x2A, 0xAC, 0x20, 0x27, 0xD0, 0xC2, 0x18, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, -0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x03, 0x00, 0x00, 0xBB, -0xB8, 0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x04, 0xFF, -0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, -0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, -0x4C, 0xDC, 0xC8, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xA1, 0x60, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x10, -0xAC, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3F, 0xB5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x12, -0x79, 0x81, 0x20, 0x00, 0x00, 0x00, 0x00, 0x13, 0x1F, 0x97, 0x18, 0x00, 0x00, 0x00, 0x00, 0x14, -0x59, 0x63, 0x20, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0x79, 0x18, 0x00, 0x00, 0x00, 0x00, 0x16, -0x39, 0x45, 0x20, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE8, 0x95, 0x98, 0x00, 0x00, 0x00, 0x00, 0x18, -0x22, 0x61, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x18, 0xC8, 0x77, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1A, -0x02, 0x43, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xA8, 0x59, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1B, -0xE2, 0x25, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x88, 0x3B, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1D, -0xC2, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x68, 0x1D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1F, -0xA1, 0xE9, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x47, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x21, -0x81, 0xCB, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x31, 0x1C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x23, -0x6A, 0xE8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x24, 0x10, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00, 0x25, -0x4A, 0xCA, 0x20, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF0, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x27, -0x2A, 0xAC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x27, 0xD0, 0xC2, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, -0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x03, -0x00, 0x00, 0xBB, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, -0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, -0x54, 0x00, 0x2D, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, -0x30, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x68, 0xED, 0xFA, 0x00, -0x1E, 0xDF, 0xA5, 0x00, 0x00, 0x00, 0x00, +0x25, 0xF0, 0xE0, 0x18, 0x27, 0x2A, 0xAC, 0x20, 0x27, 0xD0, 0xC2, 0x18, 0x01, 0x02, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x00, 0x00, 0xBB, 0xB8, 0x00, 0x00, 0xFF, 0xFF, +0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0x6C, 0x58, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, +0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x33, 0x30, 0x00, +0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, 0x39, 0x33, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, +0x00, 0x05, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x4C, 0xDC, 0xC8, 0xFF, 0xFF, +0xFF, 0xFF, 0xDF, 0xA1, 0x60, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x10, 0xAC, 0x1B, 0x28, 0x00, 0x00, +0x00, 0x00, 0x11, 0x3F, 0xB5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x12, 0x79, 0x81, 0x20, 0x00, 0x00, +0x00, 0x00, 0x13, 0x1F, 0x97, 0x18, 0x00, 0x00, 0x00, 0x00, 0x14, 0x59, 0x63, 0x20, 0x00, 0x00, +0x00, 0x00, 0x14, 0xFF, 0x79, 0x18, 0x00, 0x00, 0x00, 0x00, 0x16, 0x39, 0x45, 0x20, 0x00, 0x00, +0x00, 0x00, 0x16, 0xE8, 0x95, 0x98, 0x00, 0x00, 0x00, 0x00, 0x18, 0x22, 0x61, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x18, 0xC8, 0x77, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x02, 0x43, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x1A, 0xA8, 0x59, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE2, 0x25, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x1C, 0x88, 0x3B, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC2, 0x07, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x1E, 0x68, 0x1D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA1, 0xE9, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x20, 0x47, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x21, 0x81, 0xCB, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x22, 0x31, 0x1C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x23, 0x6A, 0xE8, 0x20, 0x00, 0x00, +0x00, 0x00, 0x24, 0x10, 0xFE, 0x18, 0x00, 0x00, 0x00, 0x00, 0x25, 0x4A, 0xCA, 0x20, 0x00, 0x00, +0x00, 0x00, 0x25, 0xF0, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x27, 0x2A, 0xAC, 0x20, 0x00, 0x00, +0x00, 0x00, 0x27, 0xD0, 0xC2, 0x18, 0x01, 0x02, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, +0x04, 0x03, 0x00, 0x00, 0xBB, 0xB8, 0x00, 0x00, 0xFF, 0xFF, 0x6A, 0x38, 0x00, 0x00, 0xFF, 0xFF, +0x6C, 0x58, 0x00, 0x04, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x0A, 0xFF, 0xFF, 0x7A, 0x68, 0x01, 0x0E, +0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x33, 0x30, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x2D, 0x30, +0x39, 0x33, 0x30, 0x00, 0x0A, 0x3C, 0x2D, 0x31, 0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x68, 0xED, +0xFA, 0x00, 0x1E, 0xDF, 0xA5, 0x00, 0x00, 0x00, 0x00, /* Pacific/Saipan */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4D, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -66465,127 +66492,110 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Pacific/Tahiti */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x50, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x50, 0x55, 0xB8, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x73, 0xC8, 0x00, 0x00, 0xFF, 0xFF, 0x73, 0x60, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x94, 0x50, 0x55, 0xB8, +0x01, 0xFF, 0xFF, 0x73, 0xC8, 0x00, 0x00, 0xFF, 0xFF, 0x73, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2D, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x50, 0x55, 0xB8, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0xFF, 0xFF, 0x73, 0xC8, 0x00, 0x00, 0xFF, 0xFF, -0x73, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x0A, 0x3C, 0x2D, 0x31, -0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x6E, 0x93, 0x4A, 0x00, 0x2E, 0x70, 0x05, 0x00, 0x00, 0x00, -0x0F, 0x53, 0x6F, 0x63, 0x69, 0x65, 0x74, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, 0x73, - +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x94, 0x50, 0x55, 0xB8, 0x01, 0xFF, 0xFF, 0x73, 0xC8, 0x00, 0x00, +0xFF, 0xFF, 0x73, 0x60, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2D, 0x31, 0x30, 0x00, 0x0A, 0x3C, +0x2D, 0x31, 0x30, 0x3E, 0x31, 0x30, 0x0A, 0x00, 0x6E, 0x93, 0x4A, 0x00, 0x2E, 0x70, 0x05, 0x00, +0x00, 0x00, 0x0F, 0x53, 0x6F, 0x63, 0x69, 0x65, 0x74, 0x79, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, +0x64, 0x73, /* Pacific/Tarawa */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x4B, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0xA2, 0x34, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0xA2, 0x34, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x12, 0xCC, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0xA2, 0x34, 0x00, 0x00, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, -0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x8B, 0x7D, 0xA2, 0x02, 0x1A, 0xA2, 0xA0, 0x00, 0x00, -0x00, 0x0F, 0x47, 0x69, 0x6C, 0x62, 0x65, 0x72, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, -0x73, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x12, 0xCC, 0x01, 0x00, 0x00, 0xA2, 0x34, 0x00, 0x00, +0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x8B, 0x7D, 0xA2, 0x02, 0x1A, 0xA2, 0xA0, +0x00, 0x00, 0x00, 0x0F, 0x47, 0x69, 0x6C, 0x62, 0x65, 0x72, 0x74, 0x20, 0x49, 0x73, 0x6C, 0x61, +0x6E, 0x64, 0x73, /* Pacific/Tongatapu */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x54, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xD2, 0x45, 0x9C, 0x40, +0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xD2, 0x45, 0x9C, 0x40, 0xEF, 0x11, 0xE0, 0x10, 0x37, 0xFB, 0x47, 0xD0, 0x38, 0xD3, 0x7D, 0xD0, 0x3A, 0x04, 0x08, 0x50, 0x3A, 0x72, 0xB8, 0x40, 0x3B, 0xE3, 0xEA, 0x50, 0x3C, 0x52, 0x9A, 0x40, 0x58, 0x1D, 0xD7, 0xD0, -0x58, 0x7A, 0x20, 0xD0, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, -0x05, 0x02, 0x02, 0x00, 0x00, 0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, -0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, -0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x32, 0x30, -0x00, 0x2B, 0x31, 0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, -0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, -0x45, 0x9C, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x11, 0xE0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x37, -0xFB, 0x47, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x38, 0xD3, 0x7D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3A, -0x04, 0x08, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x72, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3B, -0xE3, 0xEA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x52, 0x9A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, -0x1D, 0xD7, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x58, 0x7A, 0x20, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x02, 0x00, 0x00, +0x58, 0x7A, 0x20, 0xD0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, 0x00, 0x00, 0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x32, 0x30, 0x00, 0x2B, 0x31, 0x33, 0x00, -0x2B, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x33, 0x3E, -0x2D, 0x31, 0x33, 0x0A, 0x00, 0x69, 0x15, 0x0A, 0x00, 0x07, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, - +0x2B, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, +0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x45, 0x9C, 0x40, 0xFF, 0xFF, +0xFF, 0xFF, 0xEF, 0x11, 0xE0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFB, 0x47, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x38, 0xD3, 0x7D, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x04, 0x08, 0x50, 0x00, 0x00, +0x00, 0x00, 0x3A, 0x72, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xE3, 0xEA, 0x50, 0x00, 0x00, +0x00, 0x00, 0x3C, 0x52, 0x9A, 0x40, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1D, 0xD7, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x58, 0x7A, 0x20, 0xD0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x02, 0x05, 0x02, 0x05, 0x02, +0x00, 0x00, 0xAD, 0x40, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x70, 0x00, 0x04, 0x00, 0x00, 0xB6, 0xD0, +0x00, 0x0A, 0x00, 0x00, 0xC4, 0xE0, 0x01, 0x0E, 0x00, 0x00, 0xB6, 0xD0, 0x00, 0x0A, 0x00, 0x00, +0xC4, 0xE0, 0x01, 0x0E, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x32, 0x30, 0x00, 0x2B, 0x31, +0x33, 0x00, 0x2B, 0x31, 0x34, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x31, +0x33, 0x3E, 0x2D, 0x31, 0x33, 0x0A, 0x00, 0x69, 0x15, 0x0A, 0x00, 0x07, 0x53, 0x00, 0x00, 0x00, +0x00, 0x00, /* Pacific/Truk */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, -0x98, 0x11, 0xA3, 0xE0, 0xA0, 0x39, 0xF9, 0xF0, 0xC9, 0xEA, 0x0A, 0x60, 0xD2, 0x11, 0x0E, 0xF0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, -0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, -0xBF, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x26, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, -0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, -0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, 0x00, -0x00, 0x8E, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, +0x90, 0x01, 0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, +0x00, 0x8C, 0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, +0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Pacific/Wake */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x55, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x9C, 0x34, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x9C, 0x34, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x18, 0xCC, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0x9C, 0x34, 0x00, 0x00, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, -0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0xA6, 0xC0, 0xCD, 0x02, 0x10, 0xE5, 0x22, 0x00, 0x00, -0x00, 0x0B, 0x57, 0x61, 0x6B, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x18, 0xCC, 0x01, 0x00, 0x00, 0x9C, 0x34, 0x00, 0x00, +0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0xA6, 0xC0, 0xCD, 0x02, 0x10, 0xE5, 0x22, +0x00, 0x00, 0x00, 0x0B, 0x57, 0x61, 0x6B, 0x65, 0x20, 0x49, 0x73, 0x6C, 0x61, 0x6E, 0x64, /* Pacific/Wallis */ 0x50, 0x48, 0x50, 0x32, 0x01, 0x57, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0xAC, 0x58, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0xAC, 0x58, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x32, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, -0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x08, 0xA8, 0x00, 0x00, -0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0x00, 0xAC, 0x58, 0x00, 0x00, 0x00, 0x00, -0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, 0x2B, 0x31, -0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x75, 0x08, 0xF0, 0x00, 0x05, 0xD9, 0x65, 0x00, 0x00, -0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, +0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x08, 0xA8, 0x01, 0x00, 0x00, 0xAC, 0x58, 0x00, 0x00, +0x00, 0x00, 0xA8, 0xC0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x32, 0x00, 0x0A, 0x3C, +0x2B, 0x31, 0x32, 0x3E, 0x2D, 0x31, 0x32, 0x0A, 0x00, 0x75, 0x08, 0xF0, 0x00, 0x05, 0xD9, 0x65, +0x00, 0x00, 0x00, 0x00, /* Pacific/Yap */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, -0x98, 0x11, 0xA3, 0xE0, 0xA0, 0x39, 0xF9, 0xF0, 0xC9, 0xEA, 0x0A, 0x60, 0xD2, 0x11, 0x0E, 0xF0, -0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x01, 0x02, 0x01, 0x01, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, -0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x00, 0x00, 0x8C, 0xA0, -0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, 0x54, 0x5A, -0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, +0x00, 0x2B, 0x31, 0x30, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0xE1, -0xBF, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x26, 0xB4, 0xFF, 0xFF, 0xFF, 0xFF, 0x98, 0x11, -0xA3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x39, 0xF9, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0xEA, -0x0A, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x11, 0x0E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, -0xFF, 0xFF, 0x01, 0x02, 0x03, 0x02, 0x03, 0x02, 0x02, 0xFF, 0xFF, 0x3C, 0xCC, 0x00, 0x00, 0x00, -0x00, 0x8E, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x90, 0x00, -0x08, 0x00, 0x00, 0x8C, 0xA0, 0x00, 0x04, 0x4C, 0x4D, 0x54, 0x00, 0x2B, 0x31, 0x30, 0x00, 0x2B, -0x30, 0x39, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, +0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0x5A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0xED, 0xA4, +0x90, 0x01, 0x02, 0x00, 0x00, 0x89, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x00, 0x04, 0x00, +0x00, 0x8C, 0xA0, 0x00, 0x09, 0x4C, 0x4D, 0x54, 0x00, 0x50, 0x4D, 0x4D, 0x54, 0x00, 0x2B, 0x31, +0x30, 0x00, 0x0A, 0x3C, 0x2B, 0x31, 0x30, 0x3E, 0x2D, 0x31, 0x30, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Poland */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -67260,34 +67270,33 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { /* Singapore */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x86, 0x83, 0x85, 0xA3, 0xBA, 0x67, 0x4E, 0x90, 0xC0, 0x0A, 0xE4, 0x60, 0xCA, 0xB3, 0xE5, 0x60, -0xCB, 0x91, 0x5F, 0x08, 0xD2, 0x48, 0x6D, 0xF0, 0x16, 0x91, 0xF5, 0x08, 0x7F, 0xFF, 0xFF, 0xFF, -0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x07, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, -0x00, 0x61, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, -0x0C, 0x00, 0x00, 0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, -0x90, 0x00, 0x18, 0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, -0x00, 0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, -0x00, 0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, -0x08, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x53, 0xA3, 0xFF, 0xFF, 0xFF, -0xFF, 0x86, 0x83, 0x85, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x4E, 0x90, 0xFF, 0xFF, 0xFF, -0xFF, 0xC0, 0x0A, 0xE4, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xB3, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0x91, 0x5F, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x16, 0x91, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x03, -0x04, 0x05, 0x06, 0x05, 0x07, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x61, 0x5D, -0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, 0x00, 0x00, -0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x18, -0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2B, 0x30, -0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, -0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, 0x0A, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xCB, 0x91, 0x5F, 0x08, 0xD2, 0x48, 0x6D, 0xF0, 0x16, 0x91, 0xF5, 0x08, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x05, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x04, +0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, 0x00, 0x00, 0x67, 0x20, +0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, 0x00, 0x18, 0x00, 0x00, +0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, 0x2B, 0x30, 0x37, 0x00, +0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, 0x2B, 0x30, 0x39, 0x00, +0x2B, 0x30, 0x38, 0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x36, 0x53, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0x86, 0x83, 0x85, 0xA3, +0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x67, 0x4E, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0A, 0xE4, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xB3, 0xE5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0x91, 0x5F, 0x08, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x48, 0x6D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x16, 0x91, 0xF5, 0x08, +0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x05, 0x07, 0x00, 0x00, 0x61, 0x5D, 0x00, 0x00, 0x00, 0x00, +0x61, 0x5D, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x08, 0x00, 0x00, 0x67, 0x20, 0x01, 0x0C, +0x00, 0x00, 0x67, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x69, 0x78, 0x00, 0x12, 0x00, 0x00, 0x7E, 0x90, +0x00, 0x18, 0x00, 0x00, 0x70, 0x80, 0x00, 0x1C, 0x4C, 0x4D, 0x54, 0x00, 0x53, 0x4D, 0x54, 0x00, +0x2B, 0x30, 0x37, 0x00, 0x2B, 0x30, 0x37, 0x32, 0x30, 0x00, 0x2B, 0x30, 0x37, 0x33, 0x30, 0x00, +0x2B, 0x30, 0x39, 0x00, 0x2B, 0x30, 0x38, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x38, 0x3E, 0x2D, 0x38, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Turkey */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x90, 0x8B, 0xF5, 0x98, 0x9B, 0x0C, 0x17, 0x60, 0x9B, 0xD5, 0xBE, 0xD0, 0xA2, 0x65, 0x63, 0xE0, 0xA3, 0x7B, 0x82, 0x50, 0xA4, 0x4E, 0x80, 0x60, 0xA5, 0x3F, 0xB4, 0xD0, 0xA6, 0x25, 0x27, 0xE0, 0xA7, 0x27, 0x7F, 0xD0, 0xAA, 0x28, 0x28, 0x60, 0xAA, 0xE1, 0xFD, 0xD0, 0xAB, 0xF9, 0x89, 0xE0, @@ -67316,98 +67325,97 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { 0x4B, 0xAE, 0xAA, 0x10, 0x4C, 0xCC, 0xBF, 0x90, 0x4D, 0x8F, 0xDD, 0x90, 0x4E, 0xAC, 0xA1, 0x90, 0x4F, 0x6E, 0x6E, 0x10, 0x50, 0x8C, 0x83, 0x90, 0x51, 0x57, 0x8A, 0x90, 0x52, 0x6C, 0x65, 0x90, 0x53, 0x38, 0xBE, 0x10, 0x54, 0x4C, 0x47, 0x90, 0x55, 0x17, 0x4E, 0x90, 0x56, 0x3E, 0x9E, 0x90, -0x56, 0xF7, 0x30, 0x90, 0x57, 0xCF, 0x2E, 0x50, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, 0x03, +0x56, 0xF7, 0x30, 0x90, 0x57, 0xCF, 0x2E, 0x50, 0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, -0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, 0x06, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, -0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, -0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, 0x04, -0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, -0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, -0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, -0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, -0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, -0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x00, 0x54, 0x5A, 0x69, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, -0xFF, 0x56, 0xB6, 0xC8, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x8B, 0xF5, 0x98, 0xFF, 0xFF, 0xFF, -0xFF, 0x9B, 0x0C, 0x17, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xBE, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xA2, 0x65, 0x63, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x7B, 0x82, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xA4, 0x4E, 0x80, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3F, 0xB4, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xA6, 0x25, 0x27, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x27, 0x7F, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAA, 0x28, 0x28, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE1, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xAB, 0xF9, 0x89, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x31, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xC8, 0x81, 0x3F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x13, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xC9, 0x4A, 0xF5, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCE, 0x80, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xCB, 0xCB, 0xAE, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x6B, 0x09, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xD3, 0xA2, 0x39, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x02, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xD5, 0x4C, 0x0D, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0x7B, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD7, 0x2B, 0xEF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x5D, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xD9, 0x02, 0x97, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x3F, 0xD0, 0xFF, 0xFF, 0xFF, -0xFF, 0xDA, 0xEB, 0xB3, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xD2, 0x5C, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xDC, 0xD4, 0xD0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x3E, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xF1, 0xF4, 0xB9, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x62, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, -0xFF, 0xF5, 0x68, 0x06, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x38, 0xD0, 0x00, 0x00, 0x00, -0x00, 0x06, 0x6E, 0x93, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0x39, 0x9A, 0x70, 0x00, 0x00, 0x00, -0x00, 0x07, 0xFB, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x7C, 0x70, 0x00, 0x00, 0x00, -0x00, 0x09, 0xD0, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF9, 0x5E, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0B, 0xB1, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0x40, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0D, 0xA4, 0x55, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xA6, 0xAD, 0x70, 0x00, 0x00, 0x00, -0x00, 0x0F, 0x84, 0x37, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x11, 0x50, 0x00, 0x00, 0x00, -0x00, 0x19, 0x89, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x19, 0xDC, 0xB0, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x1B, 0xE6, 0xD0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xC6, 0xEF, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x1D, 0x9B, 0x31, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x7C, 0x64, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x21, 0x5C, 0x46, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x23, 0x3C, 0x28, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x25, 0x1C, 0x0A, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x27, 0x05, 0x27, 0x70, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, -0x00, 0x28, 0xE5, 0x09, 0x70, 0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2A, 0xC4, 0xEB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, -0x00, 0x2C, 0xA4, 0xCD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x83, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x2E, 0x84, 0xAF, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, -0x00, 0x30, 0x64, 0x91, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x32, 0x72, 0x97, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x34, 0x52, 0x79, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x36, 0x32, 0x5B, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x38, 0x1B, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x39, 0xFB, 0x5A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x3B, 0xDB, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3D, 0xBB, 0x1E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, -0x00, 0x3F, 0x9B, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, -0x00, 0x41, 0x84, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, -0x00, 0x43, 0x63, 0xFE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, -0x00, 0x45, 0x43, 0xE0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, -0x00, 0x47, 0x23, 0xDF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, -0x00, 0x49, 0x03, 0xC1, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, -0x00, 0x4A, 0xE3, 0xA3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, -0x00, 0x4C, 0xCC, 0xBF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x8F, 0xDD, 0x90, 0x00, 0x00, 0x00, -0x00, 0x4E, 0xAC, 0xA1, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, -0x00, 0x50, 0x8C, 0x83, 0x90, 0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, -0x00, 0x52, 0x6C, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x53, 0x38, 0xBE, 0x10, 0x00, 0x00, 0x00, -0x00, 0x54, 0x4C, 0x47, 0x90, 0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, -0x00, 0x56, 0x3E, 0x9E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, -0x00, 0x57, 0xCF, 0x2E, 0x50, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, -0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, 0x05, 0x04, 0x03, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, -0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, -0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, -0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, -0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, -0x00, 0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, -0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, -0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, -0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, +0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x15, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, +0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, +0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, 0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, +0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x54, 0x5A, 0x69, 0x66, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, +0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0xB6, 0xC8, 0xD8, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x8B, 0xF5, 0x98, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x0C, 0x17, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0xD5, 0xBE, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x65, 0x63, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA3, 0x7B, 0x82, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x4E, 0x80, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xA5, 0x3F, 0xB4, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xA6, 0x25, 0x27, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xA7, 0x27, 0x7F, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0x28, 0x28, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xE1, 0xFD, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xAB, 0xF9, 0x89, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xAC, 0xC3, 0x31, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x81, 0x3F, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x01, 0x13, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x4A, 0xF5, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0xCE, 0x80, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xCB, 0xCB, 0xAE, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x6B, 0x09, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0xA2, 0x39, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x43, 0x02, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xD5, 0x4C, 0x0D, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x29, 0x7B, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD7, 0x2B, 0xEF, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x09, 0x5D, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x02, 0x97, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0xE9, 0x3F, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0xEB, 0xB3, 0xE0, +0xFF, 0xFF, 0xFF, 0xFF, 0xDB, 0xD2, 0x5C, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0xD4, 0xD0, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xDD, 0xB2, 0x3E, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF4, 0xB9, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x62, 0xEF, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0x68, 0x06, 0x60, +0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x1F, 0x38, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x6E, 0x93, 0x70, +0x00, 0x00, 0x00, 0x00, 0x07, 0x39, 0x9A, 0x70, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFB, 0x75, 0x00, +0x00, 0x00, 0x00, 0x00, 0x09, 0x19, 0x7C, 0x70, 0x00, 0x00, 0x00, 0x00, 0x09, 0xD0, 0xCB, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0A, 0xF9, 0x5E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xB1, 0xFE, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0C, 0xD9, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xA4, 0x55, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0E, 0xA6, 0xAD, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x37, 0x80, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x11, 0x50, 0x00, 0x00, 0x00, 0x00, 0x19, 0x89, 0xB0, 0x70, +0x00, 0x00, 0x00, 0x00, 0x19, 0xDC, 0xB0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE6, 0xD0, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xC6, 0xEF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x9B, 0x31, 0x70, +0x00, 0x00, 0x00, 0x00, 0x1E, 0x8C, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x64, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x20, 0x6C, 0x55, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x21, 0x5C, 0x46, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x22, 0x4C, 0x37, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x23, 0x3C, 0x28, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x24, 0x2C, 0x19, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x25, 0x1C, 0x0A, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x26, 0x0B, 0xFB, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x27, 0x05, 0x27, 0x70, +0x00, 0x00, 0x00, 0x00, 0x27, 0xF5, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x28, 0xE5, 0x09, 0x70, +0x00, 0x00, 0x00, 0x00, 0x29, 0xD4, 0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xC4, 0xEB, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2B, 0xB4, 0xDC, 0x70, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xA4, 0xCD, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x8B, 0x83, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x84, 0xAF, 0x70, +0x00, 0x00, 0x00, 0x00, 0x2F, 0x74, 0xA0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x30, 0x64, 0x91, 0x70, +0x00, 0x00, 0x00, 0x00, 0x31, 0x5D, 0xBC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x32, 0x72, 0x97, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x33, 0x3D, 0x9E, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x34, 0x52, 0x79, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x35, 0x1D, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x36, 0x32, 0x5B, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x36, 0xFD, 0x62, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1B, 0x78, 0x70, +0x00, 0x00, 0x00, 0x00, 0x38, 0xDD, 0x44, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFB, 0x5A, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3A, 0xBD, 0x26, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xDB, 0x3C, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3C, 0xA6, 0x43, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xBB, 0x1E, 0x70, +0x00, 0x00, 0x00, 0x00, 0x3E, 0x86, 0x25, 0x70, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9B, 0x00, 0x70, +0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x41, 0x84, 0x1C, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x42, 0x45, 0xE9, 0x70, 0x00, 0x00, 0x00, 0x00, 0x43, 0x63, 0xFE, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x44, 0x25, 0xCB, 0x70, 0x00, 0x00, 0x00, 0x00, 0x45, 0x43, 0xE0, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x46, 0x05, 0xC9, 0x90, 0x00, 0x00, 0x00, 0x00, 0x47, 0x23, 0xDF, 0x10, +0x00, 0x00, 0x00, 0x00, 0x47, 0xEE, 0xE6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x49, 0x03, 0xC1, 0x10, +0x00, 0x00, 0x00, 0x00, 0x49, 0xCE, 0xC8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xE3, 0xA3, 0x10, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xAE, 0xAA, 0x10, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xCC, 0xBF, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4D, 0x8F, 0xDD, 0x90, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xAC, 0xA1, 0x90, +0x00, 0x00, 0x00, 0x00, 0x4F, 0x6E, 0x6E, 0x10, 0x00, 0x00, 0x00, 0x00, 0x50, 0x8C, 0x83, 0x90, +0x00, 0x00, 0x00, 0x00, 0x51, 0x57, 0x8A, 0x90, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6C, 0x65, 0x90, +0x00, 0x00, 0x00, 0x00, 0x53, 0x38, 0xBE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x54, 0x4C, 0x47, 0x90, +0x00, 0x00, 0x00, 0x00, 0x55, 0x17, 0x4E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x56, 0x3E, 0x9E, 0x90, +0x00, 0x00, 0x00, 0x00, 0x56, 0xF7, 0x30, 0x90, 0x00, 0x00, 0x00, 0x00, 0x57, 0xCF, 0x2E, 0x50, +0x01, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, +0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x03, 0x02, 0x04, +0x05, 0x04, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, +0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x08, +0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, 0x09, 0x08, +0x09, 0x08, 0x04, 0x00, 0x00, 0x1B, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x68, 0x00, 0x04, 0x00, +0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x00, +0x11, 0x00, 0x00, 0x38, 0x40, 0x01, 0x15, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, +0x20, 0x00, 0x0D, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x0D, 0x00, +0x00, 0x2A, 0x30, 0x00, 0x11, 0x4C, 0x4D, 0x54, 0x00, 0x49, 0x4D, 0x54, 0x00, 0x45, 0x45, 0x53, +0x54, 0x00, 0x45, 0x45, 0x54, 0x00, 0x2B, 0x30, 0x33, 0x00, 0x2B, 0x30, 0x34, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x01, 0x00, 0x0A, 0x3C, 0x2B, 0x30, 0x33, 0x3E, 0x2D, 0x33, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* UCT */ 0x50, 0x48, 0x50, 0x32, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -69237,4 +69245,4 @@ const unsigned char timelib_timezone_db_data_builtin[701301] = { }; #endif -const timelib_tzdb timezonedb_builtin = { "2022.5", 596, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2022.6", 596, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; From 8dabbda8bc2479db499e355e021561c75c2e59e1 Mon Sep 17 00:00:00 2001 From: Florian Sowade Date: Mon, 24 Oct 2022 21:37:54 +0200 Subject: [PATCH 1330/1346] =?UTF-8?q?Don=E2=80=99t=20reset=20func=20in=20z?= =?UTF-8?q?end=5Fclosure=5Finternal=5Fhandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pointer is used in _zend_observe_fcall_begin(). --- Zend/zend_closures.c | 1 - Zend/zend_observer.c | 2 ++ ext/zend_test/tests/observer_closure_03.phpt | 26 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 ext/zend_test/tests/observer_closure_03.phpt diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index f697f25a0f802..2cad01772245e 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -696,7 +696,6 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */ zend_closure *closure = (zend_closure*)ZEND_CLOSURE_OBJECT(EX(func)); closure->orig_internal_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); OBJ_RELEASE((zend_object*)closure); - EX(func) = NULL; } /* }}} */ diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c index f699ea714d83b..79929bfdd80e5 100644 --- a/Zend/zend_observer.c +++ b/Zend/zend_observer.c @@ -208,6 +208,7 @@ ZEND_API bool zend_observer_remove_end_handler(zend_function *function, zend_obs static inline zend_execute_data **prev_observed_frame(zend_execute_data *execute_data) { zend_function *func = EX(func); + ZEND_ASSERT(func); return (zend_execute_data **)&Z_PTR_P(EX_VAR_NUM((ZEND_USER_CODE(func->type) ? func->op_array.last_var : ZEND_CALL_NUM_ARGS(execute_data)) + func->common.T - 1)); } @@ -260,6 +261,7 @@ ZEND_API void ZEND_FASTCALL zend_observer_fcall_begin(zend_execute_data *execute static inline void call_end_observers(zend_execute_data *execute_data, zval *return_value) { zend_function *func = execute_data->func; + ZEND_ASSERT(func); zend_observer_fcall_end_handler *handler = (zend_observer_fcall_end_handler *)&ZEND_OBSERVER_DATA(func) + zend_observers_fcall_list.count; // TODO: Fix exceptions from generators diff --git a/ext/zend_test/tests/observer_closure_03.phpt b/ext/zend_test/tests/observer_closure_03.phpt new file mode 100644 index 0000000000000..247dfb361f57d --- /dev/null +++ b/ext/zend_test/tests/observer_closure_03.phpt @@ -0,0 +1,26 @@ +--TEST-- +Observer: Observability of closures of builtin functions +--EXTENSIONS-- +zend_test +--INI-- +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +--FILE-- + +--EXPECTF-- + + + + + + + +int(4) + +DONE + From 1e3915c8c7d86f68b397a3f85b6bd7921f963c27 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 2 Nov 2022 11:41:19 +0100 Subject: [PATCH 1331/1346] Fix GH-9829: Bug in refactoring Windows shmat() function `shm->addr` cannot be `NULL` here, so the whole check is completely pointless. Given that this is merely a clean-up and not an actual bug fix, we do without a NEWS entry. Closes GH-9873. --- TSRM/tsrm_win32.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 81278d5ab4bd4..22e651739920a 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -691,13 +691,6 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags) } shm->addr = shm->descriptor + sizeof(shm->descriptor); - - if (NULL == shm->addr) { - int err = GetLastError(); - SET_ERRNO_FROM_WIN32_CODE(err); - return (void*)-1; - } - shm->descriptor->shm_atime = time(NULL); shm->descriptor->shm_lpid = getpid(); shm->descriptor->shm_nattch++; From b30448f48f6f1d84b15d3b2ace18933c9a206061 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 2 Nov 2022 15:28:53 +0100 Subject: [PATCH 1332/1346] Fix observing inherited internal functions Fixes GH-9871 --- Zend/zend_inheritance.c | 5 ++--- ext/opcache/zend_persist.c | 6 +++++- ext/zend_test/tests/gh9871.phpt | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 ext/zend_test/tests/gh9871.phpt diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 3eaaca3409a78..2d9970975785f 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -3135,13 +3135,11 @@ static zend_always_inline bool register_early_bound_ce(zval *delayed_early_bindi if (EXPECTED(!(ce->ce_flags & ZEND_ACC_PRELOADED))) { if (zend_hash_set_bucket_key(EG(class_table), (Bucket *)delayed_early_binding, lcname) != NULL) { Z_CE_P(delayed_early_binding) = ce; - zend_observer_class_linked_notify(ce, lcname); return true; } } else { /* If preloading is used, don't replace the existing bucket, add a new one. */ if (zend_hash_add_ptr(EG(class_table), lcname, ce) != NULL) { - zend_observer_class_linked_notify(ce, lcname); return true; } } @@ -3149,7 +3147,6 @@ static zend_always_inline bool register_early_bound_ce(zval *delayed_early_bindi return false; } if (zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL) { - zend_observer_class_linked_notify(ce, lcname); return true; } return false; @@ -3170,6 +3167,7 @@ ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_ if (UNEXPECTED(!register_early_bound_ce(delayed_early_binding, lcname, ret))) { return NULL; } + zend_observer_class_linked_notify(ret, lcname); return ret; } } else { @@ -3244,6 +3242,7 @@ ZEND_API zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_ if (ZSTR_HAS_CE_CACHE(ce->name)) { ZSTR_SET_CE_CACHE(ce->name, ce); } + zend_observer_class_linked_notify(ce, lcname); return ce; } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 91765676b3860..dcff7a7883289 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -723,7 +723,11 @@ static void zend_persist_class_method(zval *zv, zend_class_entry *ce) } } } - ZEND_MAP_PTR_NEW(op_array->run_time_cache); + // Real dynamically created internal functions like enum methods must have their own run_time_cache pointer. They're always on the same scope as their defining class. + // However, copies - as caused by inheritance of internal methods - must retain the original run_time_cache pointer, shared with the source function. + if (!op_array->scope || op_array->scope == ce) { + ZEND_MAP_PTR_NEW(op_array->run_time_cache); + } } } return; diff --git a/ext/zend_test/tests/gh9871.phpt b/ext/zend_test/tests/gh9871.phpt new file mode 100644 index 0000000000000..c2b6f359bd6d3 --- /dev/null +++ b/ext/zend_test/tests/gh9871.phpt @@ -0,0 +1,33 @@ +--TEST-- +Test observing inherited internal functions +--EXTENSIONS-- +zend_test +--INI-- +opcache.enable_cli=1 +zend_test.observer.enabled=1 +zend_test.observer.observe_all=1 +zend_test.observer.show_return_value=1 +--FILE-- +setAccessible(true); + +?> +--EXPECT-- + + + + + + + + + From 4935e10fc81c76c028cba9b6011b7d8ef9ae8ddf Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 2 Nov 2022 16:02:16 +0100 Subject: [PATCH 1333/1346] Fix hardcoded paths in test --- ext/zend_test/tests/gh9871.phpt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/zend_test/tests/gh9871.phpt b/ext/zend_test/tests/gh9871.phpt index c2b6f359bd6d3..d2915fff6f8c8 100644 --- a/ext/zend_test/tests/gh9871.phpt +++ b/ext/zend_test/tests/gh9871.phpt @@ -21,13 +21,13 @@ $property = new MyReflectionProperty('A', 'protected'); $property->setAccessible(true); ?> ---EXPECT-- - - +--EXPECTF-- + + - + From 8e49d7f32f3bf8e20a699bfef5c2b2591a56e8ec Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 2 Nov 2022 16:55:13 +0100 Subject: [PATCH 1334/1346] Delay releasing closures until after observer end --- Zend/zend_closures.c | 4 +++- ext/zend_test/tests/observer_closure_03.phpt | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 2cad01772245e..5bbc90029f921 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -695,7 +695,9 @@ static ZEND_NAMED_FUNCTION(zend_closure_internal_handler) /* {{{ */ { zend_closure *closure = (zend_closure*)ZEND_CLOSURE_OBJECT(EX(func)); closure->orig_internal_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); - OBJ_RELEASE((zend_object*)closure); + // Assign to EX(this) so that it is released after observer checks etc. + ZEND_ADD_CALL_FLAG(execute_data, ZEND_CALL_RELEASE_THIS); + Z_OBJ(EX(This)) = &closure->std; } /* }}} */ diff --git a/ext/zend_test/tests/observer_closure_03.phpt b/ext/zend_test/tests/observer_closure_03.phpt index 247dfb361f57d..e36cca4a84191 100644 --- a/ext/zend_test/tests/observer_closure_03.phpt +++ b/ext/zend_test/tests/observer_closure_03.phpt @@ -7,9 +7,7 @@ zend_test.observer.enabled=1 zend_test.observer.observe_all=1 --FILE-- --EXPECTF-- From fdd088fc81259a7f4e69bf9ad0b0dd79c640c458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Schr=C3=B6der?= Date: Mon, 3 Oct 2022 12:05:31 +0200 Subject: [PATCH 1335/1346] Properly deal with internal attributes used on promoted properties. Closes GH-9661 --- NEWS | 2 + Zend/zend_compile.c | 76 ++++++++++++------- ext/zend_test/test.c | 15 ++++ ext/zend_test/test.stub.php | 7 ++ ext/zend_test/test_arginfo.h | 37 ++++++++- .../attribute-promotion-parameter-only.phpt | 31 ++++++++ .../attribute-promotion-property-only.phpt | 31 ++++++++ 7 files changed, 169 insertions(+), 30 deletions(-) create mode 100644 ext/zend_test/tests/attribute-promotion-parameter-only.phpt create mode 100644 ext/zend_test/tests/attribute-promotion-property-only.phpt diff --git a/NEWS b/NEWS index 7c262a6d89834..1d52554c3377c 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ PHP NEWS . Fixed bug GH-9823 (Don’t reset func in zend_closure_internal_handler). (Florian Sowade) . Fixed potential NULL pointer dereference Windows shm*() functions. (cmb) + . Fix target validation for internal attributes with constructor property + promotion. (kooldev) - FPM: . Fixed bug GH-9754 (SaltStack (using Python subprocess) hangs when running diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5243eb608f333..fb1b6b5d9da32 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6589,8 +6589,9 @@ static bool zend_is_valid_default_value(zend_type type, zval *value) return 0; } -static void zend_compile_attributes(HashTable **attributes, zend_ast *ast, uint32_t offset, uint32_t target) /* {{{ */ -{ +static void zend_compile_attributes( + HashTable **attributes, zend_ast *ast, uint32_t offset, uint32_t target, uint32_t promoted +) /* {{{ */ { zend_attribute *attr; zend_internal_attribute *config; @@ -6616,8 +6617,20 @@ static void zend_compile_attributes(HashTable **attributes, zend_ast *ast, uint3 } zend_string *name = zend_resolve_class_name_ast(el->child[0]); + zend_string *lcname = zend_string_tolower_ex(name, false); zend_ast_list *args = el->child[1] ? zend_ast_get_list(el->child[1]) : NULL; + config = zend_internal_attribute_get(lcname); + zend_string_release(lcname); + + /* Exclude internal attributes that do not match on promoted properties. */ + if (config && !(target & (config->flags & ZEND_ATTRIBUTE_TARGET_ALL))) { + if (promoted & (config->flags & ZEND_ATTRIBUTE_TARGET_ALL)) { + zend_string_release(name); + continue; + } + } + uint32_t flags = (CG(active_op_array)->fn_flags & ZEND_ACC_STRICT_TYPES) ? ZEND_ATTRIBUTE_STRICT_TYPES : 0; attr = zend_add_attribute( @@ -6662,31 +6675,33 @@ static void zend_compile_attributes(HashTable **attributes, zend_ast *ast, uint3 } } - /* Validate attributes in a secondary loop (needed to detect repeated attributes). */ - ZEND_HASH_PACKED_FOREACH_PTR(*attributes, attr) { - if (attr->offset != offset || NULL == (config = zend_internal_attribute_get(attr->lcname))) { - continue; - } + if (*attributes != NULL) { + /* Validate attributes in a secondary loop (needed to detect repeated attributes). */ + ZEND_HASH_PACKED_FOREACH_PTR(*attributes, attr) { + if (attr->offset != offset || NULL == (config = zend_internal_attribute_get(attr->lcname))) { + continue; + } - if (!(target & (config->flags & ZEND_ATTRIBUTE_TARGET_ALL))) { - zend_string *location = zend_get_attribute_target_names(target); - zend_string *allowed = zend_get_attribute_target_names(config->flags); + if (!(target & (config->flags & ZEND_ATTRIBUTE_TARGET_ALL))) { + zend_string *location = zend_get_attribute_target_names(target); + zend_string *allowed = zend_get_attribute_target_names(config->flags); - zend_error_noreturn(E_ERROR, "Attribute \"%s\" cannot target %s (allowed targets: %s)", - ZSTR_VAL(attr->name), ZSTR_VAL(location), ZSTR_VAL(allowed) - ); - } + zend_error_noreturn(E_ERROR, "Attribute \"%s\" cannot target %s (allowed targets: %s)", + ZSTR_VAL(attr->name), ZSTR_VAL(location), ZSTR_VAL(allowed) + ); + } - if (!(config->flags & ZEND_ATTRIBUTE_IS_REPEATABLE)) { - if (zend_is_attribute_repeated(*attributes, attr)) { - zend_error_noreturn(E_ERROR, "Attribute \"%s\" must not be repeated", ZSTR_VAL(attr->name)); + if (!(config->flags & ZEND_ATTRIBUTE_IS_REPEATABLE)) { + if (zend_is_attribute_repeated(*attributes, attr)) { + zend_error_noreturn(E_ERROR, "Attribute \"%s\" must not be repeated", ZSTR_VAL(attr->name)); + } } - } - if (config->validator != NULL) { - config->validator(attr, target, CG(active_class_entry)); - } - } ZEND_HASH_FOREACH_END(); + if (config->validator != NULL) { + config->validator(attr, target, CG(active_class_entry)); + } + } ZEND_HASH_FOREACH_END(); + } } /* }}} */ @@ -6821,7 +6836,10 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32 arg_info->type = (zend_type) ZEND_TYPE_INIT_NONE(0); if (attributes_ast) { - zend_compile_attributes(&op_array->attributes, attributes_ast, i + 1, ZEND_ATTRIBUTE_TARGET_PARAMETER); + zend_compile_attributes( + &op_array->attributes, attributes_ast, i + 1, ZEND_ATTRIBUTE_TARGET_PARAMETER, + property_flags ? ZEND_ATTRIBUTE_TARGET_PROPERTY : 0 + ); } if (type_ast) { @@ -6927,7 +6945,7 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32 scope, name, &default_value, property_flags | ZEND_ACC_PROMOTED, doc_comment, type); if (attributes_ast) { zend_compile_attributes( - &prop->attributes, attributes_ast, 0, ZEND_ATTRIBUTE_TARGET_PROPERTY); + &prop->attributes, attributes_ast, 0, ZEND_ATTRIBUTE_TARGET_PROPERTY, ZEND_ATTRIBUTE_TARGET_PARAMETER); } } } @@ -7364,7 +7382,7 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) target = ZEND_ATTRIBUTE_TARGET_METHOD; } - zend_compile_attributes(&op_array->attributes, decl->child[4], 0, target); + zend_compile_attributes(&op_array->attributes, decl->child[4], 0, target, 0); } /* Do not leak the class scope into free standing functions, even if they are dynamically @@ -7546,7 +7564,7 @@ static void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t f info = zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, type); if (attr_ast) { - zend_compile_attributes(&info->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_PROPERTY); + zend_compile_attributes(&info->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_PROPERTY, 0); } } } @@ -7607,7 +7625,7 @@ static void zend_compile_class_const_decl(zend_ast *ast, uint32_t flags, zend_as c = zend_declare_class_constant_ex(ce, name, &value_zv, flags, doc_comment); if (attr_ast) { - zend_compile_attributes(&c->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_CLASS_CONST); + zend_compile_attributes(&c->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_CLASS_CONST, 0); } } } @@ -7869,7 +7887,7 @@ static void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel) CG(active_class_entry) = ce; if (decl->child[3]) { - zend_compile_attributes(&ce->attributes, decl->child[3], 0, ZEND_ATTRIBUTE_TARGET_CLASS); + zend_compile_attributes(&ce->attributes, decl->child[3], 0, ZEND_ATTRIBUTE_TARGET_CLASS, 0); } if (implements_ast) { @@ -8027,7 +8045,7 @@ static void zend_compile_enum_case(zend_ast *ast) zend_ast *attr_ast = ast->child[3]; if (attr_ast) { - zend_compile_attributes(&c->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_CLASS_CONST); + zend_compile_attributes(&c->attributes, attr_ast, 0, ZEND_ATTRIBUTE_TARGET_CLASS_CONST, 0); } } diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 5b5ac04c45807..96898d2d71f1c 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -39,6 +39,7 @@ static zend_class_entry *zend_test_child_class; static zend_class_entry *zend_test_trait; static zend_class_entry *zend_test_attribute; static zend_class_entry *zend_test_parameter_attribute; +static zend_class_entry *zend_test_property_attribute; static zend_class_entry *zend_test_class_with_method_with_parameter_attribute; static zend_class_entry *zend_test_child_class_with_method_with_parameter_attribute; static zend_class_entry *zend_test_forbid_dynamic_call; @@ -587,6 +588,17 @@ static ZEND_METHOD(ZendTestParameterAttribute, __construct) ZVAL_STR_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), parameter); } +static ZEND_METHOD(ZendTestPropertyAttribute, __construct) +{ + zend_string *parameter; + + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_STR(parameter) + ZEND_PARSE_PARAMETERS_END(); + + ZVAL_STR_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), parameter); +} + static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, no_override) { zend_string *parameter; @@ -688,6 +700,9 @@ PHP_MINIT_FUNCTION(zend_test) ZVAL_PSTRING(&attr->args[0].value, "value1"); } + zend_test_property_attribute = register_class_ZendTestPropertyAttribute(); + zend_mark_internal_attribute(zend_test_property_attribute); + zend_test_class_with_method_with_parameter_attribute = register_class_ZendTestClassWithMethodWithParameterAttribute(); { diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php index 47442dcaab48d..a0a042a8297df 100644 --- a/ext/zend_test/test.stub.php +++ b/ext/zend_test/test.stub.php @@ -66,6 +66,13 @@ final class ZendTestParameterAttribute { public function __construct(string $parameter) {} } + #[Attribute(Attribute::TARGET_PROPERTY)] + final class ZendTestPropertyAttribute { + public string $parameter; + + public function __construct(string $parameter) {} + } + class ZendTestClassWithMethodWithParameterAttribute { final public function no_override(string $parameter): int {} public function override(string $parameter): int {} diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h index aa8612aad45ea..14e9c29bd103d 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: d8c0689141c897c3f31d00550128df7b8c00274f */ + * Stub hash: 786b35a1fbff38215431d5ae46a5816c70defce5 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -134,6 +134,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZendTestParameterAttribute___construct, 0, ZEND_ARG_TYPE_INFO(0, parameter, IS_STRING, 0) ZEND_END_ARG_INFO() +#define arginfo_class_ZendTestPropertyAttribute___construct arginfo_class_ZendTestParameterAttribute___construct + #define arginfo_class_ZendTestClassWithMethodWithParameterAttribute_no_override arginfo_zend_test_parameter_with_attribute #define arginfo_class_ZendTestClassWithMethodWithParameterAttribute_override arginfo_zend_test_parameter_with_attribute @@ -194,6 +196,7 @@ static ZEND_METHOD(_ZendTestClass, returnsThrowable); static ZEND_METHOD(_ZendTestChildClass, returnsThrowable); static ZEND_METHOD(_ZendTestTrait, testMethod); static ZEND_METHOD(ZendTestParameterAttribute, __construct); +static ZEND_METHOD(ZendTestPropertyAttribute, __construct); static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, no_override); static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, override); static ZEND_METHOD(ZendTestChildClassWithMethodWithParameterAttribute, override); @@ -281,6 +284,12 @@ static const zend_function_entry class_ZendTestParameterAttribute_methods[] = { }; +static const zend_function_entry class_ZendTestPropertyAttribute_methods[] = { + ZEND_ME(ZendTestPropertyAttribute, __construct, arginfo_class_ZendTestPropertyAttribute___construct, ZEND_ACC_PUBLIC) + ZEND_FE_END +}; + + static const zend_function_entry class_ZendTestClassWithMethodWithParameterAttribute_methods[] = { ZEND_ME(ZendTestClassWithMethodWithParameterAttribute, no_override, arginfo_class_ZendTestClassWithMethodWithParameterAttribute_no_override, ZEND_ACC_PUBLIC|ZEND_ACC_FINAL) ZEND_ME(ZendTestClassWithMethodWithParameterAttribute, override, arginfo_class_ZendTestClassWithMethodWithParameterAttribute_override, ZEND_ACC_PUBLIC) @@ -506,6 +515,32 @@ static zend_class_entry *register_class_ZendTestParameterAttribute(void) return class_entry; } +static zend_class_entry *register_class_ZendTestPropertyAttribute(void) +{ + zend_class_entry ce, *class_entry; + + INIT_CLASS_ENTRY(ce, "ZendTestPropertyAttribute", class_ZendTestPropertyAttribute_methods); + class_entry = zend_register_internal_class_ex(&ce, NULL); + class_entry->ce_flags |= ZEND_ACC_FINAL; + + zval property_parameter_default_value; + ZVAL_UNDEF(&property_parameter_default_value); + zend_string *property_parameter_name = zend_string_init("parameter", sizeof("parameter") - 1, 1); + zend_declare_typed_property(class_entry, property_parameter_name, &property_parameter_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING)); + zend_string_release(property_parameter_name); + +#if (PHP_VERSION_ID >= 80200) + zend_string *attribute_name_Attribute_class_ZendTestPropertyAttribute = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1); + zend_attribute *attribute_Attribute_class_ZendTestPropertyAttribute = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_ZendTestPropertyAttribute, 1); + zend_string_release(attribute_name_Attribute_class_ZendTestPropertyAttribute); + zval attribute_Attribute_class_ZendTestPropertyAttribute_arg0; + ZVAL_LONG(&attribute_Attribute_class_ZendTestPropertyAttribute_arg0, ZEND_ATTRIBUTE_TARGET_PROPERTY); + ZVAL_COPY_VALUE(&attribute_Attribute_class_ZendTestPropertyAttribute->args[0].value, &attribute_Attribute_class_ZendTestPropertyAttribute_arg0); +#endif + + return class_entry; +} + static zend_class_entry *register_class_ZendTestClassWithMethodWithParameterAttribute(void) { zend_class_entry ce, *class_entry; diff --git a/ext/zend_test/tests/attribute-promotion-parameter-only.phpt b/ext/zend_test/tests/attribute-promotion-parameter-only.phpt new file mode 100644 index 0000000000000..ed0c2a90bfb6c --- /dev/null +++ b/ext/zend_test/tests/attribute-promotion-parameter-only.phpt @@ -0,0 +1,31 @@ +--TEST-- +Attribute on promoted property may only target parameter +--EXTENSIONS-- +zend_test +--FILE-- +getConstructor()->getParameters()[0]->getAttributes(); + +var_dump(count($attr)); +var_dump($attr[0]->getName()); +var_dump($attr[0]->newInstance()->parameter); + +$attr = $ref->getProperty('param')->getAttributes(); + +var_dump(count($attr)); + +?> +--EXPECTF-- +int(1) +string(26) "ZendTestParameterAttribute" +string(3) "foo" +int(0) diff --git a/ext/zend_test/tests/attribute-promotion-property-only.phpt b/ext/zend_test/tests/attribute-promotion-property-only.phpt new file mode 100644 index 0000000000000..bb223dcf8df2f --- /dev/null +++ b/ext/zend_test/tests/attribute-promotion-property-only.phpt @@ -0,0 +1,31 @@ +--TEST-- +Attribute on promoted property may only target property +--EXTENSIONS-- +zend_test +--FILE-- +getConstructor()->getParameters()[0]->getAttributes(); + +var_dump(count($attr)); + +$attr = $ref->getProperty('param')->getAttributes(); + +var_dump(count($attr)); +var_dump($attr[0]->getName()); +var_dump($attr[0]->newInstance()->parameter); + +?> +--EXPECTF-- +int(0) +int(1) +string(25) "ZendTestPropertyAttribute" +string(3) "foo" From cc9dddea38c248e01d0947c220c3cfbb2fff6e84 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 3 Nov 2022 13:20:30 +0100 Subject: [PATCH 1336/1346] Fix fake closure leaking when called from internal func Introduced in 8e49d7f32f3bf8e20a699bfef5c2b2591a56e8ec. ZEND_CALL_RELEASE_THIS was previously not handled for internal calls but just for user calls in the zend_leave_helper. Closes GH-9884 --- .../fake_closure_in_internal_func_leaks.phpt | 15 +++++++++++++++ Zend/zend_execute_API.c | 4 ++++ 2 files changed, 19 insertions(+) create mode 100644 Zend/tests/fake_closure_in_internal_func_leaks.phpt diff --git a/Zend/tests/fake_closure_in_internal_func_leaks.phpt b/Zend/tests/fake_closure_in_internal_func_leaks.phpt new file mode 100644 index 0000000000000..e12b4b6253fb9 --- /dev/null +++ b/Zend/tests/fake_closure_in_internal_func_leaks.phpt @@ -0,0 +1,15 @@ +--TEST-- +Fake closure called from internal function leaks +--FILE-- + +--EXPECT-- +array(1) { + [0]=> + array(0) { + } +} diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 82c38366d89a2..0d9c357b46321 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -973,6 +973,10 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_ zend_interrupt_function(EG(current_execute_data)); } } + + if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) { + OBJ_RELEASE(Z_OBJ(call->This)); + } } EG(fake_scope) = orig_fake_scope; From 94f6a0c1dc8ab939b37e93b448bc2edce8c48206 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Fri, 4 Nov 2022 16:02:41 +0100 Subject: [PATCH 1337/1346] [ci skip] NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 1d52554c3377c..d3db2aa0ab254 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ PHP NEWS . Fixed potential NULL pointer dereference Windows shm*() functions. (cmb) . Fix target validation for internal attributes with constructor property promotion. (kooldev) + . Fixed bug GH-9750 (Generator memory leak when interrupted during argument + evaluation. (Arnaud) - FPM: . Fixed bug GH-9754 (SaltStack (using Python subprocess) hangs when running From 05b63b15932393e43e7c9cd80f3e100fb8a89f3b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 7 Nov 2022 12:19:54 +0300 Subject: [PATCH 1338/1346] Don't check "fake" closures (fix assertion) Fixes oss-fuzz #53078 --- Zend/tests/first_class_callable_016.phpt | 16 ++++++++++++++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 6 +++--- 3 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 Zend/tests/first_class_callable_016.phpt diff --git a/Zend/tests/first_class_callable_016.phpt b/Zend/tests/first_class_callable_016.phpt new file mode 100644 index 0000000000000..3369a6dee70b7 --- /dev/null +++ b/Zend/tests/first_class_callable_016.phpt @@ -0,0 +1,16 @@ +--TEST-- +First class callables and &__call() +--FILE-- +bar(...); +echo $bar(),"\n"; +?> +--EXPECT-- +bar diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7e8f17ea84d95..9a1d00d6c7787 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4166,7 +4166,7 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER)) } #if ZEND_DEBUG - if (!EG(exception) && call->func) { + if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) { if (should_throw) { zend_internal_call_arginfo_violation(call->func); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 409f8f2f047cf..9303953e4e85e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1845,7 +1845,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV } #if ZEND_DEBUG - if (!EG(exception) && call->func) { + if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) { if (should_throw) { zend_internal_call_arginfo_violation(call->func); } @@ -1954,7 +1954,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETV } #if ZEND_DEBUG - if (!EG(exception) && call->func) { + if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) { if (should_throw) { zend_internal_call_arginfo_violation(call->func); } @@ -2064,7 +2064,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_OBS } #if ZEND_DEBUG - if (!EG(exception) && call->func) { + if (!EG(exception) && call->func && !(call->func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE)) { if (should_throw) { zend_internal_call_arginfo_violation(call->func); } From 5d7b64be1d4284580aca4a2d95274715b3bb5113 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 7 Nov 2022 16:39:08 +0100 Subject: [PATCH 1339/1346] Fix cross-compilation for copy_file_range --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index e0a17416ac875..ac6f8f1d6b20c 100644 --- a/configure.ac +++ b/configure.ac @@ -712,7 +712,7 @@ return 0; #else #error "unsupported platform" #endif -]])], [ac_cv_copy_file_range=yes], [ac_cv_copy_file_range=no]) +]])], [ac_cv_copy_file_range=yes], [ac_cv_copy_file_range=no], [ac_cv_copy_file_range=no]) ]) if test "$ac_cv_copy_file_range" = yes; then From 3ca0fcde72127e28451e2776b597d3034643574d Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Tue, 8 Nov 2022 17:31:56 -0500 Subject: [PATCH 1340/1346] Update NEWS for PHP 8.2.0 --- NEWS | 706 ++++++++++++++++++++++++----------------------------------- 1 file changed, 281 insertions(+), 425 deletions(-) diff --git a/NEWS b/NEWS index d3db2aa0ab254..33b7e25307601 100644 --- a/NEWS +++ b/NEWS @@ -1,414 +1,30 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -?? ??? ????, PHP 8.2.0RC6 - -- Core: - . Fixed bug GH-9823 (Don’t reset func in zend_closure_internal_handler). - (Florian Sowade) - . Fixed potential NULL pointer dereference Windows shm*() functions. (cmb) - . Fix target validation for internal attributes with constructor property - promotion. (kooldev) - . Fixed bug GH-9750 (Generator memory leak when interrupted during argument - evaluation. (Arnaud) - -- FPM: - . Fixed bug GH-9754 (SaltStack (using Python subprocess) hangs when running - php-fpm 8.1.11). (Jakub Zelenka) - -- mysqli: - . Fixed bug GH-9841 (mysqli_query throws warning despite using - silenced error mode). (Kamil Tekiela) - -- PDO: - . Fixed bug GH-9818 (Initialize run time cache in PDO methods). - (Florian Sowade) - -- Random: - . Fixed bug GH-9839 (Pre-PHP 8.2 output compatibility for non-mt_rand() - functions for MT_RAND_PHP). (timwolla) - -27 Oct 2022, PHP 8.2.0RC5 - -- CLI: - . Fixed bug GH-9709 (Null pointer dereference with -w/-s options). - (Adam Saponara) - -- GD: - . Fixed bug #81739: OOB read due to insufficient input validation in - imageloadfont(). (CVE-2022-31630) (cmb) - -- Hash: - . Fixed bug #81738: buffer overflow in hash_update() on long parameter. - (CVE-2022-37454) (nicky at mouha dot be) - -- Core: - . Fixed bug GH-9752 (Generator crashes when interrupted during argument - evaluation with extra named params). (Arnaud) - . Fixed bug GH-9801 (Generator crashes when memory limit is exceeded during - initialization). (Arnaud) - . Fixed a bug with preloaded enums possibly segfaulting. (Bob) - -- MySQLnd: - . Fixed potential heap corruption due to alignment mismatch. (cmb) - -- OpenSSL: - . Fixed missing clean up of OpenSSL engine list - attempt to fix GH-8620. - (Jakub Zelenka) - . Fixed bug GH-8430 (OpenSSL compiled with no-md2, no-md4 or no-rmd160 does - not build). (Jakub Zelenka, fsbruva) - -- PDO_ODBC: - . Fixed bug GH-9372 (HY010 when binding overlong parameter). (cmb) - -- SOAP: - . Fixed bug GH-9720 (Null pointer dereference while serializing the response). - (cmb) - -- Streams: - . Fixed bug GH-9779 (stream_copy_to_stream fails if dest in append mode). - (Jakub Zelenka) - -13 Oct 2022, PHP 8.2.0RC4 - -- Core: - . Fixed bug GH-9655 (Pure intersection types cannot be implicitly nullable) - (Girgias) - . Fixed bug GH-9589 (dl() segfaults when module is already loaded). (cmb, - Arnaud) - -- Streams: - . Fixed bug GH-9590 (stream_select does not abort upon exception or empty - valid fd set). (Arnaud) - . Fixed bug GH-9653 (file copy between different filesystems). (David Carlier) - -29 Sep 2022, PHP 8.2.0RC3 - -- Core: - . Fixed observer class notify with Opcache file_cache_only=1. (ilutov) - -- Date: - . Fixed bug with parsing large negative numbers with the @ notation. (Derick) - -- Core: - . Fixes segfault with Fiber on FreeBSD i386 architecture. (David Carlier) - -- Fileinfo: - . Fixed bug GH-8805 (finfo returns wrong mime type for woff/woff2 files). - (Anatol) - -- Opcache: - . Added indirect call reduction for jit on x86 architectures. (wxue1) - -- Sockets: - . Fixed socket constants regression as of PHP 8.2.0beta3. (Bruce Dou) - -- Session: - . Fixed GH-9584 (Avoid memory corruption when not unregistering custom session - handler). (ilutov) - . Fixed bug GH-9583 (session_create_id() fails with user defined save handler - that doesn't have a validateId() method). (Girgias) - -- Standard: - . Revert "Fixed parse_url(): can not recognize port without scheme." - (andypost) - -15 Sep 2022, PHP 8.2.0RC2 - -- Core: - . Fixed bug GH-9500 (Using dnf type with parentheses after readonly keyword - results in a parse error). (ilutov) - . Fixed bug GH-9516 ((A&B)|D as a param should allow AB or D. Not just A). - (Girgias) - -- GMP - . Fixed bug GH-9308 (GMP throws the wrong error when a GMP object is passed - to gmp_init()). (Girgias) - -- Intl - . Fixed bug GH-9421 (Incorrect argument number for ValueError in NumberFormatter). - (Girgias) - -- Opcache: - . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer - overflow). (Arnaud) - -- OpenSSL: - . Fixed bug GH-9517 (Compilation error openssl extension related to PR - GH-9366). (Jakub Zelenka) - -- PDO_PGSQL: - . Fixed bug GH-9411 (PgSQL large object resource is incorrectly closed). - (Yurunsoft) - -- Random: - . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) - -- Standard: - . Marked crypt()'s $string parameter as #[\SensitiveParameter]. (timwolla) - . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) - . Fixed bug GH-9518 (Disabling IPv6 support disables unrelated constants). - (cmb) - -01 Sep 2022, PHP 8.2.0RC1 - -- CLI: - . Implement built-in web server responding without body to HEAD request on - a static resource. (Vedran Miletic, Marin Martuslovic) - . Implement built-in web server responding with HTTP status 405 to - DELETE/PUT/PATCH request on a static resource. - (Vedran Miletic, Marin Martuslovic) - -- Core: - . Fixed bug GH-9323 (Crash in ZEND_RETURN/GC/zend_call_function) - (Tim Starling) - . Fixed bug GH-9227 (Trailing dots and spaces in filenames are ignored). - (cmb) - . Fixed bug GH-9285 (Traits cannot be used in readonly classes). - (kocsismate) - . Fixed bug GH-9186 (@strict-properties can be bypassed using - unserialization). (kocsismate) - -- Date: - . Fixed bug GH-9431 (DateTime::getLastErrors() not returning false when no - errors/warnings). (Derick) - -- ODBC: - . Fixed bug GH-9347 (Current ODBC liveness checks may be inadequate). (Calvin - Buckley) - -- Opcache: - . Fixed bug GH-9371 (Crash with JIT on mac arm64) - (jdp1024/David Carlier) - -- OpenSSL: - . Fixed bug GH-9310 (SSL local_cert and local_pk do not respect - open_basedir). (Jakub Zelenka) - . Implement FR #76935 ("chacha20-poly1305" is an AEAD but does not work like - AEAD). (Jakub Zelenka) - . Added openssl_cipher_key_length function. (Jakub Zelenka) - -- PDO_ODBC: - . Fixed bug GH-9347 (Current ODBC liveness checks may be inadequate). (Calvin - Buckley) - -- Random: - . Fixed bug GH-9415 (Randomizer::getInt(0, 2**32 - 1) with Mt19937 - always returns 1). (timwolla) - . Fixed Randomizer::getInt() consistency for 32-bit engines. (timwolla) - -- Reflection: - . Fixed bug GH-8932 (ReflectionFunction provides no way to get the called - class of a Closure). (cmb, Nicolas Grekas) - -- Streams: - . Fixed bug GH-9316 ($http_response_header is wrong for long status line). - (cmb, timwolla) - -- XML: - . Added libxml_get_external_entity_loader() function. (Tim Starling) - -18 Aug 2022, PHP 8.2.0beta3 - -- Core: - . Fixed incorrect double to long casting in latest clang. (zeriyoshi) - . Added support for defining constants in traits. (sj-i) - . Stop incorrectly emitting false positive deprecation notice alongside - unsupported syntax fatal error for `"{$g{'h'}}"`. (TysonAndre) - . Fix unexpected deprecated dynamic property warning, which occurred when - exit() in finally block after an exception was thrown without catching. - (Twosee) - -- MBString: - . Fixed bug GH-9248 (Segmentation fault in mb_strimwidth()). (cmb) - -- Random: - . Fixed bug GH-9235 (non-existant $sequence parameter in stub for - PcgOneseq128XslRr64::__construct()). (timwolla) - . Fixed bug GH-9190, GH-9191 (undefined behavior for MT_RAND_PHP when - handling large ranges). (timwolla) - . Fixed bug GH-9249 (Xoshiro256StarStar does not reject the invalid - all-zero state). (timwolla) - . Removed redundant RuntimeExceptions from Randomizer methods. The - exceptions thrown by the engines will be exposed directly. (timwolla) - . Added extension specific Exceptions/Errors (RandomException, RandomError, - BrokenRandomEngineError). (timwolla) - -- Session: - . Fixed GH-9200 (setcookie has an obsolete expires date format). (timwolla) - -- Standard: - . Fixed bug #65489 (glob() basedir check is inconsistent). (Jakub Zelenka) - . Fixed GH-9200 (setcookie has an obsolete expires date format). (Derick) - . Fixed GH-9244 (Segfault with array_multisort + array_shift). (cmb) - . Fixed bug GH-9296 (`ksort` behaves incorrectly on arrays with mixed keys). - (Denis Vaksman) - -04 Aug 2022, PHP 8.2.0beta2 - -- Core: - . Fixed bug GH-7900 (Arrow function with never return type compile-time - errors). (ilutov) - -- Date: - . Fixed bug GH-8730 (DateTime::diff miscalculation is same time zone of - different type). (Derick) - . Fixed bug GH-8964 (DateTime object comparison after applying delta less - than 1 second). (Derick) - . Fixed bug GH-9106: (DateInterval 1.5s added to DateTimeInterface is rounded - down since PHP 8.1.0). (Derick) - . Fixed bug #75035 (Datetime fails to unserialize "extreme" dates). - (Derick) - . Fixed bug #80483 (DateTime Object with 5-digit year can't unserialized). - (Derick) - . Fixed bug #81263 (Wrong result from DateTimeImmutable::diff). (Derick) - -- DBA: - . Fixed LMDB driver memory leak on DB creation failure (Girgias) - . Fixed GH-8856 (dba: lmdb: allow to override the MDB_NOSUBDIR flag). (Girgias) - -- FFI: - . Fixed bug GH-9090 (Support assigning function pointers in FFI). (Adam - Saponara) - -- Intl: - . Declared Transliterator::$id as readonly to unlock subclassing it. (Nicolas - Grekas) - -- OPcache: - . Fixed bug GH-9164 (Segfault in zend_accel_class_hash_copy). - (Arnaud, Sergei Turchanov) - -- PCNTL: - . Fixed pcntl_(get|set)priority error handling for MacOS. (Juan Morales) - -- Random: - . Fixed bug GH-9067 (random extension is not thread safe). (cmb) - . Fixed bug GH-9055 (segmentation fault if user engine throws). (timwolla) - . Fixed bug GH-9066 (signed integer overflow). (zeriyoshi) - . Fixed bug GH-9083 (undefined behavior during shifting). (timwolla) - . Fixed bug GH-9088, GH-9056 (incorrect expansion of bytes when - generating uniform integers within a given range). (timwolla) - . Fixed bug GH-9089 (Fix memory leak on Randomizer::__construct() - call twice). (zeriyoshi) - . Fixed bug GH-9212 (PcgOneseq128XslRr64::jump() should not allow negative - $advance). (Anton Smirnov) - . Changed Mt19937 to throw a ValueError instead of InvalidArgumentException - for invalid $mode. (timwolla) - . Splitted Random\Randomizer::getInt() (without arguments) to - Random\Randomizer::nextInt(). (zeriyoshi) - -- Sockets: - . Added SOL_FILTER socket option for Solaris. (David Carlier) - -- SPL: - . Fixed bug #69181 (READ_CSV|DROP_NEW_LINE drops newlines within fields). - (cmb) - . Fixed bug #65069 (GlobIterator incorrect handling of open_basedir check). - (Jakub Zelenka) - -21 Jul 2022, PHP 8.2.0beta1 +27 Nov 2022, PHP 8.2.0 - CLI: + . Fixed bug #81496 (Server logs incorrect request method). (lauri) . Updated the mime-type table for the builtin-server. (Ayesh Karunaratne) . Fixed potential overflow for the builtin server via the PHP_CLI_SERVER_WORKERS environment variable. (yiyuaner) . Fixed GH-8575 by changing STDOUT, STDERR and STDIN to not close on resource destruction. (Jakub Zelenka) - -- Core: - . Reduced the memory footprint of strings returned by var_export(), - json_encode(), serialize(), iconv_*(), mb_ereg*(), session_create_id(), - http_build_query(), strstr(), Reflection*::__toString(). (Arnaud) - . Fixed bug GH-8995 (WeakMap object reference offset causing TypeError). - (Tobias Bachert) - . Added error_log_mode ini setting. (Mikhail Galanin) - . Updated request startup messages. (Eric Norris) + . Implement built-in web server responding without body to HEAD request on + a static resource. (Vedran Miletic, Marin Martuslovic) + . Implement built-in web server responding with HTTP status 405 to + DELETE/PUT/PATCH request on a static resource. + (Vedran Miletic, Marin Martuslovic) + . Fixed bug GH-9709 (Null pointer dereference with -w/-s options). + (Adam Saponara) - COM: . Fixed bug GH-8750 (Can not create VT_ERROR variant type). (cmb) -- Filter: - . Added FILTER_FLAG_GLOBAL_RANGE to filter Global IPs. (vnsavage) - -- FPM: - . Added listen.setfib pool option to set route FIB on FreeBSD. (David Carlier) - . Added access.suppress_path pool option to filter access log entries. - (Mark Gallagher) - . Fixed on fpm scoreboard occasional warning on acquisition failure. - (Felix Wiedemann) - -- Opcache: - . Added initial support for JIT performance profiling generation - for macOs Instrument. (David Carlier) - . Fixed bug GH-8030 (Segfault with JIT and large match/switch statements). - (Arnaud) - . Added JIT support improvement for macOs for segments and executable permission - bit handling. (David Carlier) - . Added JIT buffer allocation near the .text section on FreeNSD. (David Carlier) - -- PCRE: - . Updated bundled libpcre to 10.40. (cmb) - -- PDO_Firebird: - . Fixed bug GH-8576 (Bad interpretation of length when char is UTF-8). (cmb) - -- Random: - . Added new random extension. (Go Kudo) - -- SPL: - . Widen iterator_to_array() and iterator_count()'s $iterator parameter to - iterable. (timwolla) - -- Standard: - . Implemented FR GH-8924 (str_split should return empty array for empty - string). (Michael Vorisek) - . Added ini_parse_quantity function to convert ini quantities shorthand - notation to int. (Dennis Snell) - . Enable arc4random_buf for Linux glibc 2.36 and onwards - for the random_bytes. (Cristian Rodriguez) - . Uses CCRandomGenerateBytes instead of arc4random_buf on macOs. (David Carlier). - -- Windows: - . Added preliminary support for (cross-)building for ARM64. (Yun Dou) - -07 Jul 2022, PHP 8.2.0alpha3 - -- Core: - . Uses safe_perealloc instead of perealloc for the - ZEND_PTR_STACK_RESIZE_IF_NEEDED to avoid possible overflows. (David Carlier) - -- DBA: - . Fixed LMDB driver hanging when attempting to delete a non-existing key - (Girgias) - -- Intl: - . Fixed build for ICU 69.x and onwards. (David Carlier) - -- Opcache: - . Allocate JIT buffer close to PHP .text segemnt to allow using direct - IP-relative calls and jumps. - (Su Tao, Wang Xue, Chen Hu, Lizhen Lizhen, Dmitry) - -- Sockets: - . Added TCP_CONGESTION socket option. (David Carlier) - . Added SO_ZEROCOPY/MSG_ZEROCOPY options. (David Carlier) - -- SPL: - . Uses safe_erealloc instead of erealloc to handle heap growth - for the SplHeap::insert method to avoid possible overflows. (David Carlier) - -- Standard: - . Fixed the crypt_sha256/512 api build with clang > 12. (David Carlier) - . Uses safe_erealloc instead of erealloc to handle options in getopt - to avoid possible overflows. (David Carlier) - -- Zip: - - . Implement fseek for zip stream when possible with libzip 1.9.1. (Remi) - -23 Jun 2022, PHP 8.2.0alpha2 - - Core: + . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) + . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) + . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) + . Support huge pages on MacOS. (David CARLIER) . Fixed bug GH-8655 (Casting an object to array does not unwrap refcount=1 references). (Nicolas Grekas) . Fixed bug GH-8661 (Nullsafe in coalesce triggers undefined variable @@ -418,37 +34,60 @@ PHP NEWS . Fixed bug GH-8810 (Incorrect lineno in backtrace of multi-line function calls). (ilutov) . Optimised code path for newly created file with the stream plain wrapper. (Max Kellermann) - -- Curl: - . Added new constants from cURL 7.62 to 7.80. (Pierrick) - . New function curl_upkeep(). (Pierrick) - -- OpenSSL: - . Discard poll calls on socket when no timeout/non blocking/MSG_DONTWAIT. (Max Kellermann) - -- PCRE: - . Implemented FR #77726 (Allow null character in regex patterns). (tobil4sk) - -- Standard: - . Deprecated utf8_encode() and utf8_decode(). (Rowan Tommins) - -- Streams: - . Discard poll calls on socket when no timeout/non blocking/MSG_DONTWAIT. (Max Kellermann) - -09 Jun 2022, PHP 8.2.0alpha1 - -- CLI: - . Fixed bug #81496 (Server logs incorrect request method). (lauri) - -- Core: - . Fixed bug #81380 (Observer may not be initialized properly). (krakjoe) - . Fixed bug GH-7771 (Fix filename/lineno of constant expressions). (ilutov) - . Fixed bug GH-7792 (Improve class type in error messages). (ilutov) - . Support huge pages on MacOS. (David CARLIER) + . Uses safe_perealloc instead of perealloc for the + ZEND_PTR_STACK_RESIZE_IF_NEEDED to avoid possible overflows. (David Carlier) + . Reduced the memory footprint of strings returned by var_export(), + json_encode(), serialize(), iconv_*(), mb_ereg*(), session_create_id(), + http_build_query(), strstr(), Reflection*::__toString(). (Arnaud) + . Fixed bug GH-8995 (WeakMap object reference offset causing TypeError). + (Tobias Bachert) + . Added error_log_mode ini setting. (Mikhail Galanin) + . Updated request startup messages. (Eric Norris) + . Fixed bug GH-7900 (Arrow function with never return type compile-time + errors). (ilutov) + . Fixed incorrect double to long casting in latest clang. (zeriyoshi) + . Added support for defining constants in traits. (sj-i) + . Stop incorrectly emitting false positive deprecation notice alongside + unsupported syntax fatal error for `"{$g{'h'}}"`. (TysonAndre) + . Fix unexpected deprecated dynamic property warning, which occurred when + exit() in finally block after an exception was thrown without catching. + (Twosee) + . Fixed bug GH-9323 (Crash in ZEND_RETURN/GC/zend_call_function) + (Tim Starling) + . Fixed bug GH-9227 (Trailing dots and spaces in filenames are ignored). + (cmb) + . Fixed bug GH-9285 (Traits cannot be used in readonly classes). + (kocsismate) + . Fixed bug GH-9186 (@strict-properties can be bypassed using + unserialization). (kocsismate) + . Fixed bug GH-9500 (Using dnf type with parentheses after readonly keyword + results in a parse error). (ilutov) + . Fixed bug GH-9516 ((A&B)|D as a param should allow AB or D. Not just A). + (Girgias) + . Fixed observer class notify with Opcache file_cache_only=1. (ilutov) + . Fixes segfault with Fiber on FreeBSD i386 architecture. (David Carlier) + . Fixed bug GH-9655 (Pure intersection types cannot be implicitly nullable) + (Girgias) + . Fixed bug GH-9589 (dl() segfaults when module is already loaded). (cmb, + Arnaud) + . Fixed bug GH-9752 (Generator crashes when interrupted during argument + evaluation with extra named params). (Arnaud) + . Fixed bug GH-9801 (Generator crashes when memory limit is exceeded during + initialization). (Arnaud) + . Fixed a bug with preloaded enums possibly segfaulting. (Bob) + . Fixed bug GH-9823 (Don’t reset func in zend_closure_internal_handler). + (Florian Sowade) + . Fixed potential NULL pointer dereference Windows shm*() functions. (cmb) + . Fix target validation for internal attributes with constructor property + promotion. (kooldev) + . Fixed bug GH-9750 (Generator memory leak when interrupted during argument + evaluation. (Arnaud) - Curl: . Added support for CURLOPT_XFERINFOFUNCTION. (David Carlier) . Added support for CURLOPT_MAXFILESIZE_LARGE. (David Carlier) + . Added new constants from cURL 7.62 to 7.80. (Pierrick) + . New function curl_upkeep(). (Pierrick) - Date: . Fixed GH-8458 (DateInterval::createFromDateString does not throw if @@ -457,6 +96,37 @@ PHP NEWS (Daniel Egeberg, Derick) . idate() now accepts format specifiers "N" (ISO Day-of-Week) and "o" (ISO Year). (Pavel Djundik) + . Fixed bug GH-8730 (DateTime::diff miscalculation is same time zone of + different type). (Derick) + . Fixed bug GH-8964 (DateTime object comparison after applying delta less + than 1 second). (Derick) + . Fixed bug GH-9106: (DateInterval 1.5s added to DateTimeInterface is rounded + down since PHP 8.1.0). (Derick) + . Fixed bug #75035 (Datetime fails to unserialize "extreme" dates). + (Derick) + . Fixed bug #80483 (DateTime Object with 5-digit year can't unserialized). + (Derick) + . Fixed bug #81263 (Wrong result from DateTimeImmutable::diff). (Derick) + . Fixed bug GH-9431 (DateTime::getLastErrors() not returning false when no + errors/warnings). (Derick) + . Fixed bug with parsing large negative numbers with the @ notation. (Derick) + +- DBA: + . Fixed LMDB driver hanging when attempting to delete a non-existing key + (Girgias) + . Fixed LMDB driver memory leak on DB creation failure (Girgias) + . Fixed GH-8856 (dba: lmdb: allow to override the MDB_NOSUBDIR flag). (Girgias) + +- FFI: + . Fixed bug GH-9090 (Support assigning function pointers in FFI). (Adam + Saponara) + +- Fileinfo: + . Fixed bug GH-8805 (finfo returns wrong mime type for woff/woff2 files). + (Anatol) + +- Filter: + . Added FILTER_FLAG_GLOBAL_RANGE to filter Global IPs. (vnsavage) - FPM: . Emit error for invalid port setting. (David Carlier) @@ -464,13 +134,47 @@ PHP NEWS (David Carlier) . Added support for listening queue on macOS. (David Carlier) . Changed default for listen.backlog on Linux to -1. (Cristian Rodríguez) + . Added listen.setfib pool option to set route FIB on FreeBSD. (David Carlier) + . Added access.suppress_path pool option to filter access log entries. + (Mark Gallagher) + . Fixed on fpm scoreboard occasional warning on acquisition failure. + (Felix Wiedemann) + . Fixed bug GH-9754 (SaltStack (using Python subprocess) hangs when running + php-fpm 8.1.11). (Jakub Zelenka) - FTP: . Fix datetime format string to follow POSIX spec in ftp_mdtm(). (Jihwan Kim) +- GD: + . Fixed bug #81739: OOB read due to insufficient input validation in + imageloadfont(). (CVE-2022-31630) (cmb) + +- GMP: + . Fixed bug GH-9308 (GMP throws the wrong error when a GMP object is passed + to gmp_init()). (Girgias) + +- Hash: + . Fixed bug #81738: buffer overflow in hash_update() on long parameter. + (CVE-2022-37454) (nicky at mouha dot be) + - Intl: . Update all grandfathered language tags with preferred values . Fixed GH-7939 (Cannot unserialize IntlTimeZone objects). (cmb) + . Fixed build for ICU 69.x and onwards. (David Carlier) + . Declared Transliterator::$id as readonly to unlock subclassing it. (Nicolas + Grekas) + . Fixed bug GH-9421 (Incorrect argument number for ValueError in NumberFormatter). + (Girgias) + +- MBString: + . Fixed bug GH-9248 (Segmentation fault in mb_strimwidth()). (cmb) + +- mysqli: + . Fixed bug GH-9841 (mysqli_query throws warning despite using + silenced error mode). (Kamil Tekiela) + +- MySQLnd: + . Fixed potential heap corruption due to alignment mismatch. (cmb) - OCI8: . Added oci8.prefetch_lob_size directive to tune LOB query performance @@ -480,22 +184,124 @@ PHP NEWS - ODBC: . Fixed bug GH-8300 (User input not escaped when building connection string). (Calvin Buckley) + . Fixed bug GH-9347 (Current ODBC liveness checks may be inadequate). (Calvin + Buckley) + +- Opcache: + . Allocate JIT buffer close to PHP .text segemnt to allow using direct + IP-relative calls and jumps. + (Su Tao, Wang Xue, Chen Hu, Lizhen Lizhen, Dmitry) + . Added initial support for JIT performance profiling generation + for macOs Instrument. (David Carlier) + . Fixed bug GH-8030 (Segfault with JIT and large match/switch statements). + (Arnaud) + . Added JIT support improvement for macOs for segments and executable permission + bit handling. (David Carlier) + . Added JIT buffer allocation near the .text section on FreeNSD. (David Carlier) + . Fixed bug GH-9371 (Crash with JIT on mac arm64) + (jdp1024/David Carlier) + . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer + overflow). (Arnaud) + . Added indirect call reduction for jit on x86 architectures. (wxue1) + +- OPcache: + . Fixed bug GH-9164 (Segfault in zend_accel_class_hash_copy). + (Arnaud, Sergei Turchanov) + +- OpenSSL: + . Discard poll calls on socket when no timeout/non blocking/MSG_DONTWAIT. (Max Kellermann) + . Fixed bug GH-9310 (SSL local_cert and local_pk do not respect + open_basedir). (Jakub Zelenka) + . Implement FR #76935 ("chacha20-poly1305" is an AEAD but does not work like + AEAD). (Jakub Zelenka) + . Added openssl_cipher_key_length function. (Jakub Zelenka) + . Fixed bug GH-9517 (Compilation error openssl extension related to PR + GH-9366). (Jakub Zelenka) + . Fixed missing clean up of OpenSSL engine list - attempt to fix GH-8620. + (Jakub Zelenka) + . Fixed bug GH-8430 (OpenSSL compiled with no-md2, no-md4 or no-rmd160 does + not build). (Jakub Zelenka, fsbruva) + +- PCNTL: + . Fixed pcntl_(get|set)priority error handling for MacOS. (Juan Morales) + +- PCRE: + . Implemented FR #77726 (Allow null character in regex patterns). (tobil4sk) + . Updated bundled libpcre to 10.40. (cmb) + +- PDO: + . Fixed bug GH-9818 (Initialize run time cache in PDO methods). + (Florian Sowade) + +- PDO_Firebird: + . Fixed bug GH-8576 (Bad interpretation of length when char is UTF-8). (cmb) - PDO_ODBC: . Fixed bug #80909 (crash with persistent connections in PDO_ODBC). (Calvin Buckley) . Fixed bug GH-8300 (User input not escaped when building connection string). (Calvin Buckley) + . Fixed bug GH-9347 (Current ODBC liveness checks may be inadequate). (Calvin + Buckley) + . Fixed bug GH-9372 (HY010 when binding overlong parameter). (cmb) + +- PDO_PGSQL: + . Fixed bug GH-9411 (PgSQL large object resource is incorrectly closed). + (Yurunsoft) + +- Random: + . Added new random extension. (Go Kudo) + . Fixed bug GH-9067 (random extension is not thread safe). (cmb) + . Fixed bug GH-9055 (segmentation fault if user engine throws). (timwolla) + . Fixed bug GH-9066 (signed integer overflow). (zeriyoshi) + . Fixed bug GH-9083 (undefined behavior during shifting). (timwolla) + . Fixed bug GH-9088, GH-9056 (incorrect expansion of bytes when + generating uniform integers within a given range). (timwolla) + . Fixed bug GH-9089 (Fix memory leak on Randomizer::__construct() + call twice). (zeriyoshi) + . Fixed bug GH-9212 (PcgOneseq128XslRr64::jump() should not allow negative + $advance). (Anton Smirnov) + . Changed Mt19937 to throw a ValueError instead of InvalidArgumentException + for invalid $mode. (timwolla) + . Splitted Random\Randomizer::getInt() (without arguments) to + Random\Randomizer::nextInt(). (zeriyoshi) + . Fixed bug GH-9235 (non-existant $sequence parameter in stub for + PcgOneseq128XslRr64::__construct()). (timwolla) + . Fixed bug GH-9190, GH-9191 (undefined behavior for MT_RAND_PHP when + handling large ranges). (timwolla) + . Fixed bug GH-9249 (Xoshiro256StarStar does not reject the invalid + all-zero state). (timwolla) + . Removed redundant RuntimeExceptions from Randomizer methods. The + exceptions thrown by the engines will be exposed directly. (timwolla) + . Added extension specific Exceptions/Errors (RandomException, RandomError, + BrokenRandomEngineError). (timwolla) + . Fixed bug GH-9415 (Randomizer::getInt(0, 2**32 - 1) with Mt19937 + always returns 1). (timwolla) + . Fixed Randomizer::getInt() consistency for 32-bit engines. (timwolla) + . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) + . Fixed bug GH-9839 (Pre-PHP 8.2 output compatibility for non-mt_rand() + functions for MT_RAND_PHP). (timwolla) - Reflection: . Added ReflectionFunction::isAnonymous(). (Nicolas Grekas) . Added ReflectionMethod::hasPrototype(). (Ollie Read) . Narrow ReflectionEnum::getBackingType() return type to ReflectionNamedType. (SamMousa) + . Fixed bug GH-8932 (ReflectionFunction provides no way to get the called + class of a Closure). (cmb, Nicolas Grekas) - Session: . Fixed bug GH-7787 (Improve session write failure message for user error handlers). (ilutov) + . Fixed GH-9200 (setcookie has an obsolete expires date format). (timwolla) + . Fixed GH-9584 (Avoid memory corruption when not unregistering custom session + handler). (ilutov) + . Fixed bug GH-9583 (session_create_id() fails with user defined save handler + that doesn't have a validateId() method). (Girgias) + +- SOAP: + . Fixed bug GH-9720 (Null pointer dereference while serializing the response). + (cmb) - Sockets: . Added TCP_NOTSENT_LOWAT socket option. (David Carlier) @@ -508,10 +314,24 @@ PHP NEWS . Added ancillary data support for NetBSD. (David Carlier) . Added SO_BPF_EXTENSIONS socket option. (David Carlier) . Added SO_SETFIB socket option. (David Carlier) + . Added TCP_CONGESTION socket option. (David Carlier) + . Added SO_ZEROCOPY/MSG_ZEROCOPY options. (David Carlier) + . Added SOL_FILTER socket option for Solaris. (David Carlier) + . Fixed socket constants regression as of PHP 8.2.0beta3. (Bruce Dou) - Sodium: . Added sodium_crypto_stream_xchacha20_xor_ic(). (Scott) +- SPL: + . Uses safe_erealloc instead of erealloc to handle heap growth + for the SplHeap::insert method to avoid possible overflows. (David Carlier) + . Widen iterator_to_array() and iterator_count()'s $iterator parameter to + iterable. (timwolla) + . Fixed bug #69181 (READ_CSV|DROP_NEW_LINE drops newlines within fields). + (cmb) + . Fixed bug #65069 (GlobIterator incorrect handling of open_basedir check). + (Jakub Zelenka) + - SQLite3: . Changed sqlite3.defensive from PHP_INI_SYSTEM to PHP_INI_USER. (bohwaz) @@ -523,11 +343,47 @@ PHP NEWS (ilutov) . New function memory_reset_peak_usage(). (Patrick Allaert) . Fixed parse_url(): can not recognize port without scheme. (pandaLIU) + . Deprecated utf8_encode() and utf8_decode(). (Rowan Tommins) + . Fixed the crypt_sha256/512 api build with clang > 12. (David Carlier) + . Uses safe_erealloc instead of erealloc to handle options in getopt + to avoid possible overflows. (David Carlier) + . Implemented FR GH-8924 (str_split should return empty array for empty + string). (Michael Vorisek) + . Added ini_parse_quantity function to convert ini quantities shorthand + notation to int. (Dennis Snell) + . Enable arc4random_buf for Linux glibc 2.36 and onwards + for the random_bytes. (Cristian Rodriguez) + . Uses CCRandomGenerateBytes instead of arc4random_buf on macOs. (David Carlier). + . Fixed bug #65489 (glob() basedir check is inconsistent). (Jakub Zelenka) + . Fixed GH-9200 (setcookie has an obsolete expires date format). (Derick) + . Fixed GH-9244 (Segfault with array_multisort + array_shift). (cmb) + . Fixed bug GH-9296 (`ksort` behaves incorrectly on arrays with mixed keys). + (Denis Vaksman) + . Marked crypt()'s $string parameter as #[\SensitiveParameter]. (timwolla) + . Fixed bug GH-9464 (build on older macOs releases). (David Bohman) + . Fixed bug GH-9518 (Disabling IPv6 support disables unrelated constants). + (cmb) + . Revert "Fixed parse_url(): can not recognize port without scheme." + (andypost) - Streams: . Set IP_BIND_ADDRESS_NO_PORT if available when connecting to remote host. (Cristian Rodríguez) . Fixed bug GH-8548 (stream_wrapper_unregister() leaks memory). (ilutov) + . Discard poll calls on socket when no timeout/non blocking/MSG_DONTWAIT. (Max Kellermann) + . Fixed bug GH-9316 ($http_response_header is wrong for long status line). + (cmb, timwolla) + . Fixed bug GH-9590 (stream_select does not abort upon exception or empty + valid fd set). (Arnaud) + . Fixed bug GH-9653 (file copy between different filesystems). (David Carlier) + . Fixed bug GH-9779 (stream_copy_to_stream fails if dest in append mode). + (Jakub Zelenka) + +- Windows: + . Added preliminary support for (cross-)building for ARM64. (Yun Dou) + +- XML: + . Added libxml_get_external_entity_loader() function. (Tim Starling) - Zip: . add ZipArchive::clearError() method @@ -535,5 +391,5 @@ PHP NEWS . add ZipArchive::getStreamIndex() method . On Windows, the Zip extension is now built as shared library (DLL) by default. (cmb) + . Implement fseek for zip stream when possible with libzip 1.9.1. (Remi) -<<< NOTE: Insert NEWS from last stable release here prior to actual release! >>> From 97236f9d9b92f1825b76a2aceac3dfc37e262fdd Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 9 Nov 2022 12:47:41 +0100 Subject: [PATCH 1341/1346] Move observer_declared_function_notify until after pass_two() For early observing, there already exists a op_array_ctor hook on zend_extension. However the goal of the declared_function observer is noting the time when a fully defined function starts existing in the function_tables. This also prevents the observer being called in case there were compilation errors. Ultimately, this now gives a consistent behaviour with respect to how it works when opcache is enabled: - pass_two is done, opcodes and flags are all finalized. - similarly class_linked notifications also only happen once the class is actually finalized. - any extension wanting to delay the observer call may add the ZEND_COMPILE_IGNORE_OBSERVER compiler_option, then call it itself. --- Zend/zend_compile.c | 46 +++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index fb1b6b5d9da32..f169efcffe437 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7271,7 +7271,7 @@ static uint32_t zend_add_dynamic_func_def(zend_op_array *def) { return def_offset; } -static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, bool toplevel) /* {{{ */ +static zend_string *zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl, bool toplevel) /* {{{ */ { zend_string *unqualified_name, *name, *lcname; zend_op *opline; @@ -7305,23 +7305,20 @@ static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_as if (UNEXPECTED(zend_hash_add_ptr(CG(function_table), lcname, op_array) == NULL)) { do_bind_function_error(lcname, op_array, 1); } - zend_observer_function_declared_notify(op_array, lcname); - zend_string_release_ex(lcname, 0); - return; - } - - uint32_t func_ref = zend_add_dynamic_func_def(op_array); - if (op_array->fn_flags & ZEND_ACC_CLOSURE) { - opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL); - opline->op2.num = func_ref; } else { - opline = get_next_op(); - opline->opcode = ZEND_DECLARE_FUNCTION; - opline->op1_type = IS_CONST; - LITERAL_STR(opline->op1, zend_string_copy(lcname)); - opline->op2.num = func_ref; + uint32_t func_ref = zend_add_dynamic_func_def(op_array); + if (op_array->fn_flags & ZEND_ACC_CLOSURE) { + opline = zend_emit_op_tmp(result, ZEND_DECLARE_LAMBDA_FUNCTION, NULL, NULL); + opline->op2.num = func_ref; + } else { + opline = get_next_op(); + opline->opcode = ZEND_DECLARE_FUNCTION; + opline->op1_type = IS_CONST; + LITERAL_STR(opline->op1, zend_string_copy(lcname)); + opline->op2.num = func_ref; + } } - zend_string_release_ex(lcname, 0); + return lcname; } /* }}} */ @@ -7333,7 +7330,7 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) zend_ast *stmt_ast = decl->child[2]; zend_ast *return_type_ast = decl->child[3]; bool is_method = decl->kind == ZEND_AST_METHOD; - zend_string *method_lcname = NULL; + zend_string *lcname = NULL; zend_class_entry *orig_class_entry = CG(active_class_entry); zend_op_array *orig_op_array = CG(active_op_array); @@ -7362,9 +7359,9 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) if (is_method) { bool has_body = stmt_ast != NULL; - method_lcname = zend_begin_method_decl(op_array, decl->name, has_body); + lcname = zend_begin_method_decl(op_array, decl->name, has_body); } else { - zend_begin_func_decl(result, op_array, decl, toplevel); + lcname = zend_begin_func_decl(result, op_array, decl, toplevel); if (decl->kind == ZEND_AST_ARROW_FUNC) { find_implicit_binds(&info, params_ast, stmt_ast); compile_implicit_lexical_binds(&info, result, op_array); @@ -7407,7 +7404,7 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) } zend_compile_params(params_ast, return_type_ast, - is_method && zend_string_equals_literal(method_lcname, ZEND_TOSTRING_FUNC_NAME) ? IS_STRING : 0); + is_method && zend_string_equals_literal(lcname, ZEND_TOSTRING_FUNC_NAME) ? IS_STRING : 0); if (CG(active_op_array)->fn_flags & ZEND_ACC_GENERATOR) { zend_mark_function_as_generator(); zend_emit_op(NULL, ZEND_GENERATOR_CREATE, NULL, NULL); @@ -7436,8 +7433,7 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) if (is_method) { CG(zend_lineno) = decl->start_lineno; zend_check_magic_method_implementation( - CG(active_class_entry), (zend_function *) op_array, method_lcname, E_COMPILE_ERROR); - zend_string_release_ex(method_lcname, 0); + CG(active_class_entry), (zend_function *) op_array, lcname, E_COMPILE_ERROR); } /* put the implicit return on the really last line */ @@ -7452,6 +7448,12 @@ static void zend_compile_func_decl(znode *result, zend_ast *ast, bool toplevel) /* Pop the loop variable stack separator */ zend_stack_del_top(&CG(loop_var_stack)); + if (toplevel) { + zend_observer_function_declared_notify(op_array, lcname); + } + + zend_string_release_ex(lcname, 0); + CG(active_op_array) = orig_op_array; CG(active_class_entry) = orig_class_entry; } From 2d80d988c2932383f335624aa48fcd2bb8d77604 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 9 Nov 2022 16:36:05 +0100 Subject: [PATCH 1342/1346] Do not report MINIT stage internal class aliases in extensions Signed-off-by: Bob Weinand --- Zend/zend_API.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 54bcad825a501..f613121ee4ad0 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3281,7 +3281,10 @@ ZEND_API zend_result zend_register_class_alias_ex(const char *name, size_t name_ if (!(ce->ce_flags & ZEND_ACC_IMMUTABLE)) { ce->refcount++; } - zend_observer_class_linked_notify(ce, lcname); + // avoid notifying at MINIT time + if (ce->type == ZEND_USER_CLASS) { + zend_observer_class_linked_notify(ce, lcname); + } return SUCCESS; } return FAILURE; From 37b3e377a40799d75f7acd76e35d5eee8ad539ca Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 9 Nov 2022 16:36:28 +0100 Subject: [PATCH 1343/1346] Fix opcache preload with observers enabled Signed-off-by: Bob Weinand --- ext/opcache/ZendAccelerator.c | 2 ++ ext/zend_test/tests/observer_preload.inc | 13 ++++++++ ext/zend_test/tests/observer_preload.phpt | 38 +++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 ext/zend_test/tests/observer_preload.inc create mode 100644 ext/zend_test/tests/observer_preload.phpt diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index f78ae8755f336..f2138a63fe250 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -35,6 +35,7 @@ #include "zend_inheritance.h" #include "zend_exceptions.h" #include "zend_mmap.h" +#include "zend_observer.h" #include "main/php_main.h" #include "main/SAPI.h" #include "main/php_streams.h" @@ -4480,6 +4481,7 @@ static int accel_preload(const char *config, bool in_child) script->script.main_op_array.fn_flags |= ZEND_ACC_DONE_PASS_TWO; script->script.main_op_array.last = 1; script->script.main_op_array.last_literal = 1; + script->script.main_op_array.T = ZEND_OBSERVER_ENABLED; #if ZEND_USE_ABS_CONST_ADDR script->script.main_op_array.literals = (zval*)emalloc(sizeof(zval)); #else diff --git a/ext/zend_test/tests/observer_preload.inc b/ext/zend_test/tests/observer_preload.inc new file mode 100644 index 0000000000000..7652014f91bf0 --- /dev/null +++ b/ext/zend_test/tests/observer_preload.inc @@ -0,0 +1,13 @@ + +--EXPECTF-- + + + + + + + + + + + + + +Done + \ No newline at end of file From a814afb08823bb0cdf4ae45f67a7db83c8be9cd7 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 9 Nov 2022 17:51:45 +0100 Subject: [PATCH 1344/1346] Fix crash reading module_entry after DL_UNLOAD() when module already loaded This occurs when the handle is different from the current handle (e.g. copy of the .so file), hence the existing test did not catch that particular case. --- ext/standard/dl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/dl.c b/ext/standard/dl.c index 7b47c4726d1a7..ebf8a3a507ebb 100644 --- a/ext/standard/dl.c +++ b/ext/standard/dl.c @@ -206,8 +206,8 @@ PHPAPI int php_load_extension(const char *filename, int type, int start_now) } module_entry = get_module(); if (zend_hash_str_exists(&module_registry, module_entry->name, strlen(module_entry->name))) { - DL_UNLOAD(handle); zend_error(E_CORE_WARNING, "Module \"%s\" is already loaded", module_entry->name); + DL_UNLOAD(handle); return FAILURE; } if (module_entry->zend_api != ZEND_MODULE_API_NO) { From 5c5fe4d17478223fcbdc0580dd9b525e75c8b9c2 Mon Sep 17 00:00:00 2001 From: Sergey Panteleev Date: Tue, 6 Dec 2022 16:34:11 +0300 Subject: [PATCH 1345/1346] [ci skip] Update NEWS for PHP 8.2.0 --- NEWS | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 33b7e25307601..936d01f57c1c8 100644 --- a/NEWS +++ b/NEWS @@ -82,6 +82,8 @@ PHP NEWS promotion. (kooldev) . Fixed bug GH-9750 (Generator memory leak when interrupted during argument evaluation. (Arnaud) + . Move observer_declared_function_notify until after pass_two(). (Bob) + . Do not report MINIT stage internal class aliases in extensions. (Bob) - Curl: . Added support for CURLOPT_XFERINFOFUNCTION. (David Carlier) @@ -203,10 +205,9 @@ PHP NEWS . Fixed bug GH-9259 (opcache.interned_strings_buffer setting integer overflow). (Arnaud) . Added indirect call reduction for jit on x86 architectures. (wxue1) - -- OPcache: . Fixed bug GH-9164 (Segfault in zend_accel_class_hash_copy). (Arnaud, Sergei Turchanov) + . Fix opcache preload with observers enabled. (Bob) - OpenSSL: . Discard poll calls on socket when no timeout/non blocking/MSG_DONTWAIT. (Max Kellermann) @@ -365,6 +366,8 @@ PHP NEWS (cmb) . Revert "Fixed parse_url(): can not recognize port without scheme." (andypost) + . Fix crash reading module_entry after DL_UNLOAD() when module already + loaded. (Bob) - Streams: . Set IP_BIND_ADDRESS_NO_PORT if available when connecting to remote host. From 70ee6c20ad97e02c2b8098aeea96fefbbc3ac5c2 Mon Sep 17 00:00:00 2001 From: Sergey Panteleev Date: Tue, 6 Dec 2022 16:43:35 +0300 Subject: [PATCH 1346/1346] Update versions for PHP 8.2.0 --- NEWS | 2 +- Zend/zend.h | 2 +- configure.ac | 2 +- main/php_version.h | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 936d01f57c1c8..f1a4ef76dd12f 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| -27 Nov 2022, PHP 8.2.0 +08 Dec 2022, PHP 8.2.0 - CLI: . Fixed bug #81496 (Server logs incorrect request method). (lauri) diff --git a/Zend/zend.h b/Zend/zend.h index bea23cf40ba0d..fd7d33f46f539 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -20,7 +20,7 @@ #ifndef ZEND_H #define ZEND_H -#define ZEND_VERSION "4.2.0-dev" +#define ZEND_VERSION "4.2.0" #define ZEND_ENGINE_3 diff --git a/configure.ac b/configure.ac index ac6f8f1d6b20c..009e8f88e92ee 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.2.0-dev],[https://github.com/php/php-src/issues],[php],[https://www.php.net]) +AC_INIT([PHP],[8.2.0],[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 diff --git a/main/php_version.h b/main/php_version.h index e7993749fd9e5..4d5638e7c0ace 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -3,6 +3,6 @@ #define PHP_MAJOR_VERSION 8 #define PHP_MINOR_VERSION 2 #define PHP_RELEASE_VERSION 0 -#define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "8.2.0-dev" +#define PHP_EXTRA_VERSION "" +#define PHP_VERSION "8.2.0" #define PHP_VERSION_ID 80200